diff options
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | src/ft_e_builtin.c | 93 | ||||
| -rw-r--r-- | src/ft_e_builtin.h | 23 | ||||
| -rw-r--r-- | src/ft_e_lcom.c | 76 | ||||
| -rw-r--r-- | src/ft_p_lcom.c | 1 | 
5 files changed, 119 insertions, 75 deletions
| @@ -19,6 +19,7 @@ SRCS_NAME		+= ft_b_echo.c  SRCS_NAME		+= ft_b_env.c  SRCS_NAME		+= ft_b_exit.c  SRCS_NAME		+= ft_b_export.c +SRCS_NAME		+= ft_e_builtin.c  SRCS_NAME		+= ft_e_lcom.c  SRCS_NAME		+= ft_f_fail.c  SRCS_NAME		+= ft_m_funptr.c diff --git a/src/ft_e_builtin.c b/src/ft_e_builtin.c new file mode 100644 index 0000000..dada893 --- /dev/null +++ b/src/ft_e_builtin.c @@ -0,0 +1,93 @@ +/* ************************************************************************** */ +/*                                                                            */ +/*                                                        :::      ::::::::   */ +/*   ft_e_builtin.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 <stdlib.h> +#include <stdint.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/wait.h> +#include <errno.h> +#include "ft_s_destroy.h" +#include "ft_s_lcom.h" +#include "ft_s_struct.h" + +void +	ft_e_builtin(const t_lcom *ptr, +				uint8_t bu_id, +				t_msh *msh) +{ +	int32_t	fd; +	int32_t	status; +	int32_t	ret; +	pid_t	pid; + +	/* TODO: handle exit | bu_id = 6 */ +	if ((pid = fork()) == 0) +	{ +		if (ptr->redir == -1) +		{ +			if (ptr->redir == -1 && (fd = open(ptr->rdrpath, O_RDONLY)) == -1) +			{ +				if (errno == ENOENT) +					ft_dprintf(STDERR_FILENO, +					"minishell: %s: No such file or directory\n", ptr->rdrpath); +				else if (errno == EACCES) +					ft_dprintf(STDERR_FILENO, +					"minishell: %s: Permission denied\n", ptr->rdrpath); +			} +		} +		else if (ptr->redir == 1) +		{ +			if ((fd = open(ptr->rdrpath, +						   O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1) +			{ +				/* TODO: handle err with errno */ +				if (errno == EACCES) +					ft_dprintf(STDERR_FILENO, +					   "minishell: %s: Permission denied\n", ptr->rdrpath); +			} +			dup2(fd, STDOUT_FILENO); +			close(fd); +		} +		else if (ptr->redir == 2) +		{ +			if ((fd = open(ptr->rdrpath, +						   O_CREAT | O_APPEND | O_WRONLY, 0644)) == -1) +			{ +				/* TODO: handle err with errno */ +				if (errno == EACCES) +					ft_dprintf(STDERR_FILENO, +						"minishell: %s: Permission denied\n", ptr->rdrpath); +			} +			dup2(fd, STDOUT_FILENO); +			close(fd); +		} +		msh->ret = msh->bu_ptr[bu_id](ptr->args, msh); +		ret = msh->ret; +		ft_lcom_clear(&msh->curr); +		ft_s_destroy(msh); +		exit(ret); +	} +	else if (pid < 0) +	{ +		/* TODO: handle fork failed */ +	} +	else +	{ +		while (wait(&status) != pid) +		{ +			/* TODO: fix this unnormed syntax */ +		} +		msh->ret = status; +	} +} diff --git a/src/ft_e_builtin.h b/src/ft_e_builtin.h new file mode 100644 index 0000000..45dad81 --- /dev/null +++ b/src/ft_e_builtin.h @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/*                                                                            */ +/*                                                        :::      ::::::::   */ +/*   ft_e_builtin.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_BUILTIN_H +#define FT_E_BUILTIN_H + +#include <stdint.h> +#include "ft_s_struct.h" + +void	ft_e_builtin(const t_lcom *ptr, +					uint8_t bu_id, +					t_msh *msh); + +#endif diff --git a/src/ft_e_lcom.c b/src/ft_e_lcom.c index 51c183a..b535813 100644 --- a/src/ft_e_lcom.c +++ b/src/ft_e_lcom.c @@ -11,15 +11,7 @@  /* ************************************************************************** */  #include <libft.h> -#include <stdint.h> -#include <stdlib.h> -#include <fcntl.h> -#include <unistd.h> -#include <signal.h> -#include <sys/wait.h> -#include <errno.h> -#include "ft_s_destroy.h" -#include "ft_s_lcom.h" +#include "ft_e_builtin.h"  #include "ft_s_struct.h"  static uint8_t @@ -42,11 +34,7 @@ uint8_t  {  	/* TODO: norme */  	t_lcom	*ptr; -	int32_t	fd; -	int32_t	status; -	int32_t	ret;  	uint8_t	bu_id; -	pid_t	pid;  	ptr = msh->curr;  	while (ptr != NULL) @@ -54,67 +42,7 @@ uint8_t  		if ((bu_id = ft_get_builtin_id(ptr->com, msh))  			< FT_BUILTINS_COUNT)  		{ -			/* TODO: handle exit | bu_id = 6 */ -			if ((pid = fork()) == 0) -			{ -				if (ptr->redir == -1) -				{ -					if (ptr->redir == -1 && (fd = open(ptr->rdrpath, O_RDONLY)) == -1) -					{ -						if (errno == ENOENT) -							ft_dprintf(STDERR_FILENO, -								"minishell: %s: No such file or directory\n", ptr->rdrpath); -						else if (errno == EACCES) -							ft_dprintf(STDERR_FILENO, -								"minishell: %s: Permission denied\n", ptr->rdrpath); -					} -				} -				else if (ptr->redir == 1) -				{ -					if ((fd = open(ptr->rdrpath, -						O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1) -					{ -						/* TODO: handle err with errno */ -						if (errno == EACCES) -							ft_dprintf(STDERR_FILENO, -								"minishell: %s: Permission denied\n", -								ptr->rdrpath); -					} -					dup2(fd, STDOUT_FILENO); -					close(fd); -				} -				else if (ptr->redir == 2) -				{ -					if ((fd = open(ptr->rdrpath, -						O_CREAT | O_APPEND | O_WRONLY, 0644)) == -1) -					{ -						/* TODO: handle err with errno */ -						if (errno == EACCES) -							ft_dprintf(STDERR_FILENO, -								"minishell: %s: Permission denied\n", -								ptr->rdrpath); -					} -					dup2(fd, STDOUT_FILENO); -					close(fd); -				} -				msh->ret = msh->bu_ptr[bu_id](ptr->args, msh); -				ret = msh->ret; -				ft_lcom_clear(&msh->curr); -				ft_s_destroy(msh); -				exit(ret); -			} -			else if (pid < 0) -			{ -				/* TODO: handle fork failed */ -			} -			else -			{ -				while (wait(&status) != pid) -				{ -					/* TODO: fix this unnormed syntax */ -				} -				msh->ret = status; -			} +			ft_e_builtin(ptr, bu_id, msh);  		}  		else  		{ diff --git a/src/ft_p_lcom.c b/src/ft_p_lcom.c index b5fdc85..7a19bd6 100644 --- a/src/ft_p_lcom.c +++ b/src/ft_p_lcom.c @@ -58,7 +58,6 @@ static int8_t  		ptr++;  	}  	*p_rdrpath = '\0'; -	ft_printf("[%s]\n", (*link)->rdrpath);  	return (0);  } | 
