aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-10-07 15:10:16 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-10-07 15:10:16 +0200
commit0b031c050e049d7bdab459b48f574e8b0048926d (patch)
tree74eee3347c88daced8db318a2ce30e899533acd0
parent38630279546fbd3876fe2396f2afe4ca1bca9acc (diff)
downloadminishell-0b031c050e049d7bdab459b48f574e8b0048926d.tar.gz
minishell-0b031c050e049d7bdab459b48f574e8b0048926d.tar.bz2
minishell-0b031c050e049d7bdab459b48f574e8b0048926d.zip
Added signal on pipeline and operations
-rw-r--r--include/minishell.h4
-rw-r--r--src/eval/eval.c7
-rw-r--r--src/eval/operation.c7
-rw-r--r--src/main.c4
-rw-r--r--src/signal.c24
5 files changed, 28 insertions, 18 deletions
diff --git a/include/minishell.h b/include/minishell.h
index e111119..5bc9ad4 100644
--- a/include/minishell.h
+++ b/include/minishell.h
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/26 15:33:51 by cacharle #+# #+# */
-/* Updated: 2020/10/07 11:20:46 by cacharle ### ########.fr */
+/* Updated: 2020/10/07 14:58:27 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -63,6 +63,8 @@ typedef struct
char *progname;
pid_t pids[STATE_PIDS_MAX_SIZE];
size_t pids_len;
+ bool killed;
+ bool is_child;
} t_state;
extern t_state g_state;
diff --git a/src/eval/eval.c b/src/eval/eval.c
index 86d038e..66a535b 100644
--- a/src/eval/eval.c
+++ b/src/eval/eval.c
@@ -6,7 +6,7 @@
/* By: charles <me@cacharle.xyz> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/09/13 20:38:06 by charles #+# #+# */
-/* Updated: 2020/10/07 10:25:39 by cacharle ### ########.fr */
+/* Updated: 2020/10/07 15:02:21 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -35,26 +35,23 @@ int st_replace(int oldfd, int newfd)
int fork_wrap(int fds[2], void *passed, t_wrapped_func wrapped)
{
int status;
- /* bool waiting; */
pid_t pid;
if ((pid = fork()) == -1)
return (EVAL_FATAL);
if (pid == 0)
{
+ g_state.is_child = true;
if (st_replace(fds[FD_READ], STDIN_FILENO) != 0)
exit(EXIT_FAILURE);
if (st_replace(fds[FD_WRITE], STDOUT_FILENO) != 0)
exit(EXIT_FAILURE);
- /* if (fd_to_close != FD_NONE) */
- /* close(fd_to_close); */
if ((status = wrapped(passed)) == EVAL_FATAL)
exit(EXIT_FAILURE);
exit(status);
}
g_child_pid = pid;
waitpid(pid, &pid, 0);
- /* close(fds[FD_WRITE]); */
return (WEXITSTATUS(pid));
}
diff --git a/src/eval/operation.c b/src/eval/operation.c
index 156f6f5..1620be2 100644
--- a/src/eval/operation.c
+++ b/src/eval/operation.c
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/06/17 15:27:22 by charles #+# #+# */
-/* Updated: 2020/10/07 11:31:47 by cacharle ### ########.fr */
+/* Updated: 2020/10/07 15:08:11 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -25,6 +25,8 @@ int eval_operation(int fds[2], t_env env, t_ast *ast)
if ((status = eval(left_fds, env, ast->op.left)) == EVAL_FATAL)
return (EVAL_FATAL);
g_state.last_status = status;
+ if (g_state.killed)
+ return (status);
if ((ast->op.sep == TAG_AND && status != 0) ||
(ast->op.sep == TAG_OR && status == 0))
return (status);
@@ -50,6 +52,7 @@ int eval_pipeline(int fds[2], t_env env, t_ast *ast)
int pid = fork();
if (pid == 0)
{
+ g_state.is_child = true;
dup2(p[FD_WRITE], STDOUT_FILENO);
if (prev_output != STDIN_FILENO)
{
@@ -71,6 +74,7 @@ int eval_pipeline(int fds[2], t_env env, t_ast *ast)
int pid = fork();
if (pid == 0)
{
+ g_state.is_child = true;
if (prev_output != STDIN_FILENO)
{
dup2(prev_output, STDIN_FILENO);
@@ -81,6 +85,7 @@ int eval_pipeline(int fds[2], t_env env, t_ast *ast)
fds[1] = FD_NONE;
exit(eval(fds, env, curr->data));
}
+ g_child_pid = pid;
close(p[FD_READ]);
int status = 0;
diff --git a/src/main.c b/src/main.c
index 29b81a6..897ca05 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,7 +6,7 @@
/* By: cacharle <cacharle@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */
-/* Updated: 2020/10/06 17:22:40 by cacharle ### ########.fr */
+/* Updated: 2020/10/07 14:56:19 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -68,8 +68,10 @@ int repl(t_env env)
print_prompt();
continue ;
}
+ g_state.killed = false;
if (execute(env, line) == EVAL_FATAL)
return (2);
+ g_child_pid = -1;
print_prompt();
}
if (ret != FTGL_EOF)
diff --git a/src/signal.c b/src/signal.c
index 5d87d85..a0633fc 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -6,21 +6,24 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/07/16 09:16:16 by charles #+# #+# */
-/* Updated: 2020/09/16 16:27:30 by charles ### ########.fr */
+/* Updated: 2020/10/07 15:02:56 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
-#include "minishell.h"
#include "eval.h"
+#include "minishell.h"
-void signal_sigint(int signum)
+void signal_sigint(int signum)
{
(void)signum;
- g_state.last_status = 130;
+ if (g_state.killed || g_state.is_child)
+ return ;
if (g_child_pid != -1)
{
- kill(g_child_pid, SIGINT);
- ft_putchar('\n');
+ g_state.last_status = 1;
+ if (kill(g_child_pid, SIGINT) != -1)
+ ft_putchar('\n');
+ g_state.killed = true;
}
else
{
@@ -29,19 +32,20 @@ void signal_sigint(int signum)
}
}
-void signal_sigquit(int signum)
+void signal_sigquit(int signum)
{
+ if (g_state.killed)
+ return ;
(void)signum;
- g_state.last_status = 131;
if (g_child_pid != -1)
{
+ g_state.last_status = 131;
kill(g_child_pid, SIGQUIT);
ft_putstr("Quit (core dumped)\n");
}
}
-void signal_sigterm(int signum)
+void signal_sigterm(int signum)
{
(void)signum;
}
-