/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* 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 #include "e_redirs.h" #include "e_unshebanged.h" #include "f_fail.h" #include "s_com.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" static void e_fullpath_not_found(t_com *ptr, t_msh *msh) { f_command_not_found(ptr->bin); u_eof_fd(msh->fd); s_com_destroy(&msh->com); s_lpipes_clear(&msh->pipes); s_line_clear(&msh->curr); s_destroy(msh); exit(127); } static void e_exec_child(const char fullpath[], t_com *ptr, t_msh *msh) { if (execve(fullpath, ptr->argv, msh->envp) == -1) { if (errno != ENOEXEC) { f_exec(fullpath, ptr->bin); u_eof_fd(msh->fd); s_com_destroy(&msh->com); s_lpipes_clear(&msh->pipes); s_line_clear(&msh->curr); s_destroy(msh); exit(errno); } e_extern_read_script(fullpath, ptr, msh, FALSE); } } void e_pipe_child(char fullpath[], unsigned char fp_ret, t_com *ptr, t_msh *msh) { unsigned char bu_id; unsigned char ret; e_dup_redirs(ptr, msh); if (ft_strncmp(fullpath, "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_com_destroy(&msh->com); s_lpipes_clear(&msh->pipes); s_line_clear(&msh->curr); s_destroy(msh); exit(ret); } else { if (fp_ret == 2) e_fullpath_not_found(ptr, msh); e_exec_child(fullpath, ptr, msh); } } 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(int 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++; } }