diff options
| -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++;  	}  | 
