exec en cours

This commit is contained in:
wescande 2017-03-07 16:43:32 +01:00
parent 7195207116
commit 29aff9ebb7
12 changed files with 180 additions and 87 deletions

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */ /* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */
/* Updated: 2017/03/07 15:17:21 by wescande ### ########.fr */ /* Updated: 2017/03/07 16:21:44 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -52,6 +52,7 @@ struct s_data_cmd
char **av; char **av;
char *path; char *path;
t_execf *execf; t_execf *execf;
struct stat stat;
}; };
struct s_data_cond struct s_data_cond
@ -134,18 +135,19 @@ int exec_or_if(t_btree **ast);
int exec_and_if(t_btree **ast); int exec_and_if(t_btree **ast);
int exec_pipe(t_btree **ast); int exec_pipe(t_btree **ast);
/* int exec_redir(t_btree **ast); */ /* int exec_redir(t_btree **ast); */
int exec_cmd(t_btree **ast); //int exec_cmd(t_btree **ast);
int exec_leaf(t_btree **ast);
int exec_while(t_btree **ast); //int exec_while(t_btree **ast);
int exec_if(t_btree **ast); //int exec_if(t_btree **ast);
int exec_elif(t_btree **ast); //int exec_elif(t_btree **ast);
int exec_else(t_btree **ast); //int exec_else(t_btree **ast);
int exec_until(t_btree **ast); //int exec_until(t_btree **ast);
int exec_default(t_btree **ast); //int exec_default(t_btree **ast);
int exec_var(t_btree **ast); int exec_var(t_btree **ast);
int exec_for(t_btree **ast); //int exec_for(t_btree **ast);
int exec_case(t_btree **ast); //int exec_case(t_btree **ast);
int exec_case_branch(t_btree **ast); //int exec_case_branch(t_btree **ast);
int exec_math(t_btree **ast); int exec_math(t_btree **ast);
int launch_process(t_process *p); int launch_process(t_process *p);
@ -180,4 +182,10 @@ int add_new_job(t_job *job);
int error_badidentifier(char *name); int error_badidentifier(char *name);
/*
** Mapping pour set les process
*/
int set_process_map(t_process *p, t_btree *ast, t_cmd *cmd);
int set_process_cmd(t_process *p, t_btree *ast, t_cmd *cmd);
#endif #endif

@ -1 +1 @@
Subproject commit bc489f8664fdc24317c31b3069811f54b1178643 Subproject commit 4a36b1a5e650ada2f66034d13312367694a6481a

View file

@ -6,35 +6,12 @@
/* 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/03/07 15:17:47 by wescande ### ########.fr */ /* Updated: 2017/03/07 16:22:44 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "exec.h" #include "exec.h"
/*
char **token_to_argv(t_ld *ld, int do_match)
{
char **my_tab;
int index;
char **expand;
char **content;
my_tab = NULL;
while (ld)
{
content = ld->content;
if ((expand = glob(content[0], (unsigned char *)content[1], (unsigned char *)content[2], do_match)))
{
index = -1;
while (expand[++index])
my_tab = ft_sstradd(my_tab, expand[index]);
ft_tabdel(&expand);
}
ld = ld->next;
}
return (my_tab);
}
int exec_cmd(t_btree **ast) int exec_cmd(t_btree **ast)
{ {
t_process p; t_process p;
@ -58,4 +35,4 @@ int exec_cmd(t_btree **ast)
if (p.fdout != STDOUT) if (p.fdout != STDOUT)
close(p.fdout); close(p.fdout);
return (0); return (0);
} }*/

38
42sh/src/exec/exec_leaf.c Normal file
View file

