summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJozanLeClerc <bousset.rudy@gmail.com>2020-04-23 19:02:13 +0200
committerJozanLeClerc <bousset.rudy@gmail.com>2020-04-23 19:02:13 +0200
commit0d4d084859348ecc41ac2b3997ddc2be984636bd (patch)
treeb023549dec6eed6552f423bb821950de36274973 /src
parentok (diff)
download42-minishell-0d4d084859348ecc41ac2b3997ddc2be984636bd.tar.gz
42-minishell-0d4d084859348ecc41ac2b3997ddc2be984636bd.tar.bz2
42-minishell-0d4d084859348ecc41ac2b3997ddc2be984636bd.tar.xz
42-minishell-0d4d084859348ecc41ac2b3997ddc2be984636bd.tar.zst
42-minishell-0d4d084859348ecc41ac2b3997ddc2be984636bd.zip
Parsed bin path in $PATH, now time to execve(2)
Diffstat (limited to 'src')
-rw-r--r--src/ft_b_builtins.h1
-rw-r--r--src/ft_b_type.c24
-rw-r--r--src/ft_b_type.h22
-rw-r--r--src/ft_d_define.h4
-rw-r--r--src/ft_e_builtins.c4
-rw-r--r--src/ft_e_externs.c55
-rw-r--r--src/ft_e_externs_next.c106
-rw-r--r--src/ft_e_externs_next.h23
-rw-r--r--src/ft_m_funptr.c3
9 files changed, 185 insertions, 57 deletions
diff --git a/src/ft_b_builtins.h b/src/ft_b_builtins.h
index 36e6498..ed76f70 100644
--- a/src/ft_b_builtins.h
+++ b/src/ft_b_builtins.h
@@ -19,6 +19,7 @@
#include "ft_b_exit.h"
#include "ft_b_export.h"
#include "ft_b_pwd.h"
+#include "ft_b_type.h"
#include "ft_b_unset.h"
#endif
diff --git a/src/ft_b_type.c b/src/ft_b_type.c
new file mode 100644
index 0000000..f17ca45
--- /dev/null
+++ b/src/ft_b_type.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_b_type.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 <stdint.h>
+#include "ft_s_struct.h"
+
+uint8_t
+ ft_b_type(char *args[],
+ t_msh *msh)
+{
+ (void)args;
+ (void)msh;
+ /* TODO: do type */
+ return (0);
+}
diff --git a/src/ft_b_type.h b/src/ft_b_type.h
new file mode 100644
index 0000000..c3d5dd6
--- /dev/null
+++ b/src/ft_b_type.h
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_b_type.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* 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 */
+/* */
+/* ************************************************************************** */
+
+#ifndef FT_B_TYPE_H
+#define FT_B_TYPE_H
+
+#include <stdint.h>
+#include "ft_s_struct.h"
+
+uint8_t ft_b_type(char *args[],
+ t_msh *msh);
+
+#endif
diff --git a/src/ft_d_define.h b/src/ft_d_define.h
index 2a8002d..f85fd46 100644
--- a/src/ft_d_define.h
+++ b/src/ft_d_define.h
@@ -20,8 +20,8 @@
*/
#define FT_PS_ONE "minishell ~> "
-#define FT_BUILTINS "echo|cd|pwd|export|unset|env|exit"
-#define FT_BUILTINS_COUNT 7
+#define FT_BUILTINS "echo|cd|pwd|export|unset|env|exit|type"
+#define FT_BUILTINS_COUNT 8
/*
** ====== FAIL MSG ======
diff --git a/src/ft_e_builtins.c b/src/ft_e_builtins.c
index 4f2c551..57ba28b 100644
--- a/src/ft_e_builtins.c
+++ b/src/ft_e_builtins.c
@@ -74,9 +74,7 @@ static void
int32_t status;
while (wait(&status) != pid)
- {
- /* TODO: fix this unnormed syntax */
- }
+ ;
msh->ret = WEXITSTATUS(status);
}
diff --git a/src/ft_e_externs.c b/src/ft_e_externs.c
index 9b226d9..dbbaceb 100644
--- a/src/ft_e_externs.c
+++ b/src/ft_e_externs.c
@@ -11,63 +11,16 @@
/* ************************************************************************** */
#include <libft.h>
-#include <dirent.h>
-#include "ft_f_fail.h"
-#include "ft_s_destroy.h"
-#include "ft_s_lcom.h"
+#include "ft_e_externs_next.h"
#include "ft_s_struct.h"
-static void
- ft_search_in_path(const char *com,
- char **envpath)
-{
- char **p_path;
-
- (void)com;
- p_path = envpath;
- while (*p_path)
- {
- /* TODO: directory(3) */
- /* opendir() | readdir() | closedir() */
- p_path++;
- }
-}
-
-static char
- **ft_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, ':')))
- {
- ft_lcom_clear(&msh->curr);
- ft_s_destroy(msh);
- ft_fail_alloc();
- }
- return (envpath);
- }
- return (NULL);
-}
-
void
ft_e_extern(t_lcom *ptr,
t_msh *msh)
{
char **envpath;
+ char *fullpath;
if (ft_ischarset("/.", ptr->com[0]))
{
@@ -75,8 +28,8 @@ void
}
else if ((envpath = ft_get_env_path(msh)) != NULL)
{
- ft_search_in_path(ptr->com, envpath);
+ fullpath = ft_search_in_path(ptr->com, envpath, msh);
+ /* TODO: exec $PATH stuff */
ft_delwords(envpath);
}
- /* TODO: exec $PATH stuff | initiate all builtins first, even uncomplete */
}
diff --git a/src/ft_e_externs_next.c b/src/ft_e_externs_next.c
new file mode 100644
index 0000000..492d7e5
--- /dev/null
+++ b/src/ft_e_externs_next.c
@@ -0,0 +1,106 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_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 "ft_f_fail.h"
+#include "ft_s_destroy.h"
+#include "ft_s_lcom.h"
+#include "ft_s_struct.h"
+
+static char
+ *ft_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))))
+ {
+ ft_lcom_clear(&msh->curr);
+ ft_s_destroy(msh);
+ ft_fail_alloc();
+ }
+ ft_memcpy(fullpath, p_path, path_len);
+ *(fullpath + (path_len)) = '/';
+ ft_memcpy(fullpath + path_len + 1, d_name, name_len);
+ *(fullpath + (path_len + name_len + 1)) = '\0';
+ return (fullpath);
+}
+
+char
+ *ft_search_in_path(const char *com,
+ char **envpath,
+ t_msh *msh)
+{
+ /* TODO: norme */
+ struct dirent *ent;
+ char **p_path;
+ char *fullpath;
+ DIR *dir;
+
+ (void)com;
+ 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 = ft_get_fullpath(*p_path, ent->d_name, msh);
+ closedir(dir);
+ return (fullpath);
+ }
+ }
+ closedir(dir);
+ }
+ p_path++;
+ }
+ return (NULL);
+}
+
+char
+ **ft_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, ':')))
+ {
+ ft_lcom_clear(&msh->curr);
+ ft_s_destroy(msh);
+ ft_fail_alloc();
+ }
+ return (envpath);
+ }
+ return (NULL);
+}
diff --git a/src/ft_e_externs_next.h b/src/ft_e_externs_next.h
new file mode 100644
index 0000000..e59e10b
--- /dev/null
+++ b/src/ft_e_externs_next.h
@@ -0,0 +1,23 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_e_externs_next.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* 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 */
+/* */
+/* ************************************************************************** */
+
+#ifndef FT_E_EXTERN_NEXT_H
+#define FT_E_EXTERN_NEXT_H
+
+#include "ft_s_struct.h"
+
+char **ft_get_env_path(t_msh *msh);
+char *ft_search_in_path(const char *com,
+ char **envpath,
+ t_msh *msh);
+
+#endif
diff --git a/src/ft_m_funptr.c b/src/ft_m_funptr.c
index 0682a20..de6acd3 100644
--- a/src/ft_m_funptr.c
+++ b/src/ft_m_funptr.c
@@ -28,7 +28,8 @@ void
msh->bu_ptr[4] = ft_b_unset;
msh->bu_ptr[5] = ft_b_env;
msh->bu_ptr[6] = ft_b_exit;
- /* TODO: them builtins */
+ /* TODO: type builtin */
+ /* msh->bu_ptr[7] = ft_b_type; */
if (!(msh->bu_ref = ft_split(FT_BUILTINS, '|')))
{
ft_fail_alloc();