diff --git a/42sh/includes/job_control.h b/42sh/includes/job_control.h index 97b81eee..5597f211 100644 --- a/42sh/includes/job_control.h +++ b/42sh/includes/job_control.h @@ -59,7 +59,7 @@ void job_update_rank(void); int do_job_notification(void); void job_notify_new(t_job *job); -void job_notify_change(t_job *job, int status); +void job_notify_change(int id, int status); int job_wait(t_job *job); void job_update_status(void); diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index 30749fdb..471eda28 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -25,6 +25,9 @@ int exec_command(t_btree **ast) if (process_setexec(p)) { ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->argv[0]); + p->attributes = 0; + p->path = NULL; + p->argv = NULL; btree_delone(ast, &ast_free); return (0); } @@ -39,7 +42,8 @@ int exec_command(t_btree **ast) put_job_in_background(job, 0); } btree_delone(ast, &ast_free); - p->path = NULL; p->attributes = 0; + p->path = NULL; + p->argv = NULL; return (0); } diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index 85571934..fd7d7c47 100644 --- a/42sh/src/exec/process_setexec.c +++ b/42sh/src/exec/process_setexec.c @@ -14,6 +14,8 @@ int process_setexec(t_process *p) { + DG("going to setexec:\nenv at %p\nav[0]=%s", data_singleton()->env, p->argv[0]); + DG("going to setexec:\nPATH=%s\nav[0]=%s", ft_getenv(data_singleton()->env, "PATH"), p->argv[0]); if ((p->execf = is_builtin(p))) { DG("process is a builtin"); diff --git a/42sh/src/exec/set_exitstatus.c b/42sh/src/exec/set_exitstatus.c index 01055140..eb22a1ee 100644 --- a/42sh/src/exec/set_exitstatus.c +++ b/42sh/src/exec/set_exitstatus.c @@ -17,6 +17,6 @@ void set_exitstatus(int status) char *astatus; astatus = ft_itoa(status); - builtin_setenv("shell", (char*[3]){"?", astatus}, data_singleton()->env); + builtin_setenv("setenv", (char*[3]){"?", astatus}, data_singleton()->env); ft_strdel(&astatus); } diff --git a/42sh/src/job-control/builtin_jobs.c b/42sh/src/job-control/builtin_jobs.c index 753edb1d..90bb3c26 100644 --- a/42sh/src/job-control/builtin_jobs.c +++ b/42sh/src/job-control/builtin_jobs.c @@ -24,18 +24,15 @@ int builtin_jobs(const char *path, char *const av[], char *const envp[]) (void)path; (void)envp; (void)av; + rank = '+'; while (jlist) { DG("jlist->content"); 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); + ft_printf("{mag}jobs: [%i] %c ", job->id, rank); ft_printf("attributes=%x{eoc}\n", job->attributes); jlist = jlist->next; + rank = (rank == '+') ? '-' : ' '; } return (0); } diff --git a/42sh/src/job-control/do_job_notification.c b/42sh/src/job-control/do_job_notification.c index 5894492c..a9e4a40c 100644 --- a/42sh/src/job-control/do_job_notification.c +++ b/42sh/src/job-control/do_job_notification.c @@ -30,13 +30,13 @@ int do_job_notification(void) if (job_is_completed(j)) { ret = 1; - job_notify_change(j, 0); - job_remove(j->id); + job_notify_change(j->id, 0); + /* job_remove(j->id); */ } else if (job_is_stopped(j) && !(j->attributes & JOB_NOTIFIED)) { ret = 1; - job_notify_change(j, 8); + job_notify_change(j->id, 8); j->attributes &= JOB_NOTIFIED; } jlist = jlist->next; diff --git a/42sh/src/job-control/job_addprocess.c b/42sh/src/job-control/job_addprocess.c index d18a5e20..03df4939 100644 --- a/42sh/src/job-control/job_addprocess.c +++ b/42sh/src/job-control/job_addprocess.c @@ -21,16 +21,15 @@ int job_addprocess(t_process *p) job = &data_singleton()->exec.job; if (p->fdin == STDIN) { - job->id = jobc->current_id; job_update_id(); + job->id = jobc->current_id; ft_lstadd(&jobc->first_job, ft_lstnew(job, sizeof(*job))); - jobc->rank[1] = jobc->rank[0]; - jobc->rank[0] = job->id; + DG("added new job [%i], rank=%i:%i", job->id, jobc->rank[0], jobc->rank[1]); } job = jobc->first_job->content; ft_lstadd(&job->first_process, ft_lstnew(p, sizeof(*p))); if (JOB_IS_BG(job->attributes) && p->fdout == STDOUT) job_notify_new(job); - DG("adding process to first_job : %i", p->pid); + DG("added process to first_job : %i", p->pid); return(0); } diff --git a/42sh/src/job-control/job_notify_change.c b/42sh/src/job-control/job_notify_change.c index b3ca25bf..3865dfd7 100644 --- a/42sh/src/job-control/job_notify_change.c +++ b/42sh/src/job-control/job_notify_change.c @@ -12,16 +12,24 @@ #include "job_control.h" -void job_notify_change(t_job *job, int status) +void job_notify_change(int id, int status) { - char rank; + t_job *job; + t_jobc *jobc; + char rank; rank = ' '; - if (job->id == data_singleton()->jobc.rank[0]) + jobc = &data_singleton()->jobc; + job = jobc->first_job->content; + if (id == job->id) rank = '+'; - else if (job->id == data_singleton()->jobc.rank[1]) - rank = '-'; - ft_printf("{mag}[%i] %c ", job->id, rank); + else if (jobc->first_job->next) + { + job = jobc->first_job->next->content; + if (id == job->id) + rank = '-'; + } + ft_printf("{mag}[%i] %c ", id, rank); if (status == 0) ft_printf("{gre}done{mag}"); else if (status == 8)