diff options
Diffstat (limited to 'src/e_externs_next.c')
-rw-r--r-- | src/e_externs_next.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/e_externs_next.c b/src/e_externs_next.c new file mode 100644 index 0000000..ba3c2d5 --- /dev/null +++ b/src/e_externs_next.c @@ -0,0 +1,105 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* e_externs_next.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 <libft.h> +#include <dirent.h> +#include <stdlib.h> +#include <stddef.h> + +#include "f_fail.h" +#include "s_destroy.h" +#include "s_lcom.h" +#include "s_struct.h" + +static char + *get_fullpath(const char p_path[], + const char d_name[], + t_msh *msh) +{ + char *fullpath; + const size_t path_len = ft_strlen(p_path); + const size_t name_len = ft_strlen(d_name); + + if (!(fullpath = (char*)malloc((path_len + name_len + 2) * sizeof(char)))) + { + lcom_clear(&msh->curr); + s_destroy(msh); + fail_alloc(msh); + } + (void)ft_memcpy(fullpath, p_path, path_len); + *(fullpath + (path_len)) = '/'; + (void)ft_memcpy(fullpath + path_len + 1, d_name, name_len); + *(fullpath + (path_len + name_len + 1)) = '\0'; + return (fullpath); +} + +char + *search_in_path(const char com[], + char *envpath[], + t_msh *msh) +{ + /* TODO: norme */ + struct dirent *ent; + char **p_path; + char *fullpath; + DIR *dir; + + p_path = envpath; + while (*p_path) + { + if ((dir = opendir(*p_path)) != NULL) + { + while ((ent = readdir(dir)) != NULL) + { + /* TODO: check for not bins (dirs, etc) */ + if (ft_strncmp(com, ent->d_name, ft_strlen(com) + 1) == 0) + { + fullpath = get_fullpath(*p_path, ent->d_name, msh); + closedir(dir); + return (fullpath); + } + } + closedir(dir); + } + p_path++; + } + return (NULL); +} + +char + **get_env_path(t_msh *msh) +{ + char **p_env; + char **envpath; + char *envline; + + p_env = msh->envp; + while (*p_env && ft_strncmp("PATH", *p_env, 4) != 0) + { + p_env++; + } + if (*p_env == NULL) + return (NULL); + envline = ft_strchr(*p_env, '='); + envline += 1; + if (*envline != '\0') + { + if (!(envpath = ft_split(envline, ':'))) + { + lcom_clear(&msh->curr); + s_destroy(msh); + fail_alloc(msh); + } + return (envpath); + } + return (NULL); +} |