@ -0,0 +1,38 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* exec_leaf.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 15:47:30 by wescande #+# #+# */
/* Updated: 2017/03/07 15:50:04 by wescande ### ########.fr */
/* */
/* ************************************************************************** */
#include "exec.h"
int exec_leaf(t_btree **ast)
{
t_process p;
t_job *job;
job = &data_singleton()->exec.job;
if (set_process(&p, *ast))
return (1);
if (!(launch_process(&p)))
{
job_addprocess(&p);
if (IS_PIPEEND(p))
{
if (JOB_IS_FG(job->attrs))
put_job_in_foreground(job, 0);
else
put_job_in_background(job, 0);
}
job->pgid = 0;
}
if (p.fdout != STDOUT)
close(p.fdout);
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */ /* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 10:58:49 by ariard #+# #+# */ /* Created: 2017/03/07 10:58:49 by ariard #+# #+# */
/* Updated: 2017/03/07 13:42:11 by ariard ### ########.fr */ /* Updated: 2017/03/07 16:00:24 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -45,7 +45,7 @@ static int do_math(char **value, char *operator)
ope2 = ft_atoi(&operator[2]); ope2 = ft_atoi(&operator[2]);
else else
ope2 = 0; ope2 = 0;
if (operator[0] == '/' && ope2 == 0) if ((operator[0] == '/' || operator[0] == '%') && ope2 == 0)
ope1 = 0; ope1 = 0;
else else
{ {

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */ /* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/30 17:33:53 by ariard #+# #+# */ /* Created: 2017/01/30 17:33:53 by ariard #+# #+# */
/* Updated: 2017/03/07 14:33:10 by wescande ### ########.fr */ /* Updated: 2017/03/07 16:41:50 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -14,16 +14,44 @@
int exec_while(t_btree **ast) int exec_while(t_btree **ast)
{ {
int ret;
DG("exec while condition"); DG("exec while condition");
ft_exec(&(*ast)->left); ft_exec(&(*ast)->left);
DG("ret :[%s]", ft_getenv(data_singleton()->env, "?")); DG("ret :[%s]", ft_getenv(data_singleton()->env, "?"));
++data_singleton()->exec.control_count;
while (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0"))) while (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0")))
{ {
DG("in the while"); DG("in the while");
ft_exec(&(*ast)->right); ft_exec(&(*ast)->right);
ret = ft_atoi(ft_getenv(data_singleton()->env, "?"));
ft_exec(&(*ast)->left); ft_exec(&(*ast)->left);
} }
--data_singleton()->exec.control_count; exit(ret);
return (0); return (0);
} }
static int do_while(t_process *p)
{
int ret;
return (ret);
}
int launch_while(t_process *p)
{
pid_t pid;
if (SH_IS_INTERACTIVE(data_singleton()->opts))
{
pid = fork();
if (pid == 0)
exit(do_while(p));
else if (pid > 0)
{
p->pid = pid;
process_setgroup(p, pid);
return (0);
}
}
else
do_while(p);
return (1);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */ /* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */
/* Updated: 2017/03/07 15:18:27 by wescande ### ########.fr */ /* Updated: 2017/03/07 16:20:18 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -20,18 +20,18 @@ t_itof g_execmap[] =
{TK_AND_IF, &exec_and_if}, {TK_AND_IF, &exec_and_if},
{TK_OR_IF, &exec_or_if}, {TK_OR_IF, &exec_or_if},
{TK_PIPE, &exec_pipe}, {TK_PIPE, &exec_pipe},
{TK_WHILE, &exec_while}, {TK_WHILE, &exec_leaf},
{TK_IF, &exec_if}, {TK_IF, &exec_leaf},
{TK_ELIF, &exec_elif}, {TK_ELIF, &exec_leaf},
{TK_ELSE, &exec_else}, {TK_ELSE, &exec_leaf},
{TK_UNTIL, &exec_until}, {TK_UNTIL, &exec_leaf},
{TK_FOR, &exec_for}, {TK_FOR, &exec_leaf},
{TK_CASE, &exec_case}, {TK_CASE, &exec_leaf},
{TK_PAREN_OPEN, &exec_case_branch}, {TK_PAREN_OPEN, &exec_case_branch},
{TK_ASSIGNEMENT_WORD, &exec_var}, {TK_ASSIGNEMENT_WORD, &exec_var},
{MATH, &exec_math}, {MATH, &exec_math},
/* {TK_SUBSHELL, &exec_}, */ /* {TK_SUBSHELL, &exec_}, */
{CMD, &exec_cmd}, {CMD, &exec_leaf},
{0, 0}, {0, 0},
}; };
@ -44,9 +44,9 @@ int ft_exec(t_btree **ast)
if (!*ast) if (!*ast)
return (0); return (0);
item = (*ast)->item; item = (*ast)->item;
while (g_execmap[i].type) while (g_execmap[i].id)
{ {
if (item->type == g_execmap[i].type) if (item->type == g_execmap[i].id)
return ((*g_execmap[i].f)(ast)); return ((*g_execmap[i].f)(ast));
i++; i++;
} }

