aboutsummaryrefslogtreecommitdiff
path: root/src/eval/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/exec.c')
-rw-r--r--src/eval/exec.c62
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);
+}