From a0dd21254575b81d62fdb6dadabb4b10b88e69a7 Mon Sep 17 00:00:00 2001 From: drahwanj Date: Mon, 19 May 2025 05:24:01 +0300 Subject: [PATCH 1/3] update(tokens+env): expanding of quoted token and update . env /bin/bash --- src/exec.c | 2 +- src/exec_utils2.c | 2 +- src/main.c | 1 + src/token_filter.c | 10 +++++++++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/exec.c b/src/exec.c index f63a98d..1aba5f0 100644 --- a/src/exec.c +++ b/src/exec.c @@ -64,6 +64,7 @@ int executer(t_shell *shell, t_pak *cmd) int paks; paks = count_paks(cmd); + update_underscore_env(shell, cmd); while (cmd) { arg = cmd->full_cmd; @@ -80,7 +81,6 @@ int executer(t_shell *shell, t_pak *cmd) shell_signal_ignore(); exec_pak(shell, cmd); } - update_underscore_env(shell, cmd); cmd = cmd->next; } wait_processes(shell, paks); diff --git a/src/exec_utils2.c b/src/exec_utils2.c index 3b12653..8c5d413 100644 --- a/src/exec_utils2.c +++ b/src/exec_utils2.c @@ -35,7 +35,7 @@ void update_underscore_env(t_shell *shell, t_pak *cmd) int i; i = 0; - if (!cmd || !cmd->full_cmd || !cmd->full_cmd[i]) + if (!cmd || !cmd->full_cmd || !cmd->full_cmd[0] || cmd->next) return ; while (cmd && cmd->full_cmd && cmd->full_cmd[i]) i++; diff --git a/src/main.c b/src/main.c index c03867f..868696e 100644 --- a/src/main.c +++ b/src/main.c @@ -19,6 +19,7 @@ void update_shlvl(t_shell *shell) shell->shlvl = ft_atoi(env_grab(shell->envp, "SHLVL")) + 1; shlvl = ft_itoa(shell->shlvl); env_update(shell->envp, "SHLVL", shlvl); + env_update(shell->envp, "SHELL", shell->argv[0]); free(shlvl); } diff --git a/src/token_filter.c b/src/token_filter.c index 1de9a88..a49597a 100644 --- a/src/token_filter.c +++ b/src/token_filter.c @@ -16,7 +16,15 @@ static void combine_tokens(t_token *curr, t_token *next) { char *value; - value = ft_strjoin(curr->value, next->value); + if (curr->value && !ft_strcmp(curr->value, "$") + && (next->type == TK_DOUBLE_QUOTED + || next->type == TK_SINGLE_QUOTED)) + { + value = ft_strdup(next->value); + free(curr->value); + } + else + value = ft_strjoin(curr->value, next->value); if (!value) return ; free(next->value); From f0078c912338efd7e5624d5dcd0209450793e13d Mon Sep 17 00:00:00 2001 From: drahwanj Date: Mon, 19 May 2025 09:37:41 +0300 Subject: [PATCH 2/3] update(heredoc): now opens a new file for each heredoc instead of same file --- Makefile | 2 +- include/minishell.h | 8 ++++++-- src/heredoc.c | 16 ++++++++++----- src/heredoc_utils.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 1 + src/parse_redir.c | 10 ++++++--- src/token_filter.c | 2 +- 7 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 src/heredoc_utils.c diff --git a/Makefile b/Makefile index 693f25a..fd0a576 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ FILES = main.c \ token.c token_utils.c token_re.c token_filter.c \ syntax.c syntax_utils.c \ expand.c expand_utils.c expand_utils2.c \ - parse.c parse_redir.c parse_utils.c parse_print.c heredoc.c \ + parse.c parse_redir.c parse_utils.c parse_print.c heredoc.c heredoc_utils.c \ exec.c exec_utils.c exec_utils2.c \ find_path.c \ bn_echo.c bn_env.c bn_export.c bn_pwd.c bn_cd.c bn_exit.c bn_unset.c \ diff --git a/include/minishell.h b/include/minishell.h index d72d35f..dfb8f46 100644 --- a/include/minishell.h +++ b/include/minishell.h @@ -61,6 +61,7 @@ typedef struct s_shell bool exit; int shlvl; int e_status; + int heredoc; pid_t last_pid; t_token *tokens; t_pak *cmds; @@ -175,8 +176,11 @@ void *pak_redir_util(t_shell *shell, t_pak *cmd, int fd[2]); int parse_redir_out(t_shell *shell, t_pak **curr, t_token **token); int parse_redir_in(t_shell *shell, t_pak **curr, t_token **token); int parse_redir_app(t_shell *shell, t_pak **curr, t_token **token); -int parse_heredoc(t_shell *shell, t_pak **curr, t_token **token); -int handle_heredoc(char *delimiter); +int parse_heredoc(t_shell *shell, t_pak **curr, t_token **token, + char *file); +int handle_heredoc(char *delimiter, char *file); +char *get_heredoc_file(int file); +int open_heredoc(char *file); void print_paks(t_pak *head); void free_paks(t_shell *shell, t_pak *head); int count_paks(t_pak *head); diff --git a/src/heredoc.c b/src/heredoc.c index 7b4c8ff..6176666 100644 --- a/src/heredoc.c +++ b/src/heredoc.c @@ -79,7 +79,7 @@ static int write_heredoc_to_file(char *content, char *heredoc_file) return (open(heredoc_file, O_RDONLY)); } -void heredoc_child(char *delimiter) +void heredoc_child(char *delimiter, char *filename) { char *content; int fd; @@ -89,15 +89,21 @@ void heredoc_child(char *delimiter) content = get_heredoc_input(delimiter); if (!content) return ; - fd = write_heredoc_to_file(content, HEREDOC_FILE); + if (!filename) + { + free(content); + exit(1); + } + fd = write_heredoc_to_file(content, filename); free(content); + free(filename); if (fd < 0) exit(1); close(fd); exit(0); } -int handle_heredoc(char *delimiter) +int handle_heredoc(char *delimiter, char *file) { t_proc process; @@ -107,7 +113,7 @@ int handle_heredoc(char *delimiter) if (process.pid == 0) { signal(SIGINT, SIG_DFL); - heredoc_child(delimiter); + heredoc_child(delimiter, file); } else { @@ -121,7 +127,7 @@ int handle_heredoc(char *delimiter) } if (WIFEXITED(process.status) && WEXITSTATUS(process.status) != 0) return (-1); - return (open(HEREDOC_FILE, O_RDONLY)); + return (open_heredoc(file)); } return (-1); } diff --git a/src/heredoc_utils.c b/src/heredoc_utils.c new file mode 100644 index 0000000..802c2cd --- /dev/null +++ b/src/heredoc_utils.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* heredoc_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: drahwanj +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/19 09:13:55 by drahwanj #+# #+# */ +/* Updated: 2025/05/19 09:13:56 by drahwanj ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *get_heredoc_file(int file) +{ + char *number; + char *file_name; + char *heredoc_file; + + number = ft_itoa(file); + if (!number) + return (NULL); + heredoc_file = ft_strdup(HEREDOC_FILE); + if (!heredoc_file) + { + free(number); + return (NULL); + } + file_name = ft_strjoin(heredoc_file, number); + if (!file_name) + { + free(number); + free(heredoc_file); + return (NULL); + } + free(number); + return (file_name); +} + +int open_heredoc(char *file) +{ + int fd; + + if (!file) + return (-1); + fd = open(file, O_RDONLY); + return (fd); +} diff --git a/src/main.c b/src/main.c index 868696e..8a317f7 100644 --- a/src/main.c +++ b/src/main.c @@ -31,6 +31,7 @@ void shell_init(t_shell *shell) shell->exit = false; shell->e_status = 0; shell->last_pid = 0; + shell->heredocs = 0; update_shlvl(shell); } diff --git a/src/parse_redir.c b/src/parse_redir.c index 32c20a3..124e72e 100644 --- a/src/parse_redir.c +++ b/src/parse_redir.c @@ -78,6 +78,8 @@ int parse_redir_in(t_shell *shell, t_pak **curr, t_token **token) int parse_redir(t_shell *shell, t_pak **curr, t_token **token) { + char *filename; + if ((*token)->type == TK_REDIR_OUT) { parse_redir_out(shell, curr, token); @@ -92,12 +94,14 @@ int parse_redir(t_shell *shell, t_pak **curr, t_token **token) } else if ((*token)->type == TK_HEREDOC) { - parse_heredoc(shell, curr, token); + filename = get_heredoc_file(++(shell->heredoc)); + parse_heredoc(shell, curr, token, filename); + free(filename); } return (0); } -int parse_heredoc(t_shell *shell, t_pak **curr, t_token **token) +int parse_heredoc(t_shell *shell, t_pak **curr, t_token **token, char *file) { int old_infile; @@ -105,7 +109,7 @@ int parse_heredoc(t_shell *shell, t_pak **curr, t_token **token) if ((*curr)->infile > STDERR_FILENO) close((*curr)->infile); old_infile = (*curr)->infile; - (*curr)->infile = handle_heredoc((*token)->value); + (*curr)->infile = handle_heredoc((*token)->value, file); if (old_infile == -1) close((*curr)->infile); if (old_infile == -1) diff --git a/src/token_filter.c b/src/token_filter.c index a49597a..2aca618 100644 --- a/src/token_filter.c +++ b/src/token_filter.c @@ -18,7 +18,7 @@ static void combine_tokens(t_token *curr, t_token *next) if (curr->value && !ft_strcmp(curr->value, "$") && (next->type == TK_DOUBLE_QUOTED - || next->type == TK_SINGLE_QUOTED)) + || next->type == TK_SINGLE_QUOTED)) { value = ft_strdup(next->value); free(curr->value); From 07a514490a83c8070f459ec66ebebf7cea1f5664 Mon Sep 17 00:00:00 2001 From: drahwanj Date: Mon, 19 May 2025 09:41:08 +0300 Subject: [PATCH 3/3] fix(compilation): simple name mistake --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 8a317f7..af69f5b 100644 --- a/src/main.c +++ b/src/main.c @@ -31,7 +31,7 @@ void shell_init(t_shell *shell) shell->exit = false; shell->e_status = 0; shell->last_pid = 0; - shell->heredocs = 0; + shell->heredoc = 0; update_shlvl(shell); }