summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/u_path.c62
-rw-r--r--src/u_path.h14
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[],