diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 81b783cb..7c9c54a8 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */ -/* Updated: 2017/03/06 16:56:35 by jhalford ### ########.fr */ +/* Updated: 2017/03/07 15:04:40 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,19 +16,12 @@ # define PIPE_READ 0 # define PIPE_WRITE 1 -# define PROCESS_BUILTIN (1 << 0) -# define PROCESS_BINARY (1 << 1) -# define PROCESS_SCRIPT (1 << 2) -# define PROCESS_SUBSHELL (1 << 3) -# define PROCESS_UNKNOWN (1 << 4) -# define PROCESS_CONTROL (1 << 5) -# define PROCESS_COMPLETED (1 << 6) -# define PROCESS_SUSPENDED (1 << 7) -# define PROCESS_RUNNING (1 << 8) -# define PROCESS_CONTINUED (1 << 9) +# define PROCESS_COMPLETED (1 << 0) +# define PROCESS_SUSPENDED (1 << 1) +# define PROCESS_RUNNING (1 << 2) +# define PROCESS_CONTINUED (1 << 3) -# define PROCESS_TYPE_MASK (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5) -# define PROCESS_STATE_MASK (1 << 6 | 1 << 7 | 1 << 8 | 1 << 9) +# define PROCESS_STATE_MASK ((1 << 4) - (1 << 0)) # define IS_PIPESTART(p) ((p).fdin == STDIN) # define IS_PIPEEND(p) ((p).fdout == STDOUT) @@ -39,12 +32,13 @@ # define EXEC_OR_IF (1 << 3) # define EXEC_IF_BRANCH (1 << 4) # define EXEC_CASE_BRANCH (1 << 5) + +# define EXEC_AOL_MASK (EXEC_AND_IF | EXEC_OR_IF) + # define EXEC_IS_BG(j) (j & EXEC_BG) # define EXEC_IS_FG(j) (!EXEC_IS_BG(j)) # define EXEC_IS_AND_IF(j) (j & EXEC_AND_IF) # define EXEC_IS_OR_IF(j) (j & EXEC_OR_IF) -# define EXEC_AOL_MASK (EXEC_AND_IF | EXEC_OR_IF) - # define EXEC_IS_IF_BRANCH(j) (j & EXEC_IF_BRANCH) # define EXEC_IS_CASE_BRANCH(j) (j & EXEC_CASE_BRANCH) @@ -52,18 +46,34 @@ # include "types.h" # include "job_control.h" +enum e_process_type +{ + PROCESS_FUNCTION, + PROCESS_BUILTIN, + PROCESS_FILE, + PROCESS_SUBSHELL, + PROCESS_WHILE, + PROCESS_IF, + PROCESS_FOR, + PROCESS_CASE, +}; + +typedef enum e_process_type t_process_type; + struct s_process { - char **av; - char *path; - t_execf *execf; - pid_t pid; - int fdin; - int fdout; - int to_close; - t_list *redirs; - int status; - t_flag attrs; + /* char **av; */ + /* char *path; */ + /* t_execf *execf; */ + t_process_type type; + t_process_data data; + pid_t pid; + int fdin; + int fdout; + int to_close; + t_list *redirs; + int status; + t_flag attrs; }; struct s_exec @@ -77,22 +87,11 @@ struct s_exec int control_count; }; -struct s_execmap -{ - t_type type; - int (*f)(t_btree **ast); -}; - -struct s_redirmap -{ - t_flag type; - int (*f)(t_redir *redir); -}; - #include "minishell.h" -extern t_execmap g_execmap[]; -extern t_redirmap g_redirmap[]; +extern t_itof g_execmap[]; +extern t_itof g_redirmap[]; +extern t_itof g_launchmap[]; int ft_exec(t_btree **ast); diff --git a/42sh/includes/minishell.h b/42sh/includes/minishell.h index 59e15890..7fab094a 100644 --- a/42sh/includes/minishell.h +++ b/42sh/includes/minishell.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 13:07:44 by jhalford #+# #+# */ -/* Updated: 2017/03/04 16:46:52 by ariard ### ########.fr */ +/* Updated: 2017/03/07 14:27:40 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/includes/types.h b/42sh/includes/types.h index 68f377fc..237c8902 100644 --- a/42sh/includes/types.h +++ b/42sh/includes/types.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:11:48 by jhalford #+# #+# */ -/* Updated: 2017/03/06 15:31:28 by ariard ### ########.fr */ +/* Updated: 2017/03/07 14:35:52 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/builtin/is_builtin.c b/42sh/src/builtin/is_builtin.c index c0f39c2f..5a9577f8 100644 --- a/42sh/src/builtin/is_builtin.c +++ b/42sh/src/builtin/is_builtin.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 13:09:57 by jhalford #+# #+# */ -/* Updated: 2017/03/02 21:00:13 by jhalford ### ########.fr */ +/* Updated: 2017/03/07 14:43:50 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,7 +37,7 @@ t_execf *is_builtin(t_process *p) i = -1; while (g_builtin[++i].name) { - if (ft_strcmp(g_builtin[i].name, p->av[0]) == 0) + if (ft_strcmp(g_builtin[i].name, p->data.cmd.av[0]) == 0) return (g_builtin[i].f); } return (NULL); diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index fdf22068..53bf4591 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */ -/* Updated: 2017/03/06 15:03:36 by ariard ### ########.fr */ +/* Updated: 2017/03/07 15:04:00 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/ft_exec.c b/42sh/src/exec/ft_exec.c index a56782fa..fe167aa0 100644 --- a/42sh/src/exec/ft_exec.c +++ b/42sh/src/exec/ft_exec.c @@ -6,13 +6,13 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */ -/* Updated: 2017/03/06 15:01:32 by ariard ### ########.fr */ +/* Updated: 2017/03/07 14:54:28 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "exec.h" -t_execmap g_execmap[] = +t_itof g_execmap[] = { {TK_NEWLINE, &exec_semi}, {TK_SEMI, &exec_semi}, diff --git a/42sh/src/exec/launch_file.c b/42sh/src/exec/launch_file.c new file mode 100644 index 00000000..c482d419 --- /dev/null +++ b/42sh/src/exec/launch_file.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_file.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 14:53:31 by jhalford #+# #+# */ +/* Updated: 2017/03/07 14:54:18 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +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->execf)(p->path, p->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->path, X_OK) == -1) + { + ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->av[0]); + set_exitstatus(126, 1); + return (1); + } + pid = fork(); + if (pid == 0) + { + if (p->attrs & PROCESS_UNKNOWN) + { + ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]); + exit(127); + } + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + if (p->attrs & PROCESS_BUILTIN) + exit((*p->execf)(p->path, p->av, data_singleton()->env)); + (*p->execf)(p->path, p->av, data_singleton()->env); + ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->av[0]); + } + else if (pid > 0) + { + p->pid = pid; + process_setgroup(p, pid); + return (0); + } + else if (pid == -1) + ft_dprintf(2, "{red}%s: internal fork error{eoc}\n", SHELL_NAME); + return (1); +} diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index c1029d29..ebf4c0eb 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -6,59 +6,39 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */ -/* Updated: 2017/03/06 16:20:54 by wescande ### ########.fr */ +/* Updated: 2017/03/07 15:04:44 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +t_itof g_launchmap[] = +{ + {PROCESS_FUNCTION, NULL}, + {PROCESS_BUILTIN, NULL}, + {PROCESS_FILE, launch_file}, + {PROCESS_SUBSHELL, NULL}, + {PROCESS_WHILE, NULL}, + {PROCESS_IF, NULL}, + {PROCESS_FOR, NULL}, + {PROCESS_CASE, NULL}, +}; + int launch_process(t_process *p) { - int pid; + int i; + i = 0; /* DG("gonna launch [%s]", p->av[0]); */ /* DG("fdin=[%i]", p->fdin); */ /* DG("fdout=[%i]", p->fdout); */ - if (p->attrs & PROCESS_BUILTIN && IS_PIPESINGLE(*p)) + while (g_launchmap[i].type) { - if (process_redirect(p)) - return (1); - set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env), 1); - return (1); + if (p->type == g_launchmap[i].type) + if (!g_launchmap[i].f) + return (-1); + return ((*g_launchmap[i].f)(p)); + i++; } - p->attrs &= ~PROCESS_STATE_MASK; - p->attrs |= PROCESS_RUNNING; - if (p->attrs & (PROCESS_BINARY | PROCESS_SCRIPT) - && access(p->path, X_OK) == -1) - { - ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->av[0]); - set_exitstatus(126, 1); - return (1); - } - pid = fork(); - if (pid == 0) - { - if (p->attrs & PROCESS_UNKNOWN) - { - ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]); - exit(127); - } - process_setgroup(p, 0); - process_setsig(); - if (process_redirect(p)) - exit (1); - if (p->attrs & PROCESS_BUILTIN) - exit((*p->execf)(p->path, p->av, data_singleton()->env)); - (*p->execf)(p->path, p->av, data_singleton()->env); - ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->av[0]); - } - else if (pid > 0) - { - p->pid = pid; - process_setgroup(p, pid); - return (0); - } - else if (pid == -1) - ft_dprintf(2, "{red}%s: internal fork error{eoc}\n", SHELL_NAME); - return (1); + return (-1); } diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index 0971a463..1114f927 100644 --- a/42sh/src/exec/process_setexec.c +++ b/42sh/src/exec/process_setexec.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:07:10 by jhalford #+# #+# */ -/* Updated: 2017/03/06 12:26:01 by wescande ### ########.fr */ +/* Updated: 2017/03/07 14:49:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,18 +15,20 @@ int process_setexec(t_process *p) { p->path = NULL; - if ((p->execf = is_builtin(p))) - p->attrs |= PROCESS_BUILTIN; - else if (ft_strchr(p->av[0], '/')) - { - p->execf = &execve; - p->attrs |= PROCESS_SCRIPT; - p->path = ft_strdup(p->av[0]); - } + /* 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->execf = &execve; - p->attrs |= PROCESS_BINARY; + p->data.cmd.execf = &execve; + p->type = PROCESS_FILE; + } + else if (ft_strchr(p->av[0], '/')) + { + p->data.cmd.execf = &execve; + p->type = PROCESS_FILE; + p->data.cmd.path = ft_strdup(p->av[0]); } else { diff --git a/42sh/src/exec/set_process.c b/42sh/src/exec/set_process.c index 7ec05157..32a67674 100644 --- a/42sh/src/exec/set_process.c +++ b/42sh/src/exec/set_process.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/05 14:54:45 by jhalford #+# #+# */ -/* Updated: 2017/03/06 12:26:11 by wescande ### ########.fr */ +/* Updated: 2017/03/07 15:02:46 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/hash_table/ft_add_hash.c b/42sh/src/hash_table/ft_add_hash.c index 055d7654..403ee64d 100644 --- a/42sh/src/hash_table/ft_add_hash.c +++ b/42sh/src/hash_table/ft_add_hash.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/18 11:20:11 by gwojda #+# #+# */ -/* Updated: 2017/03/04 18:51:01 by ariard ### ########.fr */ +/* Updated: 2017/03/07 14:43:33 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,6 @@ int ft_add_hash(t_process *p) hash.key = ft_strdup(p->av[0]); id = ft_hash_str(p->av[0]); ft_lsteadd(&(g_hash[id]), ft_lstnew(&hash, sizeof(t_hash))); - p->path = ft_strdup(hash.path); + p->data.cmd.path = ft_strdup(hash.path); return (1); } diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 2576f453..0e3d9c1c 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/03/06 12:39:14 by wescande ### ########.fr */ +/* Updated: 2017/03/07 14:40:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index 8f0b9597..9dc520c7 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -187,7 +187,7 @@ t_stackmatch g_stackmatch[] = {TK_GREATAND, NEWLINE_LIST}, {TK_GREATAND, PIPE_SEMI_SEQUENCE}, {TK_GREATAND, SEQUENCE}, -// watch ! +// watch ! {TK_GREATAND, CMD_SUPERIOR}, {TK_GREATAND, AND_OR_MAJOR}, diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index c2302123..4556574f 100644 --- a/42sh/src/parser/produce_sym.c +++ b/42sh/src/parser/produce_sym.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 17:58:34 by ariard #+# #+# */ -/* Updated: 2017/03/05 15:12:59 by ariard ### ########.fr */ +/* Updated: 2017/03/07 14:36:46 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */