/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* u_path.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 #ifdef __linux__ # include #else # include #endif #include "s_struct.h" #include "u_path.h" #include "u_vars.h" static void u_get_fullpath(char fullpath[], const char p_path[], const char d_name[], size_t dstsize) { const size_t path_len = ft_strlen(p_path); const size_t name_len = ft_strlen(d_name); fullpath[0] = C_NUL; if (path_len + name_len < dstsize) { (void)ft_memcpy(fullpath, p_path, path_len * sizeof(char)); *(fullpath + (path_len)) = '/'; (void)ft_memcpy(fullpath + path_len + 1, d_name, name_len * sizeof(char)); *(fullpath + (path_len + name_len + 1)) = '\0'; } } static int8_t u_read_dir(DIR *dir, struct s_path s, const char com[], char fullpath[]) { struct dirent *ent; while ((ent = readdir(dir)) != NULL) { if (ft_strncmp(com, ent->d_name, ft_strlen(com) + 1) == 0) { u_get_fullpath(fullpath, s.tok_path, ent->d_name, s.dstsize); closedir(dir); if (fullpath[0] == C_NUL) return (1); return (0); } } return (-1); } uint8_t u_search_in_path(char fullpath[], const char com[], size_t dstsize, t_msh *msh) { char tmp[ARG_MAX]; struct s_path s; DIR *dir; int8_t ret; if (u_get_var_value(tmp, "$PATH", ARG_MAX, msh) != 0) return (2); s.dstsize = dstsize; s.tok_path = ft_strtok(tmp, ":"); while (s.tok_path != NULL) { if ((dir = opendir(s.tok_path)) != NULL) { ret = u_read_dir(dir, s, com, fullpath); if (ret == 0 || ret == 1) return (ret); closedir(dir); } s.tok_path = ft_strtok(NULL, ":"); } return (2); }