From: Lukáš Jiřiště Date: Mon, 26 Aug 2024 14:48:02 +0000 (+0200) Subject: Implement pipes and redirection for builtins X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=748542dafc234438ddb42dc022a2a4438f2b8f68;p=42%2Fminishell.git Implement pipes and redirection for builtins The feature is implemented except for error handling. Especially the restoring of STD*_FILENO should be handled and exit the minishell hwne they cannot be reopened. --- diff --git a/src/execution.c b/src/execution.c index e5d6a61..1e41ab9 100644 --- a/src/execution.c +++ b/src/execution.c @@ -6,7 +6,7 @@ /* By: lnikolov stdin_fd); + close(env->stdout_fd); + return ; +} + int dup_redirections(__attribute__((unused)) const t_vec *redirections) { size_t i; @@ -655,6 +662,21 @@ int dup_redirections(__attribute__((unused)) const t_vec *redirections) return (0); } +void close_redirections(const t_vec *redirections) +{ + size_t i; + const t_redirection *redir; + + i = 0; + while (i < redirections->size) + { + redir = ft_vec_caccess(redirections, i); + close(redir->from_to_fds[0]); + ++i; + } + return ; +} + int add_exported(__attribute__((unused)) t_vec *assignments, __attribute__((unused)) const t_execution_env *env) { size_t i; @@ -700,8 +722,48 @@ size_t count_fields(char **fields) return (i); } +int save_std_filenos(int fds[3]) +{ + fds[0] = dup(STDIN_FILENO); + if (fds[0] < 0) + return (1); + fds[1] = dup(STDIN_FILENO); + if (fds[1] < 0) + { + close(fds[0]); + return (1); + } + fds[2] = dup(STDIN_FILENO); + if (fds[2] < 0) + { + close(fds[0]); + close(fds[1]); + return (1); + } + return (0); +} + +int restore_std_filenos(int fds[3]) +{ + if (dup2(fds[0], STDIN_FILENO) == -1) + return (1); + if (dup2(fds[1], STDOUT_FILENO) == -1) + return (1); + if (dup2(fds[2], STDERR_FILENO) == -1) + return (1); + close(fds[0]); + close(fds[1]); + close(fds[2]); + return (0); +} + int ex_builtin(char **fields, __attribute__((unused)) t_vec *assignments, __attribute__((unused)) const t_vec *redirections, t_execution_env *env) { + int fds[3]; + + save_std_filenos(fds); + dup_pipes(env); + dup_redirections(redirections); if (!ft_strcmp(fields[0], "cd")) env->ret_val = cd(count_fields(fields), fields, env); else if (!ft_strcmp(fields[0], "echo")) @@ -715,7 +777,10 @@ int ex_builtin(char **fields, __attribute__((unused)) t_vec *assignments, __attr else if (!ft_strcmp(fields[0], "unset")) env->ret_val = unset(count_fields(fields), fields, env); else - return (-1); + return (1); + close_redirections(redirections); + close_pipes(env); + restore_std_filenos(fds); return (0); }