diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/e_externs_pipes.c | 172 | ||||
| -rw-r--r-- | src/e_externs_pipes.h | 20 | ||||
| -rw-r--r-- | src/e_line.h | 9 | ||||
| -rw-r--r-- | src/e_pipes.c | 178 | ||||
| -rw-r--r-- | src/e_pipes.h | 6 | 
5 files changed, 163 insertions, 222 deletions
| diff --git a/src/e_externs_pipes.c b/src/e_externs_pipes.c deleted file mode 100644 index 86c4f0d..0000000 --- a/src/e_externs_pipes.c +++ /dev/null @@ -1,172 +0,0 @@ -/* ************************************************************************** */ -/*                                                                            */ -/*                                                        :::      ::::::::   */ -/*   e_externs_pipes.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 <sys/wait.h> -#include <libft.h> -#include <stdlib.h> -#include <stdint.h> -#include <unistd.h> -#include <string.h> -#include <limits.h> -#include <errno.h> - -#include "d_define.h" -#include "f_fail.h" -#include "e_redirs.h" -#include "s_destroy.h" -#include "s_line.h" -#include "s_lpipes.h" -#include "s_struct.h" -#include "u_path.h" -#include "u_utils.h" - -static void -	e_pipe_child(char *fullpath[], -				uint8_t pipe_id, -				t_com *ptr, -				t_msh *msh) -{ -	uint8_t	bu_id; -	uint8_t	ret; - -	e_dup_redirs(ptr, msh); -	if (ft_strncmp(fullpath[pipe_id], "builtin", 8) == 0) -	{ -		bu_id = u_get_builtin_id(ptr->bin); -		ret = msh->bu_ptr[bu_id](ptr->argv + 1, msh); -		u_eof_fd(msh->fd); -		s_lpipes_clear(&msh->pipes); -		s_line_clear(&msh->curr); -		s_destroy(msh); -		ft_delwords(fullpath); -		exit(ret); -	} -	else -		execve(fullpath[pipe_id], ptr->argv, msh->envp); -	/* TODO: handle execve failed */ -} - -static size_t -	e_get_pipes_count(struct s_lpipes *ptr) -{ -	struct s_lpipes	*rptr; -	size_t			pipes; - -	rptr = ptr; -	pipes = 0; -	while (rptr->next != NULL) -	{ -		rptr = rptr->next; -		pipes++; -	} -	return (pipes); -} - -static void -	e_pipe_exec_path(char *fullpath[], -			struct s_lpipes *head, -			t_msh *msh) -{ -	int				fd[256][2]; -	size_t			pipes; -	size_t			i; -	size_t			j; -	int				pid; -	int				status; - -	/* TODO: norm, error mgmnt */ -	pipes = e_get_pipes_count(head); -	i = 0; -	while (i < pipes) -	{ -		pipe(fd[i]); -		i++; -	} -	i = 0; -	while (i <= pipes) -	{ -		if ((pid = fork()) == 0) -		{ -			if (i != 0) -				dup2(fd[i - 1][E_WRITE_END], STDIN_FILENO); -			if (i != pipes) -				dup2(fd[i][E_READ_END], STDOUT_FILENO); -			j = 0; -			while (j < pipes) -			{ -				close(fd[j][E_WRITE_END]); -				close(fd[j][E_READ_END]); -				j++; -			} -			e_pipe_child(fullpath, i, head->com, msh); -		} -		head = head->next; -		i++; -	} -	i = 0; -	while (i < pipes) -	{ -		close(fd[i][E_WRITE_END]); -		close(fd[i][E_READ_END]); -		i++; -	} -	waitpid(pid, &status, 0); -	msh->ret = WEXITSTATUS(status); -} - -void -	e_externs_pipes(struct s_lpipes *ptr, -					t_msh *msh) -{ -	struct s_lpipes	*head; -	struct s_lpipes	*rptr; -	char			**fullpath; -	char			tmp[PATH_MAX]; -	size_t			i; -	size_t			pipes; -	uint8_t			bu_id; - -	head = ptr; -	rptr = ptr; -	pipes = e_get_pipes_count(head); -	if ((fullpath = (char **)malloc((pipes + 2) * sizeof(char *))) == NULL) -		f_alloc_and_destroy_msh(msh); -	fullpath[pipes + 1] = NULL; -	i = 0; -	while (rptr != NULL) -	{ -		if (ft_ischarset("/.", rptr->com->bin[0]) == TRUE) -		{ -			if ((fullpath[i] = ft_strdup(rptr->com->bin)) == NULL) -				f_alloc_and_destroy_msh(msh); -		} -		else -		{ -			if ((bu_id = u_get_builtin_id(rptr->com->bin)) -				< B_BUILTINS_COUNT) -			{ -				if ((fullpath[i] = ft_strdup("builtin")) == NULL) -					f_alloc_and_destroy_msh(msh); -			} -			else -			{ -				u_search_in_path(tmp, rptr->com->bin, PATH_MAX, msh); -				fullpath[i] = ft_strdup(tmp); -			} -		} -		i++; -		rptr = rptr->next; -	} -	i = 0; -	e_pipe_exec_path(fullpath, head, msh); -	ft_delwords(fullpath); -} diff --git a/src/e_externs_pipes.h b/src/e_externs_pipes.h deleted file mode 100644 index 6c242fb..0000000 --- a/src/e_externs_pipes.h +++ /dev/null @@ -1,20 +0,0 @@ -/* ************************************************************************** */ -/*                                                                            */ -/*                                                        :::      ::::::::   */ -/*   e_externs_pipes.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 E_EXTERNS_PIPES_H -#define E_EXTERNS_PIPES_H - -#include "s_struct.h" - -void	e_externs_pipes(struct s_lpipes *ptr, t_msh *msh); - -#endif diff --git a/src/e_line.h b/src/e_line.h index 02b7714..66b601c 100644 --- a/src/e_line.h +++ b/src/e_line.h @@ -10,11 +10,12 @@  /*                                                                            */  /* ************************************************************************** */ -#ifndef E_LCOM_H -#define E_LCOM_H +#ifndef FT_E_LCOM_H +# define FT_E_LCOM_H -#include <stdint.h> -#include "s_struct.h" +# include <stdint.h> + +# include "s_struct.h"  void	e_line(t_msh *msh); diff --git a/src/e_pipes.c b/src/e_pipes.c index a1807d1..7b07789 100644 --- a/src/e_pipes.c +++ b/src/e_pipes.c @@ -10,38 +10,170 @@  /*                                                                            */  /* ************************************************************************** */ +#include <sys/wait.h>  #include <libft.h> +#include <stdlib.h>  #include <stdint.h>  #include <unistd.h>  #include "e_builtins.h" -#include "e_externs_pipes.h" +#include "e_redirs.h" +#include "f_fail.h" +#include "s_destroy.h" +#include "s_line.h"  #include "s_lpipes.h"  #include "s_struct.h" +#include "u_utils.h" +#include "u_path.h" -/* static uint8_t */ -/* 	get_builtin_id(const char com[], */ -/* 				t_msh *msh) */ -/* { */ -/* 	uint8_t	i; */ - -/* 	i = 0; */ -/* 	while (msh->bu_ref[i] && ft_strncmp(com, msh->bu_ref[i], */ -/* 		ft_strlen(msh->bu_ref[i]) + 1) != 0) */ -/* 	{ */ -/* 		i++; */ -/* 	} */ -/* 	return (i); */ -/* } */ - -void -	e_pipes(t_msh *msh) +/* +** TODO: handle execve failed +*/ + +static void		e_pipe_child(char *fullpath[], +						uint8_t pipe_id, +						t_com *ptr, +						t_msh *msh) +{ +	uint8_t	bu_id; +	uint8_t	ret; + +	e_dup_redirs(ptr, msh); +	if (ft_strncmp(fullpath[pipe_id], "builtin", 8) == 0) +	{ +		bu_id = u_get_builtin_id(ptr->bin); +		ret = msh->bu_ptr[bu_id](ptr->argv + 1, msh); +		u_eof_fd(msh->fd); +		s_lpipes_clear(&msh->pipes); +		s_line_clear(&msh->curr); +		s_destroy(msh); +		ft_delwords(fullpath); +		exit(ret); +	} +	else +		execve(fullpath[pipe_id], ptr->argv, msh->envp); +} + +static size_t	e_get_pipes_count(struct s_lpipes *ptr) +{ +	struct s_lpipes	*rptr; +	size_t			pipes; + +	rptr = ptr; +	pipes = 0; +	while (rptr->next != NULL) +	{ +		rptr = rptr->next; +		pipes++; +	} +	return (pipes); +} + +/* +** TODO: error mgmnt +*/ + +static void		e_pipe_exec_path(char *fullpath[], struct s_lpipes *head, t_msh *msh) +{ +	int				fd[256][2]; +	size_t			pipes; +	size_t			i; +	size_t			j; +	int				pid; +	int				status; + +	pipes = e_get_pipes_count(head); +	i = 0; +	while (i < pipes) +	{ +		pipe(fd[i]); +		i++; +	} +	i = 0; +	while (i <= pipes) +	{ +		if ((pid = fork()) == 0) +		{ +			if (i != 0) +				dup2(fd[i - 1][E_WRITE_END], STDIN_FILENO); +			if (i != pipes) +				dup2(fd[i][E_READ_END], STDOUT_FILENO); +			j = 0; +			while (j < pipes) +			{ +				close(fd[j][E_WRITE_END]); +				close(fd[j][E_READ_END]); +				j++; +			} +			e_pipe_child(fullpath, i, head->com, msh); +		} +		head = head->next; +		i++; +	} +	i = 0; +	while (i < pipes) +	{ +		close(fd[i][E_WRITE_END]); +		close(fd[i][E_READ_END]); +		i++; +	} +	waitpid(pid, &status, 0); +	msh->ret = WEXITSTATUS(status); +} + + + + + + + + +static char	**e_get_fullpath(size_t pipes, t_msh *msh) +{ +	struct s_lpipes	*rptr; +	char			tmp[PATH_MAX]; +	char			**fullpath; +	size_t			i; +	uint8_t			bu_id; + +	rptr = msh->pipes; +	if ((fullpath = (char **)malloc((pipes + 2) * sizeof(char *))) == NULL) +		f_alloc_and_destroy_msh(msh); +	fullpath[pipes + 1] = NULL; +	i = 0; +	while (rptr != NULL) +	{ +		if (ft_ischarset("/.", rptr->com->bin[0]) == TRUE) +		{ +			if ((fullpath[i] = ft_strdup(rptr->com->bin)) == NULL) +				f_alloc_and_destroy_msh(msh); +		} +		else +		{ +			if ((bu_id = u_get_builtin_id(rptr->com->bin)) +				< B_BUILTINS_COUNT) +			{ +				if ((fullpath[i] = ft_strdup("builtin")) == NULL) +					f_alloc_and_destroy_msh(msh); +			} +			else +			{ +				u_search_in_path(tmp, rptr->com->bin, PATH_MAX, msh); +				fullpath[i] = ft_strdup(tmp); +			} +		} +		i++; +		rptr = rptr->next; +	} +	return (fullpath); +} + +void		e_pipes(t_msh *msh)  { -	/* uint8_t	bu_id; */ +	char	**fullpath; -	/* if ((bu_id = get_builtin_id(ptr->pipes->one->com, msh)) */ -	/* 	< FT_BUILTINS_COUNT) */ -	/* 	e_builtin(ptr->pipes->one, bu_id, msh); */ -	e_externs_pipes(msh->pipes, msh); +	fullpath = e_get_fullpath(e_get_pipes_count(msh->pipes), msh); +	e_pipe_exec_path(fullpath, msh->pipes, msh); +	ft_delwords(fullpath);  	s_lpipes_clear(&msh->pipes);  } diff --git a/src/e_pipes.h b/src/e_pipes.h index 2f6c550..c523d4f 100644 --- a/src/e_pipes.h +++ b/src/e_pipes.h @@ -10,10 +10,10 @@  /*                                                                            */  /* ************************************************************************** */ -#ifndef E_PIPES_H -#define E_PIPES_H +#ifndef FT_E_PIPES_H +# define FT_E_PIPES_H -#include "s_struct.h" +# include "s_struct.h"  void	e_pipes(t_msh *msh); | 
