fix: infile has now quote removed and env var replacement
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								.nfs00000000098c82b700000161
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.nfs00000000098c82b700000161
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								.nfs00000000098c82e400000158
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.nfs00000000098c82e400000158
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								.nfs00000000098c82ed00000153
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.nfs00000000098c82ed00000153
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								.nfs00000000098c82f10000015a
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.nfs00000000098c82f10000015a
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										7
									
								
								file.c
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								file.c
									
									
									
									
									
								
							| @ -22,15 +22,16 @@ int	ft_file_is_readable(const char *path) | |||||||
| 	if (fd == -1) | 	if (fd == -1) | ||||||
| 	{ | 	{ | ||||||
| 		ft_eprintf("minishell: %s: No such file or directory\n", path); | 		ft_eprintf("minishell: %s: No such file or directory\n", path); | ||||||
| 		return (-1); | 		return (0); | ||||||
| 	} | 	} | ||||||
| 	readable = read(fd, "", 0); | 	readable = read(fd, "", 0); | ||||||
| 	if (readable == -1) | 	if (readable == -1) | ||||||
| 	{ | 	{ | ||||||
| 		ft_eprintf("minishell: %s: Permission denied\n", path); | 		ft_eprintf("minishell: %s: Permission denied\n", path); | ||||||
| 		return (-1); | 		return (0); | ||||||
| 	} | 	} | ||||||
| 	return (fd); | 	close(fd); | ||||||
|  | 	return (1); | ||||||
| } | } | ||||||
|  |  | ||||||
| int	ft_file_is_writable(const char *path) | int	ft_file_is_writable(const char *path) | ||||||
|  | |||||||
							
								
								
									
										51
									
								
								infile.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								infile.c
									
									
									
									
									
								
							| @ -13,11 +13,13 @@ | |||||||
