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); +}