diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/e_pipes.c | 162 | ||||
-rw-r--r-- | src/e_pipes_next.c | 77 | ||||
-rw-r--r-- | src/e_pipes_next.h | 25 |
4 files changed, 168 insertions, 98 deletions
@@ -35,9 +35,9 @@ SRCS_NAME += b_type SRCS_NAME += b_unset SRCS_NAME += e_builtins SRCS_NAME += e_externs -# SRCS_NAME += e_externs_pipes SRCS_NAME += e_line SRCS_NAME += e_pipes +SRCS_NAME += e_pipes_next SRCS_NAME += e_redirs SRCS_NAME += f_alloc SRCS_NAME += f_chdir diff --git a/src/e_pipes.c b/src/e_pipes.c index 7b07789..f9c9f72 100644 --- a/src/e_pipes.c +++ b/src/e_pipes.c @@ -17,101 +17,67 @@ #include <unistd.h> #include "e_builtins.h" -#include "e_redirs.h" +#include "e_pipes_next.h" #include "f_fail.h" -#include "s_destroy.h" -#include "s_line.h" #include "s_lpipes.h" #include "s_struct.h" #include "u_utils.h" #include "u_path.h" /* -** TODO: handle execve failed +** TODO: handle fork() failed, etc */ -static void e_pipe_child(char *fullpath[], - uint8_t pipe_id, - t_com *ptr, - t_msh *msh) +static int32_t e_unroll_pipes(int32_t fd[256][2], + char *fullpath[], + size_t pipes, + t_msh *msh) { - uint8_t bu_id; - uint8_t ret; + struct s_lpipes *head; + int32_t pid; + uint16_t i; - 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); -} - -static 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) + head = msh->pipes; + i = 0; + while (i <= pipes && i < 255) { - rptr = rptr->next; - pipes++; + if ((pid = fork()) == 0) + { + if (i != 0) + dup2(fd[i - 1][E_WRITE_END], STDIN_FILENO); + if (i != pipes) + dup2(fd[i][E_READ_END], STDOUT_FILENO); + e_close_unused_fds(fd, pipes); + e_pipe_child(fullpath, i, head->com, msh); + } + head = head->next; + i++; } - return (pipes); + return (pid); } /* ** TODO: error mgmnt */ -static void e_pipe_exec_path(char *fullpath[], struct s_lpipes *head, t_msh *msh) +static void e_pipe_exec_path(char *fullpath[], + size_t pipes, + t_msh *msh) { - int fd[256][2]; - size_t pipes; - size_t i; - size_t j; - int pid; - int status; + int32_t fd[256][2]; + int32_t pid; + int32_t status; + uint16_t i; - pipes = e_get_pipes_count(head); i = 0; - while (i < pipes) + while (i < pipes && i < 255) { pipe(fd[i]); i++; } + pid = e_unroll_pipes(fd, fullpath, pipes, msh); i = 0; - while (i <= pipes) - { - if ((pid = fork()) == 0) - { - if (i != 0) - dup2(fd[i - 1][E_WRITE_END], STDIN_FILENO); - if (i != pipes) - dup2(fd[i][E_READ_END], STDOUT_FILENO); - j = 0; - while (j < pipes) - { - close(fd[j][E_WRITE_END]); - close(fd[j][E_READ_END]); - j++; - } - e_pipe_child(fullpath, i, head->com, msh); - } - head = head->next; - i++; - } - i = 0; - while (i < pipes) + while (i < pipes && i < 255) { close(fd[i][E_WRITE_END]); close(fd[i][E_READ_END]); @@ -121,20 +87,39 @@ static void e_pipe_exec_path(char *fullpath[], struct s_lpipes *head, t_msh *ms msh->ret = WEXITSTATUS(status); } +static char *e_get_current_path(struct s_lpipes *rptr, t_msh *msh) +{ + char tmp[PATH_MAX]; + char *path; - - - - - + path = NULL; + if (rptr->com->bin != NULL && ft_ischarset("/.", rptr->com->bin[0]) == TRUE) + { + if ((path = ft_strdup(rptr->com->bin)) == NULL) + f_alloc_and_destroy_msh(msh); + } + else + { + if (u_get_builtin_id(rptr->com->bin) < B_BUILTINS_COUNT) + { + if ((path = ft_strdup("builtin")) == NULL) + f_alloc_and_destroy_msh(msh); + } + else + { + u_search_in_path(tmp, rptr->com->bin, PATH_MAX, msh); + if ((path = ft_strdup(tmp)) == NULL) + f_alloc_and_destroy_msh(msh); + } + } + return (path); +} static char **e_get_fullpath(size_t pipes, t_msh *msh) { struct s_lpipes *rptr; - char tmp[PATH_MAX]; char **fullpath; size_t i; - uint8_t bu_id; rptr = msh->pipes; if ((fullpath = (char **)malloc((pipes + 2) * sizeof(char *))) == NULL) @@ -143,25 +128,7 @@ static char **e_get_fullpath(size_t pipes, t_msh *msh) i = 0; while (rptr != NULL) { - if (ft_ischarset("/.", rptr->com->bin[0]) == TRUE) - { - if ((fullpath[i] = ft_strdup(rptr->com->bin)) == NULL) - f_alloc_and_destroy_msh(msh); - } - else - { - if ((bu_id = u_get_builtin_id(rptr->com->bin)) - < B_BUILTINS_COUNT) - { - if ((fullpath[i] = ft_strdup("builtin")) == NULL) - f_alloc_and_destroy_msh(msh); - } - else - { - u_search_in_path(tmp, rptr->com->bin, PATH_MAX, msh); - fullpath[i] = ft_strdup(tmp); - } - } + fullpath[i] = e_get_current_path(rptr, msh); i++; rptr = rptr->next; } @@ -170,10 +137,11 @@ static char **e_get_fullpath(size_t pipes, t_msh *msh) void e_pipes(t_msh *msh) { - char **fullpath; + const size_t pipes = e_get_pipes_count(msh->pipes); + char **fullpath; - fullpath = e_get_fullpath(e_get_pipes_count(msh->pipes), msh); - e_pipe_exec_path(fullpath, msh->pipes, msh); + fullpath = e_get_fullpath(pipes, msh); + e_pipe_exec_path(fullpath, pipes, msh); ft_delwords(fullpath); s_lpipes_clear(&msh->pipes); } diff --git a/src/e_pipes_next.c b/src/e_pipes_next.c new file mode 100644 index 0000000..b3482c3 --- /dev/null +++ b/src/e_pipes_next.c @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* e_pipes_next.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <stdlib.h> +#include <stdint.h> +#include <unistd.h> + +#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++; + } +} diff --git a/src/e_pipes_next.h b/src/e_pipes_next.h new file mode 100644 index 0000000..fe042d6 --- /dev/null +++ b/src/e_pipes_next.h @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* e_pipes_next.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_E_PIPES_NEXT_H +# define FT_E_PIPES_NEXT_H + +# include <stddef.h> +# include <stdint.h> + +# include "s_struct.h" + +void e_pipe_child(char *fullpath[], uint8_t pipe_id, t_com *ptr, t_msh *msh); +size_t e_get_pipes_count(struct s_lpipes *ptr); +void e_close_unused_fds(int32_t fd[256][2], size_t pipes); + +#endif |