diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index 937b5e9..cdc8a97 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/11/11 09:58:01 by hulamy ### ########.fr */ +/* Updated: 2021/11/12 10:45:33 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,6 +40,7 @@ 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); int builtin_echo(int argc, char *argv[], t_all *c); +int getenv_position(char **envp, char *name); // Free int free_exit(t_all *c, int exit_status); diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c index 26e6644..9c1f923 100644 --- a/srcs/builtins/export.c +++ b/srcs/builtins/export.c @@ -22,10 +22,14 @@ int builtin_export(int argc, char *argv[], t_all *c) var = ft_split(argv[1], '='); position = getenv_position(c->envp, var[0]); if (position == -1 || !ft_strchr(argv[1], '=')) + { + ft_free_2d_arr(var); return (0); + } c->envp[position] = ft_strjoin(var[0], "="); if (var[1]) // parce que ft_strjoin return NULL si var[1] est null, pourquoi ? - c->envp[position] = ft_strjoin(c->envp[position], var[1]); + c->envp[position] = ft_strjoinfree_s1(c->envp[position], var[1]); + ft_free_2d_arr(var); return (0); } @@ -41,7 +45,6 @@ int builtin_export(int argc, char *argv[], t_all *c) ** > 'export VARIABLE' n'exporte rien ** > 'export VARIABLE=' exporte une variable vide ** 4. ordre d'insertion d'une nouvelle variable : -** -** +** > aucune idee */ diff --git a/srcs/builtins/unset.c b/srcs/builtins/unset.c index 9377a67..7e9caa4 100644 --- a/srcs/builtins/unset.c +++ b/srcs/builtins/unset.c @@ -3,8 +3,21 @@ int builtin_unset(int argc, char *argv[], t_all *c) { + int position; + (void)argc; - (void)argv; (void)c; + position = getenv_position(c->envp, argv[1]); + if (position == -1) + return (0); + while (c->envp[position]) + { +write(1, "1", 1); + free(c->envp[position]); + c->envp[position] = ft_strdup(c->envp[position + 1]); + position++; + } +write(1, "2", 1); + free(c->envp[position]); return (0); } diff --git a/test_rl_modif.c b/test_rl_modif.c index 097cb04..5e12af6 100644 --- a/test_rl_modif.c +++ b/test_rl_modif.c @@ -2,6 +2,7 @@ # include # include # include +# include void handler_sigint(int id) { @@ -12,16 +13,24 @@ void handler_sigint(int id) rl_redisplay(); } +void handler_sigint_execution(int id) +{ + (void)id; + write(1, "\n", 1); + exit(0); +} + int main(int argc, char *argv[], char *envp[]) { (void)argc; (void)argv; char *line_input; char *prompt; + pid_t pid; - signal(SIGINT, handler_sigint); + signal(SIGINT, handler_sigint); // signal handling for SINGINT while interactive mode line_input = NULL; - prompt = strdup("\e[0;31mtest>\e[0m "); + prompt = strdup("\e[0;31m>\e[0m "); while (1) { if (line_input) @@ -29,8 +38,38 @@ int main(int argc, char *argv[], char *envp[]) line_input = readline(prompt); if (line_input && *line_input) { - write(1, line_input, strlen(line_input)); - write(1, "\n", 1); + signal(SIGINT, SIG_IGN); // stop signal handling for SIGINT because end of interactive mode + pid = fork(); + if (pid == 0) + { + signal(SIGINT, handler_sigint_execution); // start signal handling for SIGINT in child process + if (!strncmp("echo", line_input, 4)) + { + write(1, "3", 2); + sleep(1); + write(1, "\b2", 2); + sleep(1); + write(1, "\b1", 2); + sleep(1); + write(1, "\b0\n", 3); + execve("/bin/echo", argv, envp); + } + else + { + write(1, line_input, strlen(line_input)); + write(1, " 3", 2); + sleep(1); + write(1, "\b2", 2); + sleep(1); + write(1, "\b1", 2); + sleep(1); + write(1, "\b0\n", 3); + exit(0); + } + } + else + wait(0); + signal(SIGINT, handler_sigint); // restart signal handling for SIGINT because re-entring in interactive mode } else if (!line_input) {