42-archive/42sh/src/exec/set_process.c
2017-03-07 15:35:36 +01:00

47 lines
1.7 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* set_process.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/05 14:54:45 by jhalford #+# #+# */
/* Updated: 2017/03/07 15:34:31 by wescande ### ########.fr */
/* */
/* ************************************************************************** */
#include "exec.h"
int set_process(t_process *p, t_btree *ast)
{
t_exec *exec;
t_cmd *cmd;
int op;
int fds[2];
cmd = &((t_astnode *)ast->item)->data.cmd;
process_reset(p);
exec = &data_singleton()->exec;
op = pop(&exec->op_stack);
if ((EXEC_IS_AND_IF(exec->attrs)
&& ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") != 0)
|| (EXEC_IS_OR_IF(exec->attrs)
&& ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") == 0))
return (1);
fds[PIPE_WRITE] = STDOUT;
fds[PIPE_READ] = STDIN;
if (op == TK_AMP)
exec->attrs |= JOB_BG;
else if (op == TK_PIPE)
pipe(fds);
p->fdin = exec->fdin;
p->to_close = fds[PIPE_READ];
p->fdout = fds[PIPE_WRITE];
exec->fdin = fds[PIPE_READ];
p->redirs = ft_lstmap(cmd->redir, ft_id);
if (set_process_map(p, ast, cmd))
return (1);
if (exec->control_count)
p->attrs |= PROCESS_CONTROL;
return (0);
}