diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 03f24f8a..f4e7419e 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -131,7 +131,7 @@ struct s_job struct s_exec { t_job job; - int fd_save[3]; + int fd_save[10]; t_flag attrs; int fdin; t_list *op_stack; diff --git a/42sh/includes/minishell.h b/42sh/includes/minishell.h index f80bc6e3..26b20751 100644 --- a/42sh/includes/minishell.h +++ b/42sh/includes/minishell.h @@ -67,7 +67,7 @@ int data_init(int ac, char **av); void data_exit(void); int get_c_arg(char ***av, t_data *data); -void content_free(void *data, size_t content_size); +/* void content_free(void *data, size_t content_size); */ char *ft_putast(void *node); void ft_putast2(void *node); diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index 1c1f8851..5e96339f 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -81,14 +81,14 @@ int builtin_cd(const char *path, opts = CDOPT_L; i = builtin_cd_opts(av, &opts); if (!(target = builtin_cd_special(av + i, envp))) - return (builtin_return_status(0, 1)); + return (1); cwd = getcwd(NULL, 0); builtin_setenv(path, (char*[4]){"setenv", "OLDPWD", cwd, NULL}, envp); free(cwd); if (chdir(target)) { SH_ERR(CDERR_1, target); - return (builtin_return_status(0, 1)); + return (1); } else if (target != av[i]) ft_printf("%s\n", target); @@ -97,5 +97,5 @@ int builtin_cd(const char *path, free(cwd); if (!ft_strcmp(*(av + i), "-")) free(target); - return (builtin_return_status(0, 0)); + return (0); } diff --git a/42sh/src/builtin/builtin_echo.c b/42sh/src/builtin/builtin_echo.c index fcae589b..8c6add7f 100644 --- a/42sh/src/builtin/builtin_echo.c +++ b/42sh/src/builtin/builtin_echo.c @@ -25,5 +25,5 @@ int builtin_echo(const char *path, char *const av[], char *const envp[]) ft_putchar(' '); } ft_putchar('\n'); - return (builtin_return_status(0, 0)); + return (0); } diff --git a/42sh/src/builtin/builtin_exit.c b/42sh/src/builtin/builtin_exit.c index f9625fc9..b0294f64 100644 --- a/42sh/src/builtin/builtin_exit.c +++ b/42sh/src/builtin/builtin_exit.c @@ -35,6 +35,7 @@ int builtin_exit(const char *path, char *const av[], char *const envp[]) tcsetattr(STDIN, TCSANOW, &data_singleton()->jobc.shell_tmodes); job_hup_all(); data_exit(); + DG("EXITING NOW"); exit(status); return (0); } diff --git a/42sh/src/exec/exec_leaf.c b/42sh/src/exec/exec_leaf.c index c8ea2ea7..7e5f7b13 100644 --- a/42sh/src/exec/exec_leaf.c +++ b/42sh/src/exec/exec_leaf.c @@ -52,6 +52,6 @@ int exec_leaf(t_btree **ast) } } else -DG("WHY HERE?"); +DG("WHY HERE? --> because no fork means no job control"); return (0); } diff --git a/42sh/src/exec/exec_reset.c b/42sh/src/exec/exec_reset.c index ed1892a3..8fe4a385 100644 --- a/42sh/src/exec/exec_reset.c +++ b/42sh/src/exec/exec_reset.c @@ -12,13 +12,6 @@ #include "minishell.h" -static int print_error(char *std) -{ - ft_dprintf(2, "{red}%s: internal fcntl %s error errno=%i{eoc}\n", - SHELL_NAME, std, errno); - return (errno); -} - int exec_reset_job(t_job *job) { job->id = 0; @@ -32,21 +25,13 @@ int exec_reset(void) { t_exec *exec; t_jobc *jobc; + int i; exec = &data_singleton()->exec; jobc = &data_singleton()->jobc; - if (errno != EBADF) - { - if ((exec->fd_save[0] = fcntl(STDIN, F_DUPFD_CLOEXEC, 10)) == -1 - && errno != EBADF) - return (print_error("STDIN")); - if ((exec->fd_save[1] = fcntl(STDOUT, F_DUPFD_CLOEXEC, 10)) == -1 - && errno != EBADF) - return (print_error("STDOUT")); - if ((exec->fd_save[2] = fcntl(STDERR, F_DUPFD_CLOEXEC, 10)) == -1 - && errno != EBADF) - return (print_error("STDERR")); - } + i = -1; + while (++i < 10) + exec->fd_save[i] = fcntl(i, F_DUPFD_CLOEXEC, 10); exec->op_stack = NULL; exec->fdin = STDIN; exec->attrs = 0; diff --git a/42sh/src/exec/plaunch_builtin.c b/42sh/src/exec/plaunch_builtin.c index 774171d4..f67b753c 100644 --- a/42sh/src/exec/plaunch_builtin.c +++ b/42sh/src/exec/plaunch_builtin.c @@ -14,8 +14,8 @@ int plaunch_builtin(t_process *p) { - return ((*p->data.cmd.execf)( + return (*p->data.cmd.execf)( p->data.cmd.path, p->data.cmd.av, - data_singleton()->env)); + data_singleton()->env); } diff --git a/42sh/src/exec/plaunch_file.c b/42sh/src/exec/plaunch_file.c index d084b35c..4c3a4050 100644 --- a/42sh/src/exec/plaunch_file.c +++ b/42sh/src/exec/plaunch_file.c @@ -14,7 +14,7 @@ static void error_launch(char *error_ori, char *error_type, int error_code) { - ft_dprintf(2, "{red}%s: %s%s{eoc}\n", SHELL_NAME, error_ori, error_type); + SH_ERR("%s: %s%s", SHELL_NAME, error_ori, error_type); exit(error_code); } diff --git a/42sh/src/exec/process_launch.c b/42sh/src/exec/process_launch.c index ab5d2de6..4cf71ad5 100644 --- a/42sh/src/exec/process_launch.c +++ b/42sh/src/exec/process_launch.c @@ -12,7 +12,7 @@ #include "minishell.h" -int do_the_muther_forker(t_process *p) +int process_fork(t_process *p) { pid_t pid; @@ -35,8 +35,9 @@ int do_the_muther_forker(t_process *p) exit(p->map.launch(p)); } -static int do_the_fork_if_i_have_to(t_process *p) +int process_launch(t_process *p) { + p->state = PROCESS_RUNNING; if (IS_PIPESINGLE(*p) && p->type != PROCESS_FILE && p->type != PROCESS_SUBSHELL) { @@ -45,27 +46,13 @@ static int do_the_fork_if_i_have_to(t_process *p) set_exitstatus(1, 1); return (0); } - return (p->map.launch(p)); - /* set_exitstatus(p->map.launch(p), 1); */ - /* return (0); */ - } - return (do_the_muther_forker(p)); -} - -int process_launch(t_process *p) -{ - pid_t pid; - - p->state = PROCESS_RUNNING; - if (!(pid = do_the_fork_if_i_have_to(p))) - { + set_exitstatus(p->map.launch(p), 1); process_resetfds(p); process_free(p, 0); return (1); } - DG("FORK"); - p->pid = pid; - process_setgroup(p, pid); + p->pid = process_fork(p): + process_setgroup(p, p->pid); if (p->fdin != STDIN) close(p->fdin); if (p->fdout != STDOUT) diff --git a/42sh/src/exec/process_resetfds.c b/42sh/src/exec/process_resetfds.c index a8632b39..403f53d1 100644 --- a/42sh/src/exec/process_resetfds.c +++ b/42sh/src/exec/process_resetfds.c @@ -19,20 +19,13 @@ void process_resetfds(t_process *p) (void)p; exec = &data_singleton()->exec; - i = 0; - while (i < 10) + i = -1; + while (++i < 10) { - /* if (i!=3) //JACK SOME PB HERE on close la sortie debug en forcant le close sur tous les fd... ne risque-t-on pas autre chose ??!!! */ - /* { */ - close(i++); - /* } */ - /* else */ - /* i++; */ + if (exec->fd_save[i] != -1) + { + DG("dup2(%i, %i)", exec->fd_save[i], i); + dup2(exec->fd_save[i], i); + } } - if (exec->fd_save[0] != -1) - dup2(exec->fd_save[0], STDIN); - if (exec->fd_save[1] != -1) - dup2(exec->fd_save[1], STDOUT); - if (exec->fd_save[2] != -1) - dup2(exec->fd_save[2], STDERR); } diff --git a/42sh/src/job_control/job_wait.c b/42sh/src/job_control/job_wait.c index 2c80369c..b34371d6 100644 --- a/42sh/src/job_control/job_wait.c +++ b/42sh/src/job_control/job_wait.c @@ -30,6 +30,7 @@ int job_wait(int id) && errno != ECHILD) ft_dprintf(2, "{red}%s: waitpid error errno=%i{eoc}\n", SHELL_NAME, errno); + DG("wait trigger pid=%i", pid); if (pid <= 1 || mark_process_status(pid, status) || job_is_stopped(j) || job_is_completed(j)) diff --git a/42sh/src/lexer/lexer_word.c b/42sh/src/lexer/lexer_word.c index 665c0a0a..77296e3e 100644 --- a/42sh/src/lexer/lexer_word.c +++ b/42sh/src/lexer/lexer_word.c @@ -19,8 +19,9 @@ int lexer_word(t_list **alst, t_lexer *lexer) token = (*alst)->content; token->type = token->type ? token->type : TK_WORD; - if ((state = get_state_global(lexer)) - || (state = get_state_redir(lexer))) + if (lexer->str[lexer->pos] != '!' + && ((state = get_state_global(lexer)) + || (state = get_state_redir(lexer)))) lexer->state = state; else if (lexer->str[lexer->pos] == '=' && word_is_assignment((char *[]){token->data, (char *)token->esc})) diff --git a/42sh/src/line_editing/get_key.c b/42sh/src/line_editing/get_key.c index da810243..d8b60073 100644 --- a/42sh/src/line_editing/get_key.c +++ b/42sh/src/line_editing/get_key.c @@ -58,8 +58,11 @@ static int read_stdin(int *ret, int *j) { *j = 0; *ret = 0; - if (read(0, ret, sizeof(int)) < 0) + if (read(STDIN, ret, sizeof(int)) < 0) + { + DG("read problem: %s", strerror(errno)); return (-1); + } return (1); } diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index 272a3e04..9fcce223 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -17,11 +17,14 @@ extern char **environ; static int localenv_init(void) { t_data *data; + char *pid; + pid = ft_itoa(getpid()); data = data_singleton(); data->local_var = NULL; builtin_setenv(NULL, (char *[]){"local", "IFS", " \t\n", 0}, NULL); builtin_setenv(NULL, (char *[]){"local", "PS2", " >", 0}, NULL); + ft_strdel(&pid); return (0); } diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 94c1f966..543de1a4 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -43,6 +43,7 @@ static int handle_instruction(t_list **token, t_btree **ast) return (ret); if (do_lexer_routine(token, stream) > 0) continue ; + /* token_print(*token); */ if ((ret = do_parser_routine(token, ast)) == 1 && SH_NO_INTERACTIVE(data->opts)) return (ret);