/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* pipex.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */ /* Updated: 2023/03/07 17:06:38 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); i = 0; while (data->flg1[i]) free(data->flg1[i++]); free(data->flg1); i = 0; while (data->flg2[i]) free(data->flg2[i++]); free(data->flg2); free(data->cmd1); 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 (2); data.cmd1 = find_command(env, data.cmd1); if (data.cmd1 == NULL) print_error(1, argv[2]); data.cmd2 = find_command(env, data.cmd2); if (data.cmd2 == NULL) { print_error(1, argv[3]); return (free_all(&data)); } data.env = env; if (pipex(data)) return (free_all(&data)); free_all(&data); return (0); }