From 8ec6d94a522b48e991d7f69a66068e21ba84184b Mon Sep 17 00:00:00 2001 From: yosyo Date: Thu, 13 Jun 2024 14:21:45 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=94=A8=E3=80=8D=20fix(get=5Fpath?= =?UTF-8?q?):=20fixed=20algorythm=20for=20better=20performances?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/execution.h | 4 +- src/exec/exec_split_cmd.c | 29 +--------- src/exec/get_path.c | 116 +++++++------------------------------- 3 files changed, 25 insertions(+), 124 deletions(-) diff --git a/include/execution.h b/include/execution.h index f0eb12d..a76f318 100644 --- a/include/execution.h +++ b/include/execution.h @@ -6,7 +6,7 @@ /* By: mmoussou cmd[0] == '.' && cmd->cmd[1] == '/') cmd->cmd = get_cmd_local_path(cmd->cmd, env); else if (cmd->cmd[0] != '/') - cmd->cmd = get_cmd_global_path(cmd->cmd, env); + cmd->cmd = get_path(env_get_value("PATH", env), cmd->cmd); if (!(cmd->cmd)) return (-1); return (0); diff --git a/src/exec/get_path.c b/src/exec/get_path.c index 7c12b2a..b1ee97d 100644 --- a/src/exec/get_path.c +++ b/src/exec/get_path.c @@ -6,123 +6,49 @@ /* By: mmoussou content == NULL) - list_entry->content = abs_path; - else - { - new_list_entry = ft_lstnew(abs_path); - if (!new_list_entry) - return (-1); - ft_lstadd_back(&list_entry, new_list_entry); - } - return (0); -} - -int add_path_to_list(char *path, struct dirent *dir_entry, t_list *list_entry) -{ - char *abs_path; - struct stat entry; - int status; - - abs_path = ft_calloc(sizeof(char), strlen(path) - + strlen(dir_entry->d_name) + 3); + abs_path = ft_strjoin(path, "/"); if (!abs_path) - return (-1); - ft_strlcpy(abs_path, path, ft_strlen(path) + 1); - ft_strlcat(abs_path, "/", ft_strlen(abs_path) + 2); - ft_strlcat(abs_path, dir_entry->d_name, ft_strlen(abs_path) - + ft_strlen(dir_entry->d_name) + 1); - stat(abs_path, &entry); - if (S_ISREG(entry.st_mode) - && (entry.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - { - status = add_element_to_list(list_entry, abs_path); - if (status) - { - free(abs_path); - return (-1); - } - } - return (0); + return (NULL); + abs_path = ft_strjoin_free_s1(abs_path, cmd); + if (!abs_path) + return (NULL); + if (access(abs_path, X_OK) == 0) + return (abs_path); + free(abs_path); + return (NULL); } -int get_path_list(char *path, t_list *list_entry) -{ - DIR *path_dir; - struct dirent *dir_entry; - int status; - - path_dir = opendir(path); - if (!path_dir) - return (-1); - dir_entry = readdir(path_dir); - while (dir_entry) - { - if (!ft_strncmp(dir_entry->d_name, ".", 2) - || !ft_strncmp(dir_entry->d_name, "..", 3)) - { - dir_entry = readdir(path_dir); - continue ; - } - status = add_path_to_list(path, dir_entry, list_entry); - if (status) - closedir(path_dir); - if (status) - return (-1); - dir_entry = readdir(path_dir); - } - closedir(path_dir); - return (0); -} - -char **path_trans_list_to_char(t_list *list_entry) -{ - char **path_list; - int i; - - i = 0; - path_list = ft_calloc(sizeof(char *), ft_lstsize(list_entry) + 1); - if (!path_list) - return (path_list); - while (list_entry) - { - path_list[i] = list_entry->content; - list_entry = list_entry->next; - i++; - } - return (path_list); -} - -char **get_path(char *path) +char *get_path(char *path, char *cmd) { char **path_dir; - char **path_list; - t_list *list_entry; int i; if (!path) return (NULL); - list_entry = ft_lstnew(NULL); path_dir = ft_split(path, ':'); if (!path_dir) return (NULL); i = 0; while (path_dir[i]) { - get_path_list(path_dir[i], list_entry); + path = check_path_access(path_dir[i], cmd); + if (path) + { + ft_free("ac", &path_dir, &cmd); + return (path); + } i++; } - path_list = path_trans_list_to_char(list_entry); - ft_free("al", &path_dir, &list_entry); - return (path_list); + ft_free("ac", &path_dir, &cmd); + return (path); }