diff options
Diffstat (limited to '')
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | src/ft_d_define.h | 1 | ||||
-rw-r--r-- | src/ft_e_externs.c | 86 | ||||
-rw-r--r-- | src/ft_e_externs_next.c | 8 | ||||
-rw-r--r-- | src/ft_e_externs_next.h | 4 | ||||
-rw-r--r-- | src/ft_e_lcom.c | 3 |
6 files changed, 95 insertions, 11 deletions
@@ -53,8 +53,6 @@ OBJS = $(patsubst ${SRCS_DIR}%.c,${OBJS_DIR}%.o,${SRCS}) #------------------------------------------------------------------------------# NAME = minishell #------------------------------------------------------------------------------# -HISTFILE = minishell_history -#------------------------------------------------------------------------------# LFT_SRCS = $(shell find ${LFT_SRCS_DIR} -name "*.c") #==============================================================================# #-------------------------------- COMPILER ------------------------------------# @@ -66,8 +64,6 @@ CFLAGS += -Wextra CFLAGS += -Werror CFLAGS += -pedantic #------------------------------------------------------------------------------# -CDEFS = -DFT_HISTFILE=${HISTFILE} -#------------------------------------------------------------------------------# LDFLAGS = -L${LFT_DIR} LDFLAGS += -lft #==============================================================================# diff --git a/src/ft_d_define.h b/src/ft_d_define.h index f85fd46..3a10c58 100644 --- a/src/ft_d_define.h +++ b/src/ft_d_define.h @@ -22,6 +22,7 @@ #define FT_PS_ONE "minishell ~> " #define FT_BUILTINS "echo|cd|pwd|export|unset|env|exit|type" #define FT_BUILTINS_COUNT 8 +#define FT_HISTFILE "minishell_history" /* ** ====== FAIL MSG ====== diff --git a/src/ft_e_externs.c b/src/ft_e_externs.c index dbbaceb..aa67d9a 100644 --- a/src/ft_e_externs.c +++ b/src/ft_e_externs.c @@ -10,10 +10,93 @@ /* */ /* ************************************************************************** */ +#include <sys/wait.h> #include <libft.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include "ft_f_file.h" #include "ft_e_externs_next.h" +#include "ft_s_lcom.h" #include "ft_s_struct.h" +#include "ft_s_destroy.h" + +static void + ft_dup_redirs(const t_lcom *ptr, + t_msh *msh) +{ + int32_t fd; + + if (ptr->redir == -1) + { + if ((fd = open(ptr->rdrpath, O_RDONLY)) == -1) + ft_f_file(ptr->rdrpath, msh); + /* TODO: handle < redir */ + } + if (ptr->redir == 1) + { + if ((fd = open(ptr->rdrpath, + O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1) + ft_f_file(ptr->rdrpath, msh); + dup2(fd, STDOUT_FILENO); + close(fd); + } + if (ptr->redir == 2) + { + if ((fd = open(ptr->rdrpath, + O_CREAT | O_APPEND | O_WRONLY, 0644)) == -1) + ft_f_file(ptr->rdrpath, msh); + dup2(fd, STDOUT_FILENO); + close(fd); + } +} + +static void +ft_e_extern_child(const char *fullpath, + t_lcom *ptr, + t_msh *msh) +{ + int32_t ret; + char arg[2][256]; + + ft_strlcpy(arg[0], "/bin/ls -l", ft_strlen("/bin/ls -l")); + arg[0][2] = '\0'; + arg[1][0] = 0; + (void)fullpath; + (void)ptr; + ft_dup_redirs(ptr, msh); + ret = execve("/bin/ls", (char *const*)arg, msh->envp); + /* TODO: handle execve failed */ + ft_lcom_clear(&msh->curr); + ft_s_destroy(msh); + exit(ret); +} + +static void + ft_exec_path(const char fullpath[], + t_lcom *ptr, + t_msh *msh) +{ + pid_t pid; + int32_t status; + + if ((pid = fork()) == 0) + { + ft_e_extern_child(fullpath, ptr, msh); + } + else if (pid < 0) + { + /* TODO: handle fork failed */ + } + else + { + while (wait(&status) != pid) + ; + msh->ret = WEXITSTATUS(status); + } +} void ft_e_extern(t_lcom *ptr, @@ -32,4 +115,7 @@ void /* TODO: exec $PATH stuff */ ft_delwords(envpath); } + /* TODO: deal if not found etc */ + ft_exec_path(fullpath, ptr, msh); + ft_memdel((void*)&fullpath); } diff --git a/src/ft_e_externs_next.c b/src/ft_e_externs_next.c index 492d7e5..bf1bb38 100644 --- a/src/ft_e_externs_next.c +++ b/src/ft_e_externs_next.c @@ -21,8 +21,8 @@ #include "ft_s_struct.h" static char - *ft_get_fullpath(const char *p_path, - const char *d_name, + *ft_get_fullpath(const char p_path[], + const char d_name[], t_msh *msh) { char *fullpath; @@ -43,8 +43,8 @@ static char } char - *ft_search_in_path(const char *com, - char **envpath, + *ft_search_in_path(const char com[], + char *envpath[], t_msh *msh) { /* TODO: norme */ diff --git a/src/ft_e_externs_next.h b/src/ft_e_externs_next.h index e59e10b..22a37ca 100644 --- a/src/ft_e_externs_next.h +++ b/src/ft_e_externs_next.h @@ -16,8 +16,8 @@ #include "ft_s_struct.h" char **ft_get_env_path(t_msh *msh); -char *ft_search_in_path(const char *com, - char **envpath, +char *ft_search_in_path(const char com[], + char *envpath[], t_msh *msh); #endif diff --git a/src/ft_e_lcom.c b/src/ft_e_lcom.c index a23b32c..6b01dc4 100644 --- a/src/ft_e_lcom.c +++ b/src/ft_e_lcom.c @@ -22,7 +22,8 @@ static uint8_t uint8_t i; i = 0; - while (msh->bu_ref[i] && ft_strncmp(com, msh->bu_ref[i], 7) != 0) + while (msh->bu_ref[i] && ft_strncmp(com, msh->bu_ref[i], + ft_strlen(msh->bu_ref[i]) + 1) != 0) { i++; } |