| #include "libftx/libftx.h" | #include "libftx/libftx.h" | ||||||
| #include "minishell.h" | #include "minishell.h" | ||||||
| #include "utils/utils.h" | #include "utils/utils.h" | ||||||
|  | #include <fcntl.h> | ||||||
|  |  | ||||||
| static int	ft_infile_is_valid(const char *line) | static int	ft_infile_is_valid(t_data *data, const char *line) | ||||||
| { | { | ||||||
| 	char	**tab; | 	char	**tab; | ||||||
| 	size_t	i; | 	char	*path; | ||||||
|  | 	ssize_t	i; | ||||||
|  |  | ||||||
| 	tab = ft_split_quoted(line, ' '); | 	tab = ft_split_quoted(line, ' '); | ||||||
| 	if (tab == NULL) | 	if (tab == NULL) | ||||||
| @ -27,28 +29,41 @@ static int	ft_infile_is_valid(const char *line) | |||||||
| 	} | 	} | ||||||
| 	if (tab[0] == NULL) | 	if (tab[0] == NULL) | ||||||
| 		return (1); | 		return (1); | ||||||
| 	i = 0; | 	i = -1; | ||||||
| 	while (tab[i] != NULL) | 	while (tab[++i] != NULL) | ||||||
| 	{ | 	{ | ||||||
| 		if (tab[i][0] == '<') | 		if (tab[i][0] == '<') | ||||||
| 		{ | 		{ | ||||||
| 			if (tab[i + 1] != NULL && !ft_contain_only_str(tab[i + 1], "| <>")) | 			path = ft_env_filler(data, tab[i + 1]); | ||||||
| 				continue ; | 			if (path == NULL) | ||||||
| 			ft_eprintf("minishell: %s: must be followed by an infile\n", tab[i]); | 				return (0); | ||||||
|  | 			ft_quote_remover(path); | ||||||
|  | 			if (ft_file_is_readable(path) == 0) | ||||||
|  | 			{ | ||||||
|  | 				free(path); | ||||||
| 				ft_freer_tab_ultimate(1, tab); | 				ft_freer_tab_ultimate(1, tab); | ||||||
| 				return (0); | 				return (0); | ||||||
| 			} | 			} | ||||||
| 		i++; | 			if (ft_contain_only_str(path, "| <>")) | ||||||
|  | 			{ | ||||||
|  | 				free(path); | ||||||
|  | 				ft_eprintf("minishell: %s: must be followed by an infile\n", path); | ||||||
|  | 				ft_freer_tab_ultimate(1, tab); | ||||||
|  | 				return (0); | ||||||
|  | 			} | ||||||
|  | 			free(path); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	ft_freer_tab_ultimate(1, tab); | 	ft_freer_tab_ultimate(1, tab); | ||||||
| 	return (1); | 	return (1); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int	ft_get_infile(const char *line) | static int	ft_get_infile(t_data *data, const char *line) | ||||||
| { | { | ||||||
| 	size_t	i; | 	size_t	i; | ||||||
| 	int		fd; | 	int		fd; | ||||||
| 	char	**tab; | 	char	**tab; | ||||||
|  | 	char	*path; | ||||||
|  |  | ||||||
| 	tab = ft_split_quoted(line, ' '); | 	tab = ft_split_quoted(line, ' '); | ||||||
| 	if (tab == NULL) | 	if (tab == NULL) | ||||||
| @ -64,9 +79,16 @@ static int	ft_get_infile(const char *line) | |||||||
| 			if (fd != 0) | 			if (fd != 0) | ||||||
| 				close(fd); | 				close(fd); | ||||||
| 		if (ft_strcmp("<", tab[i]) == 0) | 		if (ft_strcmp("<", tab[i]) == 0) | ||||||
| 			fd = ft_file_is_readable(ft_quote_remover(tab[i + 1])); | 		{ | ||||||
|  | 			path = ft_env_filler(data, tab[i + 1]); | ||||||
|  | 			if (path == NULL) | ||||||
|  | 				return (-2); | ||||||
|  | 			ft_quote_remover(path); | ||||||
|  | 			fd = open(path, O_RDONLY); | ||||||
|  | 			free(path); | ||||||
|  | 		} | ||||||
| 		else if (ft_strcmp("<<", tab[i]) == 0) | 		else if (ft_strcmp("<<", tab[i]) == 0) | ||||||
| 			fd = ft_heredoc(tab[i + 1]); | 			fd = ft_heredoc(ft_quote_remover(tab[i + 1])); | ||||||
| 		i++; | 		i++; | ||||||
| 	} | 	} | ||||||
| 	ft_freer_tab_ultimate(1, tab); | 	ft_freer_tab_ultimate(1, tab); | ||||||
| @ -90,8 +112,11 @@ static int	ft_remove_infile(char *line) | |||||||
| 	while (tab[i] != NULL) | 	while (tab[i] != NULL) | ||||||
| 	{ | 	{ | ||||||
| 		if (tab[i][0] == '<') | 		if (tab[i][0] == '<') | ||||||
|  | 		{ | ||||||
| 			ft_strshift(line + y, | 			ft_strshift(line + y, | ||||||
| 			(-1) * (ft_strlen(tab[i]) + ft_strlen(tab[i + 1]) + 1 + (line[ft_strlen(tab[i]) + ft_strlen(tab[i + 1]) + 1] != '\0'))); | 			(-1) * (ft_strlen(tab[i]) + ft_strlen(tab[i + 1]) + 1 + (line[ft_strlen(tab[i]) + ft_strlen(tab[i + 1]) + 1] != '\0'))); | ||||||
|  | 			i++; | ||||||
|  | 		} | ||||||
| 		else | 		else | ||||||
| 			y = y + ft_strlen(tab[i]) + (y != 0); | 			y = y + ft_strlen(tab[i]) + (y != 0); | ||||||
| 		i++; | 		i++; | ||||||
| @ -104,12 +129,12 @@ int	ft_infile(t_data *data, char *line) | |||||||
| { | { | ||||||
| 	int	fd; | 	int	fd; | ||||||
|  |  | ||||||
| 	if (ft_infile_is_valid(line) == 0) | 	if (ft_infile_is_valid(data, line) == 0) | ||||||
| 	{ | 	{ | ||||||
| 		data->exit_code = 2; | 		data->exit_code = 2; | ||||||
| 		return (-2); | 		return (-2); | ||||||
| 	} | 	} | ||||||
| 	fd = ft_get_infile(line); | 	fd = ft_get_infile(data, line); | ||||||
| 	if (fd == -2) | 	if (fd == -2) | ||||||
| 		return (-2); | 		return (-2); | ||||||
| 	ft_remove_infile(line); | 	ft_remove_infile(line); | ||||||
|  | |||||||
							
								
								
									
										59
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								main.c
									
									
									
									
									
								
							| @ -39,11 +39,11 @@ static char	*ft_get_user_input() | |||||||
|  |  | ||||||
| static int	ft_minishell(t_data *data, char *line) | static int	ft_minishell(t_data *data, char *line) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	t_list	**cmds; | 	t_list	**cmds; | ||||||
| 	char	*line_clean; | 	char	*line_clean; | ||||||
| 	int		infile; | 	int		infile; | ||||||
| 	int		outfile; | 	int		outfile; | ||||||
| 	int		return_value; |  | ||||||
|  |  | ||||||
| 	if (ft_syntatic_verif(data, line)) | 	if (ft_syntatic_verif(data, line)) | ||||||
| 		return (1); | 		return (1); | ||||||
| @ -51,19 +51,21 @@ static int	ft_minishell(t_data *data, char *line) | |||||||
| 	if (line_clean == NULL) | 	if (line_clean == NULL) | ||||||
| 		return (1); | 		return (1); | ||||||
| 	outfile = ft_outfile(data, line_clean); | 	outfile = ft_outfile(data, line_clean); | ||||||
| 	return_value = 0; |  | ||||||
| 	if (outfile == -2) | 	if (outfile == -2) | ||||||
| 		return_value = 1; | 	{ | ||||||
|  | 		free(line_clean); | ||||||
|  | 		return (0); | ||||||
|  | 	} | ||||||
| 	infile = ft_infile(data, line_clean); | 	infile = ft_infile(data, line_clean); | ||||||
| 	if (return_value == 0 && infile == -2) | 	if (infile == -2) | ||||||
| 		return_value = 1; | 	{ | ||||||
| 	if (return_value == 0&& ft_gen_exit_code_var(data)) | 		if (outfile > 2) | ||||||
| 		return_value = 1; | 			close(outfile); | ||||||
| 	cmds = ft_parse_cmds(data, line_clean, infile, outfile); | 		free(line_clean); | ||||||
| 	if (return_value == 0 && cmds == NULL) | 		return (0); | ||||||
| 		return_value = 1; | 	} | ||||||
| 	if (return_value == 0 && ft_cmds_executor(data, cmds)) | 	if (ft_gen_exit_code_var(data)) | ||||||
| 		return_value = 1; | 	{ | ||||||
| 		if (outfile > 2) | 		if (outfile > 2) | ||||||
| 			close(outfile); | 			close(outfile); | ||||||
| 		if (infile > 2) | 		if (infile > 2) | ||||||
| @ -71,7 +73,35 @@ static int	ft_minishell(t_data *data, char *line) | |||||||
| 		ft_lstclear(cmds, ft_cmddel); | 		ft_lstclear(cmds, ft_cmddel); | ||||||
| 		free(cmds); | 		free(cmds); | ||||||
| 		free(line_clean); | 		free(line_clean); | ||||||
| 	return (-1 * return_value); | 		return (1); | ||||||
|  | 	} | ||||||
|  | 	cmds = ft_parse_cmds(data, line_clean, infile, outfile); | ||||||
|  | 	if (cmds == NULL) | ||||||
|  | 	{ | ||||||
|  | 		if (outfile > 2) | ||||||
|  | 			close(outfile); | ||||||
|  | 		if (infile > 2) | ||||||
|  | 			close(infile); | ||||||
|  | 		ft_lstclear(cmds, ft_cmddel); | ||||||
|  | 		free(cmds); | ||||||
|  | 		free(line_clean); | ||||||
|  | 		return (1); | ||||||
|  | 	} | ||||||
|  | 	if (ft_cmds_executor(data, cmds)) | ||||||
|  | 	{ | ||||||
|  | 		if (outfile > 2) | ||||||
|  | 			close(outfile); | ||||||
|  | 		if (infile > 2) | ||||||
|  | 			close(infile); | ||||||
|  | 		ft_lstclear(cmds, ft_cmddel); | ||||||
|  | 		free(cmds); | ||||||
|  | 		free(line_clean); | ||||||
|  | 		return (1); | ||||||
|  | 	} | ||||||
|  | 	ft_lstclear(cmds, ft_cmddel); | ||||||
|  | 	free(cmds); | ||||||
|  | 	free(line_clean); | ||||||
|  | 	return (0); | ||||||
| } | } | ||||||
|  |  | ||||||
| void	ft_ctrlc(int num) | void	ft_ctrlc(int num) | ||||||
| @ -111,13 +141,14 @@ int	main(int ac, char **av, char **env) | |||||||
| 	signal(SIGINT, ft_ctrlc); | 	signal(SIGINT, ft_ctrlc); | ||||||
| 	signal(SIGQUIT, ft_quit); | 	signal(SIGQUIT, ft_quit); | ||||||
| 	data.exit_code = 0; | 	data.exit_code = 0; | ||||||
|  | 	ft_gen_exit_code_var(&data); | ||||||
| 	data.env = init_env(env); | 	data.env = init_env(env); | ||||||
| 	if (data.env == NULL) | 	if (data.env == NULL) | ||||||
| 		return (1); | 		return (1); | ||||||
| 	line = ft_get_user_input(); | 	line = ft_get_user_input(); | ||||||
| 	while (line != NULL) | 	while (line != NULL) | ||||||
| 	{ | 	{ | ||||||
| 		if (ft_minishell(&data, line) == -1) | 		if (ft_minishell(&data, line) == 1) | ||||||
| 			break ; | 			break ; | ||||||
| 		free(line); | 		free(line); | ||||||
| 		line = ft_get_user_input(); | 		line = ft_get_user_input(); | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| static int	ft_outfile_is_valid(const char *line) | static int	ft_outfile_is_valid(const char *line) | ||||||
| { | { | ||||||
| 	char	**tab; | 	char	**tab; | ||||||
| 	size_t	i; | 	ssize_t	i; | ||||||
|  |  | ||||||
| 	tab = ft_split_quoted(line, ' '); | 	tab = ft_split_quoted(line, ' '); | ||||||
| 	if (tab == NULL) | 	if (tab == NULL) | ||||||
| @ -25,8 +25,8 @@ static int	ft_outfile_is_valid(const char *line) | |||||||
| 	} | 	} | ||||||
| 	if (tab[0] == NULL) | 	if (tab[0] == NULL) | ||||||
| 		return (1); | 		return (1); | ||||||
| 	i = 0; | 	i = -1; | ||||||
| 	while (tab[i] != NULL) | 	while (tab[++i] != NULL) | ||||||
| 	{ | 	{ | ||||||
| 		if (tab[i][0] == '>') | 		if (tab[i][0] == '>') | ||||||
| 		{ | 		{ | ||||||
| @ -36,7 +36,6 @@ static int	ft_outfile_is_valid(const char *line) | |||||||
| 			ft_freer_tab_ultimate(1, tab); | 			ft_freer_tab_ultimate(1, tab); | ||||||
| 			return (0); | 			return (0); | ||||||
| 		} | 		} | ||||||
| 		i++; |  | ||||||
| 	} | 	} | ||||||
| 	ft_freer_tab_ultimate(1, tab); | 	ft_freer_tab_ultimate(1, tab); | ||||||
| 	return (1); | 	return (1); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user