recup merge + modif

This commit is contained in:
wescande 2017-03-07 16:56:20 +01:00
commit 48dc3d7c70
16 changed files with 131 additions and 71 deletions

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */
/* Updated: 2017/03/07 16:21:44 by wescande ### ########.fr */
/* Updated: 2017/03/07 16:55:12 by wescande ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */
/* Updated: 2017/03/07 16:22:44 by wescande ### ########.fr */
/* Updated: 2017/03/07 16:43:48 by wescande ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -0,0 +1,40 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* launch_builtin.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 15:48:24 by jhalford #+# #+# */
/* Updated: 2017/03/07 16:51:58 by wescande ### ########.fr */
/* */
/* ************************************************************************** */
#include "exec.h"
int launch_builtin(t_process *p)
{
pid_t pid;
if (IS_PIPESINGLE(*p))
{
if (process_redirect(p))
return (0);
set_exitstatus((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env), 1);
return (0);
}
pid = fork();
if (pid == 0)
{
process_setgroup(p, 0);
process_setsig();
if (process_redirect(p))
exit (1);
exit((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env));
}
else if (pid > 0)
return (pid);
else if (pid == -1)
ft_dprintf(2, "{red}%s: internal fork error{eoc}\n", SHELL_NAME);
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 14:53:31 by jhalford #+# #+# */
/* Updated: 2017/03/07 15:53:45 by wescande ### ########.fr */
/* Updated: 2017/03/07 16:49:31 by wescande ### ########.fr */
/* */
/* ************************************************************************** */
@ -16,46 +16,34 @@ int launch_file(t_process *p)
{
int pid;
if (p->attrs & PROCESS_BUILTIN && IS_PIPESINGLE(*p))
{
if (process_redirect(p))
return (1);
set_exitstatus((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env), 1);
return (1);
}
p->attrs &= ~PROCESS_STATE_MASK;
p->attrs |= PROCESS_RUNNING;
if (p->attrs & (PROCESS_BINARY | PROCESS_SCRIPT)
&& access(p->data.cmd.path, X_OK) == -1)
{
ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
set_exitstatus(126, 1);
return (1);
}
pid = fork();
if (pid == 0)
{
if (p->attrs & PROCESS_UNKNOWN)
if (!p->data.cmd.path)
{
ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
exit(127);
}
else if (S_ISDIR(p->data.cmd.stat.st_mode))
{
ft_dprintf(2, "{red}%s: %s: Is a directory{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
exit(126);
}
else if (access(p->data.cmd.path, X_OK) == -1)
{
ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
exit(126);
}
process_setgroup(p, 0);
process_setsig();
if (process_redirect(p))
exit (1);
if (p->attrs & PROCESS_BUILTIN)
exit((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env));
(*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env);
ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
}
else if (pid > 0)
{
p->pid = pid;
process_setgroup(p, pid);
return (0);
}
return (pid);
else if (pid == -1)
ft_dprintf(2, "{red}%s: internal fork error{eoc}\n", SHELL_NAME);
return (1);
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */
/* Updated: 2017/03/07 15:42:49 by wescande ### ########.fr */
/* Updated: 2017/03/07 16:49:10 by wescande ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,7 +15,7 @@
t_itof g_launchmap[] =
{
{PROCESS_FUNCTION, NULL},
{PROCESS_BUILTIN, NULL},
{PROCESS_BUILTIN, launch_builtin},
{PROCESS_FILE, launch_file},
{PROCESS_SUBSHELL, NULL},
{PROCESS_WHILE, NULL},
@ -28,14 +28,24 @@ t_itof g_launchmap[] =
int launch_process(t_process *p)
{
int i;
int pid;
i = 0;
while (g_launchmap[i].id)
{
if (p->type == g_launchmap[i].id)
{
if (!g_launchmap[i].f)
return (-1);
return ((*g_launchmap[i].f)(p));
p->attrs &= ~PROCESS_STATE_MASK;
p->attrs |= PROCESS_RUNNING;
if ((pid = (*g_launchmap[i].f)(p)))
{
p->pid = pid;
process_setgroup(p, pid);
return (0);
}
}
i++;
}
return (-1);

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/13 17:07:10 by jhalford #+# #+# */
/* Updated: 2017/03/07 15:34:12 by wescande ### ########.fr */
/* Updated: 2017/03/07 16:54:13 by wescande ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,26 +15,26 @@
int process_setexec(t_process *p)
{
p->data.cmd.path = NULL;
p->data.cmd.execf = NULL;
/* if ((p->execf = is_function(p))) */
/* p->type = PROCESS_FUNCTION; */
if ((p->data.cmd.execf = is_builtin(p)))
p->type = PROCESS_BUILTIN;
else if (ft_hash(p))
{
p->data.cmd.execf = &execve;
p->type = PROCESS_FILE;
}
else if (ft_strchr(p->data.cmd.av[0], '/'))
{
p->data.cmd.execf = &execve;
p->type = PROCESS_FILE;
p->data.cmd.execf = &execve;
p->data.cmd.path = ft_strdup(p->data.cmd.av[0]);
stat(p->data.cmd.path, &p->data.cmd.stat);
}
else
{
p->data.cmd.execf = NULL;
// p->attrs |= PROCESS_UNKNOWN;
return (1);
p->type = PROCESS_FILE;
if (ft_hash(p))
{
p->data.cmd.execf = &execve;
stat(p->data.cmd.path, &p->data.cmd.stat);
}
}
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/18 11:20:11 by gwojda #+# #+# */
/* Updated: 2017/03/07 15:34:57 by wescande ### ########.fr */
/* Updated: 2017/03/07 16:56:04 by wescande ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: gwojda <gwojda@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/18 11:06:19 by gwojda #+# #+# */
/* Updated: 2017/03/04 18:50:56 by ariard ### ########.fr */
/* Updated: 2017/03/07 16:02:41 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 19:26:32 by jhalford #+# #+# */
/* Updated: 2017/03/03 19:45:05 by jhalford ### ########.fr */
/* Updated: 2017/03/07 16:38:43 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,14 +23,6 @@ int data_init(void)
data->env = ft_sstrdup(environ);
data->comp = NULL;
data->opts = 0;
/* data->exec.process.path = NULL; */
/* data->exec.process.av = NULL; */
/* data->exec.process.to_close = 0; */
/* data->exec.process.fdin = STDIN; */
/* data->exec.process.fdout = STDOUT; */
/* data->exec.process.pid = 0; */
/* data->exec.process.attributes = 0; */
/* data->exec.process.redirs = NULL; */
data->exec.fd_save[0] = fcntl(0, F_DUPFD_CLOEXEC);
data->exec.fd_save[1] = fcntl(1, F_DUPFD_CLOEXEC);
data->exec.fd_save[2] = fcntl(2, F_DUPFD_CLOEXEC);
@ -38,12 +30,10 @@ int data_init(void)
data->exec.fdin = STDIN;
data->exec.attrs = 0;
/* data->exec.aol_status = NULL; */
/* data->exec.aol_search = 0; */
/* data->exec.job.id = 0; */
/* data->exec.job.pgid = 0; */
/* data->exec.job.attributes = 0; */
/* data->exec.job.first_process = 0; */
data->exec.job.id = 0;
data->exec.job.pgid = 0;
data->exec.job.attrs = 0;
data->exec.job.first_process = NULL;
data->jobc.first_job = NULL;
data->jobc.current_id = 1;

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */
/* Updated: 2017/03/07 15:09:53 by jhalford ### ########.fr */
/* Updated: 2017/03/07 16:41:02 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -52,6 +52,7 @@ int handle_instruction(int fd)
token_print(token);
if (insert_newline(&token))
return (1);
DG("exit newline");
if (ft_parse(&ast, &token, &parser))
continue ;
if (parser.state == SUCCESS)

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/12 17:23:59 by jhalford #+# #+# */
/* Updated: 2017/03/03 19:45:52 by jhalford ### ########.fr */
/* Updated: 2017/03/07 16:38:13 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -99,7 +99,7 @@ t_aggrematch g_aggrematch[] =
{NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0},
{NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK},
{NEWLINE_LIST, FOR_WORDLIST, SEQUENTIAL_SEP, 0},
{SEQUENTIAL_SEP, FOR_WORDLIST, SEQUENTIAL_SEP, FOR_WORDLIST},
//to check
{FILENAME, TK_LESS, IO_FILE, TK_LESS},
{FILENAME, TK_LESSAND, IO_FILE, TK_LESSAND},
@ -322,6 +322,8 @@ int aggregate_sym(t_list **stack, t_sym *new_sym, t_parstate *state)
t_sym *head;
int i;
if (!*stack || !*new_sym || !*state)
return (1);
i = 0;
head = (*stack)->content;
DG("aggregate head %s && sym %s",
@ -336,13 +338,15 @@ int aggregate_sym(t_list **stack, t_sym *new_sym, t_parstate *state)
*new_sym = g_aggrematch[i].new_sym;
if (g_aggrematch[i].erase_sym)
{
if (pop_stack(stack, g_aggrematch[i].erase_sym))
return (1);
pop_stack(stack, g_aggrematch[i].erase_sym);
head = (*stack)->content;
DG("stack after pop: %s", read_state(*head));
}
if (eval_sym(stack, *new_sym))
return ((*state = ERROR));
{
*state = ERROR;
return (1);
}
aggregate_sym(stack, new_sym, state);
return (0);
}

View file

@ -343,7 +343,6 @@ t_stackmatch g_stackmatch[] =
{TK_LBRACE, CASE_LIST_NS},
{TK_LBRACE, COMPLETE_CONDITION},
{TK_LBRACE, TK_IN},
{SEQUENTIAL_SEP, NAME},
{TK_RBRACE, TK_SEMI},
{TK_RBRACE, END_COMMAND},
{TK_RBRACE, SEPARATOR_OP},
@ -412,6 +411,7 @@ t_stackmatch g_stackmatch[] =
{SEQUENTIAL_SEP, NAME},
{SEQUENTIAL_SEP, IN},
{SEQUENTIAL_SEP, WORDLIST},
{SEQUENTIAL_SEP, FOR_WORDLIST},
{END_COMMAND, SEQUENCE},
{END_COMMAND, PIPE_SEMI_SEQUENCE},
{END_COMMAND, AND_OR_MAJOR},
@ -810,6 +810,7 @@ t_stackmatch g_stackmatch[] =
{PATTERN, CASE_LIST},
{PATTERN, TK_IN},
{CASE_LIST_NS, LINEBREAK},
{CASE_LIST_NS, TK_IN},
{CASE_CLAUSE, LINEBREAK},
{CASE_CLAUSE, TK_PAREN_OPEN},
{CASE_CLAUSE, TK_LBRACE},
@ -987,6 +988,26 @@ t_stackmatch g_stackmatch[] =
{PIPE_SEMI_SEQUENCE, NEWLINE_LIST},
{PIPE_SEMI_SEQUENCE, AND_OR_MAJOR},
{SEQUENCE, PIPE_SEMI_SEQUENCE},
{SEQUENCE, TK_WHILE},
{SEQUENCE, TK_UNTIL},
{SEQUENCE, TK_DO},
{SEQUENCE, TK_PAREN_CLOSE},
{SEQUENCE, TK_IF},
{SEQUENCE, TK_ELIF},
{SEQUENCE, TK_THEN},
{SEQUENCE, TK_ELSE},
{SEQUENCE, COMPOUND_LIST},
{SEQUENCE, CASE_LIST_NS},
{SEQUENCE, COMPLETE_CONDITION},
{SEQUENCE, LINEBREAK},
{SEQUENCE, TK_PAREN_OPEN},
{SEQUENCE, TK_LBRACE},
{SEQUENCE, COMPLETE_COMMANDS},
{SEQUENCE, TK_BANG},
{SEQUENCE, TK_BANG},
{SEQUENCE, SEPARATOR_OP},
{SEQUENCE, NEWLINE_LIST},
{SEQUENCE, AND_OR_MAJOR},
{SEQUENCE, SEQUENCE},
{PIPELINE, TK_WHILE},
{PIPELINE, TK_UNTIL},
@ -1038,6 +1059,7 @@ t_stackmatch g_stackmatch[] =
{COMPLETE_COMMAND, COMPLETE_COMMANDS},
{COMPLETE_COMMAND, NEWLINE_LIST},
{COMPLETE_COMMANDS, COMPLETE_COMMANDS},
{PROGRAM, TERMINUS},
{0, 0},
};
@ -1046,6 +1068,8 @@ int eval_sym(t_list **stack, t_sym new_sym)
t_sym *head;
int i;
if (!*stack)
return (1);
head = (*stack)->content;
DG("eval head %s && sym %s", read_state(*head), read_state(new_sym));
i = 0;

View file

@ -43,7 +43,7 @@ int ft_parse(t_btree **ast, t_list **token, t_parser *parser)
else
{
if (aggregate_sym(&parser->stack, parser->new_sym, &parser->state))
return (1);
return (0);
push_stack(&parser->stack, *parser->new_sym);
}
// ft_read_stack(parser->stack);

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/09 19:12:44 by ariard #+# #+# */
/* Updated: 2017/03/06 17:09:00 by ariard ### ########.fr */
/* Updated: 2017/03/07 15:09:32 by ariard ### ########.fr */
/* */
/* ************************************************************************** */
@ -17,13 +17,14 @@ int pop_stack(t_list **stack, t_sym erase_sym)
t_sym *head;
t_list *temp;
while ((*stack) && *(head = (*stack)->content) != erase_sym)
while ((*stack) && (*(head = (*stack)->content) != erase_sym
&& *head != TERMINUS))
{
temp = *stack;
temp = *stack;
(*stack) = (*stack)->next;
ft_lstdelone(&temp, NULL);
}
if (*stack)
if ((*stack) && *(head = (*stack)->content) != TERMINUS)
{
temp = *stack;
(*stack) = (*stack)->next;

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/09 17:58:34 by ariard #+# #+# */
/* Updated: 2017/03/07 15:09:59 by jhalford ### ########.fr */
/* Updated: 2017/03/07 15:53:23 by ariard ### ########.fr */
/* */
/* ************************************************************************** */
@ -108,6 +108,8 @@ int produce_sym(t_list **stack, t_sym *new_sym, t_list **lst)
t_sym *head;
int i;
if (!*stack || !*lst)
return (1);
token = (*lst)->content;
head = (*stack)->content;
DG("produce stack : %s && token : %s", read_state(*head),