/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* p_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 "d_define.h" #include "p_redirs.h" #include "p_redirs_heredoc.h" #include "s_lredir.h" #include "s_struct.h" #include "s_lredir.h" #include "u_utils.h" #include "u_parse.h" #include "u_vars.h" static void p_append_redir(const char path[], int32_t fd_rdr[], t_com *com, t_msh *msh) { struct s_lredir *new; int32_t fd; int8_t redir; fd = fd_rdr[FD]; redir = fd_rdr[RDR]; new = s_lredir_new(path, fd, redir); if (new == NULL) { return ; } new->heredoc = NULL; if (redir == -2) { new->heredoc = p_get_heredoc(path, msh); } s_lredir_add_back(&com->rdr, new); } static size_t p_get_path(char path[], struct s_rdr_tmp tmp, t_msh *msh) { char h[PATH_MAX]; size_t pos[2]; size_t len[2]; len[1] = 0; tmp.ptr += ft_abs(tmp.redir); tmp.ptr += (tmp.redir == -2 && *tmp.ptr == '-') ? (1) : (0); while (*tmp.ptr != C_NUL && ft_iswhitespace(*tmp.ptr) == TRUE) tmp.ptr++; if (*tmp.ptr == C_TILDE && u_get_var_value(h, "$HOME", PATH_MAX, msh) == 0) { ft_strlcpy(path, h, PATH_MAX); len[1] = ft_strlen(h); tmp.ptr++; } pos[0] = (tmp.ptr - tmp.word); while (*tmp.ptr != C_NUL && ft_iswhitespace(*tmp.ptr) == FALSE && u_is_not_escaped(tmp.word, tmp.ptr) == TRUE) tmp.ptr++; pos[1] = (tmp.ptr - tmp.word); len[0] = (pos[1] - pos[0]); len[0] = ((len[1] + len[0] + 1) > PATH_MAX) ? (PATH_MAX - 1) : (len[0]); ft_strlcpy(path + len[1], tmp.word + pos[0], len[0] + 1); return (pos[1]); } static int32_t p_get_fd(const char word[], char *ptr) { char digit[255]; char *tmp; if (*ptr == '<' || (ptr - word) == 1) return (0); tmp = ptr; tmp -= 1; if (ft_isdigit(*tmp) == FALSE) return (0); while ((tmp - word) > 0 && ft_isdigit(*tmp) == TRUE) tmp--; if ((tmp - word) > 0 && ft_iswhitespace(*tmp) == FALSE) return (0); else { tmp += ((tmp - word) > 0) ? (1) : (0); ft_strlcpy(digit, word + (tmp - word), (ptr - tmp) + 1); } return (ft_atoi(digit)); } static void p_get_redir(char word[], char *ptr, t_com *com, t_msh *msh) { struct s_rdr_tmp tmp; char path[PATH_MAX]; size_t pos[2]; int32_t fd_rdr[2]; pos[0] = 0; if ((fd_rdr[FD] = p_get_fd(word, ptr)) <= 0) fd_rdr[FD] = STDOUT_FILENO; fd_rdr[RDR] = (*ptr == '>') ? (1) : (-1); fd_rdr[RDR] = (fd_rdr[RDR] == 1 && *(ptr + 1) == '>') ? (2) : (fd_rdr[1]); fd_rdr[RDR] = (fd_rdr[RDR] == -1 && *(ptr + 1) == '<') ? (-2) : (fd_rdr[1]); if (fd_rdr[FD] == STDOUT_FILENO) pos[0] = (ptr - word); else pos[0] = (ptr - word) - ft_intlen(fd_rdr[FD]); tmp.word = word; tmp.ptr = ptr; tmp.redir = fd_rdr[RDR]; pos[1] = p_get_path(path, tmp, msh); (void)ft_memmove(word + pos[0], word + pos[1], (ft_strlen(word + pos[1]) + 1) * sizeof(char)); p_append_redir(path, fd_rdr, com, msh); } int8_t p_redirs(char word[], t_com **com, t_msh *msh) { char *ptr; t_quote_mode mode; mode = Q_NONE; ptr = (char *)word; while (*ptr != C_NUL) { if (*ptr == C_DQUOTE) mode = u_meet_dquote(word, ptr, mode); else if (*ptr == C_SQUOTE) mode = u_meet_squote(word, ptr, mode); else if (mode == Q_NONE && (*ptr == '<' || *ptr == '>') == 1) { p_get_redir(word, ptr, *com, msh); ptr = word; } ptr++; } return (0); }