diff --git a/42sh/includes/job_control.h b/42sh/includes/job_control.h index 037f4f30..97b81eee 100644 --- a/42sh/includes/job_control.h +++ b/42sh/includes/job_control.h @@ -57,7 +57,7 @@ int job_addprocess(t_process *p); void job_update_id(void); void job_update_rank(void); -void do_job_notification(void); +int do_job_notification(void); void job_notify_new(t_job *job); void job_notify_change(t_job *job, int status); @@ -65,7 +65,7 @@ int job_wait(t_job *job); void job_update_status(void); int job_is_stopped(t_job *job); int job_is_completed(t_job *job); -void job_remove(t_job *job); +void job_remove(int id); void job_free(void *content, size_t content_size); int process_mark_status(pid_t pid, int status); diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index c5e9198e..30749fdb 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -39,5 +39,7 @@ int exec_command(t_btree **ast) put_job_in_background(job, 0); } btree_delone(ast, &ast_free); + p->path = NULL; + p->attributes = 0; return (0); } diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index e87fc724..e27254a1 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -20,10 +20,14 @@ 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->argv[0]); - else if (p->attributes & PROCESS_BUILTIN && p->fdout != STDOUT) + else if (p->attributes & PROCESS_BUILTIN && p->fdout == STDOUT) + { + DG("process is not to be forked, fdout=%i, attr=%x", p->fdout, p->attributes); set_exitstatus((*p->execf)(p->path, p->argv, data_singleton()->env)); + } else { + DG("process is to be forked, fdout=%i, attr=%x", p->fdout, p->attributes); if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT) && access(p->path, X_OK) == -1) { diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index c3b81dc3..85571934 100644 --- a/42sh/src/exec/process_setexec.c +++ b/42sh/src/exec/process_setexec.c @@ -17,13 +17,13 @@ int process_setexec(t_process *p) if ((p->execf = is_builtin(p))) { DG("process is a builtin"); - p->attributes &= PROCESS_BUILTIN; + p->attributes |= PROCESS_BUILTIN; } else if (ft_strchr(p->argv[0], '/')) { DG("process is a script"); p->execf = &execve; - p->attributes &= PROCESS_SCRIPT; + p->attributes |= PROCESS_SCRIPT; p->path = ft_strdup(p->argv[0]); } else if ((p->path = ft_findexec(ft_getenv( @@ -31,13 +31,13 @@ int process_setexec(t_process *p) { DG("process is binary"); p->execf = &execve; - p->attributes &= PROCESS_BINARY; + p->attributes |= PROCESS_BINARY; } else { DG("process is '%s' unknown type", p->argv[0]); p->execf = NULL; - p->attributes &= PROCESS_UNKNOWN; + p->attributes |= PROCESS_UNKNOWN; return (1); } return (0); diff --git a/42sh/src/job-control/builtin_jobs.c b/42sh/src/job-control/builtin_jobs.c index a9d9118e..753edb1d 100644 --- a/42sh/src/job-control/builtin_jobs.c +++ b/42sh/src/job-control/builtin_jobs.c @@ -26,6 +26,7 @@ int builtin_jobs(const char *path, char *const av[], char *const envp[]) (void)av; while (jlist) { + DG("jlist->content"); job = jlist->content; rank = ' '; if (job->id == data_singleton()->jobc.rank[0]) diff --git a/42sh/src/job-control/do_job_notification.c b/42sh/src/job-control/do_job_notification.c index b1615415..5894492c 100644 --- a/42sh/src/job-control/do_job_notification.c +++ b/42sh/src/job-control/do_job_notification.c @@ -12,12 +12,14 @@ #include "job_control.h" -void do_job_notification(void) +int do_job_notification(void) { t_job *j; t_list *jlist; t_jobc *jobc; + int ret; + ret = 0; job_update_status(); jobc = &data_singleton()->jobc; jlist = jobc->first_job; @@ -27,14 +29,17 @@ void do_job_notification(void) DG("checking job [%i]", j->id); if (job_is_completed(j)) { + ret = 1; job_notify_change(j, 0); - job_remove(j); + job_remove(j->id); } else if (job_is_stopped(j) && !(j->attributes & JOB_NOTIFIED)) { + ret = 1; job_notify_change(j, 8); j->attributes &= JOB_NOTIFIED; } jlist = jlist->next; } + return (ret); } diff --git a/42sh/src/job-control/job_cmpid.c b/42sh/src/job-control/job_cmp_id.c similarity index 100% rename from 42sh/src/job-control/job_cmpid.c rename to 42sh/src/job-control/job_cmp_id.c diff --git a/42sh/src/job-control/job_is_completed.c b/42sh/src/job-control/job_is_completed.c index b92bbd6d..bafa92e3 100644 --- a/42sh/src/job-control/job_is_completed.c +++ b/42sh/src/job-control/job_is_completed.c @@ -22,7 +22,10 @@ int job_is_completed(t_job *job) { p = lst->content; if (!(p->attributes & PROCESS_COMPLETED)) + { + DG("process %i is not completed", p->pid); return (0); + } lst = lst->next; } return (1); diff --git a/42sh/src/job-control/job_notify_change.c b/42sh/src/job-control/job_notify_change.c index 6ca222b3..b3ca25bf 100644 --- a/42sh/src/job-control/job_notify_change.c +++ b/42sh/src/job-control/job_notify_change.c @@ -30,5 +30,5 @@ void job_notify_change(t_job *job, int status) ft_printf("{red}killed{mag}"); else ft_printf("exit %i", status); - /* ft_printf("\t%s{eoc}\n", job->command); */ + ft_printf("\t 'process command goes here'{eoc}\n"); } diff --git a/42sh/src/job-control/job_remove.c b/42sh/src/job-control/job_remove.c index 3d93d244..900ff591 100644 --- a/42sh/src/job-control/job_remove.c +++ b/42sh/src/job-control/job_remove.c @@ -12,17 +12,18 @@ #include "job_control.h" -void job_remove(t_job *job) +void job_remove(int id) { t_jobc *jobc; jobc = &data_singleton()->jobc; - if (job->id < data_singleton()->jobc.current_id) + DG("job_remove"); + if (id < data_singleton()->jobc.current_id) { - data_singleton()->jobc.current_id = job->id; - DG("ID_UPDATE(downgrade):%i", job->id); + data_singleton()->jobc.current_id = id; + DG("ID_UPDATE(downgrade):%i", id); } else - DG("ID_UPDATE(no downgrade): %i/%i", job->id, data_singleton()->jobc.current_id); - ft_lst_delif(&jobc->first_job, job, ft_addrcmp, job_free); + DG("ID_UPDATE(no downgrade): %i/%i", id, data_singleton()->jobc.current_id); + ft_lst_delif(&jobc->first_job, &id, job_cmp_id, job_free); } diff --git a/42sh/src/job-control/process_free.c b/42sh/src/job-control/process_free.c index b6573002..9a4dae4b 100644 --- a/42sh/src/job-control/process_free.c +++ b/42sh/src/job-control/process_free.c @@ -18,7 +18,9 @@ void process_free(void *content, size_t content_size) (void)content_size; p = content; + DG("check 1"); ft_strdel(&p->path); + DG("check 2"); ft_sstrfree(p->argv); free(p); } diff --git a/42sh/src/job-control/process_mark_status.c b/42sh/src/job-control/process_mark_status.c index 12199d06..4c452266 100644 --- a/42sh/src/job-control/process_mark_status.c +++ b/42sh/src/job-control/process_mark_status.c @@ -24,10 +24,10 @@ int process_mark_status(pid_t pid, int status) DG("found process pid=%i", pid); p->status = status; if (WIFSTOPPED(status)) - p->attributes &= PROCESS_STOPPED; + p->attributes |= PROCESS_STOPPED; else { - p->attributes &= PROCESS_COMPLETED; + p->attributes |= PROCESS_COMPLETED; if (WIFSIGNALED(status)) ft_printf("%d: Terminated by signal %d.\n", (int) pid, WTERMSIG(p->status)); diff --git a/42sh/src/job-control/put_job_in_foreground.c b/42sh/src/job-control/put_job_in_foreground.c index 108999e9..f34f1572 100644 --- a/42sh/src/job-control/put_job_in_foreground.c +++ b/42sh/src/job-control/put_job_in_foreground.c @@ -27,10 +27,8 @@ int put_job_in_foreground(t_job *job, int cont) perror("kill (SIGCONT)"); } /* Wait for it to report. */ - DG("gonna wait for job"); job_wait(job); - DG("gonna remove job"); - job_remove(job); + job_remove(job->id); /* Put the shell back in the foreground. */ tcsetpgrp(STDIN_FILENO, jobc->shell_pgid); diff --git a/42sh/src/job-control/sigchld_handler.c b/42sh/src/job-control/sigchld_handler.c index e011ebd2..40390e12 100644 --- a/42sh/src/job-control/sigchld_handler.c +++ b/42sh/src/job-control/sigchld_handler.c @@ -19,5 +19,7 @@ void sigchld_handler(int signo) (void)signo; data = data_singleton(); DG("got asynchronous notification (SIGCHLD)"); + /* if (do_job_notification()) */ + /* ft_putstr(SHELL_PROMPT); */ job_update_status(); } diff --git a/42sh/src/line-editing/ft_prompt.c b/42sh/src/line-editing/ft_prompt.c index 8c7a1338..8991a190 100644 --- a/42sh/src/line-editing/ft_prompt.c +++ b/42sh/src/line-editing/ft_prompt.c @@ -14,9 +14,7 @@ int ft_prompt(void) { - t_data *data; - - data = data_singleton(); + DG("do_job_notification() before prompt"); do_job_notification(); DG("new prompt now"); ft_putstr(SHELL_PROMPT);