diff options
-rw-r--r-- | src/u_path.c | 62 | ||||
-rw-r--r-- | src/u_path.h | 14 |
2 files changed, 49 insertions, 27 deletions
diff --git a/src/u_path.c b/src/u_path.c index b43946f..5e756a5 100644 --- a/src/u_path.c +++ b/src/u_path.c @@ -16,12 +16,13 @@ #include <limits.h> #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) +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); @@ -29,44 +30,59 @@ static void u_get_fullpath(char fullpath[], fullpath[0] = C_NUL; if (path_len + name_len < dstsize) { - (void)ft_memcpy(fullpath, p_path, path_len); + (void)ft_memcpy(fullpath, p_path, path_len * sizeof(char)); *(fullpath + (path_len)) = '/'; - ft_memcpy(fullpath + path_len + 1, d_name, name_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) { - struct dirent *ent; char tmp[ARG_MAX]; - char *tok_path; + struct s_path s; DIR *dir; + int8_t ret; if (u_get_var_value(tmp, "$PATH", ARG_MAX, msh) != 0) return (1); - tok_path = ft_strtok(tmp, ":"); - while (tok_path != NULL) + s.dstsize = dstsize; + s.tok_path = ft_strtok(tmp, ":"); + while (s.tok_path != NULL) { - if ((dir = opendir(tok_path)) != NULL) + if ((dir = opendir(s.tok_path)) != NULL) { - while ((ent = readdir(dir)) != NULL) - { - if (ft_strncmp(com, ent->d_name, ft_strlen(com) + 1) == 0) - { - u_get_fullpath(fullpath, tok_path, ent->d_name, dstsize); - closedir(dir); - if (fullpath[0] == C_NUL) - return (1); - return (0); - } - } + ret = u_read_dir(dir, s, com, fullpath); + if (ret == 0 || ret == 1) + return (ret); closedir(dir); } - tok_path = ft_strtok(NULL, ":"); + s.tok_path = ft_strtok(NULL, ":"); } return (1); } diff --git a/src/u_path.h b/src/u_path.h index 0c8e256..6224558 100644 --- a/src/u_path.h +++ b/src/u_path.h @@ -10,12 +10,18 @@ /* */ /* ************************************************************************** */ -#ifndef U_PATH_H -#define U_PATH_H +#ifndef FT_U_PATH_H +# define FT_U_PATH_H -#include <stdint.h> +# include <stddef.h> -#include "s_struct.h" +# include "s_struct.h" + +struct s_path +{ + char *tok_path; + size_t dstsize; +}; uint8_t u_search_in_path(char fullpath[], const char com[], |