next to do: end of pipe doesnt terminate by itself

This commit is contained in:
Jack Halford 2017-01-03 15:36:53 +01:00
parent 9e8939d588
commit d2982d89bc
15 changed files with 47 additions and 41 deletions

View file

@ -52,10 +52,10 @@ int do_job_notification(void);
void job_notify_new(t_job *job); void job_notify_new(t_job *job);
void job_notify_change(int id, int status); void job_notify_change(int id, int status);
int job_wait(t_job *job); int job_wait(int id);
void job_update_status(void); void job_update_status(void);
int job_is_stopped(t_job *job); int job_is_stopped(int id);
int job_is_completed(t_job *job); int job_is_completed(int id);
void job_remove(int id); void job_remove(int id);
void job_free(void *content, size_t content_size); void job_free(void *content, size_t content_size);
int process_mark_status(pid_t pid, int status); int process_mark_status(pid_t pid, int status);

@ -1 +1 @@
Subproject commit a26a4be4adbf4d6d4887af95a7307356d52ce85d Subproject commit f4af2f642761111b3395bb69c1766a8c46719d4d

View file

@ -21,25 +21,16 @@ int exec_command(t_btree **ast)
node = (*ast)->item; node = (*ast)->item;
p = &data_singleton()->exec.process; p = &data_singleton()->exec.process;
job = &data_singleton()->exec.job; job = &data_singleton()->exec.job;
/* job = data_singleton()->jobc.first_job->content; */
p->av = ft_sstrdup(node->data.sstr); p->av = ft_sstrdup(node->data.sstr);
if (process_setexec(p)) process_setexec(p);
if (!(launch_process(p)))
{ {
ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]);
set_exitstatus(127);
}
else
{
DG("gonna launch_process now");
launch_process(p);
DG("launch_process done");
job_addprocess(p); job_addprocess(p);
DG("job_addprocess done");
if (IS_PIPEEND(p->attributes)) if (IS_PIPEEND(p->attributes))
{
JOB_IS_FG(job->attributes) ? JOB_IS_FG(job->attributes) ?
put_job_in_foreground(job, 0): put_job_in_foreground(job, 0):
put_job_in_background(job, 0); put_job_in_background(job, 0);
}
} }
process_reset(); process_reset();
btree_delone(ast, &ast_free); btree_delone(ast, &ast_free);

View file

@ -24,13 +24,7 @@ int exec_pipe(t_btree **ast)
pipe(fds); pipe(fds);
DG("pipe %i->%i", fds[PIPE_WRITE], fds[PIPE_READ]); DG("pipe %i->%i", fds[PIPE_WRITE], fds[PIPE_READ]);
p->fdout = fds[PIPE_WRITE]; p->fdout = fds[PIPE_WRITE];
start = 0; start = IS_PIPESTART(p->attributes);
if (!IS_PIPESTART(p->attributes))
{
p->attributes |= PROCESS_PIPESTART;
start = 1;
}
p->attributes &= ~PROCESS_PIPESTART;
p->attributes &= ~PROCESS_PIPEEND; p->attributes &= ~PROCESS_PIPEEND;
ft_exec(&(*ast)->left); ft_exec(&(*ast)->left);

View file

@ -38,7 +38,8 @@ int ft_exec(t_btree **ast)
while (g_execmap[i].type) while (g_execmap[i].type)
{ {
if (item->type == g_execmap[i].type) if (item->type == g_execmap[i].type)
return ((*g_execmap[i].f)(ast)); /* return ((*g_execmap[i].f)(ast)); */
(*g_execmap[i].f)(ast);
i++; i++;
} }
return (0); return (0);

View file

@ -19,7 +19,11 @@ int launch_process(t_process *p)
exec = &data_singleton()->exec; exec = &data_singleton()->exec;
if (p->attributes & PROCESS_UNKNOWN) if (p->attributes & PROCESS_UNKNOWN)
ft_dprintf(2, "%s: command not found: %s\n", SHELL_NAME, p->av[0]); {
ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]);
set_exitstatus(127);
return (1);
}
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)); set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env));
else else

View file

