diff options
Diffstat (limited to 'src/eval/eval.c')
| -rw-r--r-- | src/eval/eval.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/eval/eval.c b/src/eval/eval.c index 9f2fc28..899a880 100644 --- a/src/eval/eval.c +++ b/src/eval/eval.c @@ -6,12 +6,22 @@ /* By: charles <me@cacharle.xyz> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/09/13 20:38:06 by charles #+# #+# */ -/* Updated: 2020/09/15 17:45:58 by charles ### ########.fr */ +/* Updated: 2020/09/15 20:09:43 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "eval.h" +int st_replace(int oldfd, int newfd) +{ + if (oldfd != FD_NONE) + { + dup2(oldfd, newfd); + close(oldfd); + } + return 0; +} + /* ** \brief Wrap a function in a fork ** \param fds fork read/write file descriptors @@ -23,7 +33,7 @@ */ int fork_wrap( - int fds[2], void *passed, t_wrapped_func wrapped, pid_t *child_pid + int fds[2], void *passed, t_wrapped_func wrapped, pid_t *child_pid, int fd_to_close ) { int status; @@ -37,9 +47,12 @@ int fork_wrap( return (EVAL_FATAL); if (*child_pid == 0) { - if ((fds[FD_READ] != FD_NONE && dup2(fds[FD_READ], STDIN_FILENO) == -1) || - (fds[FD_WRITE] != FD_NONE && dup2(fds[FD_WRITE], STDOUT_FILENO) == -1)) + 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); @@ -59,13 +72,13 @@ int fork_wrap( ** \return The last command status or EVAL_FATAL on error */ -int eval(int fds[2], t_env env, t_ast *ast, pid_t *child_pid) +int eval(int fds[2], t_env env, t_ast *ast, pid_t *child_pid, int fd_to_close) { if (ast->tag == AST_PARENT) - return (eval_parenthesis(fds, env, ast)); + return (eval_parenthesis(fds, env, ast, child_pid, fd_to_close)); if (ast->tag == AST_OP) return (eval_operation(fds, env, ast)); if (ast->tag == AST_CMD) - return (eval_cmd(fds, env, ast, child_pid)); + return (eval_cmd(fds, env, ast, child_pid, fd_to_close)); return (EVAL_FATAL); } |
