diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/e_externs_pipes.c | 172 | ||||
-rw-r--r-- | src/e_externs_pipes.h | 20 | ||||
-rw-r--r-- | src/e_line.h | 9 | ||||
-rw-r--r-- | src/e_pipes.c | 178 | ||||
-rw-r--r-- | src/e_pipes.h | 6 |
6 files changed, 164 insertions, 223 deletions
@@ -35,7 +35,7 @@ SRCS_NAME += b_type SRCS_NAME += b_unset SRCS_NAME += e_builtins SRCS_NAME += e_externs -SRCS_NAME += e_externs_pipes +# SRCS_NAME += e_externs_pipes SRCS_NAME += e_line SRCS_NAME += e_pipes SRCS_NAME += e_redirs diff --git a/src/e_externs_pipes.c b/src/e_externs_pipes.c deleted file mode 100644 index 86c4f0d..0000000 --- a/src/e_externs_pipes.c +++ /dev/null @@ -1,172 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* e_externs_pipes.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 <sys/wait.h> -#include <libft.h> -#include <stdlib.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> -#include <limits.h> -#include <errno.h> - -#include "d_define.h" -#include "f_fail.h" -#include "e_redirs.h" -#include "s_destroy.h" -#include "s_line.h" -#include "s_lpipes.h" -#include "s_struct.h" -#include "u_path.h" -#include "u_utils.h" - -static 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); - /* TODO: handle execve failed */ -} - -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) - { - rptr = rptr->next; - pipes++; - } - return (pipes); -} - -static void - e_pipe_exec_path(char *fullpath[], - struct s_lpipes *head, - t_msh *msh) -{ - int fd[256][2]; - size_t pipes; - size_t i; - size_t j; - int pid; - int status; - - /* TODO: norm, error mgmnt */ - pipes = e_get_pipes_count(head); - i = 0; - while (i < pipes) - { - pipe(fd[i]); - i++; - } - 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) - { - close(fd[i][E_WRITE_END]); - close(fd[i][E_READ_END]); - i++; - } - waitpid(pid, &status, 0); - msh->ret = WEXITSTATUS(status); -} - -void - e_externs_pipes(struct s_lpipes *ptr, - t_msh *msh) -{ - struct s_lpipes *head; - struct s_lpipes *rptr; - char **fullpath; - char tmp[PATH_MAX]; - size_t i; - size_t pipes; - uint8_t bu_id; - - head = ptr; - rptr = ptr; - pipes = e_get_pipes_count(head); - if ((fullpath = (char **)malloc((pipes + 2) * sizeof(char *))) == NULL) - f_alloc_and_destroy_msh(msh); - fullpath[pipes + 1] = NULL; - 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); - } - } - i++; - rptr = rptr->next; - } - i = 0; - e_pipe_exec_path(fullpath, head, msh); - ft_delwords(fullpath); -} diff --git a/src/e_externs_pipes.h b/src/e_externs_pipes.h deleted file mode 100644 index 6c242fb..0000000 --- a/src/e_externs_pipes.h +++ /dev/null @@ -1,20 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* e_externs_pipes.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 E_EXTERNS_PIPES_H -#define E_EXTERNS_PIPES_H - -#include "s_struct.h" - -void e_externs_pipes(struct s_lpipes *ptr, t_msh *msh); - -#endif diff --git a/src/e_line.h b/src/e_line.h index 02b7714..66b601c 100644 --- a/src/e_line.h +++ b/src/e_line.h @@ -10,11 +10,12 @@ /* */ /* ************************************************************************** */ -#ifndef E_LCOM_H -#define E_LCOM_H +#ifndef FT_E_LCOM_H +# define FT_E_LCOM_H -#include <stdint.h> -#include "s_struct.h" +# include <stdint.h> + +# include "s_struct.h" void e_line(t_msh *msh); diff --git a/src/e_pipes.c b/src/e_pipes.c index a1807d1..7b07789 100644 --- a/src/e_pipes.c +++ b/src/e_pipes.c @@ -10,38 +10,170 @@ /* */ /* ************************************************************************** */ +#include <sys/wait.h> #include <libft.h> +#include <stdlib.h> #include <stdint.h> #include <unistd.h> #include "e_builtins.h" -#include "e_externs_pipes.h" +#include "e_redirs.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" -/* static uint8_t */ -/* get_builtin_id(const char com[], */ -/* t_msh *msh) */ -/* { */ -/* uint8_t i; */ - -/* i = 0; */ -/* while (msh->bu_ref[i] && ft_strncmp(com, msh->bu_ref[i], */ -/* ft_strlen(msh->bu_ref[i]) + 1) != 0) */ -/* { */ -/* i++; */ -/* } */ -/* return (i); */ -/* } */ - -void - e_pipes(t_msh *msh) +/* +** TODO: handle execve failed +*/ + +static 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); +} + +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) + { + rptr = rptr->next; + pipes++; + } + return (pipes); +} + +/* +** TODO: error mgmnt +*/ + +static void e_pipe_exec_path(char *fullpath[], struct s_lpipes *head, t_msh *msh) +{ + int fd[256][2]; + size_t pipes; + size_t i; + size_t j; + int pid; + int status; + + pipes = e_get_pipes_count(head); + i = 0; + while (i < pipes) + { + pipe(fd[i]); + i++; + } + 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) + { + close(fd[i][E_WRITE_END]); + close(fd[i][E_READ_END]); + i++; + } + waitpid(pid, &status, 0); + msh->ret = WEXITSTATUS(status); +} + + + + + + + + +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) + f_alloc_and_destroy_msh(msh); + fullpath[pipes + 1] = NULL; + 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); + } + } + i++; + rptr = rptr->next; + } + return (fullpath); +} + +void e_pipes(t_msh *msh) { - /* uint8_t bu_id; */ + char **fullpath; - /* if ((bu_id = get_builtin_id(ptr->pipes->one->com, msh)) */ - /* < FT_BUILTINS_COUNT) */ - /* e_builtin(ptr->pipes->one, bu_id, msh); */ - e_externs_pipes(msh->pipes, msh); + fullpath = e_get_fullpath(e_get_pipes_count(msh->pipes), msh); + e_pipe_exec_path(fullpath, msh->pipes, msh); + ft_delwords(fullpath); s_lpipes_clear(&msh->pipes); } diff --git a/src/e_pipes.h b/src/e_pipes.h index 2f6c550..c523d4f 100644 --- a/src/e_pipes.h +++ b/src/e_pipes.h @@ -10,10 +10,10 @@ /* */ /* ************************************************************************** */ -#ifndef E_PIPES_H -#define E_PIPES_H +#ifndef FT_E_PIPES_H +# define FT_E_PIPES_H -#include "s_struct.h" +# include "s_struct.h" void e_pipes(t_msh *msh); |