@ -14,16 +14,17 @@
int process_setexec(t_process *p) int process_setexec(t_process *p)
{ {
DG("process_setexec, attr=%b", p->attributes);
if ((p->execf = is_builtin(p))) if ((p->execf = is_builtin(p)))
{ {
DG("process is a builtin, attr=%b", p->attributes); DG("process is builtin");
p->attributes |= PROCESS_BUILTIN; p->attributes |= PROCESS_BUILTIN;
} }
else if (ft_strchr(p->av[0], '/')) else if (ft_strchr(p->av[0], '/'))
{ {
DG("process is a script"); DG("process is a script");
p->execf = &execve; p->execf = &execve;
p->attributes &= PROCESS_SCRIPT; p->attributes |= PROCESS_SCRIPT;
p->path = ft_strdup(p->av[0]); p->path = ft_strdup(p->av[0]);
} }
else if ((p->path = ft_findexec(ft_getenv( else if ((p->path = ft_findexec(ft_getenv(

View file

@ -27,13 +27,13 @@ int do_job_notification(void)
{ {
j = jlist->content; j = jlist->content;
DG("checking job [%i]", j->id); DG("checking job [%i]", j->id);
if (job_is_completed(j)) if (job_is_completed(j->id))
{ {
ret = 1; ret = 1;
job_notify_change(j->id, 0); job_notify_change(j->id, 0);
job_remove(j->id); job_remove(j->id);
} }
else if (job_is_stopped(j) && !(j->attributes & JOB_NOTIFIED)) else if (job_is_stopped(j->id) && !(j->attributes & JOB_NOTIFIED))
{ {
ret = 1; ret = 1;
job_notify_change(j->id, 8); job_notify_change(j->id, 8);

View file

@ -12,15 +12,21 @@
#include "job_control.h" #include "job_control.h"
int job_is_completed(t_job *job) int job_is_completed(int id)
{ {
t_list *lst; t_list *lst;
t_job *job;
t_jobc *jobc;
t_process *p; t_process *p;
jobc = &data_singleton()->jobc;
job = ft_lst_find(jobc->first_job, &id, job_cmp_id)->content;
lst = job->first_process; lst = job->first_process;
DG("check");
while (lst) while (lst)
{ {
p = lst->content; p = lst->content;
DG("checking pid=%i", p->pid);
if (!(p->attributes & PROCESS_COMPLETED)) if (!(p->attributes & PROCESS_COMPLETED))
{ {
DG("process %i is not completed", p->pid); DG("process %i is not completed", p->pid);

View file

@ -12,11 +12,15 @@
#include "job_control.h" #include "job_control.h"
int job_is_stopped(t_job *job) int job_is_stopped(int id)
{ {
t_list *lst; t_list *lst;
t_job *job;
t_jobc *jobc;
t_process *p; t_process *p;
jobc = &data_singleton()->jobc;
job = ft_lst_find(jobc->first_job, &id, job_cmp_id)->content;
lst = job->first_process; lst = job->first_process;
while (lst) while (lst)
{ {

View file

@ -18,7 +18,7 @@ void job_update_status(void)
pid_t pid; pid_t pid;
DG("updating job status'"); DG("updating job status'");
pid = waitpid (WAIT_ANY, &status, WUNTRACED|WNOHANG); pid = waitpid (WAIT_ANY, &status, WUNTRACED | WNOHANG);
while (!process_mark_status(pid, status)) while (!process_mark_status(pid, status))
pid = waitpid (WAIT_ANY, &status, WUNTRACED|WNOHANG); pid = waitpid (WAIT_ANY, &status, WUNTRACED | WNOHANG);
} }

View file

@ -12,17 +12,21 @@
#include "job_control.h" #include "job_control.h"
int job_wait(t_job *job) int job_wait(int id)
{ {
pid_t pid; pid_t pid;
int status; int status;
pid = waitpid(WAIT_ANY, &status, WUNTRACED); pid = waitpid(WAIT_ANY, &status, WUNTRACED);
while (!(process_mark_status(pid, status) while (!process_mark_status(pid, status)
|| job_is_stopped(job) && !job_is_stopped(id)
|| job_is_completed(job))) && !job_is_completed(id))
{ {
DG("waitpid now");
pid = waitpid(WAIT_ANY, &status, WUNTRACED); pid = waitpid(WAIT_ANY, &status, WUNTRACED);
DG("waitpid done");
} }
return(0); /* DG("stopped: %i", job_is_stopped(job)); */
/* DG("completed: %i", job_is_completed(job)); */
return (0);
} }

View file

@ -16,9 +16,9 @@ int process_mark_status(pid_t pid, int status)
{ {
t_process *p; t_process *p;
DG("marking: pid=%i, status=%i", pid, status);
if (pid > 1) if (pid > 1)
{ {
DG("marking: pid=%i, status=%i", pid, status);
if ((p = job_getprocess(pid))) if ((p = job_getprocess(pid)))
{ {
DG("found process pid=%i", pid); DG("found process pid=%i", pid);

View file

@ -27,7 +27,8 @@ int put_job_in_foreground(t_job *job, int cont)
perror("kill (SIGCONT)"); perror("kill (SIGCONT)");
} }
/* Wait for it to report. */ /* Wait for it to report. */
job_wait(job); DG("gonna wait for job");
job_wait(job->id);
job_remove(job->id); job_remove(job->id);
/* Put the shell back in the foreground. */ /* Put the shell back in the foreground. */

View file

@ -21,5 +21,5 @@ void sigchld_handler(int signo)
DG("got asynchronous notification (SIGCHLD)"); DG("got asynchronous notification (SIGCHLD)");
/* if (do_job_notification()) */ /* if (do_job_notification()) */
/* ft_putstr(SHELL_PROMPT); */ /* ft_putstr(SHELL_PROMPT); */
job_update_status(); /* job_update_status(); */
} }