diff options
Diffstat (limited to 'src/eval/exec.c')
| -rw-r--r-- | src/eval/exec.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/eval/exec.c b/src/eval/exec.c new file mode 100644 index 0000000..1ac9754 --- /dev/null +++ b/src/eval/exec.c @@ -0,0 +1,62 @@ +/** +** \file exec.c +** \brief Executable name and path +*/ + +#include "eval.h" + +/** +** \brief Check if executable name is already a path +** \param exec_name Executable name +** \return True if valid +*/ + +bool exec_is_path(char *exec_name) +{ + return (ft_strncmp(exec_name, "../", 3) == 0 + || ft_strncmp(exec_name, "./", 2) == 0 + || ft_strncmp(exec_name, "/", 1) == 0); +} + +/** +** \brief Check if executable path is valid +** \param exec_path Executable path +** \return True if valid +*/ + +bool exec_is_valid(char *exec_path) +{ + struct stat statbuf; + + if (stat(exec_path, &statbuf) != 0) + return (false); + if (!S_ISREG(statbuf.st_mode)) // also need to manage link + return (false); + // could test permission but probably handled by execve + return (true); +} + +/** +** \brief Search executable name in path +** \param path Path hash table +** \param path_var Path environment string in case we need to update path +** \param exec_name Executable name to search +** \return Executable path or NULL if not found or path update error +*/ + +char *exec_search_path(t_path path, char *path_var, char *exec_name) +{ + char *exec_path; + + if (exec_is_path(exec_name)) + return (exec_name); + // try current first + if ((exec_path = ft_htget(path, exec_name)) == NULL) + { + if (path_update(path, path_var) == NULL) // optimise by not updating not changed path in ht + return (NULL); + if ((exec_path = ft_htget(path, exec_name)) == NULL) + return (NULL); + } + return (exec_path); +} |
