Implement pipes and redirection for builtins
authorLukáš Jiřiště <jiriste@icpf.cas.cz>
Mon, 26 Aug 2024 14:48:02 +0000 (16:48 +0200)
committerLukáš Jiřiště <jiriste@icpf.cas.cz>
Mon, 26 Aug 2024 14:48:02 +0000 (16:48 +0200)
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.

src/execution.c

index e5d6a61e1e4f09503eb8cfcc74db18497d5fd5bf..1e41ab9a8fef2cbd8f926cac51b820beb564803e 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: lnikolov <lnikolov@student.42prague.com    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/07/21 08:57:54 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/08/26 11:50:12 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/08/26 16:47:04 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -639,6 +639,13 @@ int        dup_pipes(const t_execution_env *env)
        return (0);
 }
 
+void   close_pipes(const t_execution_env *env)
+{
+       close(env->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);
 }