From b6e54a9dc606275a7a59a1f2999a77d0859c3109 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Thu, 13 Feb 2025 21:03:26 +0100 Subject: [PATCH 01/19] dsopjdsvI --- Makefile | 5 ++++ includes/minishell.h | 7 ++++- includes/user_interface.h | 3 ++ .../close_command_pipeline.c | 2 ++ .../command_interpreter.c | 14 +++++++++ srcs/minishell_main_routine/core_routine.c | 2 +- srcs/minishell_main_routine/main.c | 4 +-- srcs/semantic_analysis/state_heredoc.c | 9 ++++-- .../default_signals_handling.c | 30 +++++++++++++++++++ srcs/user_interface/prompt.c | 30 ++++++++++++++++--- test_minishell.sh | 2 +- 11 files changed, 97 insertions(+), 11 deletions(-) create mode 100644 srcs/signals_handling/default_signals_handling.c diff --git a/Makefile b/Makefile index 89457e8..2223333 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ LIBFT := $(PATH_LIBFT)libft.a PATH_SRCS += srcs/ PATH_SRCS += srcs/minishell_main_routine +PATH_SRCS += srcs/signals_handling PATH_SRCS += srcs/exit_routines PATH_SRCS += srcs/user_interface PATH_SRCS += srcs/history @@ -141,6 +142,10 @@ SRCS += get_variable_from_env.c SRCS += quote.c SRCS += expander_exit.c +# srcs/signals_handling + +SRCS += default_signals_handling.c + # srcs/exit_status SRCS += set_exit_status.c diff --git a/includes/minishell.h b/includes/minishell.h index 5fb4363..e539e91 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -13,6 +13,8 @@ #ifndef MINISHELL_H # define MINISHELL_H +extern int stop; + // INCLUDES # include "history.h" @@ -81,7 +83,6 @@ typedef int (*t_builtin)(t_command *current_command); void display_minishell_header(void); int core_routine(t_minishell_context *minishell_context); int exit_shell_routine(void); -char *prompt_gets_user_input(void); t_lexing_status lexe_input(t_command_session *current_command); t_syntax_status parse_input(t_token_list token_list); t_command_pipeline semantic_analyzer(t_token_list token_list); @@ -134,4 +135,8 @@ int pwd(t_command *command); void set_exit_status(int exit_status); int get_exit_status_value(void); +// SIGNALS HANDLING + +void setup_default_signals_handling(void); + #endif diff --git a/includes/user_interface.h b/includes/user_interface.h index 46bd55f..5e3f2b9 100644 --- a/includes/user_interface.h +++ b/includes/user_interface.h @@ -26,11 +26,14 @@ # define MSH_PROMPT "SDF$> " # define CTRL_D 0 # define FAILURE -1 +# define MAIN_PROMPT 0 +# define SUBPROMPT 1 // PROTOTYPES void signal_handler(int signum); void received_signal(void); +char *prompt_gets_user_input(bool is_subprompt); void setup_signals(struct sigaction *sa); #endif diff --git a/srcs/command_interpretation/close_command_pipeline.c b/srcs/command_interpretation/close_command_pipeline.c index 71837a2..9bcb7f2 100644 --- a/srcs/command_interpretation/close_command_pipeline.c +++ b/srcs/command_interpretation/close_command_pipeline.c @@ -28,6 +28,8 @@ int close_command_pipeline(t_command_pipeline cmd_pipeline, { if (WIFEXITED(last_command_status)) exit_status = WEXITSTATUS(last_command_status); + else if (WIFSTOPPED(last_command_status)) + exit_status = 128 + WSTOPSIG(last_command_status); else if (WIFSIGNALED(last_command_status)) exit_status = (128 + WTERMSIG(last_command_status)); else diff --git a/srcs/command_interpretation/command_interpreter.c b/srcs/command_interpretation/command_interpreter.c index c4bfb65..08ab125 100644 --- a/srcs/command_interpretation/command_interpreter.c +++ b/srcs/command_interpretation/command_interpreter.c @@ -29,6 +29,18 @@ static void main_process_io_management(t_command *command) } } +static void setup_command_signals(void) +{ + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGTSTP, SIG_DFL); + signal(SIGCONT, SIG_DFL); + signal(SIGTTIN, SIG_DFL); + signal(SIGTTOU, SIG_DFL); + signal(SIGPIPE, SIG_DFL); +} + static void launch_command(t_minishell_context *minishell_context, t_command *command) { @@ -48,6 +60,7 @@ static void launch_command(t_minishell_context *minishell_context, } if (command_process_pid == 0) { + setup_command_signals(); command_process(minishell_context, command); } } @@ -78,6 +91,7 @@ int command_pipeline_interpreter(t_minishell_context *minishell_context) t_command_pipeline current_command; pid_t last_command_pid; + setup_default_signals_handling(); cmd_pipeline = minishell_context->command_session.command_pipeline; current_command = cmd_pipeline; while (current_command != NULL) diff --git a/srcs/minishell_main_routine/core_routine.c b/srcs/minishell_main_routine/core_routine.c index ff3ffb7..34ff644 100644 --- a/srcs/minishell_main_routine/core_routine.c +++ b/srcs/minishell_main_routine/core_routine.c @@ -53,7 +53,7 @@ int core_routine(t_minishell_context *minishell_context) while (MSH_LOOP) { minishell_context->command_session.user_input_line - = prompt_gets_user_input(); + = prompt_gets_user_input(MAIN_PROMPT); current_loop_process(minishell_context); clean_current_loop_context(minishell_context); } diff --git a/srcs/minishell_main_routine/main.c b/srcs/minishell_main_routine/main.c index 36776c6..76bf7a4 100644 --- a/srcs/minishell_main_routine/main.c +++ b/srcs/minishell_main_routine/main.c @@ -14,10 +14,11 @@ #ifndef TEST_MODE +int stop; + static int launch_shell(char **env) { t_minishell_context minishell_context; - struct sigaction sa; display_minishell_header(); ft_bzero(&minishell_context, sizeof(minishell_context)); @@ -28,7 +29,6 @@ static int launch_shell(char **env) exit(EXIT_FAILURE); } set_exit_status(0); - setup_signals(&sa); return (core_routine(&minishell_context)); } diff --git a/srcs/semantic_analysis/state_heredoc.c b/srcs/semantic_analysis/state_heredoc.c index 89124a9..7c8f5cd 100644 --- a/srcs/semantic_analysis/state_heredoc.c +++ b/srcs/semantic_analysis/state_heredoc.c @@ -29,8 +29,12 @@ static char *build_heredoc_content(const char *delimiter) heredoc_content = ft_strdup(""); while (HEREDOC_PROCESSING) { - temp_line = readline("captain'hirdock>"); - if (is_delimiter(delimiter, temp_line)) + if (stop == 1) + break; + temp_line = prompt_gets_user_input(SUBPROMPT); + if (stop == 1) + break; + if (temp_line == CTRL_D || is_delimiter(delimiter, temp_line)) { free(temp_line); break ; @@ -70,6 +74,7 @@ t_semantic_analysis_state_return state_heredoc( perror("pipe"); exit(FAILURE); } + stop = 0; heredoc_content = build_heredoc_content(current_token->token_lexem); save_heredoc_content(current_command, heredoc_content, pipefd); if (current_command->command_args == NULL) diff --git a/srcs/signals_handling/default_signals_handling.c b/srcs/signals_handling/default_signals_handling.c new file mode 100644 index 0000000..307e112 --- /dev/null +++ b/srcs/signals_handling/default_signals_handling.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* command_interpreter_signals_handling.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tchobert +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/13 17:24:37 by tchobert #+# #+# */ +/* Updated: 2025/02/13 17:24:46 by tchobert ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void sigint_handler(int sig) +{ + (void)sig; + write(STDOUT_FILENO, "\n", 1); +} + +void setup_default_signals_handling(void) +{ + signal(SIGINT, sigint_handler); + signal(SIGTERM, SIG_IGN); + signal(SIGTSTP, SIG_IGN); + signal(SIGCONT, SIG_IGN); + signal(SIGTTIN, SIG_IGN); + signal(SIGTTOU, SIG_IGN); + signal(SIGPIPE, SIG_IGN); +} diff --git a/srcs/user_interface/prompt.c b/srcs/user_interface/prompt.c index c79e5e0..f3eec24 100644 --- a/srcs/user_interface/prompt.c +++ b/srcs/user_interface/prompt.c @@ -17,11 +17,33 @@ static void prompt_asks_next_history_entry(const char *user_input_line) add_user_input_line_to_history(user_input_line); } -char *prompt_gets_user_input(void) +void sigint_for_heredoc(int signum) { - char *user_input_line; + (void)signum; + stop = 1; + write(STDOUT_FILENO, "\n", 1); + set_exit_status(128 + SIGINT); + rl_replace_line("", 0); + rl_on_new_line(); + rl_done = 1; +} + +char *prompt_gets_user_input(bool is_subprompt) +{ + static struct sigaction sa; + char *user_input_line; - user_input_line = readline(MSH_PROMPT); - prompt_asks_next_history_entry(user_input_line); + if (is_subprompt == false) + { + setup_signals(&sa); + user_input_line = readline(MSH_PROMPT); + prompt_asks_next_history_entry(user_input_line); + } + else + { + setup_signals(&sa); + signal(SIGINT, sigint_for_heredoc); + user_input_line = readline("captain'hirdock>"); + } return (user_input_line); } diff --git a/test_minishell.sh b/test_minishell.sh index 0e1d652..1ade761 100755 --- a/test_minishell.sh +++ b/test_minishell.sh @@ -2,4 +2,4 @@ dir=$(pwd) -valgrind --leak-check=full --track-origins=yes --trace-children=yes --track-fds=yes --show-leak-kinds=all --suppressions=$dir/readline.supp -s ./minishell +valgrind --leak-check=full --track-origins=yes --trace-children=yes --track-fds=yes --show-leak-kinds=all --suppressions=$dir/readline.supp ./minishell From e4d175b5f50d9285701163c98b24f0042329fd9d Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Thu, 13 Feb 2025 23:53:01 +0100 Subject: [PATCH 02/19] heredoc almost --- Makefile | 1 + includes/minishell.h | 1 + .../command_interpreter.c | 14 +---------- srcs/semantic_analysis/state_heredoc.c | 12 +++++++++ .../setup_command_mode_signals.c | 25 +++++++++++++++++++ srcs/user_interface/prompt.c | 20 ++++++++++++--- srcs/user_interface/signals.c | 2 +- 7 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 srcs/signals_handling/setup_command_mode_signals.c diff --git a/Makefile b/Makefile index 2223333..665c6f3 100644 --- a/Makefile +++ b/Makefile @@ -145,6 +145,7 @@ SRCS += expander_exit.c # srcs/signals_handling SRCS += default_signals_handling.c +SRCS += setup_command_mode_signals.c # srcs/exit_status diff --git a/includes/minishell.h b/includes/minishell.h index e539e91..c6fb8fe 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -138,5 +138,6 @@ int get_exit_status_value(void); // SIGNALS HANDLING void setup_default_signals_handling(void); +void setup_command_mode_signals(void); #endif diff --git a/srcs/command_interpretation/command_interpreter.c b/srcs/command_interpretation/command_interpreter.c index 08ab125..3e4a09a 100644 --- a/srcs/command_interpretation/command_interpreter.c +++ b/srcs/command_interpretation/command_interpreter.c @@ -29,18 +29,6 @@ static void main_process_io_management(t_command *command) } } -static void setup_command_signals(void) -{ - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); - signal(SIGQUIT, SIG_DFL); - signal(SIGTSTP, SIG_DFL); - signal(SIGCONT, SIG_DFL); - signal(SIGTTIN, SIG_DFL); - signal(SIGTTOU, SIG_DFL); - signal(SIGPIPE, SIG_DFL); -} - static void launch_command(t_minishell_context *minishell_context, t_command *command) { @@ -60,7 +48,7 @@ static void launch_command(t_minishell_context *minishell_context, } if (command_process_pid == 0) { - setup_command_signals(); + setup_command_mode_signals(); command_process(minishell_context, command); } } diff --git a/srcs/semantic_analysis/state_heredoc.c b/srcs/semantic_analysis/state_heredoc.c index 7c8f5cd..9ca8927 100644 --- a/srcs/semantic_analysis/state_heredoc.c +++ b/srcs/semantic_analysis/state_heredoc.c @@ -20,6 +20,17 @@ static bool is_delimiter(const char *delimiter, const char *line) return (delimiter_size == line_size && ft_strcmp(line, delimiter) == 0); } +static void ensure_stdin_is_open(void) +{ + const int tty_fd = open("/dev/tty", O_RDONLY); + + if (tty_fd != -1) + { + dup2(tty_fd, STDIN_FILENO); + close(tty_fd); + } +} + static char *build_heredoc_content(const char *delimiter) { char *new_line; @@ -44,6 +55,7 @@ static char *build_heredoc_content(const char *delimiter) free(heredoc_content); heredoc_content = new_line; } + ensure_stdin_is_open(); return (heredoc_content); } diff --git a/srcs/signals_handling/setup_command_mode_signals.c b/srcs/signals_handling/setup_command_mode_signals.c new file mode 100644 index 0000000..cb4d857 --- /dev/null +++ b/srcs/signals_handling/setup_command_mode_signals.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* setup_command_mode_signals. :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tchobert +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/13 23:23:17 by tchobert #+# #+# */ +/* Updated: 2025/02/13 23:23:31 by tchobert ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void setup_command_mode_signals(void) +{ + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGTSTP, SIG_DFL); + signal(SIGCONT, SIG_DFL); + signal(SIGTTIN, SIG_DFL); + signal(SIGTTOU, SIG_DFL); + signal(SIGPIPE, SIG_DFL); +} diff --git a/srcs/user_interface/prompt.c b/srcs/user_interface/prompt.c index f3eec24..306b895 100644 --- a/srcs/user_interface/prompt.c +++ b/srcs/user_interface/prompt.c @@ -17,21 +17,32 @@ static void prompt_asks_next_history_entry(const char *user_input_line) add_user_input_line_to_history(user_input_line); } +static void simulate_eof(void) +{ + const int devnull = open("/dev/null", O_RDONLY); + + if (devnull != -1) + { + dup2(devnull, STDIN_FILENO); + close(devnull); + } +} + void sigint_for_heredoc(int signum) { (void)signum; stop = 1; - write(STDOUT_FILENO, "\n", 1); + write(STDIN_FILENO, "\n", 1); set_exit_status(128 + SIGINT); rl_replace_line("", 0); - rl_on_new_line(); rl_done = 1; + simulate_eof(); } char *prompt_gets_user_input(bool is_subprompt) { - static struct sigaction sa; - char *user_input_line; + static struct sigaction sa; + char *user_input_line; if (is_subprompt == false) { @@ -45,5 +56,6 @@ char *prompt_gets_user_input(bool is_subprompt) signal(SIGINT, sigint_for_heredoc); user_input_line = readline("captain'hirdock>"); } + setup_default_signals_handling(); return (user_input_line); } diff --git a/srcs/user_interface/signals.c b/srcs/user_interface/signals.c index 63d9bc3..43ca6b5 100644 --- a/srcs/user_interface/signals.c +++ b/srcs/user_interface/signals.c @@ -32,7 +32,7 @@ void setup_signals(struct sigaction *sa) void sigint_routine(void) { set_exit_status(128 + SIGINT); - printf("\n"); + write(STDIN_FILENO, "\n", 1); rl_on_new_line(); rl_replace_line("", 0); rl_redisplay(); From fd8151961c093e5906f524241b474620273b990a Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 16:00:49 +0100 Subject: [PATCH 03/19] refactoo signals debut --- Makefile | 1 + includes/minishell.h | 3 +- includes/user_interface.h | 1 + .../command_interpreter.c | 2 +- .../setup_command_mode_signals.c | 2 +- .../setup_heredoc_signals_handling.c | 40 +++++++++++++++++++ srcs/user_interface/prompt.c | 26 +----------- 7 files changed, 48 insertions(+), 27 deletions(-) create mode 100644 srcs/signals_handling/setup_heredoc_signals_handling.c diff --git a/Makefile b/Makefile index d71d61c..eb002ea 100644 --- a/Makefile +++ b/Makefile @@ -147,6 +147,7 @@ SRCS += erase_quotes.c SRCS += default_signals_handling.c SRCS += setup_command_mode_signals.c +SRCS += setup_heredoc_signals_handling.c # srcs/exit_status diff --git a/includes/minishell.h b/includes/minishell.h index c6fb8fe..adf4300 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -138,6 +138,7 @@ int get_exit_status_value(void); // SIGNALS HANDLING void setup_default_signals_handling(void); -void setup_command_mode_signals(void); +void setup_command_mode_signals_handling(void); +void setup_heredoc_signals_handling(void); #endif diff --git a/includes/user_interface.h b/includes/user_interface.h index 5e3f2b9..18833bb 100644 --- a/includes/user_interface.h +++ b/includes/user_interface.h @@ -24,6 +24,7 @@ // DEFINES # define MSH_PROMPT "SDF$> " +# define HEREDOC_PROMPT "captain'hirdock>" # define CTRL_D 0 # define FAILURE -1 # define MAIN_PROMPT 0 diff --git a/srcs/command_interpretation/command_interpreter.c b/srcs/command_interpretation/command_interpreter.c index 3e4a09a..f8435d9 100644 --- a/srcs/command_interpretation/command_interpreter.c +++ b/srcs/command_interpretation/command_interpreter.c @@ -48,7 +48,7 @@ static void launch_command(t_minishell_context *minishell_context, } if (command_process_pid == 0) { - setup_command_mode_signals(); + setup_command_mode_signals_handling(); command_process(minishell_context, command); } } diff --git a/srcs/signals_handling/setup_command_mode_signals.c b/srcs/signals_handling/setup_command_mode_signals.c index cb4d857..65f0367 100644 --- a/srcs/signals_handling/setup_command_mode_signals.c +++ b/srcs/signals_handling/setup_command_mode_signals.c @@ -12,7 +12,7 @@ #include "minishell.h" -void setup_command_mode_signals(void) +void setup_command_mode_signals_handling(void) { signal(SIGINT, SIG_DFL); signal(SIGTERM, SIG_DFL); diff --git a/srcs/signals_handling/setup_heredoc_signals_handling.c b/srcs/signals_handling/setup_heredoc_signals_handling.c new file mode 100644 index 0000000..95f7950 --- /dev/null +++ b/srcs/signals_handling/setup_heredoc_signals_handling.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* setup_heredoc_signals_handling.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tchobert +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/14 15:53:56 by tchobert #+# #+# */ +/* Updated: 2025/02/14 15:54:12 by tchobert ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void simulate_eof(void) +{ + const int devnull = open("/dev/null", O_RDONLY); + + if (devnull != -1) + { + dup2(devnull, STDIN_FILENO); + close(devnull); + } +} + +static void sigint_for_heredoc(int signum) +{ + (void)signum; + stop = 1; + write(STDIN_FILENO, "\n", 1); + set_exit_status(128 + SIGINT); + rl_replace_line("", 0); + rl_done = 1; + simulate_eof(); +} + +void setup_heredoc_signals_handling(void) +{ + signal(SIGINT, sigint_for_heredoc); +} \ No newline at end of file diff --git a/srcs/user_interface/prompt.c b/srcs/user_interface/prompt.c index 306b895..bea4284 100644 --- a/srcs/user_interface/prompt.c +++ b/srcs/user_interface/prompt.c @@ -17,28 +17,6 @@ static void prompt_asks_next_history_entry(const char *user_input_line) add_user_input_line_to_history(user_input_line); } -static void simulate_eof(void) -{ - const int devnull = open("/dev/null", O_RDONLY); - - if (devnull != -1) - { - dup2(devnull, STDIN_FILENO); - close(devnull); - } -} - -void sigint_for_heredoc(int signum) -{ - (void)signum; - stop = 1; - write(STDIN_FILENO, "\n", 1); - set_exit_status(128 + SIGINT); - rl_replace_line("", 0); - rl_done = 1; - simulate_eof(); -} - char *prompt_gets_user_input(bool is_subprompt) { static struct sigaction sa; @@ -53,8 +31,8 @@ char *prompt_gets_user_input(bool is_subprompt) else { setup_signals(&sa); - signal(SIGINT, sigint_for_heredoc); - user_input_line = readline("captain'hirdock>"); + setup_heredoc_signals_handling(); + user_input_line = readline("HEREDOC_PROMPT"); } setup_default_signals_handling(); return (user_input_line); From 024fc716d35f9ce944bf62515365fdfc925e91d5 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 17:27:23 +0100 Subject: [PATCH 04/19] signals manque mode execution --- Makefile | 19 +++---- includes/user_interface.h | 7 +-- srcs/command_interpretation/command_process.c | 2 +- srcs/exit_routines/exit_shell_routine.c | 6 ++- srcs/minishell_main_routine/main.c | 3 +- .../setup_heredoc_signals_handling.c | 6 +++ ... => setup_main_process_signals_handling.c} | 8 +-- .../signals.c | 54 +++++++++++-------- srcs/user_interface/prompt.c | 6 +-- 9 files changed, 63 insertions(+), 48 deletions(-) rename srcs/signals_handling/{default_signals_handling.c => setup_main_process_signals_handling.c} (90%) rename srcs/{user_interface => signals_handling}/signals.c (57%) diff --git a/Makefile b/Makefile index eb002ea..9cf643a 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,6 @@ SRCS += exit_shell_routine.c # scrs/user_interface -SRCS += signals.c SRCS += prompt.c # srcs/history @@ -145,9 +144,11 @@ SRCS += erase_quotes.c # srcs/signals_handling -SRCS += default_signals_handling.c +SRCS += setup_main_process_signals_handling.c SRCS += setup_command_mode_signals.c SRCS += setup_heredoc_signals_handling.c +#SRCS += setup_execution_mode_signal_handling.c +SRCS += signals.c # srcs/exit_status @@ -156,13 +157,13 @@ SRCS += get_exit_status_value.c # print_functions to use for debug and tests -# SRCS += print_env.c -# SRCS += print_token.c -# SRCS += print_token_list.c -# SRCS += print_argument.c -# SRCS += print_arguments_list.c -# SRCS += print_command.c -# SRCS += print_command_pipeline_list.c +SRCS += print_env.c +SRCS += print_token.c +SRCS += print_token_list.c +SRCS += print_argument.c +SRCS += print_arguments_list.c +SRCS += print_command.c +SRCS += print_command_pipeline_list.c vpath %.c $(PATH_SRCS) diff --git a/includes/user_interface.h b/includes/user_interface.h index 18833bb..e14efaa 100644 --- a/includes/user_interface.h +++ b/includes/user_interface.h @@ -32,9 +32,10 @@ // PROTOTYPES -void signal_handler(int signum); -void received_signal(void); +//void signal_handler(int signum); +//void received_signal(void); char *prompt_gets_user_input(bool is_subprompt); -void setup_signals(struct sigaction *sa); +void setup_main_prompt_signals_handling(void); +//void setup_signals(struct sigaction *sa); #endif diff --git a/srcs/command_interpretation/command_process.c b/srcs/command_interpretation/command_process.c index e0494a7..2cf5813 100644 --- a/srcs/command_interpretation/command_process.c +++ b/srcs/command_interpretation/command_process.c @@ -68,7 +68,7 @@ void command_process(t_minishell_context *minishell_context, if (setup_command_redirections(command) == EXIT_FAILURE) { clean_command_process(minishell_context); - exit(FAILURE); + exit(EXIT_FAILURE); } if (command->command_nature == UNDEFINED) { diff --git a/srcs/exit_routines/exit_shell_routine.c b/srcs/exit_routines/exit_shell_routine.c index 6a2f8af..d63f799 100644 --- a/srcs/exit_routines/exit_shell_routine.c +++ b/srcs/exit_routines/exit_shell_routine.c @@ -14,7 +14,9 @@ int exit_shell_routine(void) { + const int exit_value = get_exit_status_value(); + delete_variables_list(); - printf("exit\n"); - exit (EXIT_SUCCESS); + ft_putstr_fd("exit\n", STDERR_FILENO); + exit(exit_value); } diff --git a/srcs/minishell_main_routine/main.c b/srcs/minishell_main_routine/main.c index 76bf7a4..6b05ed7 100644 --- a/srcs/minishell_main_routine/main.c +++ b/srcs/minishell_main_routine/main.c @@ -21,6 +21,7 @@ static int launch_shell(char **env) t_minishell_context minishell_context; display_minishell_header(); + setup_default_signals_handling(); ft_bzero(&minishell_context, sizeof(minishell_context)); if (build_environment(env) == PROCESS_FAILURE) { @@ -28,7 +29,7 @@ static int launch_shell(char **env) " environment\n"); exit(EXIT_FAILURE); } - set_exit_status(0); + set_exit_status(EXIT_SUCCESS); return (core_routine(&minishell_context)); } diff --git a/srcs/signals_handling/setup_heredoc_signals_handling.c b/srcs/signals_handling/setup_heredoc_signals_handling.c index 95f7950..472e4ae 100644 --- a/srcs/signals_handling/setup_heredoc_signals_handling.c +++ b/srcs/signals_handling/setup_heredoc_signals_handling.c @@ -37,4 +37,10 @@ static void sigint_for_heredoc(int signum) void setup_heredoc_signals_handling(void) { signal(SIGINT, sigint_for_heredoc); + signal(SIGTERM, SIG_IGN); + signal(SIGTSTP, SIG_IGN); + signal(SIGCONT, SIG_IGN); + signal(SIGTTIN, SIG_IGN); + signal(SIGTTOU, SIG_IGN); + signal(SIGPIPE, SIG_IGN); } \ No newline at end of file diff --git a/srcs/signals_handling/default_signals_handling.c b/srcs/signals_handling/setup_main_process_signals_handling.c similarity index 90% rename from srcs/signals_handling/default_signals_handling.c rename to srcs/signals_handling/setup_main_process_signals_handling.c index 307e112..66ee53d 100644 --- a/srcs/signals_handling/default_signals_handling.c +++ b/srcs/signals_handling/setup_main_process_signals_handling.c @@ -12,15 +12,9 @@ #include "minishell.h" -static void sigint_handler(int sig) -{ - (void)sig; - write(STDOUT_FILENO, "\n", 1); -} - void setup_default_signals_handling(void) { - signal(SIGINT, sigint_handler); + signal(SIGINT, SIG_IGN); signal(SIGTERM, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGCONT, SIG_IGN); diff --git a/srcs/user_interface/signals.c b/srcs/signals_handling/signals.c similarity index 57% rename from srcs/user_interface/signals.c rename to srcs/signals_handling/signals.c index 43ca6b5..88351dd 100644 --- a/srcs/user_interface/signals.c +++ b/srcs/signals_handling/signals.c @@ -12,25 +12,26 @@ #include "minishell.h" -static void init_signals(const struct sigaction *sa) -{ - if (sigaction(SIGINT, sa, NULL) == FAILURE) - { - perror("sigaction"); - exit(EXIT_FAILURE); - } - signal(SIGQUIT, SIG_IGN); -} +// static void init_signals(const struct sigaction *sa) +// { +// if (sigaction(SIGINT, sa, NULL) == FAILURE) +// { +// perror("sigaction"); +// exit(EXIT_FAILURE); +// } +// signal(SIGQUIT, SIG_IGN); +// } -void setup_signals(struct sigaction *sa) -{ - ft_memset(sa, 0, sizeof(struct sigaction)); - sa->sa_handler = signal_handler; - init_signals(sa); -} +// void setup_signals(struct sigaction *sa) +// { +// ft_memset(sa, 0, sizeof(struct sigaction)); +// sa->sa_handler = signal_handler; +// init_signals(sa); +// } -void sigint_routine(void) +static void sigint_routine(int signum) { + (void)signum; set_exit_status(128 + SIGINT); write(STDIN_FILENO, "\n", 1); rl_on_new_line(); @@ -38,10 +39,21 @@ void sigint_routine(void) rl_redisplay(); } -void signal_handler(int signum) +void setup_main_prompt_signals_handling(void) { - if (signum == SIGINT) - { - sigint_routine(); - } + signal(SIGINT, sigint_routine); + signal(SIGTERM, SIG_IGN); + signal(SIGTSTP, SIG_IGN); + signal(SIGCONT, SIG_IGN); + signal(SIGTTIN, SIG_IGN); + signal(SIGTTOU, SIG_IGN); + signal(SIGPIPE, SIG_IGN); } + +// void signal_handler(int signum) +// { +// if (signum == SIGINT) +// { +// sigint_routine(); +// } +// } diff --git a/srcs/user_interface/prompt.c b/srcs/user_interface/prompt.c index bea4284..335d3b6 100644 --- a/srcs/user_interface/prompt.c +++ b/srcs/user_interface/prompt.c @@ -19,20 +19,18 @@ static void prompt_asks_next_history_entry(const char *user_input_line) char *prompt_gets_user_input(bool is_subprompt) { - static struct sigaction sa; char *user_input_line; if (is_subprompt == false) { - setup_signals(&sa); + setup_main_prompt_signals_handling(); user_input_line = readline(MSH_PROMPT); prompt_asks_next_history_entry(user_input_line); } else { - setup_signals(&sa); setup_heredoc_signals_handling(); - user_input_line = readline("HEREDOC_PROMPT"); + user_input_line = readline(HEREDOC_PROMPT); } setup_default_signals_handling(); return (user_input_line); From 0b256234086653d10e6c3d6a6ba01eb8b87db05c Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 20:49:45 +0100 Subject: [PATCH 05/19] heredoc revisite 1ere version --- Makefile | 3 + includes/minishell.h | 7 ++- includes/semantic.h | 5 ++ srcs/minishell_main_routine/core_routine.c | 1 + srcs/minishell_main_routine/main.c | 2 +- srcs/semantic_analysis/ensure_stdin_is_open.c | 24 ++++++++ .../heredoc_interruption_routine.c | 22 +++++++ srcs/semantic_analysis/is_delimiter.c | 21 +++++++ srcs/semantic_analysis/state_heredoc.c | 57 ++++++++++--------- .../setup_heredoc_signals_handling.c | 7 +-- .../setup_main_process_signals_handling.c | 1 + srcs/signals_handling/signals.c | 1 + 12 files changed, 116 insertions(+), 35 deletions(-) create mode 100644 srcs/semantic_analysis/ensure_stdin_is_open.c create mode 100644 srcs/semantic_analysis/heredoc_interruption_routine.c create mode 100644 srcs/semantic_analysis/is_delimiter.c diff --git a/Makefile b/Makefile index 9cf643a..9ca4b59 100644 --- a/Makefile +++ b/Makefile @@ -104,6 +104,9 @@ SRCS += get_command_name.c SRCS += is_builtin.c SRCS += delete_command_pipeline.c SRCS += setup_pipe.c +SRCS += is_delimiter.c +SRCS += ensure_stdin_is_open.c +SRCS += heredoc_interruption_routine.c # srcs/command_interpretation diff --git a/includes/minishell.h b/includes/minishell.h index adf4300..9d830cf 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -13,8 +13,6 @@ #ifndef MINISHELL_H # define MINISHELL_H -extern int stop; - // INCLUDES # include "history.h" @@ -34,6 +32,11 @@ extern int stop; # include # include # include +# include + +// GLOBAL VARIABLE + +extern volatile sig_atomic_t g_received_signal; // DEFINES diff --git a/includes/semantic.h b/includes/semantic.h index 046f294..b609569 100644 --- a/includes/semantic.h +++ b/includes/semantic.h @@ -144,6 +144,11 @@ void delete_command_pipeline( t_command_pipeline *cmd_pipeline); void get_command_name(t_command *command); bool is_builtin(const char *command_name); +bool is_delimiter(const char *delimiter, + const char *line); +void ensure_stdin_is_open(void); +void heredoc_interruption_routine( + const char *delimiter, int heredoc_lines); void print_arguments_list( t_command_args arguments_list); diff --git a/srcs/minishell_main_routine/core_routine.c b/srcs/minishell_main_routine/core_routine.c index 7987e20..14f37ae 100644 --- a/srcs/minishell_main_routine/core_routine.c +++ b/srcs/minishell_main_routine/core_routine.c @@ -52,6 +52,7 @@ int core_routine(t_minishell_context *minishell_context) { while (MSH_LOOP) { + g_received_signal = 0; minishell_context->command_session.user_input_line = prompt_gets_user_input(MAIN_PROMPT); current_loop_process(minishell_context); diff --git a/srcs/minishell_main_routine/main.c b/srcs/minishell_main_routine/main.c index 6b05ed7..a3b9a67 100644 --- a/srcs/minishell_main_routine/main.c +++ b/srcs/minishell_main_routine/main.c @@ -14,7 +14,7 @@ #ifndef TEST_MODE -int stop; +volatile sig_atomic_t g_received_signal = 0; static int launch_shell(char **env) { diff --git a/srcs/semantic_analysis/ensure_stdin_is_open.c b/srcs/semantic_analysis/ensure_stdin_is_open.c new file mode 100644 index 0000000..6d213e3 --- /dev/null +++ b/srcs/semantic_analysis/ensure_stdin_is_open.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ensure_stdin_is_open.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tchobert +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/14 19:58:56 by tchobert #+# #+# */ +/* Updated: 2025/02/14 19:59:05 by tchobert ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void ensure_stdin_is_open(void) +{ + const int tty_fd = open("/dev/tty", O_RDONLY); + + if (tty_fd != -1) + { + dup2(tty_fd, STDIN_FILENO); + close(tty_fd); + } +} diff --git a/srcs/semantic_analysis/heredoc_interruption_routine.c b/srcs/semantic_analysis/heredoc_interruption_routine.c new file mode 100644 index 0000000..39d918c --- /dev/null +++ b/srcs/semantic_analysis/heredoc_interruption_routine.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* heredoc_interruption_routine.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tchobert +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/14 20:00:29 by tchobert #+# #+# */ +/* Updated: 2025/02/14 20:00:42 by tchobert ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void heredoc_interruption_routine(const char *delimiter, int heredoc_lines) +{ + if (heredoc_lines == 0) + heredoc_lines = 1; + ft_dprintf(STDERR_FILENO, "minishell: warning: here-document " + "at line %d delimited by end-of-file (wanted `%s')\n", + heredoc_lines, delimiter); +} diff --git a/srcs/semantic_analysis/is_delimiter.c b/srcs/semantic_analysis/is_delimiter.c new file mode 100644 index 0000000..1975627 --- /dev/null +++ b/srcs/semantic_analysis/is_delimiter.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* is_delimiter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tchobert +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/14 19:57:18 by tchobert #+# #+# */ +/* Updated: 2025/02/14 19:57:30 by tchobert ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +bool is_delimiter(const char *delimiter, const char *line) +{ + const size_t delimiter_size = ft_strlen(delimiter); + const size_t line_size = ft_strlen(line); + + return (delimiter_size == line_size && ft_strcmp(line, delimiter) == 0); +} \ No newline at end of file diff --git a/srcs/semantic_analysis/state_heredoc.c b/srcs/semantic_analysis/state_heredoc.c index 9ca8927..c4beac3 100644 --- a/srcs/semantic_analysis/state_heredoc.c +++ b/srcs/semantic_analysis/state_heredoc.c @@ -12,51 +12,53 @@ #include "minishell.h" -static bool is_delimiter(const char *delimiter, const char *line) +static char *process_data(char *heredoc_content, char *temp_line) { - const size_t delimiter_size = ft_strlen(delimiter); - const size_t line_size = ft_strlen(line); - - return (delimiter_size == line_size && ft_strcmp(line, delimiter) == 0); + ensure_stdin_is_open(); + free(temp_line); + return (heredoc_content); } -static void ensure_stdin_is_open(void) +static void update_heredoc_content(char **heredoc_content, char *temp_line, + char *new_line, int *heredoc_lines) { - const int tty_fd = open("/dev/tty", O_RDONLY); - - if (tty_fd != -1) - { - dup2(tty_fd, STDIN_FILENO); - close(tty_fd); - } + ft_asprintf(&new_line, "%s%s\n", *heredoc_content, temp_line); + free(temp_line); + free(*heredoc_content); + *heredoc_content = new_line; + if (*heredoc_lines == 0) + *(heredoc_lines) += 2; + else + ++*(heredoc_lines); } static char *build_heredoc_content(const char *delimiter) { - char *new_line; - char *heredoc_content; - char *temp_line; + char *new_line; + char *heredoc_content; + char *temp_line; + int lines; + lines = 0; heredoc_content = ft_strdup(""); + new_line = NULL; while (HEREDOC_PROCESSING) { - if (stop == 1) - break; temp_line = prompt_gets_user_input(SUBPROMPT); - if (stop == 1) + if (g_received_signal == SIGINT) break; - if (temp_line == CTRL_D || is_delimiter(delimiter, temp_line)) + if (temp_line == CTRL_D) { - free(temp_line); + heredoc_interruption_routine(delimiter, lines); break ; } - ft_asprintf(&new_line, "%s%s\n", heredoc_content, temp_line); - free(temp_line); - free(heredoc_content); - heredoc_content = new_line; + if (is_delimiter(delimiter, temp_line)) + { + break ; + } + update_heredoc_content(&heredoc_content, temp_line, new_line, &lines); } - ensure_stdin_is_open(); - return (heredoc_content); + return (process_data(heredoc_content, temp_line)); } static void save_heredoc_content(t_command *current_command, @@ -86,7 +88,6 @@ t_semantic_analysis_state_return state_heredoc( perror("pipe"); exit(FAILURE); } - stop = 0; heredoc_content = build_heredoc_content(current_token->token_lexem); save_heredoc_content(current_command, heredoc_content, pipefd); if (current_command->command_args == NULL) diff --git a/srcs/signals_handling/setup_heredoc_signals_handling.c b/srcs/signals_handling/setup_heredoc_signals_handling.c index 472e4ae..c4b5c31 100644 --- a/srcs/signals_handling/setup_heredoc_signals_handling.c +++ b/srcs/signals_handling/setup_heredoc_signals_handling.c @@ -25,10 +25,9 @@ static void simulate_eof(void) static void sigint_for_heredoc(int signum) { - (void)signum; - stop = 1; - write(STDIN_FILENO, "\n", 1); - set_exit_status(128 + SIGINT); + g_received_signal = signum; + write(STDOUT_FILENO, "\n", 1); + set_exit_status(128 + signum); rl_replace_line("", 0); rl_done = 1; simulate_eof(); diff --git a/srcs/signals_handling/setup_main_process_signals_handling.c b/srcs/signals_handling/setup_main_process_signals_handling.c index 66ee53d..5ead281 100644 --- a/srcs/signals_handling/setup_main_process_signals_handling.c +++ b/srcs/signals_handling/setup_main_process_signals_handling.c @@ -16,6 +16,7 @@ void setup_default_signals_handling(void) { signal(SIGINT, SIG_IGN); signal(SIGTERM, SIG_IGN); + signal(SIGQUIT, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGCONT, SIG_IGN); signal(SIGTTIN, SIG_IGN); diff --git a/srcs/signals_handling/signals.c b/srcs/signals_handling/signals.c index 88351dd..76868e8 100644 --- a/srcs/signals_handling/signals.c +++ b/srcs/signals_handling/signals.c @@ -43,6 +43,7 @@ void setup_main_prompt_signals_handling(void) { signal(SIGINT, sigint_routine); signal(SIGTERM, SIG_IGN); + signal(SIGQUIT, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGCONT, SIG_IGN); signal(SIGTTIN, SIG_IGN); From 7dabbb52a7b2a926e9de5103c3c9d1a7f1d54a66 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 20:55:03 +0100 Subject: [PATCH 06/19] heredoc revisite 1ere version norme --- Makefile | 14 +++++++------- includes/minishell.h | 2 +- includes/semantic.h | 3 ++- srcs/semantic_analysis/ensure_stdin_is_open.c | 4 ++-- .../heredoc_interruption_routine.c | 2 +- srcs/semantic_analysis/is_delimiter.c | 2 +- srcs/semantic_analysis/state_heredoc.c | 4 ++-- .../setup_heredoc_signals_handling.c | 6 +++--- 8 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 9ca4b59..6687225 100644 --- a/Makefile +++ b/Makefile @@ -160,13 +160,13 @@ SRCS += get_exit_status_value.c # print_functions to use for debug and tests -SRCS += print_env.c -SRCS += print_token.c -SRCS += print_token_list.c -SRCS += print_argument.c -SRCS += print_arguments_list.c -SRCS += print_command.c -SRCS += print_command_pipeline_list.c +# SRCS += print_env.c +# SRCS += print_token.c +# SRCS += print_token_list.c +# SRCS += print_argument.c +# SRCS += print_arguments_list.c +# SRCS += print_command.c +# SRCS += print_command_pipeline_list.c vpath %.c $(PATH_SRCS) diff --git a/includes/minishell.h b/includes/minishell.h index 9d830cf..7734c45 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -79,7 +79,7 @@ typedef enum e_builtin_type PWD } t_builtin_type; -typedef int (*t_builtin)(t_command *current_command); +typedef int (*t_builtin)(t_command *current_command); // PROTOTYPES diff --git a/includes/semantic.h b/includes/semantic.h index b609569..7904507 100644 --- a/includes/semantic.h +++ b/includes/semantic.h @@ -148,7 +148,8 @@ bool is_delimiter(const char *delimiter, const char *line); void ensure_stdin_is_open(void); void heredoc_interruption_routine( - const char *delimiter, int heredoc_lines); + const char *delimiter, + int heredoc_lines); void print_arguments_list( t_command_args arguments_list); diff --git a/srcs/semantic_analysis/ensure_stdin_is_open.c b/srcs/semantic_analysis/ensure_stdin_is_open.c index 6d213e3..6ac03ba 100644 --- a/srcs/semantic_analysis/ensure_stdin_is_open.c +++ b/srcs/semantic_analysis/ensure_stdin_is_open.c @@ -12,9 +12,9 @@ #include "minishell.h" -void ensure_stdin_is_open(void) +void ensure_stdin_is_open(void) { - const int tty_fd = open("/dev/tty", O_RDONLY); + const int tty_fd = open("/dev/tty", O_RDONLY); if (tty_fd != -1) { diff --git a/srcs/semantic_analysis/heredoc_interruption_routine.c b/srcs/semantic_analysis/heredoc_interruption_routine.c index 39d918c..e927b37 100644 --- a/srcs/semantic_analysis/heredoc_interruption_routine.c +++ b/srcs/semantic_analysis/heredoc_interruption_routine.c @@ -18,5 +18,5 @@ void heredoc_interruption_routine(const char *delimiter, int heredoc_lines) heredoc_lines = 1; ft_dprintf(STDERR_FILENO, "minishell: warning: here-document " "at line %d delimited by end-of-file (wanted `%s')\n", - heredoc_lines, delimiter); + heredoc_lines, delimiter); } diff --git a/srcs/semantic_analysis/is_delimiter.c b/srcs/semantic_analysis/is_delimiter.c index 1975627..7a3d1e5 100644 --- a/srcs/semantic_analysis/is_delimiter.c +++ b/srcs/semantic_analysis/is_delimiter.c @@ -18,4 +18,4 @@ bool is_delimiter(const char *delimiter, const char *line) const size_t line_size = ft_strlen(line); return (delimiter_size == line_size && ft_strcmp(line, delimiter) == 0); -} \ No newline at end of file +} diff --git a/srcs/semantic_analysis/state_heredoc.c b/srcs/semantic_analysis/state_heredoc.c index c4beac3..ba21e20 100644 --- a/srcs/semantic_analysis/state_heredoc.c +++ b/srcs/semantic_analysis/state_heredoc.c @@ -46,13 +46,13 @@ static char *build_heredoc_content(const char *delimiter) { temp_line = prompt_gets_user_input(SUBPROMPT); if (g_received_signal == SIGINT) - break; + break ; if (temp_line == CTRL_D) { heredoc_interruption_routine(delimiter, lines); break ; } - if (is_delimiter(delimiter, temp_line)) + if (is_delimiter(delimiter, temp_line)) { break ; } diff --git a/srcs/signals_handling/setup_heredoc_signals_handling.c b/srcs/signals_handling/setup_heredoc_signals_handling.c index c4b5c31..327b265 100644 --- a/srcs/signals_handling/setup_heredoc_signals_handling.c +++ b/srcs/signals_handling/setup_heredoc_signals_handling.c @@ -12,9 +12,9 @@ #include "minishell.h" -static void simulate_eof(void) +static void simulate_eof(void) { - const int devnull = open("/dev/null", O_RDONLY); + const int devnull = open("/dev/null", O_RDONLY); if (devnull != -1) { @@ -42,4 +42,4 @@ void setup_heredoc_signals_handling(void) signal(SIGTTIN, SIG_IGN); signal(SIGTTOU, SIG_IGN); signal(SIGPIPE, SIG_IGN); -} \ No newline at end of file +} From 9f710e86dc150b6b038dcdb29d0e5d07dfb8ffb6 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 21:03:02 +0100 Subject: [PATCH 07/19] pblm saut de ligne regle dans heredoc --- srcs/semantic_analysis/state_heredoc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srcs/semantic_analysis/state_heredoc.c b/srcs/semantic_analysis/state_heredoc.c index ba21e20..8c17d30 100644 --- a/srcs/semantic_analysis/state_heredoc.c +++ b/srcs/semantic_analysis/state_heredoc.c @@ -44,6 +44,8 @@ static char *build_heredoc_content(const char *delimiter) new_line = NULL; while (HEREDOC_PROCESSING) { + if (g_received_signal == SIGINT) + break ; temp_line = prompt_gets_user_input(SUBPROMPT); if (g_received_signal == SIGINT) break ; @@ -53,9 +55,7 @@ static char *build_heredoc_content(const char *delimiter) break ; } if (is_delimiter(delimiter, temp_line)) - { break ; - } update_heredoc_content(&heredoc_content, temp_line, new_line, &lines); } return (process_data(heredoc_content, temp_line)); From 640b8082c7259bbee1c2082a66304d6a4b489c97 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 21:17:59 +0100 Subject: [PATCH 08/19] SIGINT default --- srcs/command_interpretation/command_interpreter.c | 1 + .../setup_execution_mode_signals_handling.c | 13 +++++++++++++ .../setup_main_process_signals_handling.c | 8 +++++++- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 srcs/signals_handling/setup_execution_mode_signals_handling.c diff --git a/srcs/command_interpretation/command_interpreter.c b/srcs/command_interpretation/command_interpreter.c index f8435d9..ffd87c3 100644 --- a/srcs/command_interpretation/command_interpreter.c +++ b/srcs/command_interpretation/command_interpreter.c @@ -44,6 +44,7 @@ static void launch_command(t_minishell_context *minishell_context, command->command_pid = command_process_pid; if (command_process_pid > 0) { + setup_default_signals_handling(); main_process_io_management(command); } if (command_process_pid == 0) diff --git a/srcs/signals_handling/setup_execution_mode_signals_handling.c b/srcs/signals_handling/setup_execution_mode_signals_handling.c new file mode 100644 index 0000000..612a158 --- /dev/null +++ b/srcs/signals_handling/setup_execution_mode_signals_handling.c @@ -0,0 +1,13 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* setup_execution_mode_signals_handling.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tchobert +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/14 21:05:11 by tchobert #+# #+# */ +/* Updated: 2025/02/14 21:05:22 by tchobert ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" diff --git a/srcs/signals_handling/setup_main_process_signals_handling.c b/srcs/signals_handling/setup_main_process_signals_handling.c index 5ead281..a684607 100644 --- a/srcs/signals_handling/setup_main_process_signals_handling.c +++ b/srcs/signals_handling/setup_main_process_signals_handling.c @@ -12,9 +12,15 @@ #include "minishell.h" +static void sigint_handler(int signum) +{ + (void)signum; + write(STDOUT_FILENO, "\n", 1); +} + void setup_default_signals_handling(void) { - signal(SIGINT, SIG_IGN); + signal(SIGINT, sigint_handler); signal(SIGTERM, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGTSTP, SIG_IGN); From ea127cb2a25f8d61440a9ceed2f8a7fa10af7ca1 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 22:19:39 +0100 Subject: [PATCH 09/19] patch leaks sur empty string in input --- srcs/command_interpretation/execute_command.c | 4 +++- srcs/signals_handling/signals.c | 2 +- srcs/user_interface/prompt.c | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/srcs/command_interpretation/execute_command.c b/srcs/command_interpretation/execute_command.c index 7351255..68fedaa 100644 --- a/srcs/command_interpretation/execute_command.c +++ b/srcs/command_interpretation/execute_command.c @@ -44,6 +44,8 @@ static t_command_status get_command_validity(t_command *command, const t_path_type command_path_type = get_path_type( command->command_name); + if(*(command->command_name) == '\0') + return (INVALID_COMMAND); return (command_path_manager(command, command_env, command_path_type)); } @@ -61,7 +63,7 @@ t_command_status execute_command(t_command *command) execve(command->command_binary_path, command_arguments, command_environment); } - ft_dprintf(STDERR_FILENO, "minishell: command not found: %s\n", + ft_dprintf(STDERR_FILENO, "minishell: %s: command not found\n", command->command_args->content); clean_command_attributes(command_arguments, command_environment); return (INVALID_COMMAND); diff --git a/srcs/signals_handling/signals.c b/srcs/signals_handling/signals.c index 76868e8..4e820aa 100644 --- a/srcs/signals_handling/signals.c +++ b/srcs/signals_handling/signals.c @@ -31,7 +31,7 @@ static void sigint_routine(int signum) { - (void)signum; + g_received_signal = signum; set_exit_status(128 + SIGINT); write(STDIN_FILENO, "\n", 1); rl_on_new_line(); diff --git a/srcs/user_interface/prompt.c b/srcs/user_interface/prompt.c index 335d3b6..7267aa7 100644 --- a/srcs/user_interface/prompt.c +++ b/srcs/user_interface/prompt.c @@ -19,7 +19,7 @@ static void prompt_asks_next_history_entry(const char *user_input_line) char *prompt_gets_user_input(bool is_subprompt) { - char *user_input_line; + char *user_input_line; if (is_subprompt == false) { From 0661bc18a1e1a7edb6cca8e56f6a42c6560e3a7e Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 22:36:16 +0100 Subject: [PATCH 10/19] gestion variable retour ctrl-c dans heredoc --- srcs/command_interpretation/command_process.c | 11 +++++++++-- srcs/semantic_analysis/state_heredoc.c | 2 ++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/srcs/command_interpretation/command_process.c b/srcs/command_interpretation/command_process.c index 2cf5813..93d28b8 100644 --- a/srcs/command_interpretation/command_process.c +++ b/srcs/command_interpretation/command_process.c @@ -61,6 +61,14 @@ void close_command_process_unused_fds(t_minishell_context *minishell_context, } } +static void undefined_command_process(t_minishell_context *minishell_context) +{ + const int exit_value = get_exit_status_value(); + + clean_command_process(minishell_context); + exit(exit_value); +} + void command_process(t_minishell_context *minishell_context, t_command *command) { @@ -72,8 +80,7 @@ void command_process(t_minishell_context *minishell_context, } if (command->command_nature == UNDEFINED) { - clean_command_process(minishell_context); - exit(SUCCESS); + undefined_command_process(minishell_context); } if (command->command_nature == BUILTIN) execute_builtin(minishell_context, command, BUILTIN_IN_PIPELINE); diff --git a/srcs/semantic_analysis/state_heredoc.c b/srcs/semantic_analysis/state_heredoc.c index 8c17d30..b3a5325 100644 --- a/srcs/semantic_analysis/state_heredoc.c +++ b/srcs/semantic_analysis/state_heredoc.c @@ -15,6 +15,8 @@ static char *process_data(char *heredoc_content, char *temp_line) { ensure_stdin_is_open(); + if (g_received_signal == 130) + set_exit_status(130); free(temp_line); return (heredoc_content); } From ae3e96c0097d072e2a0d7f16e333f617a9aa390f Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 22:39:17 +0100 Subject: [PATCH 11/19] fix espace dans msg en trop si pblm ouverture --- srcs/semantic_analysis/save_opening_error.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/srcs/semantic_analysis/save_opening_error.c b/srcs/semantic_analysis/save_opening_error.c index 788c43b..101a782 100644 --- a/srcs/semantic_analysis/save_opening_error.c +++ b/srcs/semantic_analysis/save_opening_error.c @@ -16,18 +16,18 @@ void save_opening_error(t_command *current_command, const char *file_name) { if (errno == ENOENT) ft_asprintf(¤t_command->opening_failure_msg, - "minishell: %s: No such file or directory\n", file_name); + "minishell: %s: No such file or directory", file_name); else if (errno == EACCES) ft_asprintf(¤t_command->opening_failure_msg, - "minishell: %s: Permission denied\n", file_name); + "minishell: %s: Permission denied", file_name); else if (errno == EMFILE || errno == ENFILE) ft_asprintf(¤t_command->opening_failure_msg, - "minishell: %s: Too many open files\n", file_name); + "minishell: %s: Too many open files", file_name); else if (errno == EISDIR) ft_asprintf(¤t_command->opening_failure_msg, - "minishell: %s: Is a directory\n", file_name); + "minishell: %s: Is a directory", file_name); else ft_asprintf(¤t_command->opening_failure_msg, - "minishell: %s: failed to open %s: %s\n", file_name, + "minishell: %s: failed to open %s: %s", file_name, strerror(errno)); } From 6b093f20ae14819c80cf83b0fd6a513d0602a584 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 22:48:10 +0100 Subject: [PATCH 12/19] fix message erreur cd si la cible n'existe pas --- srcs/builtins/cd/cd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srcs/builtins/cd/cd.c b/srcs/builtins/cd/cd.c index d4d4a14..55e8faf 100644 --- a/srcs/builtins/cd/cd.c +++ b/srcs/builtins/cd/cd.c @@ -30,7 +30,7 @@ static int change_directory(char *target) if (chdir(target) == -1) { free(target); - perror("chdir"); + perror("cd"); return (EXIT_FAILURE); } free(target); From 5679e185a425d95cce6d73c015a86e4eb4adeffe Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Fri, 14 Feb 2025 22:59:35 +0100 Subject: [PATCH 13/19] fix undersocre dans noms variables --- srcs/semantic_analysis/assignation_checker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srcs/semantic_analysis/assignation_checker.c b/srcs/semantic_analysis/assignation_checker.c index b541cb9..aba5658 100644 --- a/srcs/semantic_analysis/assignation_checker.c +++ b/srcs/semantic_analysis/assignation_checker.c @@ -41,7 +41,7 @@ t_assignation_status assignation_checker(char *assignation) i = 1; while (probable_key[i] != '\0') { - if (ft_isalnum(probable_key[i]) == false) + if (ft_isalnum(probable_key[i]) == false && probable_key[i] != '_') { free(probable_key); return (INVALID_ASSIGNATION); From e742f086e443dce92eb933fc5c2b17ea10d568da Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Sat, 15 Feb 2025 14:50:38 +0100 Subject: [PATCH 14/19] fix distinction entre empty input entre quotes et sans quotes --- includes/lexing.h | 1 + srcs/expander/erase_quotes.c | 18 +++++ srcs/semantic_analysis/state_command.c | 2 + test | 101 +++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 test diff --git a/includes/lexing.h b/includes/lexing.h index f793aa6..0ab30cb 100644 --- a/includes/lexing.h +++ b/includes/lexing.h @@ -60,6 +60,7 @@ typedef struct s_token { t_lexem token_lexem; t_token_type token_type; + bool is_surrounded_by_quotes; } t_token; typedef t_token t_grammar_element; diff --git a/srcs/expander/erase_quotes.c b/srcs/expander/erase_quotes.c index 31ef414..dcce285 100644 --- a/srcs/expander/erase_quotes.c +++ b/srcs/expander/erase_quotes.c @@ -12,6 +12,23 @@ #include "minishell.h" +static bool is_surrounded_by_quotes(char *word) +{ + size_t word_len; + + if (word == NULL || *word == '\0') + return (false); + word_len = ft_strlen(word); + if (word_len < 2) + return (false); + if (*word == '\"' && word[word_len -1] == '\"') + return (true); + else if (*word == '\'' && word[word_len -1] == '\'') + return (true); + else + return (false); +} + static char *erase_quotes_in_word(t_lexem word, t_quote_state *quote_state) { size_t i; @@ -51,6 +68,7 @@ void erase_quotes(t_token_list token_list) token = current_token->content; if (token->token_type == WORD) { + token->is_surrounded_by_quotes = is_surrounded_by_quotes(token->token_lexem); expanded_token = erase_quotes_in_word(token->token_lexem, "e_state); free(token->token_lexem); diff --git a/srcs/semantic_analysis/state_command.c b/srcs/semantic_analysis/state_command.c index eb7626c..c726479 100644 --- a/srcs/semantic_analysis/state_command.c +++ b/srcs/semantic_analysis/state_command.c @@ -65,6 +65,8 @@ t_semantic_analysis_state_return state_command( return (update_machine_state(current_token->token_type, semantic_machine)); } + if (*current_token->token_lexem == '\0' && current_token->is_surrounded_by_quotes == false) + return (TOKEN_PROCESSED); add_argument_to_command_args(current_token->token_lexem, ¤t_command->command_args); semantic_machine->machine_state = STATE_COMMAND; diff --git a/test b/test new file mode 100644 index 0000000..aa365b9 --- /dev/null +++ b/test @@ -0,0 +1,101 @@ +ABCDF +SYSTEMD_EXEC_PID=2661317 +SSH_AUTH_SOCK=/run/user/107616/keyring/ssh +SESSION_MANAGER=local/paul-f3Br9s3.clusters.42paris.fr:@/tmp/.ICE-unix/2661292,unix/paul-f3Br9s3.clusters.42paris.fr:/tmp/.ICE-unix/2661292 +GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/af65622b_bf46_409b_960e_2f0e2722f2d3 +LANG=en_US.UTF-8 +XDG_CURRENT_DESKTOP=ubuntu:GNOME +XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/tchobert +LIBVIRT_DEFAULT_URI=qemu:///system +GPG_AGENT_INFO=/run/user/107616/gnupg/S.gpg-agent:0:1 +DESKTOP_SESSION=ubuntu +QT_IM_MODULE=ibus +XDG_MENU_PREFIX=gnome- +XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session2 +USER=tchobert +DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/107616/bus +DOCKER_HOST=unix:///run/user/107616/docker.sock +SSH_AGENT_LAUNCHER=gnome-keyring +GTK_MODULES=gail:atk-bridge +XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg +GTK_IM_MODULE=ibus +XDG_SESSION_DESKTOP=ubuntu +QT_ACCESSIBILITY=1 +GNOME_DESKTOP_SESSION_ID=this-is-deprecated +KRB5CCNAME=FILE:/tmp/krb5cc_107616_mqz6QO +LOGNAME=tchobert +GNOME_TERMINAL_SERVICE=:1.87 +VTE_VERSION=6800 +PATH=/home/tchobert/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin +XDG_RUNTIME_DIR=/run/user/107616 +XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/home/tchobert/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop +XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 +SHELL=/bin/zsh +XMODIFIERS=@im=ibus +XDG_SESSION_TYPE=x11 +HOME=/home/tchobert +COLORTERM=truecolor +XAUTHORITY=/home/tchobert/.Xauthority +PWD=/home/tchobert/minishell +XDG_SESSION_CLASS=user +TERM=xterm-256color +GDMSESSION=ubuntu +DISPLAY=:0 +SHLVL=2 +OLDPWD=/home/tchobert +ZSH=/home/tchobert/.oh-my-zsh +PAGER=less +LESS=-R +LSCOLORS=Gxfxcxdxbxegedabagacad +LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: +_=/home/tchobert/minishell/./minishell +SHELL=/bin/zsh +LSCOLORS=Gxfxcxdxbxegedabagacad +SESSION_MANAGER=local/paul-f3Br9s3.clusters.42paris.fr:@/tmp/.ICE-unix/2661292,unix/paul-f3Br9s3.clusters.42paris.fr:/tmp/.ICE-unix/2661292 +QT_ACCESSIBILITY=1 +COLORTERM=truecolor +XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg +SSH_AGENT_LAUNCHER=gnome-keyring +LESS=-R +XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session2 +XDG_MENU_PREFIX=gnome- +GNOME_DESKTOP_SESSION_ID=this-is-deprecated +GTK_IM_MODULE=ibus +SSH_AUTH_SOCK=/run/user/107616/keyring/ssh +XMODIFIERS=@im=ibus +DESKTOP_SESSION=ubuntu +GTK_MODULES=gail:atk-bridge +PWD=/home/tchobert/minishell +KRB5CCNAME=FILE:/tmp/krb5cc_107616_mqz6QO +LOGNAME=tchobert +XDG_SESSION_DESKTOP=ubuntu +XDG_SESSION_TYPE=x11 +GPG_AGENT_INFO=/run/user/107616/gnupg/S.gpg-agent:0:1 +SYSTEMD_EXEC_PID=2663661 +XAUTHORITY=/home/tchobert/.Xauthority +XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/tchobert +HOME=/home/tchobert +LANG=en_US.UTF-8 +LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: +XDG_CURRENT_DESKTOP=ubuntu:GNOME +VTE_VERSION=6800 +XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 +GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/0ceb241c_3025_47ea_8ad7_6011913f7c9a +XDG_SESSION_CLASS=user +TERM=xterm-256color +ZSH=/home/tchobert/.oh-my-zsh +LIBVIRT_DEFAULT_URI=qemu:///system +USER=tchobert +GNOME_TERMINAL_SERVICE=:1.87 +DISPLAY=:0 +SHLVL=1 +PAGER=less +QT_IM_MODULE=ibus +XDG_RUNTIME_DIR=/run/user/107616 +DOCKER_HOST=unix:///run/user/107616/docker.sock +XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/home/tchobert/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop +PATH=/home/tchobert/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin +GDMSESSION=ubuntu +DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/107616/bus +OLDPWD=/home/tchobert/minishell +_=/usr/bin/env From f4902f662ac4c59dc4230c2d5d347b7769f4624f Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Sat, 15 Feb 2025 15:01:57 +0100 Subject: [PATCH 15/19] fix si PATH est unset dans recherche commande --- srcs/command_interpretation/command_path_manager.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/srcs/command_interpretation/command_path_manager.c b/srcs/command_interpretation/command_path_manager.c index 09dbe4c..deceb47 100644 --- a/srcs/command_interpretation/command_path_manager.c +++ b/srcs/command_interpretation/command_path_manager.c @@ -31,6 +31,8 @@ static t_command_status check_complete_absolute_path(t_command *command, static t_command_status check_uncomplete_absolute_path(t_command *command, char **command_env) { + if (ft_getenv("PATH", command_env) == NULL) + return (INVALID_COMMAND); return (build_complete_path(command, command_env)); } From 0c3b7fbbafab84205b51524543a806fab056c493 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Sat, 15 Feb 2025 15:21:56 +0100 Subject: [PATCH 16/19] pblm norme --- srcs/command_interpretation/execute_command.c | 2 +- srcs/expander/erase_quotes.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/srcs/command_interpretation/execute_command.c b/srcs/command_interpretation/execute_command.c index 68fedaa..b56254c 100644 --- a/srcs/command_interpretation/execute_command.c +++ b/srcs/command_interpretation/execute_command.c @@ -44,7 +44,7 @@ static t_command_status get_command_validity(t_command *command, const t_path_type command_path_type = get_path_type( command->command_name); - if(*(command->command_name) == '\0') + if (*(command->command_name) == '\0') return (INVALID_COMMAND); return (command_path_manager(command, command_env, command_path_type)); } diff --git a/srcs/expander/erase_quotes.c b/srcs/expander/erase_quotes.c index dcce285..2f87224 100644 --- a/srcs/expander/erase_quotes.c +++ b/srcs/expander/erase_quotes.c @@ -68,7 +68,8 @@ void erase_quotes(t_token_list token_list) token = current_token->content; if (token->token_type == WORD) { - token->is_surrounded_by_quotes = is_surrounded_by_quotes(token->token_lexem); + token->is_surrounded_by_quotes + = is_surrounded_by_quotes(token->token_lexem); expanded_token = erase_quotes_in_word(token->token_lexem, "e_state); free(token->token_lexem); From dab859ca39e1b28236b714d244f3eb09f7c1d8ca Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Sat, 15 Feb 2025 15:24:05 +0100 Subject: [PATCH 17/19] norme --- srcs/semantic_analysis/state_command.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/srcs/semantic_analysis/state_command.c b/srcs/semantic_analysis/state_command.c index c726479..221902a 100644 --- a/srcs/semantic_analysis/state_command.c +++ b/srcs/semantic_analysis/state_command.c @@ -65,7 +65,8 @@ t_semantic_analysis_state_return state_command( return (update_machine_state(current_token->token_type, semantic_machine)); } - if (*current_token->token_lexem == '\0' && current_token->is_surrounded_by_quotes == false) + if (*current_token->token_lexem == '\0' + && current_token->is_surrounded_by_quotes == false) return (TOKEN_PROCESSED); add_argument_to_command_args(current_token->token_lexem, ¤t_command->command_args); From 511c2583ec73f3675ace312f4da4c091d1f695c4 Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Sat, 15 Feb 2025 19:33:42 +0100 Subject: [PATCH 18/19] gestion du lancement du shell avec un env -i --- Makefile | 1 + includes/environment.h | 1 + .../build_minimal_environment.c | 37 +++++++ srcs/minishell_main_routine/main.c | 23 +++- test | 101 ------------------ 5 files changed, 58 insertions(+), 105 deletions(-) create mode 100644 srcs/environment_building/build_minimal_environment.c delete mode 100644 test diff --git a/Makefile b/Makefile index 7095e74..7888311 100644 --- a/Makefile +++ b/Makefile @@ -88,6 +88,7 @@ SRCS += set_variable_to_environment.c # srcs/environment_building SRCS += build_environment.c +SRCS += build_minimal_environment.c # srcs/semantic_analysis diff --git a/includes/environment.h b/includes/environment.h index 6210620..d5e0cbb 100644 --- a/includes/environment.h +++ b/includes/environment.h @@ -48,6 +48,7 @@ typedef struct s_variable t_variable_list *get_environment(void); t_status build_environment(char **variables); +t_status build_minimal_environment(void); t_status set_variable_from_keyvalue_to_environment( const char *keyvalue, bool make_it_exportable, t_variable_list *environment); diff --git a/srcs/environment_building/build_minimal_environment.c b/srcs/environment_building/build_minimal_environment.c new file mode 100644 index 0000000..1d478cb --- /dev/null +++ b/srcs/environment_building/build_minimal_environment.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* build_minimal_environment.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tchobert +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/15 18:58:08 by tchobert #+# #+# */ +/* Updated: 2025/02/15 18:58:17 by tchobert ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_status set_pwd(void) +{ + char *pwd_variable; + char cwd[PATH_MAX]; + + if (getcwd(cwd, PATH_MAX) == NULL) + { + perror("getcwd"); + return (PROCESS_FAILURE); + } + if (ft_asprintf(&pwd_variable, "PWD=%s", cwd) == -1) + return (PROCESS_FAILURE); + if (set_variable_from_keyvalue(pwd_variable, EXPORTABLE) == PROCESS_FAILURE) + return (PROCESS_FAILURE); + return (PROCESS_SUCCESS); +} + +t_status build_minimal_environment(void) +{ + if (set_variable_from_keyvalue("SHLVL=1", EXPORTABLE) == PROCESS_FAILURE) + return (PROCESS_FAILURE); + return (set_pwd()); +} diff --git a/srcs/minishell_main_routine/main.c b/srcs/minishell_main_routine/main.c index a3b9a67..a126cb8 100644 --- a/srcs/minishell_main_routine/main.c +++ b/srcs/minishell_main_routine/main.c @@ -16,6 +16,13 @@ volatile sig_atomic_t g_received_signal = 0; +static void environment_initialisation_failure_exit_process(void) +{ + ft_dprintf(STDERR_FILENO, "Fatal error while initializing minishell's" + " environment. Aborting\n"); + exit(EXIT_FAILURE); +} + static int launch_shell(char **env) { t_minishell_context minishell_context; @@ -23,11 +30,19 @@ static int launch_shell(char **env) display_minishell_header(); setup_default_signals_handling(); ft_bzero(&minishell_context, sizeof(minishell_context)); - if (build_environment(env) == PROCESS_FAILURE) + if (*env != NULL) + { + if (build_environment(env) == PROCESS_FAILURE) + { + environment_initialisation_failure_exit_process(); + } + } + else { - ft_dprintf(STDERR_FILENO, "Fatal error while initializing minishell's" - " environment\n"); - exit(EXIT_FAILURE); + if (build_minimal_environment() == PROCESS_FAILURE) + { + environment_initialisation_failure_exit_process(); + } } set_exit_status(EXIT_SUCCESS); return (core_routine(&minishell_context)); diff --git a/test b/test deleted file mode 100644 index aa365b9..0000000 --- a/test +++ /dev/null @@ -1,101 +0,0 @@ -ABCDF -SYSTEMD_EXEC_PID=2661317 -SSH_AUTH_SOCK=/run/user/107616/keyring/ssh -SESSION_MANAGER=local/paul-f3Br9s3.clusters.42paris.fr:@/tmp/.ICE-unix/2661292,unix/paul-f3Br9s3.clusters.42paris.fr:/tmp/.ICE-unix/2661292 -GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/af65622b_bf46_409b_960e_2f0e2722f2d3 -LANG=en_US.UTF-8 -XDG_CURRENT_DESKTOP=ubuntu:GNOME -XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/tchobert -LIBVIRT_DEFAULT_URI=qemu:///system -GPG_AGENT_INFO=/run/user/107616/gnupg/S.gpg-agent:0:1 -DESKTOP_SESSION=ubuntu -QT_IM_MODULE=ibus -XDG_MENU_PREFIX=gnome- -XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session2 -USER=tchobert -DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/107616/bus -DOCKER_HOST=unix:///run/user/107616/docker.sock -SSH_AGENT_LAUNCHER=gnome-keyring -GTK_MODULES=gail:atk-bridge -XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg -GTK_IM_MODULE=ibus -XDG_SESSION_DESKTOP=ubuntu -QT_ACCESSIBILITY=1 -GNOME_DESKTOP_SESSION_ID=this-is-deprecated -KRB5CCNAME=FILE:/tmp/krb5cc_107616_mqz6QO -LOGNAME=tchobert -GNOME_TERMINAL_SERVICE=:1.87 -VTE_VERSION=6800 -PATH=/home/tchobert/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin -XDG_RUNTIME_DIR=/run/user/107616 -XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/home/tchobert/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop -XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 -SHELL=/bin/zsh -XMODIFIERS=@im=ibus -XDG_SESSION_TYPE=x11 -HOME=/home/tchobert -COLORTERM=truecolor -XAUTHORITY=/home/tchobert/.Xauthority -PWD=/home/tchobert/minishell -XDG_SESSION_CLASS=user -TERM=xterm-256color -GDMSESSION=ubuntu -DISPLAY=:0 -SHLVL=2 -OLDPWD=/home/tchobert -ZSH=/home/tchobert/.oh-my-zsh -PAGER=less -LESS=-R -LSCOLORS=Gxfxcxdxbxegedabagacad -LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: -_=/home/tchobert/minishell/./minishell -SHELL=/bin/zsh -LSCOLORS=Gxfxcxdxbxegedabagacad -SESSION_MANAGER=local/paul-f3Br9s3.clusters.42paris.fr:@/tmp/.ICE-unix/2661292,unix/paul-f3Br9s3.clusters.42paris.fr:/tmp/.ICE-unix/2661292 -QT_ACCESSIBILITY=1 -COLORTERM=truecolor -XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg -SSH_AGENT_LAUNCHER=gnome-keyring -LESS=-R -XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session2 -XDG_MENU_PREFIX=gnome- -GNOME_DESKTOP_SESSION_ID=this-is-deprecated -GTK_IM_MODULE=ibus -SSH_AUTH_SOCK=/run/user/107616/keyring/ssh -XMODIFIERS=@im=ibus -DESKTOP_SESSION=ubuntu -GTK_MODULES=gail:atk-bridge -PWD=/home/tchobert/minishell -KRB5CCNAME=FILE:/tmp/krb5cc_107616_mqz6QO -LOGNAME=tchobert -XDG_SESSION_DESKTOP=ubuntu -XDG_SESSION_TYPE=x11 -GPG_AGENT_INFO=/run/user/107616/gnupg/S.gpg-agent:0:1 -SYSTEMD_EXEC_PID=2663661 -XAUTHORITY=/home/tchobert/.Xauthority -XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/tchobert -HOME=/home/tchobert -LANG=en_US.UTF-8 -LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: -XDG_CURRENT_DESKTOP=ubuntu:GNOME -VTE_VERSION=6800 -XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 -GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/0ceb241c_3025_47ea_8ad7_6011913f7c9a -XDG_SESSION_CLASS=user -TERM=xterm-256color -ZSH=/home/tchobert/.oh-my-zsh -LIBVIRT_DEFAULT_URI=qemu:///system -USER=tchobert -GNOME_TERMINAL_SERVICE=:1.87 -DISPLAY=:0 -SHLVL=1 -PAGER=less -QT_IM_MODULE=ibus -XDG_RUNTIME_DIR=/run/user/107616 -DOCKER_HOST=unix:///run/user/107616/docker.sock -XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/home/tchobert/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop -PATH=/home/tchobert/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin -GDMSESSION=ubuntu -DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/107616/bus -OLDPWD=/home/tchobert/minishell -_=/usr/bin/env From 6dc6574e46185f7f91f58a1e19364f9a9f69218b Mon Sep 17 00:00:00 2001 From: Thomas Chobert Date: Sat, 15 Feb 2025 20:07:20 +0100 Subject: [PATCH 19/19] ajout protection inclusion expander.h --- includes/expander.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/includes/expander.h b/includes/expander.h index 13040ef..c7f984e 100644 --- a/includes/expander.h +++ b/includes/expander.h @@ -10,7 +10,10 @@ /* */ /* ************************************************************************** */ -#include "minishell.h" +#ifndef EXPANDER_H +# define EXPANDER_H + +# include "minishell.h" typedef enum e_quote_state { @@ -33,3 +36,5 @@ void change_quote_state(char quote, t_quote_state *quote_state); void expander_exit(void); void erase_quotes(t_token_list token_list); char *manage_return_cmd(t_lexem temp_expanded, t_lexem expanded_word); + +#endif \ No newline at end of file