diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 4e810a89..2f5f338b 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -25,8 +25,8 @@ # define PROCESS_PIPESTART (1 << 6) # define PROCESS_PIPEEND (1 << 7) -# define IS_PIPESTART(p) (p & (PROCESS_PIPESTART)) -# define IS_PIPEEND(p) (p & (PROCESS_PIPEEND)) +# define IS_PIPESTART(a) (a & PROCESS_PIPESTART) +# define IS_PIPEEND(a) (a & PROCESS_PIPEEND) # include "libft.h" # include "types.h" @@ -80,6 +80,7 @@ int process_setexec(t_process *p); int process_setgroup(t_process *p); int process_redirect(t_process *p); void process_free(void *content, size_t content_size); +void process_reset(void); void fd_redirect(void); void fd_reset(void); diff --git a/42sh/src/builtin/builtin_setenv.c b/42sh/src/builtin/builtin_setenv.c index 6cecb3d6..916949e7 100644 --- a/42sh/src/builtin/builtin_setenv.c +++ b/42sh/src/builtin/builtin_setenv.c @@ -35,10 +35,13 @@ int builtin_setenv(const char *path, char *const av[], char *const envp[]) str = ft_str3join(av[0], "=", av[1]); while ((*env)[i]) { + /* DG("check 2: i=%i, (*env)[i]=%p",i, (*env)[i]); */ + /* DG("content=%s", (*env)[i]); */ if (ft_strcmp((*env)[i], av[0]) == '=') { ft_strdel(&(*env)[i]); (*env)[i] = str; + DG("done setenv"); return (0); } i++; @@ -46,5 +49,6 @@ int builtin_setenv(const char *path, char *const av[], char *const envp[]) *env = ft_sstradd(*env, str); ft_strdel(&str); } + DG("done setenv"); return (0); } diff --git a/42sh/src/builtin/is_builtin.c b/42sh/src/builtin/is_builtin.c index 3438b909..80963e91 100644 --- a/42sh/src/builtin/is_builtin.c +++ b/42sh/src/builtin/is_builtin.c @@ -29,7 +29,7 @@ t_execf *is_builtin(t_process *p) i = -1; while (g_builtin[++i].name) - if (ft_strcmp(g_builtin[i].name, p->argv[0]) == 0) + if (ft_strcmp(g_builtin[i].name, p->av[0]) == 0) return (g_builtin[i].f); return (NULL); } diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index e7da8fe3..83f0148b 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -25,25 +25,23 @@ int exec_command(t_btree **ast) if (process_setexec(p)) { ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]); - p->attributes = 0; - p->path = NULL; - p->argv = NULL; - btree_delone(ast, &ast_free); - return (0); + set_exitstatus(127); } - DG("gonna launch_process now"); - launch_process(p); - job_addprocess(p); - if (IS_PIPEEND(p->attributes)) + else { - if (JOB_IS_FG(job->attributes)) - put_job_in_foreground(job, 0); - else - put_job_in_background(job, 0); + DG("gonna launch_process now"); + launch_process(p); + DG("launch_process done"); + job_addprocess(p); + DG("job_addprocess done"); + if (IS_PIPEEND(p->attributes)) + { + JOB_IS_FG(job->attributes) ? + put_job_in_foreground(job, 0): + put_job_in_background(job, 0); + } } + process_reset(); btree_delone(ast, &ast_free); - p->attributes = 0; - p->path = NULL; - p->argv = NULL; return (0); } diff --git a/42sh/src/exec/exec_pipe.c b/42sh/src/exec/exec_pipe.c index 41cc9d82..273c9710 100644 --- a/42sh/src/exec/exec_pipe.c +++ b/42sh/src/exec/exec_pipe.c @@ -15,6 +15,7 @@ int exec_pipe(t_btree **ast) { int fds[2]; + int start; t_data *data; t_process *p; @@ -23,27 +24,30 @@ int exec_pipe(t_btree **ast) pipe(fds); DG("pipe %i->%i", fds[PIPE_WRITE], fds[PIPE_READ]); p->fdout = fds[PIPE_WRITE]; - if (!IS_PIPEEND(p->attributes)) + start = 0; + if (!IS_PIPESTART(p->attributes)) + { p->attributes |= PROCESS_PIPESTART; - else - p->attributes &= ~PROCESS_PIPESTART; - p->attributes &= ~PROCESS_PIPEEND; + start = 1; + } + p->attributes &= ~PROCESS_PIPESTART; + p->attributes &= ~PROCESS_PIPEEND; ft_exec(&(*ast)->left); + p->attributes &= ~PROCESS_PIPESTART; if (p->fdout != STDOUT) close(p->fdout); p->fdout = STDOUT; p->fdin = fds[PIPE_READ]; - p->attributes &= ~PROCESS_PIPESTART; - p->attributes |= PROCESS_PIPEEND; + p->attributes |= PROCESS_PIPEEND; ft_exec(&(*ast)->right); + if (start) + p->attributes |= PROCESS_PIPESTART; /* close(fds[PIPE_WRITE]); */ /* close(fds[PIPE_READ]); */ p->fdin = STDIN; p->fdout = STDOUT; - p->attributes |= PROCESS_PIPESTART; - p->attributes &= ~PROCESS_PIPEEND; btree_delone(ast, &ast_free); return (0); } diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index be15accc..4c7d43d9 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -20,7 +20,7 @@ int launch_process(t_process *p) exec = &data_singleton()->exec; if (p->attributes & PROCESS_UNKNOWN) ft_dprintf(2, "%s: command not found: %s\n", SHELL_NAME, p->av[0]); - else if (p->attributes & PROCESS_BUILTIN && p->fdout != STDOUT) + else if (p->attributes & PROCESS_BUILTIN && p->fdout == STDOUT) set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env)); else { diff --git a/42sh/src/exec/process_reset.c b/42sh/src/exec/process_reset.c new file mode 100644 index 00000000..d4ef0777 --- /dev/null +++ b/42sh/src/exec/process_reset.c @@ -0,0 +1,14 @@ +#include "exec.h" + +void process_reset(void) +{ + t_data *data; + + data = data_singleton(); + data->exec.process.path = NULL; + data->exec.process.av = NULL; + data->exec.process.fdin = STDIN; + data->exec.process.fdout = STDOUT; + data->exec.process.pid = 0; + data->exec.process.attributes = PROCESS_PIPESTART | PROCESS_PIPEEND; +} diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index e058df46..01fe54f1 100644 --- a/42sh/src/exec/process_setexec.c +++ b/42sh/src/exec/process_setexec.c @@ -16,7 +16,7 @@ int process_setexec(t_process *p) { if ((p->execf = is_builtin(p))) { - DG("process is a builtin"); + DG("process is a builtin, attr=%b", p->attributes); p->attributes |= PROCESS_BUILTIN; } else if (ft_strchr(p->av[0], '/')) diff --git a/42sh/src/job-control/builtin_jobs.c b/42sh/src/job-control/builtin_jobs.c index b7813eeb..06980138 100644 --- a/42sh/src/job-control/builtin_jobs.c +++ b/42sh/src/job-control/builtin_jobs.c @@ -31,15 +31,11 @@ int builtin_jobs(const char *path, char *const av[], char *const envp[]) lg = 0; if (ft_strcmp(av[1], "-l") == 0) lg = 1; + rank = '+'; while (jlist) { firstp = 1; job = jlist->content; - rank = ' '; - if (job->id == data_singleton()->jobc.rank[0]) - rank = '+'; - else if (job->id == data_singleton()->jobc.rank[1]) - rank = '-'; ft_printf("{mag}[%i] %c ", job->id, rank); if (lg) ft_printf("%i ", p->pid); @@ -63,6 +59,7 @@ int builtin_jobs(const char *path, char *const av[], char *const envp[]) firstp = 0; } jlist = jlist->next; + rank = (rank == '+') ? '-' : ' '; ft_printf("{eoc}\n"); } return (0); diff --git a/42sh/src/job-control/job_addprocess.c b/42sh/src/job-control/job_addprocess.c index be5fb094..1b1e714e 100644 --- a/42sh/src/job-control/job_addprocess.c +++ b/42sh/src/job-control/job_addprocess.c @@ -19,8 +19,10 @@ int job_addprocess(t_process *p) jobc = &data_singleton()->jobc; job = &data_singleton()->exec.job; + DG("check; attr=%b", p->attributes); if (IS_PIPESTART(p->attributes)) { + DG("check"); job_update_id(); job->id = jobc->current_id; ft_lstadd(&jobc->first_job, ft_lstnew(job, sizeof(*job))); diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index 355d591f..4953aa39 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -23,10 +23,7 @@ int data_init(void) data->line.input = NULL; data->env = ft_sstrdup(environ); data->line.history = NULL; - data->exec.process.fdin = STDIN; - data->exec.process.fdout = STDOUT; - data->exec.process.pid = 0; - data->exec.process.attributes = PROCESS_PIPESTART; + process_reset(); data->exec.aol_status = NULL; data->exec.aol_search = 0; data->exec.job.id = 0; @@ -35,8 +32,6 @@ int data_init(void) data->exec.job.first_process = 0; data->jobc.first_job = NULL; data->jobc.current_id = 1; - data->jobc.rank[0] = 0; - data->jobc.rank[1] = 0; if (!(data->line.history = ft_dlstnew(NULL, 0))) return (-1); if ((term_name = ft_getenv(data->env, "TERM")) == NULL)