From 2eed0f2d453d4ffa765035ed49135a1a51c1d216 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Fri, 3 Dec 2021 16:10:04 +0100 Subject: [PATCH 01/19] little fix, ft_lstnew_generic() prototype. + unused c var in builtin_env() --- srcs/builtins/env.c | 3 ++- srcs/parsing/expansions/expand_token.c | 4 +--- srcs/parsing/expansions/new_token_for_each_field.c | 6 ++---- srcs/parsing/expansions/words_expansions.c | 3 +-- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/srcs/builtins/env.c b/srcs/builtins/env.c index 6642079..d634397 100644 --- a/srcs/builtins/env.c +++ b/srcs/builtins/env.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/10 05:01:26 by lperrey #+# #+# */ -/* Updated: 2021/11/27 11:18:55 by lperrey ### ########.fr */ +/* Updated: 2021/12/01 17:19:48 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,7 @@ int builtin_env(int argc, char *argv[], t_all *c) // WIP { (void)argc; (void)argv; + (void)c; ft_putendl_arr_fd(environ, 1); return (0); } diff --git a/srcs/parsing/expansions/expand_token.c b/srcs/parsing/expansions/expand_token.c index 90ab62f..f9c3f81 100644 --- a/srcs/parsing/expansions/expand_token.c +++ b/srcs/parsing/expansions/expand_token.c @@ -6,14 +6,12 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/07 02:01:33 by lperrey #+# #+# */ -/* Updated: 2021/11/26 21:54:42 by lperrey ### ########.fr */ +/* Updated: 2021/11/30 18:35:44 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_list *ft_lstnew_generic(size_t lst_sizse, size_t content_size); - static t_list *ret_parameter_expansion(char *content, int *i); t_list *expand_token(char *content) diff --git a/srcs/parsing/expansions/new_token_for_each_field.c b/srcs/parsing/expansions/new_token_for_each_field.c index fa0eca5..f28e7c6 100644 --- a/srcs/parsing/expansions/new_token_for_each_field.c +++ b/srcs/parsing/expansions/new_token_for_each_field.c @@ -6,14 +6,12 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/07 02:01:33 by lperrey #+# #+# */ -/* Updated: 2021/11/30 13:46:46 by lperrey ### ########.fr */ +/* Updated: 2021/11/30 18:51:13 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_list *ft_lstnew_generic(size_t lst_sizse, size_t content_size); - static t_token *insert_tokens(t_token *t, t_token *insert_lst); int new_token_for_each_field(char **fields, t_token **t) @@ -29,7 +27,7 @@ int new_token_for_each_field(char **fields, t_token **t) { if (fields[i][0]) { - insert_lst->next = (t_token *)ft_lstnew_generic(sizeof(t_token), 0); + insert_lst->next = ft_lstnew_generic(sizeof(t_token), 0); insert_lst = insert_lst->next; if (!insert_lst) {//todo wrap diff --git a/srcs/parsing/expansions/words_expansions.c b/srcs/parsing/expansions/words_expansions.c index dfc9eb9..17f0a46 100644 --- a/srcs/parsing/expansions/words_expansions.c +++ b/srcs/parsing/expansions/words_expansions.c @@ -6,13 +6,12 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/07 02:01:33 by lperrey #+# #+# */ -/* Updated: 2021/11/26 21:05:01 by lperrey ### ########.fr */ +/* Updated: 2021/11/30 18:35:59 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_list *ft_lstnew_generic(size_t lst_sizse, size_t content_size); t_list *expand_token(char *content); char *rejoin_after_expand(t_list *expand_lst); int new_token_for_each_field(char **fields, t_token **t); From 27c00a78a0b8b9a6545bea624e9f0d6a2a2a0e2d Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sat, 4 Dec 2021 18:14:24 +0100 Subject: [PATCH 02/19] export builtin --- headers/minishell_prototypes.h | 5 +- srcs/builtins/export.c | 122 ++++++++++++++++++++++++++++----- srcs/builtins/unset.c | 2 +- srcs/init.c | 3 +- 4 files changed, 109 insertions(+), 23 deletions(-) diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index 2c5267d..b7a7370 100644 --- a/headers/minishell_prototypes.h +++ b/headers/minishell_prototypes.h @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 02:59:58 by lperrey #+# #+# */ -/* Updated: 2021/12/02 00:37:39 by lperrey ### ########.fr */ +/* Updated: 2021/12/04 15:46:00 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -58,10 +58,11 @@ int builtin_cd(int argc, char *argv[], t_all *c); int builtin_pwd(int argc, char *argv[], t_all *c); int builtin_export(int argc, char *argv[], t_all *c); int builtin_unset(int argc, char *argv[], t_all *c); +char *ft_getenv(char *env_var); +size_t ft_getenv_position(char *env_var); int builtin_exit(int argc, char *argv[], t_all *c); int builtin_env(int argc, char *argv[], t_all *c); int builtin_echo(int argc, char *argv[], t_all *c); -int getenv_position(char **envp, char *name); // Free int exit_free(t_all *c, int exit_status); diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c index 6e190b7..bbfc020 100644 --- a/srcs/builtins/export.c +++ b/srcs/builtins/export.c @@ -1,33 +1,119 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* export.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/12/03 13:36:54 by lperrey #+# #+# */ +/* Updated: 2021/12/04 16:07:21 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ #include "minishell.h" -int getenv_position(char **envp, char *name) // TODO : virer arg envp et utiliser "extern **environ" à la place +char *ft_getenv(char *env_var); +size_t ft_getenv_position(char *env_var); + +static int change_env_value(char *arg); + +// in complete shell, must mark all arguments for export +// (Not implemented in minishell) +int builtin_export(int argc, char *argv[], t_all *c) { int i; - i = 0; - while (envp[i] && ft_strncmp(envp[i], name, ft_strlen(name))) + (void)argc; + i = 1; + while (argv[i]) + { + if (ft_strchr(argv[i], '=')) + { + if (!change_env_value(argv[i])) + return (EXIT_FAILURE); + if (ft_strncmp(argv[i], "PATH=", 5) == 0) + c->path = retrieve_path(); + } i++; - return (i); + } + return (EXIT_SUCCESS); } -int builtin_export(int argc, char *argv[], t_all *c) +static int change_env_value(char *arg) { - char **var; - int env_position; + char **var_split; + int env_position; - (void)argc; - (void)c; - if (!ft_strchr(argv[1], '=')) - return (0); - var = ft_split(argv[1], '='); - env_position = getenv_position(environ, var[0]); - if (environ[env_position] == '\0') + var_split = ft_split(arg, '='); + if (!var_split) + return (ft_reti_perror(-1, "builtin_export, ft_split()")); + env_position = ft_getenv_position(var_split[0]); + ft_free_2d_arr(var_split); + if (environ[env_position] == NULL) + { environ = ft_resize_2d_arr(environ, 1); - environ[env_position] = ft_strdup(argv[1]); - if (!ft_strncmp(var[0], "PATH", 4 + 1)) // TODO : NON. Ce n'est pas la fin de la string donc "strlen() + 1" n'est pas adapté - c->path = retrieve_path(); - // free var + if (!environ) + return (ft_reti_perror(-1, "builtin_export, ft_resize_2d_arr()")); + } + environ[env_position] = ft_strdup(arg); + if (!environ[env_position]) + return (ft_reti_perror(-1, "builtin_export, ft_strdup()")); return (0); } +/* +** Search for an environement variable, +** and return a pointer to the first character after "env_var=" . +** Return NULL if env_var not found. +*/ +char *ft_getenv(char *env_var) +{ + int i; + char *tmp; + size_t env_var_len; + + env_var_len = ft_strlen(env_var); + i = 0; + tmp = NULL; + while (!tmp && environ[i]) + { + if (environ[i][env_var_len] == '=') + { + if (ft_strncmp(environ[i], env_var, env_var_len) == 0) + tmp = &environ[i][env_var_len + 1]; + else + i++; + } + else + i++; + } + return (tmp); +} + +/* +** Like ft_getenv(), but return position of env_var instead of value. +** If env_var not found, return last position of **environ (== NULL) +*/ +size_t ft_getenv_position(char *env_var) +{ + int i; + int found; + size_t env_var_len; + + env_var_len = ft_strlen(env_var); + i = 0; + found = 0; + while (!found && environ[i]) + { + if (environ[i][env_var_len] == '=') + { + if (ft_strncmp(environ[i], env_var, env_var_len) == 0) + found = 1; + else + i++; + } + else + i++; + } + return (i); +} diff --git a/srcs/builtins/unset.c b/srcs/builtins/unset.c index 755c76f..211fd7c 100644 --- a/srcs/builtins/unset.c +++ b/srcs/builtins/unset.c @@ -11,7 +11,7 @@ int builtin_unset(int argc, char *argv[], t_all *c) i = 1; while (argv[i]) { - env_position = getenv_position(environ, argv[i]); + env_position = ft_getenv_position(argv[i]); free(environ[env_position]); while (environ[env_position]) { diff --git a/srcs/init.c b/srcs/init.c index 92f24a6..e332c64 100644 --- a/srcs/init.c +++ b/srcs/init.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */ -/* Updated: 2021/12/02 01:38:22 by lperrey ### ########.fr */ +/* Updated: 2021/12/04 15:11:20 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,7 +36,6 @@ int init(t_all *c) return (1); } -// done : TODO : Un appel à builtin_export() modifiant $PATH doit aussi entrainer un appel à "c->path = retrieve_path()" char **retrieve_path(void) { char *path; From c3a9035622cd413efccc3bfb396e3b1924244551 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sun, 5 Dec 2021 01:01:27 +0100 Subject: [PATCH 03/19] builtins cd, pwd (todo, refactoring cd) --- headers/minishell_prototypes.h | 3 ++- srcs/builtins/cd.c | 46 +++++++++++++++++++++++++++++----- srcs/builtins/export.c | 4 +-- srcs/builtins/pwd.c | 22 +++++++++++++--- srcs/error_wrappers.c | 17 ++++++++++++- 5 files changed, 78 insertions(+), 14 deletions(-) diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index b7a7370..1abbc1d 100644 --- a/headers/minishell_prototypes.h +++ b/headers/minishell_prototypes.h @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 02:59:58 by lperrey #+# #+# */ -/* Updated: 2021/12/04 15:46:00 by lperrey ### ########.fr */ +/* Updated: 2021/12/04 19:09:42 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -72,6 +72,7 @@ typedef void (*t_free_f)(void *); // generic // Error wrappers void shell_error(char *s1, char *s2); +void shell_perror(char *s1, char *s2, char *s3); // Generic char *ft_strjoinfree(char *s1, char *s2); diff --git a/srcs/builtins/cd.c b/srcs/builtins/cd.c index 1ceaafa..48c5701 100644 --- a/srcs/builtins/cd.c +++ b/srcs/builtins/cd.c @@ -1,12 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/12/04 19:31:19 by lperrey #+# #+# */ +/* Updated: 2021/12/04 20:01:37 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ #include "minishell.h" int builtin_cd(int argc, char *argv[], t_all *c) { - (void)argc; - chdir(argv[1]); - c->prompt = init_prompt(c->prompt_base); - if (!c->prompt) - return (ft_reti_perror(0, "init_prompt() error")); - return (0); + char *tmp; + + if (argc == 2) + tmp = argv[1]; + else if (argc < 2) + { + tmp = getenv("HOME"); + if (!tmp) + { + shell_error("cd: ", "HOME not set"); + return (EXIT_FAILURE); + } + } + else if (argc > 2) + { + shell_error("cd: ", "too many arguments"); + return (EXIT_FAILURE); + } + if (chdir(tmp) == -1) + { + shell_perror("cd: ", tmp, ": "); + return (EXIT_FAILURE); + } + tmp = init_prompt(c->prompt_base); + if (!tmp) + return (ft_reti_perror(EXIT_FAILURE, "builtin_cd, init_prompt()")); + free(c->prompt); + c->prompt = tmp; + return (EXIT_SUCCESS); } diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c index bbfc020..bbd48f5 100644 --- a/srcs/builtins/export.c +++ b/srcs/builtins/export.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/12/03 13:36:54 by lperrey #+# #+# */ -/* Updated: 2021/12/04 16:07:21 by lperrey ### ########.fr */ +/* Updated: 2021/12/04 18:47:15 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ size_t ft_getenv_position(char *env_var); static int change_env_value(char *arg); -// in complete shell, must mark all arguments for export +// in complete shell, must mark arguments for export // (Not implemented in minishell) int builtin_export(int argc, char *argv[], t_all *c) { diff --git a/srcs/builtins/pwd.c b/srcs/builtins/pwd.c index 7b4f630..981be6c 100644 --- a/srcs/builtins/pwd.c +++ b/srcs/builtins/pwd.c @@ -1,15 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pwd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/12/04 19:15:36 by lperrey #+# #+# */ +/* Updated: 2021/12/04 20:22:49 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ #include "minishell.h" int builtin_pwd(int argc, char *argv[], t_all *c) { - char *pwd; + char *working_dir; (void)argc; (void)argv; (void)c; - pwd = getcwd(NULL, 0); - write(1, pwd, ft_strlen(pwd)); + working_dir = getcwd(NULL, 0); + if (!working_dir) + return (ft_reti_perror(EXIT_FAILURE, "builtin_pwd, getcwd()")); + write(1, working_dir, ft_strlen(working_dir)); write(1, "\n", 1); - return (0); + free(working_dir); + return (EXIT_SUCCESS); } diff --git a/srcs/error_wrappers.c b/srcs/error_wrappers.c index df1d6f2..c88754c 100644 --- a/srcs/error_wrappers.c +++ b/srcs/error_wrappers.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/12/01 17:16:30 by lperrey #+# #+# */ -/* Updated: 2021/12/01 17:19:02 by lperrey ### ########.fr */ +/* Updated: 2021/12/04 19:09:34 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,3 +24,18 @@ void shell_error(char *s1, char *s2) write(STDERR_FILENO, s2, ft_strlen(s2)); write(STDERR_FILENO, "\n", 1); } + +void shell_perror(char *s1, char *s2, char *s3) +{ + char *prefix; + + prefix = "minishell: "; + write(STDERR_FILENO, prefix, ft_strlen(prefix)); + if (s1) + write(STDERR_FILENO, s1, ft_strlen(s1)); + if (s2) + write(STDERR_FILENO, s2, ft_strlen(s2)); + if (s3) + write(STDERR_FILENO, s3, ft_strlen(s3)); + perror(NULL); +} From 66183ab4410fd61f2465f554af5cf48b27ccf908 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sun, 5 Dec 2021 16:28:41 +0100 Subject: [PATCH 04/19] cd refactoring, error_wrappers --- headers/minishell_prototypes.h | 6 +++--- srcs/builtins/cd.c | 17 ++++------------- srcs/error_wrappers.c | 10 +++++++--- srcs/exec/find_access.c | 4 ++-- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index 1abbc1d..619e293 100644 --- a/headers/minishell_prototypes.h +++ b/headers/minishell_prototypes.h @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 02:59:58 by lperrey #+# #+# */ -/* Updated: 2021/12/04 19:09:42 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 15:55:07 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -71,8 +71,8 @@ void close_pipeline_fd(t_cmd *pipeline[]); typedef void (*t_free_f)(void *); // generic // Error wrappers -void shell_error(char *s1, char *s2); -void shell_perror(char *s1, char *s2, char *s3); +int shell_error(char *s1, char *s2, char *s3, int ret_val); +int shell_perror(char *s1, char *s2, char *s3, int ret_val); // Generic char *ft_strjoinfree(char *s1, char *s2); diff --git a/srcs/builtins/cd.c b/srcs/builtins/cd.c index 48c5701..06abd87 100644 --- a/srcs/builtins/cd.c +++ b/srcs/builtins/cd.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/12/04 19:31:19 by lperrey #+# #+# */ -/* Updated: 2021/12/04 20:01:37 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 16:21:41 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,21 +22,12 @@ int builtin_cd(int argc, char *argv[], t_all *c) { tmp = getenv("HOME"); if (!tmp) - { - shell_error("cd: ", "HOME not set"); - return (EXIT_FAILURE); - } + return (shell_error("cd: ", "HOME not set", "", EXIT_FAILURE)); } else if (argc > 2) - { - shell_error("cd: ", "too many arguments"); - return (EXIT_FAILURE); - } + return (shell_error("cd: ", "too many arguments", "", EXIT_FAILURE)); if (chdir(tmp) == -1) - { - shell_perror("cd: ", tmp, ": "); - return (EXIT_FAILURE); - } + return (shell_perror("cd: ", tmp, ": ", EXIT_FAILURE)); tmp = init_prompt(c->prompt_base); if (!tmp) return (ft_reti_perror(EXIT_FAILURE, "builtin_cd, init_prompt()")); diff --git a/srcs/error_wrappers.c b/srcs/error_wrappers.c index c88754c..aef5775 100644 --- a/srcs/error_wrappers.c +++ b/srcs/error_wrappers.c @@ -6,13 +6,13 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/12/01 17:16:30 by lperrey #+# #+# */ -/* Updated: 2021/12/04 19:09:34 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 16:26:48 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void shell_error(char *s1, char *s2) +int shell_error(char *s1, char *s2, char *s3, int ret_val) { char *prefix; @@ -22,10 +22,13 @@ void shell_error(char *s1, char *s2) write(STDERR_FILENO, s1, ft_strlen(s1)); if (s2) write(STDERR_FILENO, s2, ft_strlen(s2)); + if (s3) + write(STDERR_FILENO, s3, ft_strlen(s3)); write(STDERR_FILENO, "\n", 1); + return (ret_val); } -void shell_perror(char *s1, char *s2, char *s3) +int shell_perror(char *s1, char *s2, char *s3, int ret_val) { char *prefix; @@ -38,4 +41,5 @@ void shell_perror(char *s1, char *s2, char *s3) if (s3) write(STDERR_FILENO, s3, ft_strlen(s3)); perror(NULL); + return (ret_val); } diff --git a/srcs/exec/find_access.c b/srcs/exec/find_access.c index fbe16e5..22d44a1 100644 --- a/srcs/exec/find_access.c +++ b/srcs/exec/find_access.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/16 01:57:38 by lperrey #+# #+# */ -/* Updated: 2021/12/01 17:16:55 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 16:20:55 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,7 +48,7 @@ int cmd_find_access(t_cmd *cmd, char *path[]) if (!cmd->path) { cmd->error = EXIT_CMD_NOT_FOUND; - shell_error(cmd->argv[0], ": command not found"); + shell_error(cmd->argv[0], ": ", "command not found", 0); } } return (1); From b7b3cec6e048746c109ae2007bc41e28c2db3139 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sun, 5 Dec 2021 18:15:23 +0100 Subject: [PATCH 05/19] builtin unset + fixed builtin export --- headers/minishell_prototypes.h | 7 ++- srcs/builtins/export.c | 85 ++++++++------------------ srcs/builtins/unset.c | 55 ++++++++++++++--- srcs/generic.c | 75 ++++++++++++++++++++++- srcs/lexing/lexing.c | 3 +- srcs/parsing/expansions/expand_token.c | 9 ++- 6 files changed, 159 insertions(+), 75 deletions(-) diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index 619e293..27e2cbe 100644 --- a/headers/minishell_prototypes.h +++ b/headers/minishell_prototypes.h @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 02:59:58 by lperrey #+# #+# */ -/* Updated: 2021/12/05 15:55:07 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 17:36:01 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -58,8 +58,6 @@ int builtin_cd(int argc, char *argv[], t_all *c); int builtin_pwd(int argc, char *argv[], t_all *c); int builtin_export(int argc, char *argv[], t_all *c); int builtin_unset(int argc, char *argv[], t_all *c); -char *ft_getenv(char *env_var); -size_t ft_getenv_position(char *env_var); int builtin_exit(int argc, char *argv[], t_all *c); int builtin_env(int argc, char *argv[], t_all *c); int builtin_echo(int argc, char *argv[], t_all *c); @@ -91,6 +89,9 @@ void *ft_dup_2d_arr(void *ptr, void *(*dup_func)(void *)); void ft_perror_io(char *err_str, char *io_file); int ft_reti_perror_io(int ret, char *err_str, char *io_file); void ft_free_null(void *ptr); +char *ft_getenv(char *env_var); +size_t ft_getenv_position(char *env_var); +int ft_is_posix_name(char *str); char **ft_split_quotes(char const *s, char c); char *ft_strdup_quotes(const char *s); diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c index bbd48f5..24b2c9b 100644 --- a/srcs/builtins/export.c +++ b/srcs/builtins/export.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/12/03 13:36:54 by lperrey #+# #+# */ -/* Updated: 2021/12/04 18:47:15 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 18:14:31 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,24 +19,35 @@ static int change_env_value(char *arg); // in complete shell, must mark arguments for export // (Not implemented in minishell) -int builtin_export(int argc, char *argv[], t_all *c) +int builtin_export(int argc, char *argv[], t_all *c) // 2 lignes de trop... NORME / 20 { int i; + int exit_value; + int ret; (void)argc; + exit_value = EXIT_SUCCESS; i = 1; while (argv[i]) { if (ft_strchr(argv[i], '=')) { - if (!change_env_value(argv[i])) + ret = change_env_value(argv[i]); + if (ret == -1) return (EXIT_FAILURE); + else if (ret == EXIT_FAILURE) + exit_value = EXIT_FAILURE; if (ft_strncmp(argv[i], "PATH=", 5) == 0) c->path = retrieve_path(); } + else if (!ft_is_posix_name(argv[i])) + { + shell_error("export: ", argv[i], ": not a valid identifier", 0); + exit_value = EXIT_FAILURE; + } i++; } - return (EXIT_SUCCESS); + return (exit_value); } static int change_env_value(char *arg) @@ -47,6 +58,12 @@ static int change_env_value(char *arg) var_split = ft_split(arg, '='); if (!var_split) return (ft_reti_perror(-1, "builtin_export, ft_split()")); + if (!ft_is_posix_name(var_split[0])) + { + shell_error("export: ", var_split[0], ": not a valid identifier", 0); + ft_free_2d_arr(var_split); + return (EXIT_FAILURE); + } env_position = ft_getenv_position(var_split[0]); ft_free_2d_arr(var_split); if (environ[env_position] == NULL) @@ -58,62 +75,12 @@ static int change_env_value(char *arg) environ[env_position] = ft_strdup(arg); if (!environ[env_position]) return (ft_reti_perror(-1, "builtin_export, ft_strdup()")); - return (0); + return (EXIT_SUCCESS); } /* -** Search for an environement variable, -** and return a pointer to the first character after "env_var=" . -** Return NULL if env_var not found. +environment variables must be POSIX NAME : + 3.235 Name +https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html +#tag_03_235 */ -char *ft_getenv(char *env_var) -{ - int i; - char *tmp; - size_t env_var_len; - - env_var_len = ft_strlen(env_var); - i = 0; - tmp = NULL; - while (!tmp && environ[i]) - { - if (environ[i][env_var_len] == '=') - { - if (ft_strncmp(environ[i], env_var, env_var_len) == 0) - tmp = &environ[i][env_var_len + 1]; - else - i++; - } - else - i++; - } - return (tmp); -} - -/* -** Like ft_getenv(), but return position of env_var instead of value. -** If env_var not found, return last position of **environ (== NULL) -*/ -size_t ft_getenv_position(char *env_var) -{ - int i; - int found; - size_t env_var_len; - - env_var_len = ft_strlen(env_var); - i = 0; - found = 0; - while (!found && environ[i]) - { - if (environ[i][env_var_len] == '=') - { - if (ft_strncmp(environ[i], env_var, env_var_len) == 0) - found = 1; - else - i++; - } - else - i++; - } - return (i); -} diff --git a/srcs/builtins/unset.c b/srcs/builtins/unset.c index 211fd7c..f530ae8 100644 --- a/srcs/builtins/unset.c +++ b/srcs/builtins/unset.c @@ -1,24 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* unset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/12/05 17:05:05 by lperrey #+# #+# */ +/* Updated: 2021/12/05 18:14:28 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ #include "minishell.h" +static int unset_env_var(char *arg); + int builtin_unset(int argc, char *argv[], t_all *c) { - int env_position; - int i; + int i; + int exit_value; (void)argc; (void)c; + exit_value = EXIT_SUCCESS; i = 1; while (argv[i]) { - env_position = ft_getenv_position(argv[i]); - free(environ[env_position]); - while (environ[env_position]) - { - environ[env_position] = environ[env_position + 1]; - env_position++; - } + if (unset_env_var(argv[i]) == EXIT_FAILURE) + exit_value = EXIT_FAILURE; i++; } - return (0); + return (exit_value); } + +static int unset_env_var(char *arg) +{ + int env_position; + + if (!ft_is_posix_name(arg)) + { + shell_error("unset: ", arg, ": not a valid identifier", 0); + return (EXIT_FAILURE); + } + env_position = ft_getenv_position(arg); + free(environ[env_position]); + while (environ[env_position]) + { + environ[env_position] = environ[env_position + 1]; + env_position++; + } + return (EXIT_SUCCESS); +} + +/* +environment variables must be POSIX NAME : + 3.235 Name +https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html +#tag_03_235 +*/ diff --git a/srcs/generic.c b/srcs/generic.c index 602be02..e42a4ff 100644 --- a/srcs/generic.c +++ b/srcs/generic.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 09:25:35 by lperrey #+# #+# */ -/* Updated: 2021/11/30 18:51:00 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 17:35:32 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -218,3 +218,76 @@ void ft_free_null(void *ptr) free(*(char**)ptr); *(char**)ptr = NULL; } + +/* +** Search for an environement variable, +** and return a pointer to the first character after "env_var=" . +** Return NULL if env_var not found. +*/ +char *ft_getenv(char *env_var) +{ + int i; + char *tmp; + size_t env_var_len; + + env_var_len = ft_strlen(env_var); + i = 0; + tmp = NULL; + while (!tmp && environ[i]) + { + if (environ[i][env_var_len] == '=') + { + if (ft_strncmp(environ[i], env_var, env_var_len) == 0) + tmp = &environ[i][env_var_len + 1]; + else + i++; + } + else + i++; + } + return (tmp); +} + +/* +** Like ft_getenv(), but return position of env_var instead of value. +** If env_var not found, return last position of **environ (== NULL) +*/ +size_t ft_getenv_position(char *env_var) +{ + int i; + int found; + size_t env_var_len; + + env_var_len = ft_strlen(env_var); + i = 0; + found = 0; + while (!found && environ[i]) + { + if (environ[i][env_var_len] == '=') + { + if (ft_strncmp(environ[i], env_var, env_var_len) == 0) + found = 1; + else + i++; + } + else + i++; + } + return (i); +} + +int ft_is_posix_name(char *str) +{ + unsigned int i; + + if (str[0] != '_' && !ft_isalpha(str[0])) + return (0); + i = 1; + while (str[i]) + { + if (str[i] != '_' && !ft_isalnum(str[i])) + return (0); + i++; + } + return (i); +} diff --git a/srcs/lexing/lexing.c b/srcs/lexing/lexing.c index 5914fb4..d3a2775 100644 --- a/srcs/lexing/lexing.c +++ b/srcs/lexing/lexing.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/19 08:38:55 by lperrey #+# #+# */ -/* Updated: 2021/12/01 14:54:22 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 17:11:31 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -63,6 +63,7 @@ static int tokenize_input(t_token *t, char *input, size_t input_len) } /* + 2.3 Token Recognition https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html #tag_18_03 */ diff --git a/srcs/parsing/expansions/expand_token.c b/srcs/parsing/expansions/expand_token.c index f9c3f81..b0ee83d 100644 --- a/srcs/parsing/expansions/expand_token.c +++ b/srcs/parsing/expansions/expand_token.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/07 02:01:33 by lperrey #+# #+# */ -/* Updated: 2021/11/30 18:35:44 by lperrey ### ########.fr */ +/* Updated: 2021/12/05 18:14:24 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -105,3 +105,10 @@ static t_list *ret_parameter_expansion(char *content, int *i) return (ft_retp_free(NULL, expand, free)); return (expand); } + +/* +environment variables must be POSIX NAME : + 3.235 Name +https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html +#tag_03_235 +*/ From 2d85c34b98276171e68378eea22f8f2ca43bd947 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Mon, 6 Dec 2021 01:14:18 +0100 Subject: [PATCH 06/19] commented debug print in parsing --- srcs/parsing/parsing.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srcs/parsing/parsing.c b/srcs/parsing/parsing.c index a8f0f86..bf2708f 100644 --- a/srcs/parsing/parsing.c +++ b/srcs/parsing/parsing.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/24 10:52:40 by lperrey #+# #+# */ -/* Updated: 2021/11/29 12:28:07 by lperrey ### ########.fr */ +/* Updated: 2021/12/06 01:08:11 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -78,7 +78,7 @@ t_cmd **parsing(t_token *token_list) // Struct CMD fill if (!pipeline_fill_argv(token_list, pipeline)) return (ft_retp_free(NULL, &pipeline, (t_free_f)free_pipeline)); - print_pipeline(pipeline); + //print_pipeline(pipeline); return (pipeline); } From 200e043a8c8c73fac955bb24de58f5327d398265 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Mon, 6 Dec 2021 03:56:05 +0100 Subject: [PATCH 07/19] builtin export fixed and refactored + builtin exit, env verif OK --- srcs/builtins/env.c | 2 +- srcs/builtins/exit.c | 2 +- srcs/builtins/export.c | 69 +++++++++++++++++++++++------------------- srcs/builtins/unset.c | 2 +- 4 files changed, 41 insertions(+), 34 deletions(-) diff --git a/srcs/builtins/env.c b/srcs/builtins/env.c index d634397..0e83f21 100644 --- a/srcs/builtins/env.c +++ b/srcs/builtins/env.c @@ -12,7 +12,7 @@ #include "minishell.h" -int builtin_env(int argc, char *argv[], t_all *c) // WIP +int builtin_env(int argc, char *argv[], t_all *c) { (void)argc; (void)argv; diff --git a/srcs/builtins/exit.c b/srcs/builtins/exit.c index 7a726ea..1464d29 100644 --- a/srcs/builtins/exit.c +++ b/srcs/builtins/exit.c @@ -12,7 +12,7 @@ #include "minishell.h" -int builtin_exit(int argc, char *argv[], t_all *c) // WIP +int builtin_exit(int argc, char *argv[], t_all *c) { unsigned char status; int i; diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c index 24b2c9b..4955f77 100644 --- a/srcs/builtins/export.c +++ b/srcs/builtins/export.c @@ -6,20 +6,20 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/12/03 13:36:54 by lperrey #+# #+# */ -/* Updated: 2021/12/05 18:14:31 by lperrey ### ########.fr */ +/* Updated: 2021/12/06 03:19:30 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *ft_getenv(char *env_var); -size_t ft_getenv_position(char *env_var); +static int export_var(char *arg); +static int change_var_value(char *arg, char *var_name); -static int change_env_value(char *arg); +#define ERR_ID 1 +#define ERR_ID_STR ": not a valid identifier" +#define CMD "builtin_export" -// in complete shell, must mark arguments for export -// (Not implemented in minishell) -int builtin_export(int argc, char *argv[], t_all *c) // 2 lignes de trop... NORME / 20 +int builtin_export(int argc, char *argv[], t_all *c) { int i; int exit_value; @@ -30,51 +30,58 @@ int builtin_export(int argc, char *argv[], t_all *c) // 2 lignes de trop... NORM i = 1; while (argv[i]) { - if (ft_strchr(argv[i], '=')) - { - ret = change_env_value(argv[i]); - if (ret == -1) - return (EXIT_FAILURE); - else if (ret == EXIT_FAILURE) - exit_value = EXIT_FAILURE; - if (ft_strncmp(argv[i], "PATH=", 5) == 0) - c->path = retrieve_path(); - } - else if (!ft_is_posix_name(argv[i])) - { - shell_error("export: ", argv[i], ": not a valid identifier", 0); + ret = export_var(argv[i]); + if (ret == -1) + return (EXIT_FAILURE); + else if (ret == ERR_ID) exit_value = EXIT_FAILURE; - } + if (ft_strncmp(argv[i], "PATH=", 5) == 0) + c->path = retrieve_path(); i++; } return (exit_value); } -static int change_env_value(char *arg) +// in complete shell, must mark arguments for export +// (Not implemented in minishell) +static int export_var(char *arg) { char **var_split; - int env_position; + int ret; + ret = 0; var_split = ft_split(arg, '='); if (!var_split) - return (ft_reti_perror(-1, "builtin_export, ft_split()")); + return (ft_reti_perror(-1, CMD", ft_split()")); if (!ft_is_posix_name(var_split[0])) { - shell_error("export: ", var_split[0], ": not a valid identifier", 0); + shell_error("export: ", var_split[0], ERR_ID_STR, 0); ft_free_2d_arr(var_split); - return (EXIT_FAILURE); + return (ERR_ID); } - env_position = ft_getenv_position(var_split[0]); + if (ft_strchr(arg, '=')) + ret = change_var_value(arg, var_split[0]); ft_free_2d_arr(var_split); + return (ret); +} + +static int change_var_value(char *arg, char *var_name) +{ + int env_position; + char *tmp; + + env_position = ft_getenv_position(var_name); if (environ[env_position] == NULL) { environ = ft_resize_2d_arr(environ, 1); if (!environ) - return (ft_reti_perror(-1, "builtin_export, ft_resize_2d_arr()")); + return (ft_reti_perror(-1, CMD", ft_resize_2d_arr()")); } - environ[env_position] = ft_strdup(arg); - if (!environ[env_position]) - return (ft_reti_perror(-1, "builtin_export, ft_strdup()")); + tmp = ft_strdup(arg); + if (!tmp) + return (ft_reti_perror(-1, CMD", ft_strdup()")); + free(environ[env_position]); + environ[env_position] = tmp; return (EXIT_SUCCESS); } diff --git a/srcs/builtins/unset.c b/srcs/builtins/unset.c index f530ae8..474417c 100644 --- a/srcs/builtins/unset.c +++ b/srcs/builtins/unset.c @@ -35,7 +35,7 @@ int builtin_unset(int argc, char *argv[], t_all *c) static int unset_env_var(char *arg) { int env_position; - + if (!ft_is_posix_name(arg)) { shell_error("unset: ", arg, ": not a valid identifier", 0); From caa733e14a1e0e9e3411bb3c80ca93a8ffe65ef8 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 8 Dec 2021 00:22:06 +0100 Subject: [PATCH 08/19] open_pipes() bugfix + write "exit" to STDERR (like bash) + set_last_exit_status() on CTRL-C --- srcs/exec/pipeline.c | 2 +- srcs/shell_loop.c | 2 +- srcs/signals.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/srcs/exec/pipeline.c b/srcs/exec/pipeline.c index 6646d52..3a0354f 100644 --- a/srcs/exec/pipeline.c +++ b/srcs/exec/pipeline.c @@ -45,7 +45,7 @@ static int open_pipes(t_cmd *pipeline[]) else if (close(pipes[STDOUT_FILENO]) == -1) perror("close()"); - if (pipeline[i]->fd_in == STDIN_FILENO) + if (pipeline[i + 1]->fd_in == STDIN_FILENO) pipeline[i + 1]->fd_in = pipes[STDIN_FILENO]; else if (close(pipes[STDIN_FILENO]) == -1) diff --git a/srcs/shell_loop.c b/srcs/shell_loop.c index 1a65c3c..7b1055d 100644 --- a/srcs/shell_loop.c +++ b/srcs/shell_loop.c @@ -53,7 +53,7 @@ static char *read_input(char *prompt, t_all *c) sigaction(SIGINT, &signal_behaviour, NULL); if (!line_input) { - write(1, "exit\n", 5); + write(STDERR_FILENO, "exit\n", 5); exit_free(c, get_last_exit_status()); } return (line_input); diff --git a/srcs/signals.c b/srcs/signals.c index 61445b6..3834374 100644 --- a/srcs/signals.c +++ b/srcs/signals.c @@ -14,11 +14,11 @@ void sigint_handler_interactive(int signum) { - (void)signum; write(1, "\n", 1); rl_on_new_line(); rl_replace_line("", 1); rl_redisplay(); + set_last_exit_status(EXIT_SIGNAL + signum); } void sigint_handler_heredoc(int signum) From 8a7611da92ae01e5fb16929e26f1e5c0ec956ba2 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 8 Dec 2021 03:03:16 +0100 Subject: [PATCH 09/19] fixed empty quotes expansions --- .../expansions/new_token_for_each_field.c | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/srcs/parsing/expansions/new_token_for_each_field.c b/srcs/parsing/expansions/new_token_for_each_field.c index f28e7c6..029106b 100644 --- a/srcs/parsing/expansions/new_token_for_each_field.c +++ b/srcs/parsing/expansions/new_token_for_each_field.c @@ -25,21 +25,16 @@ int new_token_for_each_field(char **fields, t_token **t) i = 0; while (fields[i]) { - if (fields[i][0]) - { - insert_lst->next = ft_lstnew_generic(sizeof(t_token), 0); - insert_lst = insert_lst->next; - if (!insert_lst) - {//todo wrap - perror("insert_token_for_each_field() error"); - ft_free_2d_arr(fields); - return ((int)ft_lstclear((t_list **)&head.next, NULL)); - } - insert_lst->content = fields[i]; - insert_lst->id = T_WORD; + insert_lst->next = ft_lstnew_generic(sizeof(t_token), 0); + insert_lst = insert_lst->next; + if (!insert_lst) + {//todo wrap + perror("insert_token_for_each_field() error"); + ft_free_2d_arr(fields); + return ((int)ft_lstclear((t_list **)&head.next, NULL)); } - else - free(fields[i]); + insert_lst->content = fields[i]; + insert_lst->id = T_WORD; i++; } free(fields); From 312c90539bb1880afea9715d44065c9111d49a23 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 8 Dec 2021 03:46:40 +0100 Subject: [PATCH 10/19] adjustement to ft_strjoin() after libft update from libft : ft_strjoin() no longer return if an arg is NULL --- libft | 2 +- srcs/parsing/expansions/expand_token.c | 4 ---- srcs/parsing/expansions/rejoin_after_expand.c | 7 +------ 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/libft b/libft index d58ee38..af88c1c 160000 --- a/libft +++ b/libft @@ -1 +1 @@ -Subproject commit d58ee38bab0a9e0449d98efc9522b124c71632fd +Subproject commit af88c1ce23f0daa453c70cee0c61a30f71c2a622 diff --git a/srcs/parsing/expansions/expand_token.c b/srcs/parsing/expansions/expand_token.c index b0ee83d..4cc2fe8 100644 --- a/srcs/parsing/expansions/expand_token.c +++ b/srcs/parsing/expansions/expand_token.c @@ -99,10 +99,6 @@ static t_list *ret_parameter_expansion(char *content, int *i) free(tmp); if (expand->content) expand->content = ft_strdup(expand->content); - else - expand->content = ft_calloc(1, 1); - if (!expand->content) - return (ft_retp_free(NULL, expand, free)); return (expand); } diff --git a/srcs/parsing/expansions/rejoin_after_expand.c b/srcs/parsing/expansions/rejoin_after_expand.c index c56c98b..917b921 100644 --- a/srcs/parsing/expansions/rejoin_after_expand.c +++ b/srcs/parsing/expansions/rejoin_after_expand.c @@ -18,12 +18,7 @@ char *rejoin_after_expand(t_list *expand_lst) char *result; head = expand_lst; - result = ft_calloc(1, 1); - if (!result) - {//todo wrap - perror("rejoin_after_expand() error"); - return (ft_lstclear(&head, free)); - } + result = NULL; while (expand_lst) { result = ft_strjoinfree_s1(result, expand_lst->content); From 8125e4306594944867d8c4b5848896288b889d46 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 8 Dec 2021 04:02:00 +0100 Subject: [PATCH 11/19] init_prompt() correct error return --- srcs/init.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/srcs/init.c b/srcs/init.c index e332c64..a93c524 100644 --- a/srcs/init.c +++ b/srcs/init.c @@ -50,7 +50,7 @@ char **retrieve_path(void) return (path_split); } -static char *init_prompt_base(void) // WIP, error return TODO +static char *init_prompt_base(void) { char *prompt_base; char *tmp; @@ -61,21 +61,33 @@ static char *init_prompt_base(void) // WIP, error return TODO if (!tmp) tmp = U_DEFAULT_USER; prompt_base = ft_strjoin(TERM_LIGHT_GREEN, tmp); + if (!prompt_base) + return (NULL); prompt_base = ft_strjoinfree_s1(prompt_base, "@"); + if (!prompt_base) + return (NULL); tmp = getenv("NAME"); if (!tmp) tmp = U_DEFAULT_NAME; prompt_base = ft_strjoinfree_s1(prompt_base, tmp); + if (!prompt_base) + return (NULL); prompt_base = ft_strjoinfree_s1(prompt_base, TERM_RESET":"TERM_LIGHT_BLUE); + if (!prompt_base) + return (NULL); return (prompt_base); } -char *init_prompt(char *prompt_base) // WIP, error return TODO +char *init_prompt(char *prompt_base) { char *prompt; prompt = ft_strjoinfree_s2(prompt_base, getcwd(NULL, 0)); + if (!prompt) + return (NULL); prompt = ft_strjoinfree_s1(prompt, TERM_RESET U_PROMPT_END); + if (!prompt) + return (NULL); return (prompt); } From bcc82aabaf1659a1579b0a2aca904c8f2e7cd76d Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 8 Dec 2021 04:45:12 +0100 Subject: [PATCH 12/19] signals adjustements --- headers/minishell_prototypes.h | 3 +-- headers/minishell_structs.h | 2 +- srcs/exec/subshell_exec.c | 8 ++++++-- srcs/init.c | 2 +- srcs/signals.c | 22 +++++++--------------- 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index 27e2cbe..48b9d30 100644 --- a/headers/minishell_prototypes.h +++ b/headers/minishell_prototypes.h @@ -13,7 +13,6 @@ #ifndef MINISHELL_PROTOTYPES_H # define MINISHELL_PROTOTYPES_H -// variable globale int g_switch_heredoc_sigint; extern char **environ; @@ -24,7 +23,7 @@ char **retrieve_path(void); int set_terminal_attributes(struct termios *ori_termios, struct termios *interactive_termios, int *termios_changed); // WIP, TEST, TEMP, PLACEHOLDER, NOT IMPORTANT, :) -int set_signals_handling(struct sigaction *signal_behaviour); +void set_signals_behaviour(void); // Shell modes void shell_loop(t_all *c); diff --git a/headers/minishell_structs.h b/headers/minishell_structs.h index 18f55ee..69b5f79 100644 --- a/headers/minishell_structs.h +++ b/headers/minishell_structs.h @@ -46,7 +46,7 @@ typedef struct s_all // struct termios interactive_termios; // int termios_changed; // struct sigaction ori_signal_behaviour; - struct sigaction signal_behaviour; +// struct sigaction signal_behaviour; } t_all; #endif diff --git a/srcs/exec/subshell_exec.c b/srcs/exec/subshell_exec.c index 273f9bf..1e1374d 100644 --- a/srcs/exec/subshell_exec.c +++ b/srcs/exec/subshell_exec.c @@ -14,13 +14,17 @@ int cmd_exec_in_subshell(t_cmd *cmd, t_all *c) { + struct sigaction signal_behaviour; + cmd->pid = fork(); if (cmd->pid == -1) perror("fork()"); if (cmd->pid == 0) { - c->signal_behaviour.sa_handler = SIG_DFL; - sigaction(SIGINT, &c->signal_behaviour, NULL); + ft_bzero(&signal_behaviour, sizeof signal_behaviour); + signal_behaviour.sa_handler = SIG_DFL; + sigaction(SIGINT, &signal_behaviour, NULL); + sigaction(SIGQUIT, &signal_behaviour, NULL); if (cmd->fd_in != STDIN_FILENO) if (dup2(cmd->fd_in, STDIN_FILENO) == -1) return (ft_reti_perror(EXIT_FAILURE, "dup2()")); diff --git a/srcs/init.c b/srcs/init.c index a93c524..052b17a 100644 --- a/srcs/init.c +++ b/srcs/init.c @@ -32,7 +32,7 @@ int init(t_all *c) c->prompt = init_prompt(c->prompt_base); if (!c->prompt) return (ft_reti_perror(0, "init_prompt() error")); - set_signals_handling(&c->signal_behaviour); + set_signals_behaviour(); return (1); } diff --git a/srcs/signals.c b/srcs/signals.c index 3834374..e21e689 100644 --- a/srcs/signals.c +++ b/srcs/signals.c @@ -24,23 +24,15 @@ void sigint_handler_interactive(int signum) void sigint_handler_heredoc(int signum) { (void)signum; - g_switch_heredoc_sigint = 1; rl_done = 1; -// write (1, rl_line_buffer, ft_strlen(rl_line_buffer) + 1); -// rl_line_buffer = "\004"; -// write(1, "\004", 1); -// rl_on_new_line(); -// rl_replace_line((char *)NULL, 1); -// rl_replace_line("\004", 1); -// rl_replace_line("", 1); -// rl_redisplay(); + g_switch_heredoc_sigint = 1; } -int set_signals_handling(struct sigaction *signal_behaviour) +void set_signals_behaviour(void) { - signal_behaviour->sa_handler = sigint_handler_interactive; - sigaction(SIGINT, signal_behaviour, NULL); - signal_behaviour->sa_handler = SIG_IGN; - sigaction(SIGQUIT, signal_behaviour, NULL); - return (1); + struct sigaction signal_behaviour; + + ft_bzero(&signal_behaviour, sizeof signal_behaviour); + signal_behaviour.sa_handler = SIG_IGN; + sigaction(SIGQUIT, &signal_behaviour, NULL); } From cee6a8962bfb9ee0d0d1fe4a995d796f83c0ed30 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 8 Dec 2021 06:36:52 +0100 Subject: [PATCH 13/19] shlvl_init(), set SHLVL + export builtin small change --- Makefile | 2 +- headers/minishell_prototypes.h | 1 + srcs/builtins/export.c | 9 ++++---- srcs/init.c | 41 ++++++++++++++++++++++------------ srcs/retrieve_path.c | 27 ++++++++++++++++++++++ 5 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 srcs/retrieve_path.c diff --git a/Makefile b/Makefile index e596344..9a2a361 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ LIBS = -L $(LIBFT_D) -lft \ LIBFT_D = ./libft LIBFT = $(LIBFT_D)/libft.a -SRCS = main.c init.c free.c generic.c error_wrappers.c \ +SRCS = main.c init.c retrieve_path.c free.c generic.c error_wrappers.c \ signals.c \ shell_loop.c shell_script.c \ lexing.c fill_token.c check_operators.c \ diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index 48b9d30..4e2fcee 100644 --- a/headers/minishell_prototypes.h +++ b/headers/minishell_prototypes.h @@ -56,6 +56,7 @@ int simple_command_builtin(t_cmd *cmd, t_all *c); int builtin_cd(int argc, char *argv[], t_all *c); int builtin_pwd(int argc, char *argv[], t_all *c); int builtin_export(int argc, char *argv[], t_all *c); +int export_var(char *arg); int builtin_unset(int argc, char *argv[], t_all *c); int builtin_exit(int argc, char *argv[], t_all *c); int builtin_env(int argc, char *argv[], t_all *c); diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c index 4955f77..2d4e285 100644 --- a/srcs/builtins/export.c +++ b/srcs/builtins/export.c @@ -12,7 +12,6 @@ #include "minishell.h" -static int export_var(char *arg); static int change_var_value(char *arg, char *var_name); #define ERR_ID 1 @@ -32,7 +31,7 @@ int builtin_export(int argc, char *argv[], t_all *c) { ret = export_var(argv[i]); if (ret == -1) - return (EXIT_FAILURE); + return (ft_reti_perror(EXIT_FAILURE, CMD", export_var()")); else if (ret == ERR_ID) exit_value = EXIT_FAILURE; if (ft_strncmp(argv[i], "PATH=", 5) == 0) @@ -44,7 +43,9 @@ int builtin_export(int argc, char *argv[], t_all *c) // in complete shell, must mark arguments for export // (Not implemented in minishell) -static int export_var(char *arg) +// arg == var_name[=value] +// return "-1" on alloc error +int export_var(char *arg) { char **var_split; int ret; @@ -52,7 +53,7 @@ static int export_var(char *arg) ret = 0; var_split = ft_split(arg, '='); if (!var_split) - return (ft_reti_perror(-1, CMD", ft_split()")); + return (-1); if (!ft_is_posix_name(var_split[0])) { shell_error("export: ", var_split[0], ERR_ID_STR, 0); diff --git a/srcs/init.c b/srcs/init.c index 052b17a..db93acd 100644 --- a/srcs/init.c +++ b/srcs/init.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */ -/* Updated: 2021/12/04 15:11:20 by lperrey ### ########.fr */ +/* Updated: 2021/12/08 06:27:51 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ static char *init_prompt_base(void); static int init_readline_hook(void); +static int shlvl_init(void); int init(t_all *c) { @@ -24,30 +25,42 @@ int init(t_all *c) rl_startup_hook = NULL; environ = ft_dup_2d_arr(environ, (t_dup_f)ft_strdup); if (!environ) - return (ft_reti_perror(0, "ft_dup_2d_arr(environ) error")); + return (ft_reti_perror(0, "ft_dup_2d_arr(environ)")); c->path = retrieve_path(); + if (!shlvl_init()) + return (ft_reti_perror(0, "shlvl_init()")); c->prompt_base = init_prompt_base(); if (!c->prompt_base) - return (ft_reti_perror(0, "init_prompt_base() error")); + return (ft_reti_perror(0, "init_prompt_base()")); c->prompt = init_prompt(c->prompt_base); if (!c->prompt) - return (ft_reti_perror(0, "init_prompt() error")); + return (ft_reti_perror(0, "init_prompt()")); set_signals_behaviour(); return (1); } -char **retrieve_path(void) +static int shlvl_init(void) { - char *path; - char **path_split; + char *tmp; - path = getenv("PATH"); - if (!path) - return (ft_retp_print(NULL, "minishell: Warning, $PATH not set\n", 2)); - path_split = ft_split(path, ':'); - if (!path_split) - return (ft_retp_perror(NULL, "retrieve_path()")); - return (path_split); + tmp = getenv("SHLVL"); + if (tmp && ft_isdigit_str(tmp)) + { + tmp = ft_itoa(ft_atoi(tmp) + 1); + if (!tmp) + return (0); + tmp = ft_strjoinfree_s2("SHLVL=", tmp); + if (!tmp) + return (0); + if (export_var(tmp) == -1) + return (0); + } + else + { + if (export_var("SHLVL=1") == -1) + return (0); + } + return (1); } static char *init_prompt_base(void) diff --git a/srcs/retrieve_path.c b/srcs/retrieve_path.c new file mode 100644 index 0000000..27ee2d2 --- /dev/null +++ b/srcs/retrieve_path.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* retrieve_path.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */ +/* Updated: 2021/12/08 06:27:23 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char **retrieve_path(void) +{ + char *path; + char **path_split; + + path = getenv("PATH"); + if (!path) + return (ft_retp_print(NULL, "minishell: Warning, $PATH not set\n", 2)); + path_split = ft_split(path, ':'); + if (!path_split) + return (ft_retp_perror(NULL, "retrieve_path()")); + return (path_split); +} From 322d8d5f09f307fb2fc2354e1e9314451bc7c5f9 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 8 Dec 2021 21:10:03 +0100 Subject: [PATCH 14/19] added minishell_tests as submodule --- .gitignore | 5 ++++- .gitmodules | 3 +++ minishell_tests | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) create mode 160000 minishell_tests diff --git a/.gitignore b/.gitignore index a1a6a9c..8faecd2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +Thumbs.db *.o *.swp *.out @@ -9,9 +10,11 @@ *.dSYM .vscode *.lnk +*.zip memo memo.txt minishell -*.zip arg_test osef_temp +env_var_test +memo_local diff --git a/.gitmodules b/.gitmodules index cb2e6ae..aee5a3e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "libft"] path = libft url = git@bitbucket.org:LuckyLaszlo/libft.git +[submodule "minishell_tests"] + path = minishell_tests + url = git@bitbucket.org:LuckyLaszlo/minishell_tests.git diff --git a/minishell_tests b/minishell_tests new file mode 160000 index 0000000..7f638a0 --- /dev/null +++ b/minishell_tests @@ -0,0 +1 @@ +Subproject commit 7f638a0bf4e4a08150fb472b1b1e663c60df3038 From 34da9678dc1e230c9be3fba4b8687f16bd7a490c Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 8 Dec 2021 22:00:18 +0100 Subject: [PATCH 15/19] shlvl_init() fixed leak --- srcs/init.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/srcs/init.c b/srcs/init.c index db93acd..003253b 100644 --- a/srcs/init.c +++ b/srcs/init.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */ -/* Updated: 2021/12/08 06:27:51 by lperrey ### ########.fr */ +/* Updated: 2021/12/08 21:54:36 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,6 +42,7 @@ int init(t_all *c) static int shlvl_init(void) { char *tmp; + int ret; tmp = getenv("SHLVL"); if (tmp && ft_isdigit_str(tmp)) @@ -52,14 +53,13 @@ static int shlvl_init(void) tmp = ft_strjoinfree_s2("SHLVL=", tmp); if (!tmp) return (0); - if (export_var(tmp) == -1) - return (0); + ret = export_var(tmp); + free(tmp); } else - { - if (export_var("SHLVL=1") == -1) - return (0); - } + ret = export_var("SHLVL=1"); + if (ret == -1) + return (0); return (1); } From 73feaf0230e419638824a6a52885e30907ff6616 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Thu, 9 Dec 2021 04:19:27 +0100 Subject: [PATCH 16/19] builtin cd --- srcs/builtins/cd.c | 75 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/srcs/builtins/cd.c b/srcs/builtins/cd.c index 06abd87..a1d5981 100644 --- a/srcs/builtins/cd.c +++ b/srcs/builtins/cd.c @@ -6,32 +6,77 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/12/04 19:31:19 by lperrey #+# #+# */ -/* Updated: 2021/12/05 16:21:41 by lperrey ### ########.fr */ +/* Updated: 2021/12/08 22:33:56 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +#define CMD "builtin_cd" + +static int change_prompt(t_all *c); +static int change_env_pwd(void); + int builtin_cd(int argc, char *argv[], t_all *c) +{ + char *dir; + + if (argc > 2) + return (shell_error("cd: ", "too many arguments", "", EXIT_FAILURE)); + else if (argc < 2 || ft_strncmp(argv[1], "~", 2) == 0) + { + dir = getenv("HOME"); + if (!dir) + return (shell_error("cd: ", "HOME not set", "", EXIT_FAILURE)); + } + else if (argc == 2) + dir = argv[1]; + if (chdir(dir) == -1) + return (shell_perror("cd: ", dir, ": ", EXIT_FAILURE)); + if (change_prompt(c) == -1) + return (ft_reti_perror(EXIT_FAILURE, CMD", change_prompt()")); + if (change_env_pwd() == -1) + return (ft_reti_perror(EXIT_FAILURE, CMD", change_env_pwd()")); + return (EXIT_SUCCESS); +} + +static int change_prompt(t_all *c) { char *tmp; - if (argc == 2) - tmp = argv[1]; - else if (argc < 2) - { - tmp = getenv("HOME"); - if (!tmp) - return (shell_error("cd: ", "HOME not set", "", EXIT_FAILURE)); - } - else if (argc > 2) - return (shell_error("cd: ", "too many arguments", "", EXIT_FAILURE)); - if (chdir(tmp) == -1) - return (shell_perror("cd: ", tmp, ": ", EXIT_FAILURE)); tmp = init_prompt(c->prompt_base); if (!tmp) - return (ft_reti_perror(EXIT_FAILURE, "builtin_cd, init_prompt()")); + return (-1); free(c->prompt); c->prompt = tmp; - return (EXIT_SUCCESS); + return (0); +} + +static int change_env_pwd(void) +{ + char *tmp; + int ret; + + tmp = getenv("PWD"); + if (tmp) + { + tmp = ft_strjoin("OLDPWD=", tmp); + if (!tmp) + return (-1); + ret = export_var(tmp); + free(tmp); + if (ret == -1) + return (-1); + } + tmp = getcwd(NULL, 0); + if (!tmp) + return (-1); + tmp = ft_strjoinfree_s2("PWD=", tmp); + if (!tmp) + return (-1); + ret = export_var(tmp); + free(tmp); + if (ret == -1) + return (-1); + return (0); } From f7d37fadb6c2e1fe4a03c16a92fb923170dbdaf9 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Thu, 9 Dec 2021 05:32:20 +0100 Subject: [PATCH 17/19] here_doc bugfix --- srcs/parsing/redirections/here_doc.c | 35 ++---------------------- srcs/parsing/redirections/redirections.c | 3 ++ 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/srcs/parsing/redirections/here_doc.c b/srcs/parsing/redirections/here_doc.c index c652e18..c5d5b73 100644 --- a/srcs/parsing/redirections/here_doc.c +++ b/srcs/parsing/redirections/here_doc.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/11 18:46:43 by lperrey #+# #+# */ -/* Updated: 2021/11/29 12:38:58 by lperrey ### ########.fr */ +/* Updated: 2021/12/09 05:31:16 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,9 +25,6 @@ int here_doc(char *delimiter) and the here-document lines shall not be expanded. Otherwise, the delimiter shall be the word itself. */ // TODO : A voir si on fait les expansions de variables dans le here_doc. - // implementer une gestion des signaux pour here_doc (verifier comportement bash et doc POSIX). - // Peut-être remplacer gnl() par readline() pour avoir une gestion correct - // du terminal (actuellement l'affichage lors du changement de ligne est foireux). int here_doc; int ret; @@ -102,7 +99,7 @@ static int here_doc_write(char *delimiter, int doc_fd) ft_putstr_fd(" delimited by end-of-file (wanted `", 2); ft_putstr_fd(delimiter, 2); ft_putstr_fd("')\n", 2); - return (-1); + return (0); } if (ft_strncmp(line, delimiter, ft_strlen(line) + 1) == 0) // Ou ft_strlen(delimiter) + 1 ? Ça devrais être identique et ça peux se calculer une seul fois. break ; @@ -117,31 +114,3 @@ static int here_doc_write(char *delimiter, int doc_fd) sigaction(SIGINT, &signal_action, NULL); return (0); } - -/* -static int here_doc_write(char *delimiter, int doc_fd) -{ - char *line; - int ret; - - line = NULL; - ret = 1; - while (ret) - { - ret = gnl(STDIN_FILENO, &line, 0); - if (ret == -1) - return (ft_reti_perror_free(0, line, free, "gnl() STDIN")); - if (ft_strncmp(line, delimiter, ft_strlen(line) + 1) == 0) // Ou ft_strlen(delimiter) + 1 ? Ça devrais être identique et ça peux se calculer une seul fois. - break ; - if (write(doc_fd, line, ft_strlen(line)) == -1) - return (ft_reti_perror_free(0, line, free, "write() "TMP_HERE_DOC)); - if (write(doc_fd, "\n", 1) == -1) - return (ft_reti_perror_free(0, line, free, "write() "TMP_HERE_DOC)); - free(line); - line = NULL; - } - free(line); - gnl(STDIN_FILENO, NULL, 1); - return (1); -} - */ diff --git a/srcs/parsing/redirections/redirections.c b/srcs/parsing/redirections/redirections.c index 5b3bea9..2c5b63c 100644 --- a/srcs/parsing/redirections/redirections.c +++ b/srcs/parsing/redirections/redirections.c @@ -72,7 +72,10 @@ static int redirect_cmd_input(t_token *t, t_cmd *cmd) cmd->error = EXIT_REDIRECTION; } else if (cmd->fd_in > EXIT_SIGNAL) + { + cmd->fd_in = 0; return (0); + } } return (1); } From 592bcb4e93cd89213698fd5d3beda37fa332108e Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Thu, 9 Dec 2021 20:57:31 +0100 Subject: [PATCH 18/19] bugfix pipeline redirections --- srcs/parsing/redirections/redirections.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srcs/parsing/redirections/redirections.c b/srcs/parsing/redirections/redirections.c index 2c5b63c..d8d7539 100644 --- a/srcs/parsing/redirections/redirections.c +++ b/srcs/parsing/redirections/redirections.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/11 18:46:43 by lperrey #+# #+# */ -/* Updated: 2021/11/29 12:39:05 by lperrey ### ########.fr */ +/* Updated: 2021/12/09 20:38:05 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,7 +37,7 @@ int redirections(t_token *t, t_cmd **pipeline) return (0); } } - else if (t->id == '|') + if (t->id == '|') i++; t = t->next; } From 9322ec9ec95556dedfdb80ceab75de95bef19ce8 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Fri, 10 Dec 2021 06:34:44 +0100 Subject: [PATCH 19/19] close_stdio() at exit --- headers/minishell_prototypes.h | 1 + srcs/free.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index 4e2fcee..20ff829 100644 --- a/headers/minishell_prototypes.h +++ b/headers/minishell_prototypes.h @@ -66,6 +66,7 @@ int builtin_echo(int argc, char *argv[], t_all *c); int exit_free(t_all *c, int exit_status); void free_pipeline(t_cmd **pipeline_ptr[]); void close_pipeline_fd(t_cmd *pipeline[]); +void close_stdio(void); typedef void (*t_free_f)(void *); // generic // Error wrappers diff --git a/srcs/free.c b/srcs/free.c index 285350b..303a182 100644 --- a/srcs/free.c +++ b/srcs/free.c @@ -23,6 +23,7 @@ int exit_free(t_all *c, int exit_status) //if (c->termios_changed) // tcsetattr(STDIN_FILENO, TCSANOW, &c->ori_termios); rl_clear_history(); + close_stdio(); exit(exit_status); } @@ -70,3 +71,13 @@ void close_pipeline_fd(t_cmd *pipeline[]) i++; } } + +void close_stdio(void) +{ + if (close(STDIN_FILENO) == -1) + perror("close()"); + if (close(STDOUT_FILENO) == -1) + perror("close()"); + if (close(STDERR_FILENO) == -1) + perror("close()"); +}