/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* exec.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:06:11 by charles #+# #+# */ /* Updated: 2020/04/01 17:06:12 by charles ### ########.fr */ /* */ /* ************************************************************************** */ /* ** \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); }