From 04ac2df8a5ee84d1e6690ef4309fc8a258da0c3d Mon Sep 17 00:00:00 2001 From: whaffman Date: Mon, 3 Mar 2025 22:34:59 +0100 Subject: [PATCH] builtin cd and exit WIP 42/52 --- inc/environment.h | 3 +- sources.mk | 54 ++++++++++++++-------------- src/builtin/builtin_cd.c | 40 +++++++++++++++------ src/builtin/builtin_exit.c | 10 +++--- src/builtin/builtin_export.c | 40 ++++++++++++++------- src/environment/environment_update.c | 29 +++++++++++++++ 6 files changed, 119 insertions(+), 57 deletions(-) create mode 100644 src/environment/environment_update.c diff --git a/inc/environment.h b/inc/environment.h index 6d0e160..b141207 100644 --- a/inc/environment.h +++ b/inc/environment.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:26:35 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:44:49 by whaffman ######## odam.nl */ +/* Updated: 2025/03/03 21:32:49 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -24,5 +24,6 @@ int environment_parse(t_minishell *msh, char **envp); char **environment_get_arr(t_minishell *msh); void environment_del(t_minishell *msh, char *name); void environment_free(t_minishell *msh, void *content); +void environment_update(t_minishell *msh, char *name, char *value); #endif // ENVIRONMENT_H diff --git a/sources.mk b/sources.mk index fd8fb6d..917112d 100644 --- a/sources.mk +++ b/sources.mk @@ -1,27 +1,27 @@ -VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/signal:src/debug:src/expander:src/builtin:src/redirect: -SOURCES = history_write.c history_load.c prompt.c check_malloc.c \ -free_command_list.c free_freelist.c free_lexer.c free_safe.c \ -free_token.c free_token_list.c ft_lstclear_safe.c ft_lstnew_safe.c \ -ft_strdup_safe.c ft_strjoin_safe.c malloc_safe.c \ -free_minishell_line.c ft_substr_safe.c error_msg.c ft_split_safe.c \ -init_minishell.c print_banner.c ft_free_arr_safe.c free_minishell.c \ -lexer_read_char.c lexer_new.c lexer_parse_input.c \ -lexer_parse_quotes.c lexer_read_word.c lexer_token_next.c token_new.c \ -token_char_convert.c token_parse.c token_type_convert.c \ -environment_del.c environment_free.c environment_get.c \ -environment_get_arr.c environment_free_list.c environment_parse.c \ -environment_print.c environment_add.c executor_close_fds.c \ -executor_open_fds.c executor_count_fds.c executor_create_pipes.c \ -executor_create_redirects.c executor_execute_pipeline.c \ -executor_fork.c executor_absolute_path.c executor_child.c \ -parser_alloc_command.c parser_create_command.c parser_get_arguments.c \ -parser_get_commands.c parser_validate_command.c signal.c \ -signal_init.c.c print_commands.c print_freelist.c \ -expander_expand_dollar.c expander_is_character.c \ -expander_parse_variables.c expander_get_variable.c \ -expander_allocate_memory.c expander_parse_string.c is_builtin.c \ -builtin_echo.c builtin_env.c builtin_router.c builtin_unset.c \ -simple_builtins.c builtin_cd.c builtin_exit.c builtin_export.c \ -builtin_pwd.c redirect_process_heredoc.c redirect_get_inputs.c \ -redirect_get_outputs.c redirect_new.c redirect_new_error.c \ -redirect_valid_type.c main.c \ +VPATH = src:src/parser:src/environment:src/lexer:src/redirect:src/debug:src/token:src/signal:src/prompt:src/utils:src/expander:src/executor:src/builtin: +SOURCES = parser_validate_command.c parser_get_arguments.c \ +parser_alloc_command.c parser_create_command.c parser_get_commands.c \ +environment_get.c environment_get_arr.c environment_free_list.c \ +environment_update.c environment_add.c environment_print.c \ +environment_del.c environment_free.c environment_parse.c lexer_new.c \ +lexer_read_word.c lexer_read_char.c lexer_parse_input.c \ +lexer_parse_quotes.c lexer_token_next.c redirect_get_inputs.c \ +redirect_get_outputs.c redirect_new.c redirect_valid_type.c \ +redirect_new_error.c redirect_process_heredoc.c print_freelist.c \ +print_commands.c main.c token_new.c token_char_convert.c \ +token_parse.c token_type_convert.c signal_init.c.c signal.c \ +history_write.c prompt.c history_load.c free_command_list.c \ +free_minishell.c ft_lstnew_safe.c free_safe.c free_lexer.c \ +ft_free_arr_safe.c print_banner.c check_malloc.c free_freelist.c \ +ft_lstclear_safe.c ft_split_safe.c error_msg.c free_token_list.c \ +malloc_safe.c free_minishell_line.c ft_strdup_safe.c free_token.c \ +ft_substr_safe.c init_minishell.c ft_strjoin_safe.c \ +expander_allocate_memory.c expander_parse_string.c \ +expander_parse_variables.c expander_expand_dollar.c \ +expander_is_character.c expander_get_variable.c executor_open_fds.c \ +executor_count_fds.c executor_fork.c executor_absolute_path.c \ +executor_execute_pipeline.c executor_child.c executor_close_fds.c \ +executor_create_redirects.c executor_create_pipes.c builtin_export.c \ +simple_builtins.c builtin_router.c is_builtin.c builtin_unset.c \ +builtin_env.c builtin_cd.c builtin_pwd.c builtin_exit.c \ +builtin_echo.c \ diff --git a/src/builtin/builtin_cd.c b/src/builtin/builtin_cd.c index 81a9b89..7b18405 100644 --- a/src/builtin/builtin_cd.c +++ b/src/builtin/builtin_cd.c @@ -6,33 +6,51 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:07 by whaffman #+# #+# */ -/* Updated: 2025/03/03 14:43:09 by whaffman ######## odam.nl */ +/* Updated: 2025/03/03 21:42:47 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" +static int builtin_cd_change_directory(t_minishell *msh, char *path) +{ + char *oldpwd; + + oldpwd = getcwd(NULL, 0); + if (oldpwd == NULL) + return (error_msg("cd", "getcwd failed"), EXIT_FAILURE); + if (chdir(path) == -1) + return (error_msg("cd", path), free(oldpwd), EXIT_FAILURE); + environment_update(msh, "OLDPWD", oldpwd); + free(oldpwd); + path = getcwd(NULL, 0); + environment_update(msh, "PWD", path); + free(path); + return (EXIT_SUCCESS); +} + int builtin_cd(t_minishell *msh, t_command *cmd) { t_environment *env; char *path; + if (cmd->args[1] != NULL && cmd->args[2] != NULL) + return (error_msg("cd", "too many arguments"), EXIT_FAILURE); if (cmd->args[1] == NULL) { env = environment_get(msh, "HOME"); if (env == NULL || env->value == NULL) - { - error_msg(NULL, NULL); - return (EXIT_FAILURE); - } + return (error_msg("cd", "HOME not set"), EXIT_FAILURE); + path = env->value; + } + else if (ft_strcmp(cmd->args[1], "-") == 0) + { + env = environment_get(msh, "OLDPWD"); + if (env == NULL || env->value == NULL) + return (error_msg("cd", "OLDPWD not set"), EXIT_FAILURE); path = env->value; } else path = cmd->args[1]; - if (chdir(path) == -1) - { - error_msg("cd", path); - return (EXIT_FAILURE); - } - return (EXIT_SUCCESS); + return (builtin_cd_change_directory(msh, path)); } diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c index e1fb75f..1f8b908 100644 --- a/src/builtin/builtin_exit.c +++ b/src/builtin/builtin_exit.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ -/* Updated: 2025/03/03 14:44:01 by whaffman ######## odam.nl */ +/* Updated: 2025/03/03 21:46:10 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ int builtin_exit(t_minishell *msh, t_command *cmd) exit_status = 0; if (ft_count_arr(cmd->args) > 2) { - ft_putstr_fd("exit\n", STDERR_FILENO); + ft_putstr_fd("exit\n", STDOUT_FILENO); ft_putstr_fd("minishell: exit: too many arguments\n", STDERR_FILENO); return (EXIT_FAILURE); } @@ -28,16 +28,16 @@ int builtin_exit(t_minishell *msh, t_command *cmd) { if (ft_isdigit_str(cmd->args[1]) == FALSE) { - ft_putstr_fd("exit\n", STDERR_FILENO); + ft_putstr_fd("exit\n", STDOUT_FILENO); ft_putstr_fd("minishell: exit: ", STDERR_FILENO); ft_putstr_fd(cmd->args[1], STDERR_FILENO); ft_putstr_fd(": numeric argument required\n", STDERR_FILENO); - return (EXIT_FAILURE); + return (2); } exit_status = ft_atoi(cmd->args[1]); } free_minishell(&msh); - ft_putendl_fd("exit", STDERR_FILENO); + ft_putendl_fd("exit", STDOUT_FILENO); rl_clear_history(); exit(exit_status); return (FAILURE); diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index adb01c9..a9f96ea 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -6,15 +6,30 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ -/* Updated: 2025/03/03 14:37:13 by whaffman ######## odam.nl */ +/* Updated: 2025/03/03 22:30:52 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" + +//TO LIBFT +static int ft_isvalid_identifier(char *str) +{ + if (ft_isalpha(*str) == FALSE && *str != '_') + return (FALSE); + while (*str != '\0') + { + if (ft_isalnum(*str) == FALSE && *str != '_') + return (FALSE); + str++; + } + return (TRUE); +} + int builtin_export(t_minishell *msh, t_command *cmd) { - t_environment *env; + char *err; char **arr; int i; @@ -23,18 +38,17 @@ int builtin_export(t_minishell *msh, t_command *cmd) while (cmd->args[++i] != NULL) { arr = ft_split_safe(msh, cmd->args[i], '='); - if (arr[1] == NULL) - return (FAILURE) ; - env = environment_get(msh, arr[0]); - if (env != NULL) - { - free_safe(msh, (void **)&(env->value)); - env->value = ft_strdup_safe(msh, arr[1]); - } + if (arr == NULL || arr[0] == NULL) + return (ft_free_arr_safe(msh, arr), EXIT_FAILURE); + else if (ft_isvalid_identifier(arr[0]) == TRUE) + environment_update(msh, arr[0], arr[1]); else - environment_add(msh, arr[0], arr[1]); + { + err = ft_strjoin_safe(msh, arr[0], ": not a valid identifier"); + error_msg("export", err); + return(ft_free_arr_safe(msh, arr), EXIT_FAILURE); + } ft_free_arr_safe(msh, arr); } - ft_free_arr_safe(msh, arr); - return (SUCCESS); + return (EXIT_SUCCESS); } diff --git a/src/environment/environment_update.c b/src/environment/environment_update.c new file mode 100644 index 0000000..6dcb290 --- /dev/null +++ b/src/environment/environment_update.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* environment_update.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/03/03 21:28:53 by whaffman #+# #+# */ +/* Updated: 2025/03/03 21:33:16 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void environment_update(t_minishell *msh, char *name, char *value) +{ + t_environment *env; + + if (environment_get(msh, name) == NULL) + { + environment_add(msh, name, value); + } + else + { + env = environment_get(msh, name); + free_safe(msh, (void **)&(env->value)); + env->value = ft_strdup_safe(msh, value); + } +}