aboutsummaryrefslogtreecommitdiff
path: root/src/eval/operation.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/operation.c')
-rw-r--r--src/eval/operation.c105
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);
+}