/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* pipex.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */ /* Updated: 2023/01/30 14:24:01 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "pipex.h" int free_all(t_data *data) { int i; int y; if (data->fd1 > 0 && data->cmds[0]) close(data->fd1); close(data->fd2); y = -1; while (++y < data->argc - 3) { i = -1; while (data->flgs[y][++i]) free(data->flgs[y][i]); free(data->flgs[y]); } free(data->flgs); i = -1; while (++i < data->argc - 3) free(data->cmds[i]); free(data->cmds); return (1); } void make_cmd(t_data data, int i, int fl1, int fl2) { dup2(fl1, 0); dup2(fl2, 1); close(data.fd[0][0]); close(data.fd[0][1]); close(data.fd[1][0]); close(data.fd[1][1]); execve(data.cmds[i], data.flgs[i], data.env); } void cmd(t_data data, int i, int t) { if (t == 0) make_cmd(data, 0, data.fd1, data.fd[0][1]); else if (t == 1) make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd[i % 2][1]); else if (t == 2) make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd2); free_all(&data); exit(1); } int pipex(int argc, t_data data) { int *fk; int i; if (pipe(data.fd[0]) < -1) return (1); if (pipe(data.fd[1]) < -1) return (1); fk = ft_calloc(argc - 3, sizeof(int)); i = -1; while (++i < argc - 3) { fk[i] = fork(); if (fk[i] < 0) return (1); if (fk[i] == 0) { if (i == 0 && data.fd1 > 0 && data.cmds[0]) cmd(data, i, 0); else if (i + 1 < argc - 3) cmd(data, i, 1); else cmd(data, i, 2); } } close(data.fd[0][0]); close(data.fd[0][1]); close(data.fd[1][0]); close(data.fd[1][1]); if (data.fd1 > 0 && data.cmds[0]) waitpid(fk[0], NULL, 0); i = -1; while (++i < argc - 3) waitpid(fk[i], NULL, 0); free(fk); return (0); } int main(int argc, char *argv[], char **env) { t_data data; int i; if (argc < 5) return (1); if (parsing(argc, argv, &data)) return (2); data.argc = argc; i = -1; while (++i < argc - 3) { data.cmds[i] = find_command(env, data.cmds[i]); if (data.cmds[i] == NULL) { print_error(1, argv[2 + i]); if (i == argc - 4) return (free_all(&data)); } } data.env = env; if (pipex(argc, data)) return (free_all(&data)); free_all(&data); return (0); }