/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* s_com.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 #ifdef __linux__ # include #else # include #endif #include "d_define.h" #include "f_fail.h" #include "p_args.h" #include "p_lblock.h" #include "p_lblock_next.h" #include "p_subst_alias.h" #include "p_subst_home.h" #include "p_subst_vars.h" #include "p_redirs.h" #include "s_lredir.h" #include "s_struct.h" static char s_fill_com(char *words[], t_com **com) { unsigned long i; unsigned long j; if (words[0] == NULL) return (0); if (((*com)->bin = (char*)malloc((ft_strlen(words[0]) + 1) * sizeof(char))) == NULL) return (-1); ft_strlcpy((*com)->bin, words[0], ft_strlen(words[0]) + 1); i = 0; while (words[i] != NULL) i++; if (((*com)->argv = (char**)malloc((i + 1) * sizeof(char*))) == NULL) return (-1); j = 0; while (i > 0 && j < i) { if (((*com)->argv[j] = ft_strdup(words[j])) == NULL) return (-1); j++; } (*com)->argv[j] = 0; return (0); } static void s_com_cpy_env_fork(t_com **com, t_msh *msh) { size_t i; size_t j; i = 0; while (msh->env_fork_tmp[i][0] != '\0') i++; if (((*com)->env_fork = (char**)malloc((i + 1) * sizeof(char*))) == NULL) f_alloc_and_destroy_msh(msh); j = 0; while (j < i) { if (((*com)->env_fork[j] = ft_strdup(msh->env_fork_tmp[j])) == NULL) f_alloc_and_destroy_msh(msh); j++; } (*com)->env_fork[j] = NULL; } void s_com_destroy(t_com **com) { t_com *ptr; if (*com == NULL) return ; ptr = *com; ft_memdel((void*)&ptr->bin); if (ptr->argv != NULL) ft_delwords(ptr->argv); if (ptr->env_fork != NULL) ft_delwords(ptr->env_fork); if (ptr->rdr != NULL) s_lredir_clear(&ptr->rdr); ft_memdel((void*)&ptr); } static void *s_get_nword(char nword[], char word[], t_com *com, t_msh *msh) { size_t ret; nword[0] = C_NUL; ft_strlcpy(nword, word, ARG_MAX); if (p_redirs(nword, &com, msh) != 0) { msh->ret = 1; ft_memdel((void*)&com); return (NULL); } if (msh->alias != NULL) { ret = p_subst_alias(nword, TRUE, msh); while (ret != 0) ret = p_subst_alias(nword, FALSE, msh); } p_subst_vars(nword, msh); return (nword); } t_com *s_com_new(char word[], t_msh *msh) { char nword[ARG_MAX]; t_com *com; char **words; if ((com = (t_com*)malloc(sizeof(t_com))) == NULL) return (NULL); com->argv = NULL; com->env_fork = NULL; com->bin = NULL; com->rdr = NULL; if (s_get_nword(nword, word, com, msh) == NULL || (words = p_split_args(nword)) == NULL || (words = p_subst_home(words, msh)) == NULL) return (NULL); words = p_check_args_equals(words, msh); if (msh->env_fork_tmp[0][0] != '\0') s_com_cpy_env_fork(&com, msh); if (s_fill_com(words, &com) < 0) { ft_delwords(words); return (NULL); } ft_delwords(words); return (com); }