From 8b0cb4d5817c8577e8009b6488cb623c183c2dc6 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Sat, 26 Sep 2020 18:39:36 +0200 Subject: Pretty damn fine --- src/e_builtins.c | 4 +-- src/e_externs.c | 3 +- src/e_externs_pipes.c | 4 +-- src/e_redirs.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/e_redirs.h | 20 ++++++++++++ src/m_redirs.c | 61 ------------------------------------ src/m_redirs.h | 20 ------------ src/p_redirs.c | 18 ++++++++--- src/s_com.c | 2 -- 9 files changed, 125 insertions(+), 92 deletions(-) create mode 100644 src/e_redirs.c create mode 100644 src/e_redirs.h delete mode 100644 src/m_redirs.c delete mode 100644 src/m_redirs.h (limited to 'src') diff --git a/src/e_builtins.c b/src/e_builtins.c index 92af2c3..90f3775 100644 --- a/src/e_builtins.c +++ b/src/e_builtins.c @@ -19,8 +19,8 @@ #include "b_builtins.h" #include "b_export_next.h" #include "b_export_mute.h" +#include "e_redirs.h" #include "m_loop.h" -#include "m_redirs.h" #include "s_com.h" #include "s_destroy.h" #include "s_line.h" @@ -50,7 +50,7 @@ static void if (ptr->env_fork != NULL) e_export_env_fork(ptr, msh); - dup_redirs(ptr, msh); + e_dup_redirs(ptr, msh); ret = 0; if (bu_id == FT_ID_H && msh->fd == STDIN_FILENO) ret = msh->bu_ptr[bu_id](ptr->argv + 1, msh); diff --git a/src/e_externs.c b/src/e_externs.c index 8761986..f4b608c 100644 --- a/src/e_externs.c +++ b/src/e_externs.c @@ -22,7 +22,7 @@ #include "b_export_next.h" #include "d_define.h" #include "f_fail.h" -#include "m_redirs.h" +#include "e_redirs.h" #include "s_com.h" #include "s_destroy.h" #include "s_line.h" @@ -72,6 +72,7 @@ static void { if (ptr->env_fork != NULL) e_export_env_fork(ptr, msh); + e_dup_redirs(ptr, msh); e_extern_child(fullpath, ptr, msh); } else if (pid < 0) diff --git a/src/e_externs_pipes.c b/src/e_externs_pipes.c index ca843d0..64581e4 100644 --- a/src/e_externs_pipes.c +++ b/src/e_externs_pipes.c @@ -21,7 +21,7 @@ #include "d_define.h" #include "f_fail.h" -#include "m_redirs.h" +#include "e_redirs.h" #include "s_destroy.h" #include "s_line.h" #include "s_lpipes.h" @@ -38,7 +38,7 @@ static void uint8_t bu_id; uint8_t ret; - dup_redirs(ptr, msh); + e_dup_redirs(ptr, msh); if (ft_strncmp(fullpath[pipe_id], "builtin", 8) == 0) { bu_id = u_get_builtin_id(ptr->bin); diff --git a/src/e_redirs.c b/src/e_redirs.c new file mode 100644 index 0000000..474e043 --- /dev/null +++ b/src/e_redirs.c @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* e_redirs.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 "f_fail.h" +#include "s_destroy.h" +#include "s_line.h" +#include "s_struct.h" + +static void e_redir_minus_one(struct s_lredir *ptr, t_msh *msh) +{ + int32_t fd; + + if ((fd = open(ptr->path, O_RDONLY)) == -1) + { + f_redir(ptr->path, msh); + return ; + } + dup2(fd, STDIN_FILENO); + close(fd); +} + +static void e_redir_plus_one(struct s_lredir *ptr, t_msh *msh) +{ + int32_t fd; + + if ((fd = open(ptr->path, O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1) + { + f_redir(ptr->path, msh); + return ; + } + dup2(fd, ptr->fd); + close(fd); +} + +static void e_redir_plus_two(struct s_lredir *ptr, t_msh *msh) +{ + int32_t fd; + + if ((fd = open(ptr->path, O_CREAT | O_APPEND | O_WRONLY, 0644)) == -1) + { + f_redir(ptr->path, msh); + return ; + } + dup2(fd, ptr->fd); + close(fd); +} + +void e_dup_redirs(const t_com *com, t_msh *msh) +{ + struct s_lredir *ptr; + + ptr = com->rdr; + while (ptr != NULL) + { + ft_printf("PATH: [%s]; FD: [%d]; RDR: [%hhd]\n", ptr->path, ptr->fd, ptr->redir); + if (ptr->redir == -1) + { + e_redir_minus_one(ptr, msh); + } + else if (ptr->redir == 1) + { + e_redir_plus_one(ptr, msh); + } + else if (ptr->redir == 2) + { + e_redir_plus_two(ptr, msh); + } + ptr = ptr->next; + } +} diff --git a/src/e_redirs.h b/src/e_redirs.h new file mode 100644 index 0000000..7fddea0 --- /dev/null +++ b/src/e_redirs.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* e_redirs.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef M_REDIRS_H +#define M_REDIRS_H + +#include "s_struct.h" + +void e_dup_redirs(const t_com *com, t_msh *msh); + +#endif diff --git a/src/m_redirs.c b/src/m_redirs.c deleted file mode 100644 index 40a6646..0000000 --- a/src/m_redirs.c +++ /dev/null @@ -1,61 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* m_redirs.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 "f_fail.h" -#include "s_destroy.h" -#include "s_line.h" -#include "s_struct.h" - -void dup_redirs(const t_com *ptr, t_msh *msh) -{ - (void)ptr; - (void)msh; - /* int32_t fd; */ - - /* if (ptr->redir == -1) */ - /* { */ - /* if ((fd = open(ptr->rdrpath, O_RDONLY)) == -1) */ - /* { */ - /* f_redir(ptr->rdrpath, msh); */ - /* return ; */ - /* } */ - /* dup2(fd, STDIN_FILENO); */ - /* close(fd); */ - /* } */ - /* else if (ptr->redir == 1) */ - /* { */ - /* if ((fd = open(ptr->rdrpath, */ - /* O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1) */ - /* { */ - /* f_redir(ptr->rdrpath, msh); */ - /* return ; */ - /* } */ - /* dup2(fd, ptr->rdrfd); */ - /* close(fd); */ - /* } */ - /* else if (ptr->redir == 2) */ - /* { */ - /* if ((fd = open(ptr->rdrpath, */ - /* O_CREAT | O_APPEND | O_WRONLY, 0644)) == -1) */ - /* { */ - /* f_redir(ptr->rdrpath, msh); */ - /* return ; */ - /* } */ - /* dup2(fd, ptr->rdrfd); */ - /* close(fd); */ - /* } */ -} diff --git a/src/m_redirs.h b/src/m_redirs.h deleted file mode 100644 index fc33758..0000000 --- a/src/m_redirs.h +++ /dev/null @@ -1,20 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* m_redirs.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: rbousset +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ -/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef M_REDIRS_H -#define M_REDIRS_H - -#include "s_struct.h" - -void dup_redirs(const t_com *ptr, t_msh *msh); - -#endif diff --git a/src/p_redirs.c b/src/p_redirs.c index 3f9e866..cf4cf1d 100644 --- a/src/p_redirs.c +++ b/src/p_redirs.c @@ -13,11 +13,13 @@ #include #include #include +#include #include #include "d_define.h" #include "s_lredir.h" #include "s_struct.h" +#include "s_lredir.h" #include "u_utils.h" #include "u_parse.h" @@ -26,7 +28,15 @@ static void p_append_redir(const char path[], int8_t redir, t_com *com) { - struct s_lredir *rdr; + struct s_lredir *new; + + new = s_lredir_new(path, fd, redir); + if (new == NULL) + { + return ; + } + s_lredir_add_back(&com->rdr, new); + } static size_t p_get_path(char path[], @@ -88,12 +98,12 @@ static int8_t p_get_redir(char word[], char *ptr, t_com *com) pos[0] = 0; pos[1] = 0; - if ((fd = p_get_fd(word, ptr)) < 0) - fd = 0; + if ((fd = p_get_fd(word, ptr)) <= 0) + fd = STDOUT_FILENO; redir = (*ptr == '>') ? (1) : (-1); redir = (redir == 1 && *(ptr + 1) == '>') ? (2) : (redir); redir = (redir == -1 && *(ptr + 1) == '<') ? (-2) : (redir); - if (fd == 0) + if (fd == STDOUT_FILENO) pos[0] = (ptr - word); else pos[0] = (ptr - word) - ft_intlen(fd); diff --git a/src/s_com.c b/src/s_com.c index 45a6304..527829d 100644 --- a/src/s_com.c +++ b/src/s_com.c @@ -109,10 +109,8 @@ t_com com->rdr = NULL; nword[0] = C_NUL; ft_strlcpy(nword, word, ARG_MAX); - ft_printf("BEFORE: [%s]\n", nword); if (p_redirs(nword, &com) != 0) return (NULL); - ft_printf("AFTER: [%s]\n", nword); if (msh->alias != NULL) { ret = p_subst_alias(nword, TRUE, msh); -- cgit v1.2.3