/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* pipex_bonus.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/20 09:48:45 by erey-bet #+# #+# */ /* Updated: 2023/03/26 21:52:53 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "pipex_bonus.h" void make_cmd(t_data data, int i, int fl1, int fl2) { if (fl1 > 0) dup2(fl1, 0); dup2(fl2, 1); close(data.fd[0][0]); close(data.fd[0][1]); if (i > 0) { close(data.fd[1][0]); close(data.fd[1][1]); } if (data.fd1 > 0) close(data.fd1); if (data.fd2 > 0) close(data.fd2); execve(data.cmds[i], data.flgs[i], data.env); } void choice_cmd(t_data data, int i, int **forks) { if (i == 0) make_cmd(data, 0, data.fd1, data.fd[0][1]); else if (i + 1 < data.argc - 3) make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd[i % 2][1]); else make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd2); write(2, "Error execve\n", 13); free(*forks); free_all(&data); exit(1); } int pipex_loop(int argc, int **forks, t_data data) { int i; i = -1; while (++i < argc - 3) { if (open_close_pipe(&data, 0, i % 2)) return (1); if ((i > 0 || (i == 0 && data.fd1 > 0)) && data.cmds[i]) { (*forks)[i] = fork(); if ((*forks)[i] < 0) return (1); if ((*forks)[i] == 0) choice_cmd(data, i, forks); } if (i > 0) if (open_close_pipe(&data, 1, (i + 1) % 2)) return (1); } return (open_close_pipe(&data, 1, (i + 1) % 2)); } int pipex(int argc, t_data data) { int *forks; int i; forks = ft_calloc(argc - 3, sizeof(int)); if (!forks) return (1); if (pipex_loop(argc, &forks, data)) { free(forks); return (1); } i = -1; while (++i < argc - 3) waitpid(forks[i], NULL, 0); free(forks); return (0); } int main(int argc, char *argv[], char **env) { t_data data; if (argc < 5 || (!ft_strncmp(argv[1], "here_doc", 8) && argc < 6)) { write(2, "Not enought argument\n", 21); return (1); } if (ft_strncmp(argv[1], "here_doc", 8) == 0) { argc = argc - 1; if (here_doc(argc, argv, env, &data)) return (1); } else if (parsing(argc, argv, env, &data)) return (1); if (verification_command(argv, data)) return (free_all(&data)); if (pipex(argc, data)) return (free_all(&data)); free_all(&data); return (0); }