summaryrefslogtreecommitdiffstats
path: root/src/e_externs_next.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/e_externs_next.c')
-rw-r--r--src/e_externs_next.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/e_externs_next.c b/src/e_externs_next.c
new file mode 100644
index 0000000..ba3c2d5
--- /dev/null
+++ b/src/e_externs_next.c
@@ -0,0 +1,105 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* e_externs_next.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */
+/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include <libft.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <stddef.h>
+
+#include "f_fail.h"
+#include "s_destroy.h"
+#include "s_lcom.h"
+#include "s_struct.h"
+
+static char
+ *get_fullpath(const char p_path[],
+ const char d_name[],
+ t_msh *msh)
+{
+ char *fullpath;
+ const size_t path_len = ft_strlen(p_path);
+ const size_t name_len = ft_strlen(d_name);
+
+ if (!(fullpath = (char*)malloc((path_len + name_len + 2) * sizeof(char))))
+ {
+ lcom_clear(&msh->curr);
+ s_destroy(msh);
+ fail_alloc(msh);
+ }
+ (void)ft_memcpy(fullpath, p_path, path_len);
+ *(fullpath + (path_len)) = '/';
+ (void)ft_memcpy(fullpath + path_len + 1, d_name, name_len);
+ *(fullpath + (path_len + name_len + 1)) = '\0';
+ return (fullpath);
+}
+
+char
+ *search_in_path(const char com[],
+ char *envpath[],
+ t_msh *msh)
+{
+ /* TODO: norme */
+ struct dirent *ent;
+ char **p_path;
+ char *fullpath;
+ DIR *dir;
+
+ p_path = envpath;
+ while (*p_path)
+ {
+ if ((dir = opendir(*p_path)) != NULL)
+ {
+ while ((ent = readdir(dir)) != NULL)
+ {
+ /* TODO: check for not bins (dirs, etc) */
+ if (ft_strncmp(com, ent->d_name, ft_strlen(com) + 1) == 0)
+ {
+ fullpath = get_fullpath(*p_path, ent->d_name, msh);
+ closedir(dir);
+ return (fullpath);
+ }
+ }
+ closedir(dir);
+ }
+ p_path++;
+ }
+ return (NULL);
+}
+
+char
+ **get_env_path(t_msh *msh)
+{
+ char **p_env;
+ char **envpath;
+ char *envline;
+
+ p_env = msh->envp;
+ while (*p_env && ft_strncmp("PATH", *p_env, 4) != 0)
+ {
+ p_env++;
+ }
+ if (*p_env == NULL)
+ return (NULL);
+ envline = ft_strchr(*p_env, '=');
+ envline += 1;
+ if (*envline != '\0')
+ {
+ if (!(envpath = ft_split(envline, ':')))
+ {
+ lcom_clear(&msh->curr);
+ s_destroy(msh);
+ fail_alloc(msh);
+ }
+ return (envpath);
+ }
+ return (NULL);
+}