From d3821b9ac7606bb23274169181472e4a482d6b7a Mon Sep 17 00:00:00 2001 From: wescande Date: Mon, 6 Mar 2017 16:20:06 +0100 Subject: [PATCH] some correctif --- 42sh/Makefile | 2 +- 42sh/includes/exec.h | 21 +++++++++-------- 42sh/libft | 2 +- 42sh/src/exec/exec_while.c | 4 +++- 42sh/src/exec/launch_process.c | 14 ++++++------ 42sh/src/exec/mark_process_status.c | 10 ++++----- 42sh/src/exec/process_reset.c | 4 ++-- 42sh/src/exec/process_setexec.c | 10 ++++----- 42sh/src/exec/set_process.c | 13 +++++++++-- 42sh/src/job-control/job_is_completed.c | 4 ++-- 42sh/src/job-control/job_is_stopped.c | 4 ++-- 42sh/src/job-control/mark_job_as_running.c | 8 +++---- 42sh/src/job-control/process_format.c | 26 +++++++++++++--------- 42sh/src/main/main.c | 5 ++++- 14 files changed, 72 insertions(+), 55 deletions(-) diff --git a/42sh/Makefile b/42sh/Makefile index 4b83d8f5..83025081 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -280,7 +280,7 @@ $(OBJ_DIR)%.o : $(SRC_DIR)%.c | $(OBJ_DIR) @$(eval PERCENT=$(shell echo $$(($(INDEX)*100/$(NB))))) @$(eval COLOR=$(shell echo $$(($(PERCENT)%35+196)))) @$(eval TO_DO=$(shell echo $$((20-$(INDEX)*20/$(NB))))) - @printf "\r\033[38;5;11m⌛ MAKE %10.10s : %2d%% \033[48;5;%dm%*s\033[0m%*s\033[48;5;255m \033[0m \033[38;5;11m %*s\033[0m\033[K" $(NAME) $(PERCENT) $(COLOR) $(DONE) "" $(TO_DO) "" $(DELTA) "$@" + @printf "\r\033[38;5;11m⌛ MAKE %10.10s : %2d%% \033[48;5;%dm%*s\033[0m%*s\033[48;5;255m \033[0m \033[38;5;11m %*.*s\033[0m\033[K" $(NAME) $(PERCENT) $(COLOR) $(DONE) "" $(TO_DO) "" $(DELTA) $(DELTA) "$@" @$(CC) $(FLAGS) $(D_FLAGS) -MMD -c $< -o $@\ -I $(INC_DIR)\ -I $(LIBFT_INC) diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 15db9b28..4afa61d6 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/05 15:19:44 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:33:24 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,13 +21,14 @@ # define PROCESS_SCRIPT (1 << 2) # define PROCESS_SUBSHELL (1 << 3) # define PROCESS_UNKNOWN (1 << 4) -# define PROCESS_COMPLETED (1 << 5) -# define PROCESS_SUSPENDED (1 << 6) -# define PROCESS_RUNNING (1 << 7) -# define PROCESS_CONTINUED (1 << 8) +# 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_TYPE_MASK (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4) -# define PROCESS_STATE_MASK (1 << 5 | 1 << 6 | 1 << 7 | 1 << 8) +# 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 IS_PIPESTART(p) ((p).fdin == STDIN) # define IS_PIPEEND(p) ((p).fdout == STDOUT) @@ -62,20 +63,18 @@ struct s_process int to_close; t_list *redirs; int status; - t_flag attributes; + t_flag attrs; }; struct s_exec { - /* char *aol_status; */ - /* int aol_search; */ t_job job; - /* t_process process; */ int fd_save[3]; t_flag attrs; int fdin; t_list *op_stack; char *case_pattern; + int control_count; }; struct s_execmap diff --git a/42sh/libft b/42sh/libft index 0270e365..6a2672a1 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit 0270e3651474c1b20bb0d6873f5c6188ccf43897 +Subproject commit 6a2672a19268c6481525d9aaee5bd35722bbd75a diff --git a/42sh/src/exec/exec_while.c b/42sh/src/exec/exec_while.c index 192913ca..e634687a 100644 --- a/42sh/src/exec/exec_while.c +++ b/42sh/src/exec/exec_while.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/30 17:33:53 by ariard #+# #+# */ -/* Updated: 2017/03/04 17:19:18 by ariard ### ########.fr */ +/* Updated: 2017/03/06 12:27:23 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,11 +17,13 @@ int exec_while(t_btree **ast) DG("exec while condition"); ft_exec(&(*ast)->left); DG("ret :[%s]", ft_getenv(data_singleton()->env, "?")); + ++data_singleton()->exec.control_count; while (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0"))) { DG("in the while"); ft_exec(&(*ast)->right); ft_exec(&(*ast)->left); } + --data_singleton()->exec.control_count; return (0); } diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index 8dd68e79..cfd4fc08 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */ -/* Updated: 2017/03/05 18:08:57 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:28:21 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,16 +19,16 @@ int launch_process(t_process *p) /* DG("gonna launch [%s]", p->av[0]); */ /* DG("fdin=[%i]", p->fdin); */ /* DG("fdout=[%i]", p->fdout); */ - if (p->attributes & PROCESS_BUILTIN && IS_PIPESINGLE(*p)) + 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->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_RUNNING; - if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT) + 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]); @@ -38,7 +38,7 @@ int launch_process(t_process *p) pid = fork(); if (pid == 0) { - if (p->attributes & PROCESS_UNKNOWN) + if (p->attrs & PROCESS_UNKNOWN) { ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]); exit(127); @@ -47,7 +47,7 @@ int launch_process(t_process *p) process_setsig(); if (process_redirect(p)) exit (1); - if (p->attributes & PROCESS_BUILTIN) + 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]); diff --git a/42sh/src/exec/mark_process_status.c b/42sh/src/exec/mark_process_status.c index 32679242..eeca4a86 100644 --- a/42sh/src/exec/mark_process_status.c +++ b/42sh/src/exec/mark_process_status.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 12:41:11 by jhalford #+# #+# */ -/* Updated: 2017/03/03 19:02:54 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:28:55 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,13 +26,13 @@ int mark_process_status(pid_t pid, int status) p->status = status; if (WIFSTOPPED(status)) { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_SUSPENDED; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_SUSPENDED; } else { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_COMPLETED; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_COMPLETED; if (WIFSIGNALED(status)) ft_printf("{mag}%d: Terminated by signal %d.\n{eoc}", (int)pid, WTERMSIG(status)); diff --git a/42sh/src/exec/process_reset.c b/42sh/src/exec/process_reset.c index 54dffa26..7ab34d1d 100644 --- a/42sh/src/exec/process_reset.c +++ b/42sh/src/exec/process_reset.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/07 17:44:22 by jhalford #+# #+# */ -/* Updated: 2017/03/03 16:36:06 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:29:17 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,5 +23,5 @@ void process_reset(t_process *p) p->to_close = 0; p->redirs = NULL; p->status = -1; - p->attributes = 0; + p->attrs = 0; } diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index 89be21a8..0971a463 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/05 18:09:31 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:26:01 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,22 +16,22 @@ int process_setexec(t_process *p) { p->path = NULL; if ((p->execf = is_builtin(p))) - p->attributes |= PROCESS_BUILTIN; + p->attrs |= PROCESS_BUILTIN; else if (ft_strchr(p->av[0], '/')) { p->execf = &execve; - p->attributes |= PROCESS_SCRIPT; + p->attrs |= PROCESS_SCRIPT; p->path = ft_strdup(p->av[0]); } else if (ft_hash(p)) { p->execf = &execve; - p->attributes |= PROCESS_BINARY; + p->attrs |= PROCESS_BINARY; } else { p->execf = NULL; - p->attributes |= PROCESS_UNKNOWN; + p->attrs |= PROCESS_UNKNOWN; return (1); } return (0); diff --git a/42sh/src/exec/set_process.c b/42sh/src/exec/set_process.c index 88a39993..7ec05157 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/05 15:42:45 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:26:11 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,7 +40,16 @@ int set_process(t_process *p, t_btree *ast) p->to_close = fds[PIPE_READ]; p->fdout = fds[PIPE_WRITE]; exec->fdin = fds[PIPE_READ]; - p->redirs = cmd->redir; + p->redirs = ft_lstmap(cmd->redir, ft_id); + t_list *tmp = p->redirs; + while (tmp) + { + t_redir *toto = tmp->content; + printf("IIIIIIIIIIIIIIIIIIIIIII%lld |%d| {%s}\n", toto->type, toto->n, toto->word); + tmp= tmp->next; + } process_setexec(p); + if (exec->control_count) + p->attrs |= PROCESS_CONTROL; return (0); } diff --git a/42sh/src/job-control/job_is_completed.c b/42sh/src/job-control/job_is_completed.c index 8c9a0f1c..9742515a 100644 --- a/42sh/src/job-control/job_is_completed.c +++ b/42sh/src/job-control/job_is_completed.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 15:10:20 by jhalford #+# #+# */ -/* Updated: 2017/01/31 13:52:36 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:30:22 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ int job_is_completed(int id) while (lst) { p = lst->content; - if (!(p->attributes & PROCESS_COMPLETED)) + if (!(p->attrs & PROCESS_COMPLETED)) return (0); lst = lst->next; } diff --git a/42sh/src/job-control/job_is_stopped.c b/42sh/src/job-control/job_is_stopped.c index e6b2c80a..b7c20a91 100644 --- a/42sh/src/job-control/job_is_stopped.c +++ b/42sh/src/job-control/job_is_stopped.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 15:06:45 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:54:33 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:31:00 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ int job_is_stopped(int id) while (lst) { p = lst->content; - if (!(p->attributes & (PROCESS_COMPLETED | PROCESS_SUSPENDED))) + if (!(p->attrs & (PROCESS_COMPLETED | PROCESS_SUSPENDED))) return (0); lst = lst->next; } diff --git a/42sh/src/job-control/mark_job_as_running.c b/42sh/src/job-control/mark_job_as_running.c index 86e5cf01..3d5f3cfb 100644 --- a/42sh/src/job-control/mark_job_as_running.c +++ b/42sh/src/job-control/mark_job_as_running.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/08 14:40:40 by jhalford #+# #+# */ -/* Updated: 2017/03/03 16:47:28 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:30:50 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,10 +21,10 @@ void mark_job_as_running(t_job *j) while (plist) { p = plist->content; - if (p->attributes & PROCESS_SUSPENDED) + if (p->attrs & PROCESS_SUSPENDED) { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_CONTINUED; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_CONTINUED; } plist = plist->next; } diff --git a/42sh/src/job-control/process_format.c b/42sh/src/job-control/process_format.c index 25fe10cb..9e0f9d62 100644 --- a/42sh/src/job-control/process_format.c +++ b/42sh/src/job-control/process_format.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/09 13:05:55 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:10:56 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:32:05 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ static void process_format_state(t_process *p) { int state; - state = p->attributes & PROCESS_STATE_MASK; + state = p->attrs & PROCESS_STATE_MASK; if (state == PROCESS_RUNNING) ft_putstr("running "); else if (state == PROCESS_SUSPENDED) @@ -24,8 +24,8 @@ static void process_format_state(t_process *p) else if (state == PROCESS_CONTINUED) { ft_putstr("continued"); - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_RUNNING; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_RUNNING; } else if (state == PROCESS_COMPLETED) { @@ -42,7 +42,9 @@ static void process_format_com_long(t_list **plist) t_process *p; p = (*plist)->content; - if (p->attributes & PROCESS_SUBSHELL) + if (p->attrs & PROCESS_CONTROL) + ft_putstr("script"); + else if (p->attrs & PROCESS_SUBSHELL) { ft_putstr("( "); ft_putstr(p->av[2]); @@ -62,15 +64,17 @@ static void process_format_com_short(t_list **plist, t_flag state) while (*plist) { p = (*plist)->content; - if (!(p->attributes & state) || + if (!(p->attrs & state) || (state == PROCESS_COMPLETED && p->status != 0)) break ; - if (p->attributes & PROCESS_CONTINUED) + if (p->attrs & PROCESS_CONTINUED) { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes &= ~PROCESS_RUNNING; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs &= ~PROCESS_RUNNING; } - if (p->attributes & PROCESS_SUBSHELL) + if (p->attrs & PROCESS_CONTROL) + ft_putstr("script"); + else if (p->attrs & PROCESS_SUBSHELL) { ft_putstr("( "); ft_putstr(p->av[2]); @@ -90,7 +94,7 @@ void process_format(t_list **plist, int firstp, int opts) t_flag state; p = (*plist)->content; - state = p->attributes & PROCESS_STATE_MASK; + state = p->attrs & PROCESS_STATE_MASK; if (!firstp) ft_printf(" "); if (opts & JOBS_OPTS_L) diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 47fed25d..aaaf6b56 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/05 16:47:43 by ariard ### ########.fr */ +/* Updated: 2017/03/06 12:39:14 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,7 +57,10 @@ int handle_instruction(int fd) if (parser.state == SUCCESS) break ; else if (parser.state == ERROR && SH_IS_INTERACTIVE(data_singleton()->opts)) + { + ft_add_str_in_history(lexer.str); return (error_syntax(&token, &parser, &ast)); + } else if (parser.state == ERROR) error_syntax(&token, &parser, &ast); }