From 40378fec732d3c1c2a0de313eeafcd55f699f97b Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 18 Dec 2016 13:13:01 +0100 Subject: [PATCH 1/4] bit more stable --- 42sh/includes/job_control.h | 4 ++-- 42sh/src/exec/exec_command.c | 2 ++ 42sh/src/exec/launch_process.c | 6 +++++- 42sh/src/exec/process_setexec.c | 8 ++++---- 42sh/src/job-control/builtin_jobs.c | 1 + 42sh/src/job-control/do_job_notification.c | 9 +++++++-- 42sh/src/job-control/{job_cmpid.c => job_cmp_id.c} | 0 42sh/src/job-control/job_is_completed.c | 3 +++ 42sh/src/job-control/job_notify_change.c | 2 +- 42sh/src/job-control/job_remove.c | 13 +++++++------ 42sh/src/job-control/process_free.c | 2 ++ 42sh/src/job-control/process_mark_status.c | 4 ++-- 42sh/src/job-control/put_job_in_foreground.c | 4 +--- 42sh/src/job-control/sigchld_handler.c | 2 ++ 42sh/src/line-editing/ft_prompt.c | 4 +--- 15 files changed, 40 insertions(+), 24 deletions(-) rename 42sh/src/job-control/{job_cmpid.c => job_cmp_id.c} (100%) 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); From 6144e4eab589e33311917751d143736901795537 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Mon, 19 Dec 2016 17:12:02 +0100 Subject: [PATCH 2/4] gotta fix problem with env --- 42sh/includes/job_control.h | 2 +- 42sh/src/exec/exec_command.c | 6 +++++- 42sh/src/exec/process_setexec.c | 2 ++ 42sh/src/exec/set_exitstatus.c | 2 +- 42sh/src/job-control/builtin_jobs.c | 9 +++------ 42sh/src/job-control/do_job_notification.c | 6 +++--- 42sh/src/job-control/job_addprocess.c | 7 +++---- 42sh/src/job-control/job_notify_change.c | 20 ++++++++++++++------ 8 files changed, 32 insertions(+), 22 deletions(-) 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) From c9a39637da681f73a4e66efe75257e262688fd27 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Thu, 22 Dec 2016 11:44:44 +0100 Subject: [PATCH 3/4] pipeend and pipestart bits in process attribute, env problems solved --- 42sh/includes/exec.h | 12 +++++++++ 42sh/includes/job_control.h | 8 ------ 42sh/libft | 2 +- 42sh/src/builtin/builtin_setenv.c | 2 +- 42sh/src/exec/exec_command.c | 2 +- 42sh/src/exec/exec_pipe.c | 31 +++++++++++++++------- 42sh/src/exec/process_setexec.c | 2 -- 42sh/src/job-control/do_job_notification.c | 2 +- 42sh/src/job-control/job_addprocess.c | 4 +-- 9 files changed, 40 insertions(+), 25 deletions(-) diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 92324800..86048c03 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -16,6 +16,18 @@ # define PIPE_READ 0 # define PIPE_WRITE 1 +# define PROCESS_COMPLETED (1 << 0) +# define PROCESS_STOPPED (1 << 1) +# define PROCESS_BUILTIN (1 << 2) +# define PROCESS_BINARY (1 << 3) +# define PROCESS_SCRIPT (1 << 4) +# define PROCESS_UNKNOWN (1 << 5) +# define PROCESS_PIPESTART (1 << 6) +# define PROCESS_PIPEEND (1 << 7) + +# define IS_PIPESTART(p) (p & (PROCESS_PIPESTART)) +# define IS_PIPEEND(p) (p & (PROCESS_PIPEEND)) + # include "libft.h" # include "types.h" # include "job_control.h" diff --git a/42sh/includes/job_control.h b/42sh/includes/job_control.h index 5597f211..78fabb2c 100644 --- a/42sh/includes/job_control.h +++ b/42sh/includes/job_control.h @@ -19,19 +19,11 @@ # include "libft.h" # include "types.h" -# define PROCESS_COMPLETED (1 << 0) -# define PROCESS_STOPPED (1 << 1) -# define PROCESS_BUILTIN (1 << 2) -# define PROCESS_BINARY (1 << 3) -# define PROCESS_SCRIPT (1 << 4) -# define PROCESS_UNKNOWN (1 << 5) - # define JOB_NOTIFIED (1 << 0) # define JOB_BG (1 << 1) # define JOB_IS_BG(j) (j & JOB_BG) # define JOB_IS_FG(j) !(j & JOB_BG) - struct s_job { int id; diff --git a/42sh/libft b/42sh/libft index e7cece57..a26a4be4 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit e7cece5732986cdcd159b40f1d927137e2d6c9f3 +Subproject commit a26a4be4adbf4d6d4887af95a7307356d52ce85d diff --git a/42sh/src/builtin/builtin_setenv.c b/42sh/src/builtin/builtin_setenv.c index fc6ec20a..6cecb3d6 100644 --- a/42sh/src/builtin/builtin_setenv.c +++ b/42sh/src/builtin/builtin_setenv.c @@ -37,7 +37,7 @@ int builtin_setenv(const char *path, char *const av[], char *const envp[]) { if (ft_strcmp((*env)[i], av[0]) == '=') { - ft_strdel(*env); + ft_strdel(&(*env)[i]); (*env)[i] = str; return (0); } diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index 471eda28..67db7916 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -34,7 +34,7 @@ int exec_command(t_btree **ast) DG("gonna launch_process now"); launch_process(p); job_addprocess(p); - if (p->fdout == STDOUT) + if (IS_PIPEEND(p->fdout == STDOUT)) { if (JOB_IS_FG(job->attributes)) put_job_in_foreground(job, 0); diff --git a/42sh/src/exec/exec_pipe.c b/42sh/src/exec/exec_pipe.c index 7b9025af..6bd51167 100644 --- a/42sh/src/exec/exec_pipe.c +++ b/42sh/src/exec/exec_pipe.c @@ -16,21 +16,34 @@ int exec_pipe(t_btree **ast) { int fds[2]; t_data *data; + t_process *p; data = data_singleton(); + p = &data_singleton()->exec.process; pipe(fds); DG("pipe %i->%i", fds[PIPE_WRITE], fds[PIPE_READ]); - data->exec.process.fdout = fds[PIPE_WRITE]; + p->fdout = fds[PIPE_WRITE]; + if (!IS_PIPEEND(p->attributes)) + { + p->attributes |= PROCESS_PIPESTART; + p->attributes &= ~PROCESS_PIPEEND; + } + ft_exec(&(*ast)->left); - if (data->exec.process.fdout != STDOUT) - close(data->exec.process.fdout); - data->exec.process.fdout = STDOUT; - data->exec.process.fdin = fds[PIPE_READ]; + if (p->fdout != STDOUT) + close(p->fdout); + p->fdout = STDOUT; + p->fdin = fds[PIPE_READ]; + + p->attributes ~= ~PROCESS_PIPESTART; + p->attributes |= PROCESS_PIPEEND; + ft_exec(&(*ast)->right); - close(fds[PIPE_WRITE]); - close(fds[PIPE_READ]); - data->exec.process.fdin = STDIN; - data->exec.process.fdout = STDOUT; + /* close(fds[PIPE_WRITE]); */ + /* close(fds[PIPE_READ]); */ + p->fdin = STDIN; + p->fdout = STDOUT; + p->attributes &= ~PROCESS_PIPEEND; btree_delone(ast, &ast_free); return (0); } diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index fd7d7c47..85571934 100644 --- a/42sh/src/exec/process_setexec.c +++ b/42sh/src/exec/process_setexec.c @@ -14,8 +14,6 @@ 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/job-control/do_job_notification.c b/42sh/src/job-control/do_job_notification.c index a9e4a40c..91c63e8a 100644 --- a/42sh/src/job-control/do_job_notification.c +++ b/42sh/src/job-control/do_job_notification.c @@ -31,7 +31,7 @@ int do_job_notification(void) { ret = 1; job_notify_change(j->id, 0); - /* job_remove(j->id); */ + job_remove(j->id); } else if (job_is_stopped(j) && !(j->attributes & JOB_NOTIFIED)) { diff --git a/42sh/src/job-control/job_addprocess.c b/42sh/src/job-control/job_addprocess.c index 03df4939..48d1930e 100644 --- a/42sh/src/job-control/job_addprocess.c +++ b/42sh/src/job-control/job_addprocess.c @@ -19,7 +19,7 @@ int job_addprocess(t_process *p) jobc = &data_singleton()->jobc; job = &data_singleton()->exec.job; - if (p->fdin == STDIN) + if (IS_PIPESTART(p->attributes)) { job_update_id(); job->id = jobc->current_id; @@ -28,7 +28,7 @@ int job_addprocess(t_process *p) } job = jobc->first_job->content; ft_lstadd(&job->first_process, ft_lstnew(p, sizeof(*p))); - if (JOB_IS_BG(job->attributes) && p->fdout == STDOUT) + if (JOB_IS_BG(job->attributes) && IS_PIPEEND(p->attributes)) job_notify_new(job); DG("added process to first_job : %i", p->pid); return(0); From 14e5d176aa87be4cfc9923ae0dff37bb31be920a Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Mon, 2 Jan 2017 17:22:50 +0100 Subject: [PATCH 4/4] end of holidays commit --- 42sh/includes/job_control.h | 1 - 42sh/src/exec/exec_command.c | 2 +- 42sh/src/exec/exec_pipe.c | 10 +++--- 42sh/src/exec/launch_process.c | 2 +- 42sh/src/job-control/job_addprocess.c | 2 +- 42sh/src/job-control/job_update_rank.c | 35 -------------------- 42sh/src/job-control/process_mark_status.c | 7 ++-- 42sh/src/job-control/put_job_in_foreground.c | 2 +- 42sh/src/line-editing/ft_interactive_sh.c | 1 + 42sh/src/main/data_init.c | 1 + 10 files changed, 13 insertions(+), 50 deletions(-) delete mode 100644 42sh/src/job-control/job_update_rank.c diff --git a/42sh/includes/job_control.h b/42sh/includes/job_control.h index 78fabb2c..08eca6df 100644 --- a/42sh/includes/job_control.h +++ b/42sh/includes/job_control.h @@ -38,7 +38,6 @@ struct s_jobc t_list *first_job; pid_t shell_pgid; int current_id; - int rank[2]; struct termios shell_tmodes; }; diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index 67db7916..934d7e03 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -34,7 +34,7 @@ int exec_command(t_btree **ast) DG("gonna launch_process now"); launch_process(p); job_addprocess(p); - if (IS_PIPEEND(p->fdout == STDOUT)) + if (IS_PIPEEND(p->attributes)) { if (JOB_IS_FG(job->attributes)) put_job_in_foreground(job, 0); diff --git a/42sh/src/exec/exec_pipe.c b/42sh/src/exec/exec_pipe.c index 6bd51167..41cc9d82 100644 --- a/42sh/src/exec/exec_pipe.c +++ b/42sh/src/exec/exec_pipe.c @@ -24,18 +24,17 @@ int exec_pipe(t_btree **ast) DG("pipe %i->%i", fds[PIPE_WRITE], fds[PIPE_READ]); p->fdout = fds[PIPE_WRITE]; if (!IS_PIPEEND(p->attributes)) - { p->attributes |= PROCESS_PIPESTART; - p->attributes &= ~PROCESS_PIPEEND; - } + else + p->attributes &= ~PROCESS_PIPESTART; + p->attributes &= ~PROCESS_PIPEEND; ft_exec(&(*ast)->left); if (p->fdout != STDOUT) close(p->fdout); p->fdout = STDOUT; p->fdin = fds[PIPE_READ]; - - p->attributes ~= ~PROCESS_PIPESTART; + p->attributes &= ~PROCESS_PIPESTART; p->attributes |= PROCESS_PIPEEND; ft_exec(&(*ast)->right); @@ -43,6 +42,7 @@ int exec_pipe(t_btree **ast) /* 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 e27254a1..511659ff 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -27,7 +27,7 @@ int launch_process(t_process *p) } else { - DG("process is to be forked, fdout=%i, attr=%x", p->fdout, p->attributes); + DG("process is to be forked, fdout=%i, attr=%b", p->fdout, p->attributes); if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT) && access(p->path, X_OK) == -1) { diff --git a/42sh/src/job-control/job_addprocess.c b/42sh/src/job-control/job_addprocess.c index 48d1930e..77455423 100644 --- a/42sh/src/job-control/job_addprocess.c +++ b/42sh/src/job-control/job_addprocess.c @@ -24,7 +24,7 @@ int job_addprocess(t_process *p) job_update_id(); job->id = jobc->current_id; ft_lstadd(&jobc->first_job, ft_lstnew(job, sizeof(*job))); - DG("added new job [%i], rank=%i:%i", job->id, jobc->rank[0], jobc->rank[1]); + DG("added new job [%i]", job->id); } job = jobc->first_job->content; ft_lstadd(&job->first_process, ft_lstnew(p, sizeof(*p))); diff --git a/42sh/src/job-control/job_update_rank.c b/42sh/src/job-control/job_update_rank.c deleted file mode 100644 index 49c8475b..00000000 --- a/42sh/src/job-control/job_update_rank.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* job_shiftstatus.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/12/12 13:05:10 by jhalford #+# #+# */ -/* Updated: 2016/12/12 17:23:12 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "job_control.h" - -void job_update_rank() -{ - t_jobc *jobc; - t_job *job; - t_list *list; - - jobc = &data_singleton()->jobc; - list = jobc->first_job; - if (list) - { - job = list->content; - jobc->rank[0] = job->id; - jobc->rank[1] = list->next ? ((t_job*)list->next->content)->id : 0; - } - else - { - jobc->rank[0] = 0; - jobc->rank[1] = 0; - } - DG("updated rank: %i,%i", jobc->rank[0], jobc->rank[1]); -} diff --git a/42sh/src/job-control/process_mark_status.c b/42sh/src/job-control/process_mark_status.c index 4c452266..e517c9eb 100644 --- a/42sh/src/job-control/process_mark_status.c +++ b/42sh/src/job-control/process_mark_status.c @@ -17,7 +17,7 @@ int process_mark_status(pid_t pid, int status) t_process *p; DG("marking: pid=%i, status=%i", pid, status); - if (pid > 0) + if (pid > 1) { if ((p = job_getprocess(pid))) { @@ -37,8 +37,5 @@ int process_mark_status(pid_t pid, int status) ft_dprintf(2, "No child process %d.\n", pid); return(-1); } - else - { - return(-1); - } + return(-1); } diff --git a/42sh/src/job-control/put_job_in_foreground.c b/42sh/src/job-control/put_job_in_foreground.c index f34f1572..8e17a06c 100644 --- a/42sh/src/job-control/put_job_in_foreground.c +++ b/42sh/src/job-control/put_job_in_foreground.c @@ -23,7 +23,7 @@ int put_job_in_foreground(t_job *job, int cont) if (cont) { tcsetattr (STDIN_FILENO, TCSADRAIN, &job->tmodes); - if (kill(- job->pgid, SIGCONT) < 0) + if (kill(-job->pgid, SIGCONT) < 0) perror("kill (SIGCONT)"); } /* Wait for it to report. */ diff --git a/42sh/src/line-editing/ft_interactive_sh.c b/42sh/src/line-editing/ft_interactive_sh.c index 2c2d58a9..1c6b4465 100644 --- a/42sh/src/line-editing/ft_interactive_sh.c +++ b/42sh/src/line-editing/ft_interactive_sh.c @@ -47,6 +47,7 @@ int ft_interactive_sh(t_data *data) if ((input_init(data))) return (-1); + DG("interactive_sh loop"); while (1) { ft_bzero(buf, 4); diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index b089b8b9..355d591f 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -26,6 +26,7 @@ int data_init(void) data->exec.process.fdin = STDIN; data->exec.process.fdout = STDOUT; data->exec.process.pid = 0; + data->exec.process.attributes = PROCESS_PIPESTART; data->exec.aol_status = NULL; data->exec.aol_search = 0; data->exec.job.id = 0;