/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* interpreter.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: dkaiser #include #include #include #include static int eval_rec(t_node *node, t_env *env, int in_fd); int eval(t_node *node, t_env *env) { pid_t pid; int result; result = 0; pid = fork(); if (pid < 0) { return (EXIT_FAILURE); } if (pid == 0) { result = eval_rec(node, env, STDIN_FILENO); exit(result); } else { waitpid(pid, &result, 0); } return (result); } 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(); if (pid < 0) { return (EXIT_FAILURE); } 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 { close(p[1]); dup2(p[0], STDIN_FILENO); result = eval_rec(node->content.pipe.right, env, p[0]); } } else if (node->type == CMD_NODE) { result = execute_cmd(&node->content.cmd, env); } else { panic(UNREACHABLE); return (EXIT_FAILURE); } return (result); }