diff options
| author | Dominik Kaiser | 2024-10-25 12:51:07 +0200 |
|---|---|---|
| committer | Dominik Kaiser | 2024-10-25 12:51:07 +0200 |
| commit | 07522e059d2956014b8d97f39b72a90c6dc6a7c6 (patch) | |
| tree | 8d89a16dfe683f9d70bb175d61e941f99942de62 | |
| parent | 0a5684e637cd6ec084575ddf9930cfde55d3cca7 (diff) | |
| download | minishell-07522e059d2956014b8d97f39b72a90c6dc6a7c6.tar.gz minishell-07522e059d2956014b8d97f39b72a90c6dc6a7c6.zip | |
Finish pipes I guess
Somehow this worked at the first try.
This'll have to be tested more thoroughly.
| -rw-r--r-- | src/interpreter.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/interpreter.c b/src/interpreter.c index f6757c4..e08d289 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/05 13:15:24 by dkaiser #+# #+# */ -/* Updated: 2024/10/22 15:42:07 by dkaiser ### ########.fr */ +/* Updated: 2024/10/25 12:47:15 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,7 +18,7 @@ #include <sys/wait.h> #include <unistd.h> -int eval_rec(t_node *node, t_env *env); +static int eval_rec(t_node *node, t_env *env, int in_fd); int eval(t_node *node, t_env *env) { @@ -33,7 +33,7 @@ int eval(t_node *node, t_env *env) } if (pid == 0) { - result = eval_rec(node, env); + result = eval_rec(node, env, STDIN_FILENO); exit(result); } else @@ -43,11 +43,15 @@ int eval(t_node *node, t_env *env) return (result); } -int eval_rec(t_node *node, t_env *env) +static int eval_rec(t_node *node, t_env *env, int in_fd) { pid_t pid; int result; + int p[2]; + result = pipe(p); + if (result == -1) + return (EXIT_FAILURE); if (node->type == PIPE_NODE) { pid = fork(); @@ -57,12 +61,17 @@ int eval_rec(t_node *node, t_env *env) } if (pid == 0) { + close(p[0]); + dup2(in_fd, STDIN_FILENO); + dup2(p[1], STDOUT_FILENO); result = execute_cmd(&node->content.pipe.left->content.cmd, env); exit(result); } else { - result = eval(node->content.pipe.right, env); + close(p[1]); + dup2(p[0], STDIN_FILENO); + result = eval_rec(node->content.pipe.right, env, p[0]); } } else if (node->type == CMD_NODE) |
