diff options
| author | JozanLeClerc <bousset.rudy@gmail.com> | 2020-04-23 15:32:57 +0200 | 
|---|---|---|
| committer | JozanLeClerc <bousset.rudy@gmail.com> | 2020-04-23 15:32:57 +0200 | 
| commit | 70c7830ba36896408611083fc57fb3265b53357c (patch) | |
| tree | 8c830f593b28ce2b948b9bbfb0ccb55ab37964cb /src/ft_e_builtin.c | |
| parent | Ok it's fine (diff) | |
| download | 42-minishell-70c7830ba36896408611083fc57fb3265b53357c.tar.gz 42-minishell-70c7830ba36896408611083fc57fb3265b53357c.tar.bz2 42-minishell-70c7830ba36896408611083fc57fb3265b53357c.tar.xz 42-minishell-70c7830ba36896408611083fc57fb3265b53357c.tar.zst 42-minishell-70c7830ba36896408611083fc57fb3265b53357c.zip | |
Fine builtins execution, now norme
Diffstat (limited to 'src/ft_e_builtin.c')
| -rw-r--r-- | src/ft_e_builtin.c | 93 | 
1 files changed, 93 insertions, 0 deletions
| 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; +	} +} | 
