/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* connec_pipe_cmd_execute.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/11 12:01:29 by khais #+# #+# */ /* Updated: 2025/04/28 15:04:17 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #include "connec_pipe_cmd_execute.h" #include "../common/do_waitpid.h" #include #include #include "../cmd/cmd_execute.h" static void pipe_do_close(int pipefd[2]) { close(pipefd[0]); close(pipefd[1]); } static void dup_and_close(int fd, int fd2, int pipefd[2]) { dup2(fd, fd2); pipe_do_close(pipefd); } static int do_pipe(int pipefd[2], t_minishell *app) { if (pipe(pipefd) < 0) { perror("minishell: pipe"); app->last_return_value = 2; return (-1); } return (0); } static void close_and_wait(t_minishell *app, int pid1, int pid2, int pipefd[2]) { pipe_do_close(pipefd); do_waitpid(app, pid1); do_waitpid(app, pid2); } void connec_pipe_cmd_execute(t_connec_cmd *cmd, t_minishell *app) { int pid1; int pid2; int pipefd[2]; if (do_pipe(pipefd, app) < 0) return ; pid1 = fork(); if (pid1 == 0) { dup_and_close(pipefd[1], STDOUT_FILENO, pipefd); cmd_execute(cmd->first, app, true); return ; } pid2 = fork(); if (pid2 == 0) { dup_and_close(pipefd[0], STDIN_FILENO, pipefd); cmd_execute(cmd->second, app, true); } else close_and_wait(app, pid1, pid2, pipefd); }