diff options
author | JozanLeClerc <bousset.rudy@gmail.com> | 2020-07-27 18:55:07 +0200 |
---|---|---|
committer | JozanLeClerc <bousset.rudy@gmail.com> | 2020-07-27 18:55:07 +0200 |
commit | 487a66394061f2d14a2fa421302966b5442d643f (patch) | |
tree | 34237d4e9cb85f94bcefd46f399d2224dff3f6b3 /src/e_externs_pipes.c | |
parent | Correct shell prompt (diff) | |
download | 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.gz 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.bz2 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.xz 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.zst 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.zip |
I couldn't see shit
Diffstat (limited to 'src/e_externs_pipes.c')
-rw-r--r-- | src/e_externs_pipes.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/e_externs_pipes.c b/src/e_externs_pipes.c new file mode 100644 index 0000000..c8f8404 --- /dev/null +++ b/src/e_externs_pipes.c @@ -0,0 +1,147 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* 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 <errno.h> + +#include "d_define.h" +#include "e_externs_next.h" +#include "f_fail.h" +#include "m_redirs.h" +#include "s_destroy.h" +#include "s_lcom.h" +#include "s_struct.h" + +static void + e_extern_child(const char *fullpath, + t_lcom *ptr, + t_msh *msh) +{ + dup_redirs(ptr, msh); + execve(fullpath, 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 + exec_path(const char *fullpath[], + struct s_lpipes *head, + t_msh *msh) +{ + size_t pipes; + size_t i; + size_t j; + int fd[256][2]; + 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][FT_WRITE_END], STDIN_FILENO); + if (i != pipes) + dup2(fd[i][FT_READ_END], STDOUT_FILENO); + j = 0; + while (j < pipes) + { + close(fd[j][FT_WRITE_END]); + close(fd[j][FT_READ_END]); + j++; + } + e_extern_child(fullpath[i], head->one, msh); + } + head = head->next; + i++; + } + i = 0; + while (i < pipes) + { + close(fd[i][FT_WRITE_END]); + close(fd[i][FT_READ_END]); + i++; + } + /* while (wait(&status) != pid) */ + /* ; */ + /* msh->ret = WEXITSTATUS(status); */ + 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 **envpath; + char **fullpath; + size_t i; + size_t pipes; + + head = ptr; + rptr = ptr; + pipes = e_get_pipes_count(head); + if (!(fullpath = (char **)malloc((pipes + 2) * sizeof(char *)))) + fail_alloc(msh); + fullpath[pipes + 1] = NULL; + i = 0; + while (rptr != NULL) + { + if (ft_ischarset("/.", rptr->one->com[0])) + { + if (!(fullpath[i] = ft_strdup(rptr->one->com))) + fail_alloc(msh); + } + else if ((envpath = get_env_path(msh)) != NULL) + { + fullpath[i] = search_in_path(rptr->one->com, envpath, msh); + ft_delwords(envpath); + } + /* TODO: deal if not found etc */ + i++; + rptr = rptr->next; + } + i = 0; + exec_path((const char**)fullpath, head, msh); + ft_delwords(fullpath); +} |