/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* pipex.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */ /* Updated: 2023/03/21 15:59:11 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "pipex.h" int free_all(t_data *data) { int i; if (data->fd1 > 0) close(data->fd1); if (data->fd2 > 0) close(data->fd2); if (data->flg1) { i = 0; while (data->flg1[i]) free(data->flg1[i++]); free(data->flg1); } if (data->flg2) { i = 0; while (data->flg2[i]) free(data->flg2[i++]); free(data->flg2); } if (data->cmd1) free(data->cmd1); if (data->cmd2) free(data->cmd2); return (1); } void first_cmd(int fd[2], t_data data) { dup2(data.fd1, 0); dup2(fd[1], 1); close(fd[0]); close(fd[1]); if (data.fd2 > 0) close(data.fd2); if (data.fd1 > 0) close(data.fd1); execve(data.cmd1, data.flg1, data.env); free_all(&data); exit(1); } void second_cmd(int fd[2], t_data data) { dup2(fd[0], 0); dup2(data.fd2, 1); close(fd[0]); close(fd[1]); if (data.fd2 > 0) close(data.fd2); if (data.fd1 > 0) close(data.fd1); execve(data.cmd2, data.flg2, data.env); free_all(&data); exit(1); } int pipex(t_data data) { int fd[2]; int f1; int f2; if (pipe(fd) < -1) return (1); if (data.fd1 > -1 && data.cmd1) { f1 = fork(); if (f1 < 0) return (1); if (f1 == 0) first_cmd(fd, data); } f2 = fork(); if (f2 < 0) return (1); if (f2 == 0) second_cmd(fd, data); close(fd[0]); close(fd[1]); if (data.fd1 > 0 && data.cmd1) waitpid(f1, NULL, 0); waitpid(f2, NULL, 0); return (0); } int main(int argc, char *argv[], char **env) { t_data data; if (argc != 5) { write(2, "Bad argument's number\n", 22); return (1); } if (parsing(argv, &data)) return (1); if (finds_commands(argv, env, &data.cmd1, &data.cmd2)) return (free_all(&data)); data.env = env; if (pipex(data)) return (free_all(&data)); free_all(&data); return (0); }