some nices fixes, works nicely

This commit is contained in:
Jack Halford 2017-02-01 21:27:16 +01:00
parent 62cdc4ca84
commit 6ad4ca1848
10 changed files with 23 additions and 12 deletions

View file

@ -57,7 +57,8 @@ int exec_command(t_btree **ast)
} }
p->av = NULL; p->av = NULL;
p->pid = 0; p->pid = 0;
p->attributes = PROCESS_PIPESTART | PROCESS_PIPEEND; /* p->attributes = PROCESS_PIPESTART | PROCESS_PIPEEND; */
p->attributes &= ~(PROCESS_STATE_MASK | PROCESS_TYPE_MASK);
btree_delone(ast, &ast_free); btree_delone(ast, &ast_free);
return (0); return (0);
} }

View file

@ -23,13 +23,12 @@ int process_setgroup(t_process *p, pid_t pid)
j = &data_singleton()->exec.job; j = &data_singleton()->exec.job;
if (!j->pgid) if (!j->pgid)
j->pgid = pid ? pid : getpid(); j->pgid = pid ? pid : getpid();
DG("in pid %i gonna setpgid(%i, %i)", getpid(), pid, j->pgid); DG("pid:%i gonna setpgid(%i, %i)", getpid(), pid, j->pgid);
setpgid(pid, j->pgid); setpgid(pid, j->pgid);
if (pid == 0 && JOB_IS_FG(j->attributes)) if (pid == 0 && JOB_IS_FG(j->attributes))
{ {
signal(SIGTTOU, SIG_IGN); DG("pid:%i gonna setpgrp(%i)", getpid(), j->pgid);
tcsetpgrp(STDIN, j->pgid); tcsetpgrp(STDIN, j->pgid);
signal(SIGTTOU, SIG_DFL);
} }
return (0); return (0);
} }

View file

@ -2,7 +2,7 @@
void process_setsig(void) void process_setsig(void)
{ {
signal(SIGINT, SIG_DFL); /* signal(SIGINT, SIG_DFL); */
signal(SIGQUIT, SIG_DFL); signal(SIGQUIT, SIG_DFL);
signal(SIGTSTP, SIG_DFL); signal(SIGTSTP, SIG_DFL);
signal(SIGTTIN, SIG_DFL); signal(SIGTTIN, SIG_DFL);

View file

@ -16,5 +16,8 @@ void job_run(t_job *job, int foreground)
{ {
mark_job_as_running(job); mark_job_as_running(job);
job_format(job, JOBS_OPTS_L); job_format(job, JOBS_OPTS_L);
foreground ? put_job_in_foreground(job, 1) : put_job_in_background(job, 1); if (foreground)
put_job_in_foreground(job, 1);
else
put_job_in_background(job, 1);
} }

View file

@ -17,8 +17,10 @@ int job_wait(int id)
pid_t pid; pid_t pid;
int status; int status;
if (job_is_stopped(id) || job_is_completed(id)) DG("waiting for [%i]", id);
if (job_is_stopped(id))
return (0); return (0);
job_update_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_completed(id) && !job_is_completed(id)

View file

@ -32,7 +32,7 @@ int process_mark_status(pid_t pid, int status)
p->attributes |= PROCESS_COMPLETED; p->attributes |= PROCESS_COMPLETED;
if (WIFSIGNALED(status)) if (WIFSIGNALED(status))
ft_printf("{mag}%d: Terminated by signal %d.\n{eoc}", ft_printf("{mag}%d: Terminated by signal %d.\n{eoc}",
(int)pid, WTERMSIG(p->status)); (int)pid, WTERMSIG(status));
} }
return (0); return (0);
} }

View file

@ -16,6 +16,6 @@ int put_job_in_background(t_job *j, int cont)
{ {
if (cont) if (cont)
if (kill(-j->pgid, SIGCONT) < 0) if (kill(-j->pgid, SIGCONT) < 0)
DG("kill (SIGCONT) malfunction"); DG("kill(SIGCONT) failed");
return (0); return (0);
} }

View file

@ -17,16 +17,21 @@ int put_job_in_foreground(t_job *j, int cont)
t_jobc *jobc; t_jobc *jobc;
jobc = &data_singleton()->jobc; jobc = &data_singleton()->jobc;
tcsetpgrp (STDIN, j->pgid); DG("pid:%i gonna setpgrp(%i) (JOB)", getpid(), j->pgid);
tcsetpgrp(STDIN, j->pgid);
tcsetattr(STDIN, TCSADRAIN, &jobc->shell_tmodes);
if (cont) if (cont)
{ {
tcsetattr(STDIN, TCSADRAIN, &j->tmodes); tcsetattr(STDIN, TCSADRAIN, &j->tmodes);
if (kill(-j->pgid, SIGCONT) < 0) if (kill(-j->pgid, SIGCONT) < 0)
DG("kill (SIGCONT) malfunction"); DG("kill(SIGCONT) failed");
} }
job_wait(j->id); job_wait(j->id);
DG("finished waiting for [%i]", j->id);
job_remove(j->id); job_remove(j->id);
DG("pid:%i gonna setpgrp(%i) (SHELL)", getpid(), jobc->shell_pgid);
tcsetpgrp(STDIN, jobc->shell_pgid); tcsetpgrp(STDIN, jobc->shell_pgid);
tcgetattr(STDIN, &j->tmodes); tcgetattr(STDIN, &j->tmodes);

View file

@ -15,5 +15,5 @@
void sigint_handler(int signo) void sigint_handler(int signo)
{ {
(void)signo; (void)signo;
DG("got SIGINT in process %i", getpid()); DG("pid:%i got SIGINT", getpid());
} }

View file

@ -66,6 +66,7 @@ void ft_reset_stats_term(int signal)
int ft_readline(void) int ft_readline(void)
{ {
signal(SIGWINCH, ft_reset_stats_term); signal(SIGWINCH, ft_reset_stats_term);
ft_save_stats_term();
if (tcsetattr(0, TCSANOW, ft_stats_term_termcaps()) == -1) if (tcsetattr(0, TCSANOW, ft_stats_term_termcaps()) == -1)
return (-1); return (-1);
if (data_singleton()->line.input) if (data_singleton()->line.input)