/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* e_pipes_next.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ /* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include #include #include #include "e_redirs.h" #include "s_destroy.h" #include "s_line.h" #include "s_lpipes.h" #include "s_struct.h" #include "u_utils.h" #include "u_utils.h" /* ** TODO: handle execve failed */ void e_pipe_child(char *fullpath[], uint8_t pipe_id, t_com *ptr, t_msh *msh) { uint8_t bu_id; uint8_t ret; e_dup_redirs(ptr, msh); if (ft_strncmp(fullpath[pipe_id], "builtin", 8) == 0) { bu_id = u_get_builtin_id(ptr->bin); ret = msh->bu_ptr[bu_id](ptr->argv + 1, msh); u_eof_fd(msh->fd); s_lpipes_clear(&msh->pipes); s_line_clear(&msh->curr); s_destroy(msh); ft_delwords(fullpath); exit(ret); } else execve(fullpath[pipe_id], ptr->argv, msh->envp); } size_t e_get_pipes_count(struct s_lpipes *ptr) { struct s_lpipes *rptr; size_t pipes; rptr = ptr; pipes = 0; while (rptr->next != NULL) { rptr = rptr->next; pipes++; } return (pipes); } void e_close_unused_fds(int32_t fd[256][2], size_t pipes) { size_t i; i = 0; while (i < pipes && i < 255) { close(fd[i][E_WRITE_END]); close(fd[i][E_READ_END]); i++; } }