merge
This commit is contained in:
commit
4c63c30b04
23 changed files with 105 additions and 104 deletions
|
|
@ -16,6 +16,18 @@
|
||||||
# define PIPE_READ 0
|
# define PIPE_READ 0
|
||||||
# define PIPE_WRITE 1
|
# 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 "libft.h"
|
||||||
# include "types.h"
|
# include "types.h"
|
||||||
# include "job_control.h"
|
# include "job_control.h"
|
||||||
|
|
|
||||||
|
|
@ -19,19 +19,11 @@
|
||||||
# include "libft.h"
|
# include "libft.h"
|
||||||
# include "types.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_NOTIFIED (1 << 0)
|
||||||
# define JOB_BG (1 << 1)
|
# define JOB_BG (1 << 1)
|
||||||
# define JOB_IS_BG(j) (j & JOB_BG)
|
# define JOB_IS_BG(j) (j & JOB_BG)
|
||||||
# define JOB_IS_FG(j) !(j & JOB_BG)
|
# define JOB_IS_FG(j) !(j & JOB_BG)
|
||||||
|
|
||||||
|
|
||||||
struct s_job
|
struct s_job
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
|
|
@ -46,7 +38,6 @@ struct s_jobc
|
||||||
t_list *first_job;
|
t_list *first_job;
|
||||||
pid_t shell_pgid;
|
pid_t shell_pgid;
|
||||||
int current_id;
|
int current_id;
|
||||||
int rank[2];
|
|
||||||
struct termios shell_tmodes;
|
struct termios shell_tmodes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -57,15 +48,15 @@ int job_addprocess(t_process *p);
|
||||||
void job_update_id(void);
|
void job_update_id(void);
|
||||||
void job_update_rank(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_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);
|
int job_wait(t_job *job);
|
||||||
void job_update_status(void);
|
void job_update_status(void);
|
||||||
int job_is_stopped(t_job *job);
|
int job_is_stopped(t_job *job);
|
||||||
int job_is_completed(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);
|
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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ int builtin_setenv(const char *path, char *const av[], char *const envp[])
|
||||||
{
|
{
|
||||||
if (ft_strcmp((*env)[i], av[0]) == '=')
|
if (ft_strcmp((*env)[i], av[0]) == '=')
|
||||||
{
|
{
|
||||||
ft_strdel(*env);
|
ft_strdel(&(*env)[i]);
|
||||||
(*env)[i] = str;
|
(*env)[i] = str;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
|
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */
|
/* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/01/02 19:07:43 by jhalford ### ########.fr */
|
/* Updated: 2017/01/02 19:10:01 by jhalford ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -25,13 +25,16 @@ int exec_command(t_btree **ast)
|
||||||
if (process_setexec(p))
|
if (process_setexec(p))
|
||||||
{
|
{
|
||||||
ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]);
|
ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]);
|
||||||
|
p->attributes = 0;
|
||||||
|
p->path = NULL;
|
||||||
|
p->argv = NULL;
|
||||||
btree_delone(ast, &ast_free);
|
btree_delone(ast, &ast_free);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
DG("gonna launch_process now");
|
DG("gonna launch_process now");
|
||||||
launch_process(p);
|
launch_process(p);
|
||||||
job_addprocess(p);
|
job_addprocess(p);
|
||||||
if (p->fdout == STDOUT)
|
if (IS_PIPEEND(p->attributes))
|
||||||
{
|
{
|
||||||
if (JOB_IS_FG(job->attributes))
|
if (JOB_IS_FG(job->attributes))
|
||||||
put_job_in_foreground(job, 0);
|
put_job_in_foreground(job, 0);
|
||||||
|
|
@ -39,5 +42,8 @@ int exec_command(t_btree **ast)
|
||||||
put_job_in_background(job, 0);
|
put_job_in_background(job, 0);
|
||||||
}
|
}
|
||||||
btree_delone(ast, &ast_free);
|
btree_delone(ast, &ast_free);
|
||||||
|
p->attributes = 0;
|
||||||
|
p->path = NULL;
|
||||||
|
p->argv = NULL;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,21 +16,34 @@ int exec_pipe(t_btree **ast)
|
||||||
{
|
{
|
||||||
int fds[2];
|
int fds[2];
|
||||||
t_data *data;
|
t_data *data;
|
||||||
|
t_process *p;
|
||||||
|
|
||||||
data = data_singleton();
|
data = data_singleton();
|
||||||
|
p = &data_singleton()->exec.process;
|
||||||
pipe(fds);
|
pipe(fds);
|
||||||
DG("pipe %i->%i", fds[PIPE_WRITE], fds[PIPE_READ]);
|
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;
|
||||||
|
else
|
||||||
|
p->attributes &= ~PROCESS_PIPESTART;
|
||||||
|
p->attributes &= ~PROCESS_PIPEEND;
|
||||||
|
|
||||||
ft_exec(&(*ast)->left);
|
ft_exec(&(*ast)->left);
|
||||||
if (data->exec.process.fdout != STDOUT)
|
if (p->fdout != STDOUT)
|
||||||
close(data->exec.process.fdout);
|
close(p->fdout);
|
||||||
data->exec.process.fdout = STDOUT;
|
p->fdout = STDOUT;
|
||||||
data->exec.process.fdin = fds[PIPE_READ];
|
p->fdin = fds[PIPE_READ];
|
||||||
|
p->attributes &= ~PROCESS_PIPESTART;
|
||||||
|
p->attributes |= PROCESS_PIPEEND;
|
||||||
|
|
||||||
ft_exec(&(*ast)->right);
|
ft_exec(&(*ast)->right);
|
||||||
close(fds[PIPE_WRITE]);
|
/* close(fds[PIPE_WRITE]); */
|
||||||
close(fds[PIPE_READ]);
|
/* close(fds[PIPE_READ]); */
|
||||||
data->exec.process.fdin = STDIN;
|
p->fdin = STDIN;
|
||||||
data->exec.process.fdout = STDOUT;
|
p->fdout = STDOUT;
|
||||||
|
p->attributes |= PROCESS_PIPESTART;
|
||||||
|
p->attributes &= ~PROCESS_PIPEEND;
|
||||||
btree_delone(ast, &ast_free);
|
btree_delone(ast, &ast_free);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */
|
/* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/01/02 18:14:28 by jhalford ### ########.fr */
|
/* Updated: 2017/01/02 19:10:46 by jhalford ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -24,6 +24,7 @@ int launch_process(t_process *p)
|
||||||
set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env));
|
set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
DG("process is to be forked, fdout=%i, attr=%b", p->fdout, p->attributes);
|
||||||
if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT)
|
if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT)
|
||||||
&& access(p->path, X_OK) == -1)
|
&& access(p->path, X_OK) == -1)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/12/13 17:07:10 by jhalford #+# #+# */
|
/* Created: 2016/12/13 17:07:10 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/01/02 18:15:27 by jhalford ### ########.fr */
|
/* Updated: 2017/01/02 19:11:00 by jhalford ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -17,7 +17,7 @@ int process_setexec(t_process *p)
|
||||||
if ((p->execf = is_builtin(p)))
|
if ((p->execf = is_builtin(p)))
|
||||||
{
|
{
|
||||||
DG("process is a builtin");
|
DG("process is a builtin");
|
||||||
p->attributes &= PROCESS_BUILTIN;
|
p->attributes |= PROCESS_BUILTIN;
|
||||||
}
|
}
|
||||||
else if (ft_strchr(p->av[0], '/'))
|
else if (ft_strchr(p->av[0], '/'))
|
||||||
{
|
{
|
||||||
|
|
@ -31,13 +31,13 @@ int process_setexec(t_process *p)
|
||||||
{
|
{
|
||||||
DG("process is binary");
|
DG("process is binary");
|
||||||
p->execf = &execve;
|
p->execf = &execve;
|
||||||
p->attributes &= PROCESS_BINARY;
|
p->attributes |= PROCESS_BINARY;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DG("process is '%s' unknown type", p->av[0]);
|
DG("process is '%s' unknown type", p->av[0]);
|
||||||
p->execf = NULL;
|
p->execf = NULL;
|
||||||
p->attributes &= PROCESS_UNKNOWN;
|
p->attributes |= PROCESS_UNKNOWN;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,6 @@ void set_exitstatus(int status)
|
||||||
char *astatus;
|
char *astatus;
|
||||||
|
|
||||||
astatus = ft_itoa(status);
|
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);
|
ft_strdel(&astatus);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/12/15 17:43:01 by jhalford #+# #+# */
|
/* Created: 2016/12/15 17:43:01 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/01/02 19:07:44 by jhalford ### ########.fr */
|
/* Updated: 2017/01/02 19:11:19 by jhalford ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,14 @@
|
||||||
|
|
||||||
#include "job_control.h"
|
#include "job_control.h"
|
||||||
|
|
||||||
void do_job_notification(void)
|
int do_job_notification(void)
|
||||||
{
|
{
|
||||||
t_job *j;
|
t_job *j;
|
||||||
t_list *jlist;
|
t_list *jlist;
|
||||||
t_jobc *jobc;
|
t_jobc *jobc;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
job_update_status();
|
job_update_status();
|
||||||
jobc = &data_singleton()->jobc;
|
jobc = &data_singleton()->jobc;
|
||||||
jlist = jobc->first_job;
|
jlist = jobc->first_job;
|
||||||
|
|
@ -27,14 +29,17 @@ void do_job_notification(void)
|
||||||
DG("checking job [%i]", j->id);
|
DG("checking job [%i]", j->id);
|
||||||
if (job_is_completed(j))
|
if (job_is_completed(j))
|
||||||
{
|
{
|
||||||
job_notify_change(j, 0);
|
ret = 1;
|
||||||
job_remove(j);
|
job_notify_change(j->id, 0);
|
||||||
|
job_remove(j->id);
|
||||||
}
|
}
|
||||||
else if (job_is_stopped(j) && !(j->attributes & JOB_NOTIFIED))
|
else if (job_is_stopped(j) && !(j->attributes & JOB_NOTIFIED))
|
||||||
{
|
{
|
||||||
job_notify_change(j, 8);
|
ret = 1;
|
||||||
|
job_notify_change(j->id, 8);
|
||||||
j->attributes &= JOB_NOTIFIED;
|
j->attributes &= JOB_NOTIFIED;
|
||||||
}
|
}
|
||||||
jlist = jlist->next;
|
jlist = jlist->next;
|
||||||
}
|
}
|
||||||
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,18 +19,17 @@ int job_addprocess(t_process *p)
|
||||||
|
|
||||||
jobc = &data_singleton()->jobc;
|
jobc = &data_singleton()->jobc;
|
||||||
job = &data_singleton()->exec.job;
|
job = &data_singleton()->exec.job;
|
||||||
if (p->fdin == STDIN)
|
if (IS_PIPESTART(p->attributes))
|
||||||
{
|
{
|
||||||
job->id = jobc->current_id;
|
|
||||||
job_update_id();
|
job_update_id();
|
||||||
|
job->id = jobc->current_id;
|
||||||
ft_lstadd(&jobc->first_job, ft_lstnew(job, sizeof(*job)));
|
ft_lstadd(&jobc->first_job, ft_lstnew(job, sizeof(*job)));
|
||||||
jobc->rank[1] = jobc->rank[0];
|
DG("added new job [%i]", job->id);
|
||||||
jobc->rank[0] = job->id;
|
|
||||||
}
|
}
|
||||||
job = jobc->first_job->content;
|
job = jobc->first_job->content;
|
||||||
ft_lstadd(&job->first_process, ft_lstnew(p, sizeof(*p)));
|
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);
|
job_notify_new(job);
|
||||||
DG("adding process to first_job : %i", p->pid);
|
DG("added process to first_job : %i", p->pid);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,10 @@ int job_is_completed(t_job *job)
|
||||||
{
|
{
|
||||||
p = lst->content;
|
p = lst->content;
|
||||||
if (!(p->attributes & PROCESS_COMPLETED))
|
if (!(p->attributes & PROCESS_COMPLETED))
|
||||||
|
{
|
||||||
|
DG("process %i is not completed", p->pid);
|
||||||
return (0);
|
return (0);
|
||||||
|
}
|
||||||
lst = lst->next;
|
lst = lst->next;
|
||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
|
|
|
||||||
|
|
@ -12,16 +12,24 @@
|
||||||
|
|
||||||
#include "job_control.h"
|
#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 = ' ';
|
rank = ' ';
|
||||||
if (job->id == data_singleton()->jobc.rank[0])
|
jobc = &data_singleton()->jobc;
|
||||||
|
job = jobc->first_job->content;
|
||||||
|
if (id == job->id)
|
||||||
rank = '+';
|
rank = '+';
|
||||||
else if (job->id == data_singleton()->jobc.rank[1])
|
else if (jobc->first_job->next)
|
||||||
rank = '-';
|
{
|
||||||
ft_printf("{mag}[%i] %c ", job->id, rank);
|
job = jobc->first_job->next->content;
|
||||||
|
if (id == job->id)
|
||||||
|
rank = '-';
|
||||||
|
}
|
||||||
|
ft_printf("{mag}[%i] %c ", id, rank);
|
||||||
if (status == 0)
|
if (status == 0)
|
||||||
ft_printf("{gre}done{mag}");
|
ft_printf("{gre}done{mag}");
|
||||||
else if (status == 8)
|
else if (status == 8)
|
||||||
|
|
@ -30,5 +38,5 @@ void job_notify_change(t_job *job, int status)
|
||||||
ft_printf("{red}killed{mag}");
|
ft_printf("{red}killed{mag}");
|
||||||
else
|
else
|
||||||
ft_printf("exit %i", status);
|
ft_printf("exit %i", status);
|
||||||
/* ft_printf("\t%s{eoc}\n", job->command); */
|
ft_printf("\t 'process command goes here'{eoc}\n");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,17 +12,18 @@
|
||||||
|
|
||||||
#include "job_control.h"
|
#include "job_control.h"
|
||||||
|
|
||||||
void job_remove(t_job *job)
|
void job_remove(int id)
|
||||||
{
|
{
|
||||||
t_jobc *jobc;
|
t_jobc *jobc;
|
||||||
|
|
||||||
jobc = &data_singleton()->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;
|
data_singleton()->jobc.current_id = id;
|
||||||
DG("ID_UPDATE(downgrade):%i", job->id);
|
DG("ID_UPDATE(downgrade):%i", id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
DG("ID_UPDATE(no downgrade): %i/%i", job->id, data_singleton()->jobc.current_id);
|
DG("ID_UPDATE(no downgrade): %i/%i", id, data_singleton()->jobc.current_id);
|
||||||
ft_lst_delif(&jobc->first_job, job, ft_addrcmp, job_free);
|
ft_lst_delif(&jobc->first_job, &id, job_cmp_id, job_free);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
/* ************************************************************************** */
|
|
||||||
/* */
|
|
||||||
/* ::: :::::::: */
|
|
||||||
/* job_shiftstatus.c :+: :+: :+: */
|
|
||||||
/* +:+ +:+ +:+ */
|
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
|
||||||
/* +#+#+#+#+#+ +#+ */
|
|
||||||
/* 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]);
|
|
||||||
}
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/12/12 12:41:11 by jhalford #+# #+# */
|
/* Created: 2016/12/12 12:41:11 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/01/02 18:16:10 by jhalford ### ########.fr */
|
/* Updated: 2017/01/02 19:11:34 by jhalford ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,17 +17,17 @@ int process_mark_status(pid_t pid, int status)
|
||||||
t_process *p;
|
t_process *p;
|
||||||
|
|
||||||
DG("marking: pid=%i, status=%i", pid, status);
|
DG("marking: pid=%i, status=%i", pid, status);
|
||||||
if (pid > 0)
|
if (pid > 1)
|
||||||
{
|
{
|
||||||
if ((p = job_getprocess(pid)))
|
if ((p = job_getprocess(pid)))
|
||||||
{
|
{
|
||||||
DG("found process pid=%i", pid);
|
DG("found process pid=%i", pid);
|
||||||
p->status = status;
|
p->status = status;
|
||||||
if (WIFSTOPPED(status))
|
if (WIFSTOPPED(status))
|
||||||
p->attributes &= PROCESS_STOPPED;
|
p->attributes |= PROCESS_STOPPED;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p->attributes &= PROCESS_COMPLETED;
|
p->attributes |= PROCESS_COMPLETED;
|
||||||
if (WIFSIGNALED(status))
|
if (WIFSIGNALED(status))
|
||||||
ft_printf("%d: Terminated by signal %d.\n",
|
ft_printf("%d: Terminated by signal %d.\n",
|
||||||
(int) pid, WTERMSIG(p->status));
|
(int) pid, WTERMSIG(p->status));
|
||||||
|
|
@ -37,8 +37,5 @@ int process_mark_status(pid_t pid, int status)
|
||||||
ft_dprintf(2, "No child process %d.\n", pid);
|
ft_dprintf(2, "No child process %d.\n", pid);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
else
|
return(-1);
|
||||||
{
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,12 @@ int put_job_in_foreground(t_job *job, int cont)
|
||||||
if (cont)
|
if (cont)
|
||||||
{
|
{
|
||||||
tcsetattr (STDIN_FILENO, TCSADRAIN, &job->tmodes);
|
tcsetattr (STDIN_FILENO, TCSADRAIN, &job->tmodes);
|
||||||
if (kill(- job->pgid, SIGCONT) < 0)
|
if (kill(-job->pgid, SIGCONT) < 0)
|
||||||
perror("kill (SIGCONT)");
|
perror("kill (SIGCONT)");
|
||||||
}
|
}
|
||||||
/* Wait for it to report. */
|
/* Wait for it to report. */
|
||||||
DG("gonna wait for job");
|
|
||||||
job_wait(job);
|
job_wait(job);
|
||||||
DG("gonna remove job");
|
job_remove(job->id);
|
||||||
job_remove(job);
|
|
||||||
|
|
||||||
/* Put the shell back in the foreground. */
|
/* Put the shell back in the foreground. */
|
||||||
tcsetpgrp(STDIN_FILENO, jobc->shell_pgid);
|
tcsetpgrp(STDIN_FILENO, jobc->shell_pgid);
|
||||||
|
|
|
||||||
|
|
@ -19,5 +19,7 @@ void sigchld_handler(int signo)
|
||||||
(void)signo;
|
(void)signo;
|
||||||
data = data_singleton();
|
data = data_singleton();
|
||||||
DG("got asynchronous notification (SIGCHLD)");
|
DG("got asynchronous notification (SIGCHLD)");
|
||||||
|
/* if (do_job_notification()) */
|
||||||
|
/* ft_putstr(SHELL_PROMPT); */
|
||||||
job_update_status();
|
job_update_status();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ int ft_interactive_sh(t_data *data)
|
||||||
|
|
||||||
if ((input_init(data)))
|
if ((input_init(data)))
|
||||||
return (-1);
|
return (-1);
|
||||||
|
DG("interactive_sh loop");
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
ft_bzero(buf, 4);
|
ft_bzero(buf, 4);
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,7 @@
|
||||||
|
|
||||||
int ft_prompt(void)
|
int ft_prompt(void)
|
||||||
{
|
{
|
||||||
t_data *data;
|
DG("do_job_notification() before prompt");
|
||||||
|
|
||||||
data = data_singleton();
|
|
||||||
do_job_notification();
|
do_job_notification();
|
||||||
DG("new prompt now");
|
DG("new prompt now");
|
||||||
ft_putstr(SHELL_PROMPT);
|
ft_putstr(SHELL_PROMPT);
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ int data_init(void)
|
||||||
data->exec.process.fdin = STDIN;
|
data->exec.process.fdin = STDIN;
|
||||||
data->exec.process.fdout = STDOUT;
|
data->exec.process.fdout = STDOUT;
|
||||||
data->exec.process.pid = 0;
|
data->exec.process.pid = 0;
|
||||||
|
data->exec.process.attributes = PROCESS_PIPESTART;
|
||||||
data->exec.aol_status = NULL;
|
data->exec.aol_status = NULL;
|
||||||
data->exec.aol_search = 0;
|
data->exec.aol_search = 0;
|
||||||
data->exec.job.id = 0;
|
data->exec.job.id = 0;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue