/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* pipe.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/05 18:17:25 by marde-vr #+# #+# */ /* Updated: 2024/03/28 13:18:35 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" void close_pipe_fds(t_msh *msh, int i) { if (i != 0) { if (msh->fds[i - 1][0] > 2) close(msh->fds[i - 1][0]); if (msh->fds[i - 1][1] > 2) close(msh->fds[i - 1][1]); } if (msh->fds[i][0] > 2) close(msh->fds[i][0]); if (msh->fds[i][1] > 2) close(msh->fds[i][1]); } void execute_command(t_msh *msh, char **cmd_args, int i) { char **env; if (msh->cmds->value && (!ft_strcmp(msh->cmds->value, "cd") || !ft_strcmp(msh->cmds->value, "exit") || exec_builtin(msh))) { while (i >= 0) { free(msh->fds[i]); msh->fds[i] = 0; i--; } free(cmd_args); ft_exit(msh, g_return_code); } if (msh->cmds->value) { set_echoctl(msh->echoctl); env = env_to_char_tab(msh->env); execve(msh->cmds->value, cmd_args, env); ft_free_str_arr(env); } } void child(t_msh *msh, char **cmd_args, int i) { if ((msh->in_type != ARG/* && msh->in_type != PIPE*/) || (/*msh->in_type == PIPE &&*/ i > 0)) redirect_input(msh, i); if (/*msh->out_type == PIPE ||*/ msh->out_type == RED_O || msh->out_type == RED_O_APP) redirect_output(msh, i); close_pipe_fds(msh, i); execute_command(msh, cmd_args, i); close(0); close(1); close(2); while (i >= 0) { free(msh->fds[i]); msh->fds[i] = 0; i--; } free(cmd_args); ft_exit(msh, g_return_code); } void parent(t_msh *msh, int i, int cmd_count) { signal(SIGINT, signal_handler_command); signal(SIGQUIT, signal_handler_command); if (i != 0) { if (msh->fds[i - 1][0] > 2) close(msh->fds[i - 1][0]); if (msh->fds[i - 1][1] > 2) close(msh->fds[i - 1][1]); } if (i == cmd_count - 1) { if (msh->fds[i][0] > 2) close(msh->fds[i][0]); if (msh->fds[i][1] > 2) close(msh->fds[i][1]); } if (msh->in_fd > 2) close(msh->in_fd); if (msh->out_fd > 2) close(msh->out_fd); }