View file

@ -6,10 +6,12 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 14:53:31 by jhalford #+# #+# */ /* Created: 2017/03/07 14:53:31 by jhalford #+# #+# */
/* Updated: 2017/03/07 14:54:18 by jhalford ### ########.fr */ /* Updated: 2017/03/07 15:53:45 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "exec.h"
int launch_file(t_process *p) int launch_file(t_process *p)
{ {
int pid; int pid;
@ -18,15 +20,15 @@ int launch_file(t_process *p)
{ {
if (process_redirect(p)) if (process_redirect(p))
return (1); return (1);
set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env), 1); set_exitstatus((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env), 1);
return (1); return (1);
} }
p->attrs &= ~PROCESS_STATE_MASK; p->attrs &= ~PROCESS_STATE_MASK;
p->attrs |= PROCESS_RUNNING; p->attrs |= PROCESS_RUNNING;
if (p->attrs & (PROCESS_BINARY | PROCESS_SCRIPT) if (p->attrs & (PROCESS_BINARY | PROCESS_SCRIPT)
&& access(p->path, X_OK) == -1) && access(p->data.cmd.path, X_OK) == -1)
{ {
ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->av[0]); ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
set_exitstatus(126, 1); set_exitstatus(126, 1);
return (1); return (1);
} }
@ -35,7 +37,7 @@ int launch_file(t_process *p)
{ {
if (p->attrs & PROCESS_UNKNOWN) if (p->attrs & PROCESS_UNKNOWN)
{ {
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->data.cmd.av[0]);
exit(127); exit(127);
} }
process_setgroup(p, 0); process_setgroup(p, 0);
@ -43,9 +45,9 @@ int launch_file(t_process *p)
if (process_redirect(p)) if (process_redirect(p))
exit (1); exit (1);
if (p->attrs & PROCESS_BUILTIN) if (p->attrs & PROCESS_BUILTIN)
exit((*p->execf)(p->path, p->av, data_singleton()->env)); exit((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env));
(*p->execf)(p->path, p->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->av[0]); ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
} }
else if (pid > 0) else if (pid > 0)
{ {

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */ /* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */ /* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */
/* Updated: 2017/03/07 15:19:05 by wescande ### ########.fr */ /* Updated: 2017/03/07 15:42:49 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -22,6 +22,7 @@ t_itof g_launchmap[] =
{PROCESS_IF, NULL}, {PROCESS_IF, NULL},
{PROCESS_FOR, NULL}, {PROCESS_FOR, NULL},
{PROCESS_CASE, NULL}, {PROCESS_CASE, NULL},
{0, NULL}
}; };
int launch_process(t_process *p) int launch_process(t_process *p)
@ -29,9 +30,9 @@ int launch_process(t_process *p)
int i; int i;
i = 0; i = 0;
while (g_launchmap[i].type) while (g_launchmap[i].id)
{ {
if (p->type == g_launchmap[i].type) if (p->type == g_launchmap[i].id)
if (!g_launchmap[i].f) if (!g_launchmap[i].f)
return (-1); return (-1);
return ((*g_launchmap[i].f)(p)); return ((*g_launchmap[i].f)(p));

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 15:06:05 by wescande #+# #+# */ /* Created: 2017/03/07 15:06:05 by wescande #+# #+# */
/* Updated: 2017/03/07 15:07:39 by wescande ### ########.fr */ /* Updated: 2017/03/07 15:50:51 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,32 +6,33 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 15:08:12 by wescande #+# #+# */ /* Created: 2017/03/07 15:08:12 by wescande #+# #+# */
/* Updated: 2017/03/07 15:11:17 by wescande ### ########.fr */ /* Updated: 2017/03/07 15:50:56 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "exec.h" #include "exec.h"
t_setprocessmap g_setprocessmap[] = t_itof g_setprocessmap[] =
{ {
{TK_NEWLINE, &exec_semi}, {TK_NEWLINE, NULL},
{TK_SEMI, &exec_semi}, {TK_SEMI, NULL},
{TK_AMP, &exec_ampersand}, {TK_AMP, NULL},
{TK_AND_IF, &exec_and_if}, {TK_AND_IF, NULL},
{TK_OR_IF, &exec_or_if}, {TK_OR_IF,NULL},
{TK_PIPE, &exec_pipe}, {TK_PIPE, NULL},
{TK_WHILE, &exec_while}, {TK_WHILE, NULL},
{TK_IF, &exec_if}, {TK_IF, NULL},
{TK_ELIF, &exec_elif}, {TK_ELIF, NULL},
{TK_ELSE, &exec_else}, {TK_ELSE, NULL},
{TK_UNTIL, &exec_until}, {TK_UNTIL, NULL},
{TK_FOR, &exec_for}, {TK_FOR, NULL},
{TK_CASE, &exec_case}, {TK_CASE, NULL},
{TK_PAREN_OPEN, &exec_case_branch}, {TK_PAREN_OPEN, NULL},
{TK_ASSIGNEMENT_WORD, &exec_var}, {TK_ASSIGNEMENT_WORD, NULL},
{MATH, NULL},
/* {TK_SUBSHELL, &exec_}, */ /* {TK_SUBSHELL, &exec_}, */
{CMD, &exec_cmd}, {CMD, &set_process_cmd},
{0, 0}, {0, NULL}
}; };
int set_process_map(t_process *p, t_btree *ast, t_cmd *cmd) int set_process_map(t_process *p, t_btree *ast, t_cmd *cmd)
@ -41,9 +42,9 @@ int set_process_map(t_process *p, t_btree *ast, t_cmd *cmd)
i = 0; i = 0;
if (!ast) if (!ast)
return (0); return (0);
while (g_execmap[i].type) while (g_setprocessmap[i].id)
{ {
if (p->type == g_setprocessmap[i].type) if (p->type == g_setprocessmap[i].id)
return ((*g_setprocessmap[i].f)(p, ast, cmd)); return ((*g_setprocessmap[i].f)(p, ast, cmd));
i++; i++;
} }

View file

@ -0,0 +1,38 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* token_to_argv.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 15:55:53 by wescande #+# #+# */
/* Updated: 2017/03/07 15:56:25 by wescande ### ########.fr */
/* */
/* ************************************************************************** */
#include "exec.h"
char **token_to_argv(t_ld *ld, int do_match)
{
char **my_tab;
int index;
char **expand;
char **content;
my_tab = NULL;
while (ld)
{
content = ld->content;
if ((expand = glob(content[0],
(unsigned char *)content[1],
(unsigned char *)content[2], do_match)))
{
index = -1;
while (expand[++index])
my_tab = ft_sstradd(my_tab, expand[index]);
ft_tabdel(&expand);
}
ld = ld->next;
}
return (my_tab);
}