/** ** \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); }