diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2020-10-06 15:57:29 +0200 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2020-10-06 15:57:29 +0200 |
| commit | 54394620893f7245c7697a57d724d430d06b57d1 (patch) | |
| tree | 8e51b671bcb2cdba4306165eaba39cc1f99f1cf4 /src/eval/operation.c | |
| parent | 930bb63605984abeda8c887a6333109c004d3b00 (diff) | |
| download | minishell-54394620893f7245c7697a57d724d430d06b57d1.tar.gz minishell-54394620893f7245c7697a57d724d430d06b57d1.tar.bz2 minishell-54394620893f7245c7697a57d724d430d06b57d1.zip | |
Added pipeline ast and pipeline evaluation (not working when first command is infinite)
Diffstat (limited to 'src/eval/operation.c')
| -rw-r--r-- | src/eval/operation.c | 105 |
1 files changed, 69 insertions, 36 deletions
diff --git a/src/eval/operation.c b/src/eval/operation.c index fbdf5bb..a54b657 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/09/15 20:30:27 by charles ### ########.fr */ +/* Updated: 2020/10/06 15:53:12 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,51 +17,84 @@ int eval_operation(int fds[2], t_env env, t_ast *ast) int status; int left_fds[2]; int right_fds[2]; - int p[2]; left_fds[FD_READ] = fds[FD_READ]; left_fds[FD_WRITE] = FD_NONE; right_fds[FD_READ] = FD_NONE; right_fds[FD_WRITE] = fds[FD_WRITE]; - if (ast->op.sep == TAG_PIPE) - { - pipe(p); - left_fds[FD_WRITE] = p[FD_WRITE]; - right_fds[FD_READ] = p[FD_READ]; - - pid_t left_pid; - pid_t right_pid; - - /* left_pid = fork(); */ - /* if (left_pid != 0) */ - /* { */ - /* dup2(p[FD_WRITE], STDOUT_FILENO); */ - /* close(p[FD_READ]); */ - /* exit(eval(left_fds, env, ast->op.left, NULL)); */ - /* } */ - /* */ - /* right_pid = fork(); */ - /* if (right_pid != 0) */ - /* { */ - /* dup2(p[FD_READ], STDIN_FILENO); */ - /* close(p[FD_WRITE]); */ - /* exit(eval(right_fds, env, ast->op.right, NULL)); */ - /* } */ - eval(left_fds, env, ast->op.left, &left_pid, p[FD_READ]); - close(p[FD_WRITE]); - status = eval(right_fds, env, ast->op.right, &right_pid, p[FD_WRITE]); - close(p[FD_READ]); - - wait(&left_pid); - wait(&left_pid); - return (status); - } if ((status = eval(left_fds, env, ast->op.left, NULL, FD_NONE)) == EVAL_FATAL) return (EVAL_FATAL); g_state.last_status = status; if ((ast->op.sep == TAG_AND && status != 0) || - (ast->op.sep == TAG_PIPE && status != 0) || (ast->op.sep == TAG_OR && status == 0)) return (status); return (eval(right_fds, env, ast->op.right, NULL, FD_NONE)); } + +/* pid_t run_piped_child(t_env env, t_ast *ast, int copied, int closed) */ +/* { */ +/* pid_t pid; */ +/* int fds[2]; */ +/* */ +/* pid = fork(); */ +/* if (pid == 0) */ +/* { */ +/* dup2(copied, STDOUT_FILENO); */ +/* close(closed); */ +/* fds[0] = FD_NONE; */ +/* fds[1] = FD_NONE; */ +/* exit(eval(fds, env, ast, NULL, FD_NONE)); */ +/* } */ +/* return (pid); */ +/* } */ + +int eval_pipeline(int fds[2], t_env env, t_ast *ast) +{ + t_ftlst *curr; + /* t_ftvec *pids; */ + int p[2]; + int prev_output; + + /* pids = ft_vecnew(16); */ + + prev_output = STDIN_FILENO; + curr = ast->pipeline; + + + // create pipe + // fork + // dup2 pipe write -> stdout + // dup2 prev_output -> stdin + + while (curr->next != NULL) + { + pipe(p); + + int pid = fork(); + if (pid == 0) + { + dup2(p[FD_WRITE], STDOUT_FILENO); + if (prev_output != STDIN_FILENO) + dup2(prev_output, STDIN_FILENO); + close(p[FD_READ]); + exit(eval(fds, env, curr->data, NULL, FD_NONE)); + } + close(p[FD_WRITE]); + prev_output = p[FD_READ]; + curr = curr->next; + } + + int pid = fork(); + if (pid == 0) + { + /* dup2(p[FD_WRITE], STDOUT_FILENO); */ + if (prev_output != STDIN_FILENO) + dup2(prev_output, STDIN_FILENO); + close(p[FD_WRITE]); + exit(eval(fds, env, curr->data, NULL, FD_NONE)); + } + + while (wait(NULL) != -1) + ; + return (0); +} |
