From f0993a9bcb5eea0fa0fd8c794cad5417aa703327 Mon Sep 17 00:00:00 2001 From: VernihoraIvan Date: Mon, 5 Aug 2024 16:07:03 +0200 Subject: [PATCH 1/2] update --- src/builtin/builtin_utils.c | 6 +++--- src/env/path_resolution.c | 4 ++-- src/exec/execution.c | 24 ++++++++++++++++++------ src/redirect/here_doc.c | 7 ++++--- src/redirect/redirection.c | 14 +++++++------- src/redirect/set_redir_utils.c | 29 ++++++++++++++++++++++++++--- src/utils/prompt.c | 4 +++- 7 files changed, 63 insertions(+), 25 deletions(-) diff --git a/src/builtin/builtin_utils.c b/src/builtin/builtin_utils.c index 490986a..7f179be 100644 --- a/src/builtin/builtin_utils.c +++ b/src/builtin/builtin_utils.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 10:43:33 by Jskehan #+# #+# */ -/* Updated: 2024/08/04 16:29:27 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 14:06:29 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,11 +50,11 @@ void show_last_command_status(t_mini *mini, char **str) void execute_builtin(t_mini *mini, t_cmd *cmd) { if (ft_strcmp(cmd->full_command[0], "echo") == 0) - mini_echo(cmd); + return (mini_echo(cmd)); else if (ft_strcmp(cmd->full_command[0], "pwd") == 0) mini_pwd(); else if (ft_strcmp(cmd->full_command[0], "cd") == 0) - mini->exit_status = mini_cd(cmd->full_command, mini); + g_mini->exit_status = mini_cd(cmd->full_command, mini); else if (ft_strcmp(cmd->full_command[0], "exit") == 0) mini_exit(cmd->full_command, mini); else if (ft_strcmp(cmd->full_command[0], "$?") == 0) diff --git a/src/env/path_resolution.c b/src/env/path_resolution.c index 41337ee..1ea336a 100644 --- a/src/env/path_resolution.c +++ b/src/env/path_resolution.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 15:23:12 by Jskehan #+# #+# */ -/* Updated: 2024/08/04 16:04:59 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 13:26:42 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,7 +57,7 @@ char *resolve_command_path(char *command, t_mini **mini) i++; } ft_free_2d_array(&paths); - g_mini->exit_status = 127; + // g_mini->exit_status = 127; // printf("Command path not found for: %s\n", command); // Debug print return (NULL); } diff --git a/src/exec/execution.c b/src/exec/execution.c index 7d4c2a5..ee77ef4 100644 --- a/src/exec/execution.c +++ b/src/exec/execution.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 10:52:13 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 11:49:49 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 15:44:10 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,6 +26,12 @@ static void child_redir(t_cmd *cmd) perror("dup2"); close(cmd->fd_out); } + if (cmd->fd_out == -1) + { + printf("fdout = -1\n"); + if (close(STDOUT_FILENO) == -1) + perror("close"); + } } static void execute_command(t_mini *mini, t_cmd *cmd) @@ -49,7 +55,8 @@ static void execute_command(t_mini *mini, t_cmd *cmd) } else { - mini_perror(CMD_NOT_FOUND, cmd->full_command[0], 127); + // mini_perror(CMD_NOT_FOUND, cmd->full_command[0], 127); + ft_error1(4, cmd->full_command[0], 127, cmd->full_command[0]); exit(127); } } @@ -118,16 +125,21 @@ static void wait_for_children(int num_cmds, t_mini *mini) { int status; + (void)mini; for (int k = 0; k < num_cmds; k++) { wait(&status); if (WIFEXITED(status)) { - mini->exit_status = WEXITSTATUS(status); + // mini->exit_status = WEXITSTATUS(status); + g_mini->exit_status = WEXITSTATUS(status); } else if (WIFSIGNALED(status)) { - mini->exit_status = 128 + WTERMSIG(status); + // mini->exit_status = 128 + WTERMSIG(status); + // g_mini->exit_status = 128 + WTERMSIG(status); + g_mini->exit_status = 1; + } } } @@ -180,11 +192,11 @@ void *check_to_fork(t_mini *mini, t_list *commands) if (cmd->full_command && (dir = opendir(cmd->full_command[0])) != NULL) { closedir(dir); - mini->exit_status = 126; // Command is a directory + g_mini->exit_status = 126; // Command is a directory return (NULL); } if (!cmd->full_command && cmd->is_heredoc == 1) - return (mini->exit_status = 127, NULL);// Command not found + return (g_mini->exit_status = 127, NULL);// Command not found cmd->command_path = resolve_command_path(cmd->full_command[0], &mini); if (cmd->command_path && access(cmd->command_path, X_OK) == 0) exec_pipes(mini, commands); diff --git a/src/redirect/here_doc.c b/src/redirect/here_doc.c index df770ae..2935bd7 100644 --- a/src/redirect/here_doc.c +++ b/src/redirect/here_doc.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* here_doc.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/10 14:19:34 by Jskehan #+# #+# */ -/* Updated: 2024/07/16 14:32:56 by Jskehan ### ########.fr */ +/* Updated: 2024/08/05 14:38:25 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,7 +49,8 @@ int get_here_doc(t_mini *mini, const char *limit, const char *warn) mini->exit_status = 0; if (pipe(fd) == -1) { - mini_perror("PIPERR", NULL, 1); + // mini_perror("PIPERR", NULL, 1); + ft_error1(4, NULL, 1, "pipe"); return (-1); } str = read_string_until_limit(mini, limit, warn); diff --git a/src/redirect/redirection.c b/src/redirect/redirection.c index bffd3d8..24aa9b3 100644 --- a/src/redirect/redirection.c +++ b/src/redirect/redirection.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* redirection.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/10 14:08:23 by Jskehan #+# #+# */ -/* Updated: 2024/08/02 11:55:26 by Jskehan ### ########.fr */ +/* Updated: 2024/08/05 14:39:42 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,12 +21,12 @@ int get_fd(int oldfd, t_cmd *cmd, char *path) if (!path) return (-1); if (access(path, F_OK) == -1 && !cmd->is_outfile) - mini_perror("NDIR", path, 127); + ft_error1(127, path, 1, "NDIR"); else if (!cmd->is_outfile && access(path, R_OK) == -1) - mini_perror("NPERM", path, 126); + ft_error1(126, path, 1, "NPERM"); else if (cmd->is_outfile && access(path, W_OK) == -1 && access(path, F_OK) == 0) - mini_perror("NPERM", path, 126); + ft_error1(126, path, 1, "NPERM"); if (cmd->is_outfile && cmd->is_append) fd = open(path, O_CREAT | O_WRONLY | O_APPEND, 0666); else if (cmd->is_outfile && !cmd->is_append) @@ -59,10 +59,10 @@ t_mini *get_file(t_mini *mini, t_list *command, char **args, int *i) if ((cmd->is_outfile ? cmd->fd_out : cmd->fd_in) != -1) { ft_putendl_fd(nl, 2); - mini->exit_status = 2; + g_mini->exit_status = 2; } else - mini->exit_status = 1; + g_mini->exit_status = 1; } return (mini); } diff --git a/src/redirect/set_redir_utils.c b/src/redirect/set_redir_utils.c index 40aca77..d031239 100644 --- a/src/redirect/set_redir_utils.c +++ b/src/redirect/set_redir_utils.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 14:23:13 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 11:55:43 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 16:01:56 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,9 +23,18 @@ static int check_access(char *path, int mode) if (mode == 1) // Read mode { if (access(path, F_OK) == -1) - return (ft_error1(3, NULL, 127, NULL), 0); + { + printf("test\n"); + ft_error1(3, NULL, 0, NULL); + // exit(0); + return (0); + } else if (access(path, R_OK) == -1) return (ft_error1(5, NULL, 1, NULL), 0); + // { + // (ft_error1(5, NULL, 1, NULL)); + // exit(0); + // } // return (ft_error(5, NULL), 0); return (1); } @@ -41,6 +50,7 @@ static int check_access(char *path, int mode) static int get_fd(int oldfd, int mode, char *path) { + printf("inside get_fd\n"); if (oldfd > 2) close(oldfd); if (!path) @@ -59,16 +69,28 @@ static int get_fd(int oldfd, int mode, char *path) static t_cmd *handle_redirection(t_cmd *node, char **full_command, int **i, int mode) { + printf("handle_redirection\n"); + printf("node->fd_out: %d\n", node->fd_out); if (mode == 2 || mode == 3) { if (node->fd_out > 2) close(node->fd_out); node->fd_out = get_fd(node->fd_out, mode, full_command[++(**i)]); - if (node->fd_out == -1) + if (!full_command[*(*i)] || node->fd_out == -1) + { **i = -2; + if (node->fd_out != -1) + { + g_mini->exit_status = 2; + // ft_error1(2, NULL, 0, NULL); + } + else + g_mini->exit_status = 1; + } } else if (mode == 1) { + if (node->fd_in > 2) close(node->fd_in); node->fd_in = get_fd(node->fd_in, mode, full_command[++(**i)]); @@ -114,5 +136,6 @@ t_cmd *set_redir(t_cmd *node, char *input, char **full_command, int *i) else if (input[0] != '|') node->full_command = ft_add_row_2d_array(node->full_command, input); } + return (node); } diff --git a/src/utils/prompt.c b/src/utils/prompt.c index 088ec0e..9f754fd 100644 --- a/src/utils/prompt.c +++ b/src/utils/prompt.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/15 21:09:11 by Jskehan #+# #+# */ -/* Updated: 2024/08/02 17:10:53 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 15:52:56 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,6 +45,7 @@ t_list *create_nodes(char **input, t_mini *mini) return (NULL); } } + print_nodes(commands); return (commands); } @@ -113,5 +114,6 @@ void prompt_loop(t_mini *mini) mini->signals.is_executing_command = 1; handle_input(input, mini); mini->signals.is_executing_command = 0; + // printf("exit code: %d\n", mini->exit_status); } } From c7f073b33466921cc5f0b750bf332bb4ab605ef8 Mon Sep 17 00:00:00 2001 From: VernihoraIvan Date: Mon, 5 Aug 2024 16:35:21 +0200 Subject: [PATCH 2/2] fixing redir-in/out from non-existing file --- src/exec/execution.c | 4 ++-- src/parser/parser_utils.c | 5 +---- src/redirect/redirection.c | 3 +-- src/redirect/set_redir_utils.c | 24 +++++++----------------- src/utils/prompt.c | 13 ++++++++----- 5 files changed, 19 insertions(+), 30 deletions(-) diff --git a/src/exec/execution.c b/src/exec/execution.c index ee77ef4..214e8f4 100644 --- a/src/exec/execution.c +++ b/src/exec/execution.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 10:52:13 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 15:44:10 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 16:12:13 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,7 @@ static void child_redir(t_cmd *cmd) } if (cmd->fd_out == -1) { - printf("fdout = -1\n"); + // printf("fdout = -1\n"); if (close(STDOUT_FILENO) == -1) perror("close"); } diff --git a/src/parser/parser_utils.c b/src/parser/parser_utils.c index 47dfb86..b18b56e 100644 --- a/src/parser/parser_utils.c +++ b/src/parser/parser_utils.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/07 17:38:35 by iverniho #+# #+# */ -/* Updated: 2024/08/05 12:53:42 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 16:32:33 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -185,10 +185,7 @@ void ft_error1(int error, char *arg, int exit_code, char *message) else if (error == 9) { ft_putstr_fd("minishell> export: ", STDERR_FILENO); - ft_putendl_fd(ft_strjoin(add_quotes(arg), message), 2); - // ft_putstr_fd("minishell> ", STDERR_FILENO); - // ft_putendl_fd(message, 2); g_mini->exit_status = exit_code; } } diff --git a/src/redirect/redirection.c b/src/redirect/redirection.c index 24aa9b3..068995a 100644 --- a/src/redirect/redirection.c +++ b/src/redirect/redirection.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/10 14:08:23 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 14:39:42 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 16:25:51 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -58,7 +58,6 @@ t_mini *get_file(t_mini *mini, t_list *command, char **args, int *i) *i = -1; if ((cmd->is_outfile ? cmd->fd_out : cmd->fd_in) != -1) { - ft_putendl_fd(nl, 2); g_mini->exit_status = 2; } else diff --git a/src/redirect/set_redir_utils.c b/src/redirect/set_redir_utils.c index d031239..71f19c9 100644 --- a/src/redirect/set_redir_utils.c +++ b/src/redirect/set_redir_utils.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 14:23:13 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 16:01:56 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 16:24:52 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,25 +24,17 @@ static int check_access(char *path, int mode) { if (access(path, F_OK) == -1) { - printf("test\n"); ft_error1(3, NULL, 0, NULL); - // exit(0); return (0); } else if (access(path, R_OK) == -1) return (ft_error1(5, NULL, 1, NULL), 0); - // { - // (ft_error1(5, NULL, 1, NULL)); - // exit(0); - // } - // return (ft_error(5, NULL), 0); return (1); } else if (mode == 2) // Write mode { if (access(path, W_OK) == -1 && access(path, F_OK) != -1) return (ft_error1(5, NULL, 1, NULL), 0); - // return (ft_error(5, NULL), 0); return (1); } return (1); @@ -50,7 +42,6 @@ static int check_access(char *path, int mode) static int get_fd(int oldfd, int mode, char *path) { - printf("inside get_fd\n"); if (oldfd > 2) close(oldfd); if (!path) @@ -69,8 +60,6 @@ static int get_fd(int oldfd, int mode, char *path) static t_cmd *handle_redirection(t_cmd *node, char **full_command, int **i, int mode) { - printf("handle_redirection\n"); - printf("node->fd_out: %d\n", node->fd_out); if (mode == 2 || mode == 3) { if (node->fd_out > 2) @@ -80,17 +69,13 @@ static t_cmd *handle_redirection(t_cmd *node, char **full_command, int **i, { **i = -2; if (node->fd_out != -1) - { g_mini->exit_status = 2; - // ft_error1(2, NULL, 0, NULL); - } else g_mini->exit_status = 1; } } else if (mode == 1) { - if (node->fd_in > 2) close(node->fd_in); node->fd_in = get_fd(node->fd_in, mode, full_command[++(**i)]); @@ -136,6 +121,11 @@ t_cmd *set_redir(t_cmd *node, char *input, char **full_command, int *i) else if (input[0] != '|') node->full_command = ft_add_row_2d_array(node->full_command, input); } - + if (node->fd_in == -1 || node->fd_out == -1) + { + ft_free_2d_array(&node->full_command); + free(node); + return (NULL); + } return (node); } diff --git a/src/utils/prompt.c b/src/utils/prompt.c index 9f754fd..c72fa92 100644 --- a/src/utils/prompt.c +++ b/src/utils/prompt.c @@ -6,13 +6,13 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/15 21:09:11 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 15:52:56 by iverniho ### ########.fr */ +/* Updated: 2024/08/05 16:32:15 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void handle_command_node(char **input, t_list **commands, +int handle_command_node(char **input, t_list **commands, t_list **cur_command, int *i, t_mini *mini) { *cur_command = ft_lstlast(*commands); @@ -23,6 +23,9 @@ void handle_command_node(char **input, t_list **commands, } (*cur_command)->content = set_redir((*cur_command)->content, input[*i], input, i); + if (!(*cur_command)->content) + return (ft_lstclear(commands, free), -1); + return (1); } t_list *create_nodes(char **input, t_mini *mini) @@ -37,7 +40,8 @@ t_list *create_nodes(char **input, t_mini *mini) (void)mini; while (input && input[++i]) { - handle_command_node(input, &commands, &cur_command, &i, mini); + if (handle_command_node(input, &commands, &cur_command, &i, mini) == -1) + return (g_mini->exit_status = 1, NULL); if (i == -2) { ft_lstclear(&commands, free); @@ -45,7 +49,7 @@ t_list *create_nodes(char **input, t_mini *mini) return (NULL); } } - print_nodes(commands); + // print_nodes(commands); return (commands); } @@ -114,6 +118,5 @@ void prompt_loop(t_mini *mini) mini->signals.is_executing_command = 1; handle_input(input, mini); mini->signals.is_executing_command = 0; - // printf("exit code: %d\n", mini->exit_status); } }