From b0e7229c549239dab5d1cb3e3ac319fc81bc804a Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 26 Nov 2016 23:05:23 +0100 Subject: [PATCH] stuck at dup2 --- 42sh/includes/exec.h | 15 +++++++-------- 42sh/libft | 2 +- 42sh/src/exec/exec_command.c | 12 +++++++++--- 42sh/src/exec/exec_great.c | 4 +++- 42sh/src/exec/exec_less.c | 4 +++- 42sh/src/exec/exec_pipe.c | 12 ++++++------ 42sh/src/exec/exec_semi.c | 6 +++--- 42sh/src/exec/ft_exec.c | 4 ++-- 42sh/src/main/main.c | 2 +- 42sh/src/main/sig_handler.c | 1 + 42sh/src/minishell-exec/ft_cmd.c | 15 +++------------ 11 files changed, 39 insertions(+), 38 deletions(-) diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index dbfedeb0..65bb06fc 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -9,18 +9,17 @@ typedef struct s_exec t_exec; struct s_exec { t_type type; - int (*f)(t_btree *ast); + int (*f)(t_btree *ast, t_data *data); }; extern t_exec g_exec[]; -int ft_exec(t_btree *ast); +int ft_exec(t_btree *ast, t_data *data); -int ft_exec(t_btree *ast); -int exec_semi(t_btree *ast); -int exec_pipe(t_btree *ast); -int exec_less(t_btree *ast); -int exec_great(t_btree *ast); -int exec_command(t_btree *ast); +int exec_semi(t_btree *ast, t_data *data); +int exec_pipe(t_btree *ast, t_data *data); +int exec_less(t_btree *ast, t_data *data); +int exec_great(t_btree *ast, t_data *data); +int exec_command(t_btree *ast, t_data *data); #endif diff --git a/42sh/libft b/42sh/libft index 2a60fb6d..509c754e 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit 2a60fb6dcefcf969d29c0c70f4da61a305f9ccf2 +Subproject commit 509c754e17e269f4655286ebad1bf1cf543fbf97 diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index e6f10fd3..3eb92793 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -12,9 +12,15 @@ #include "exec.h" -int exec_command(t_btree *ast) +int exec_command(t_btree *ast, t_data *data) { - (void)ast; - ft_putendl("exec_commands"); + t_astnode *node; + + node = ast->item; + ft_putstr_fd("befor exec: ", 2); + ft_sstrprint(((t_astnode*)ast->item)->u_data.sstr, ','); + ft_putchar('\n'); + ft_cmd_process(node->u_data.sstr, &data->env); + ft_putstr_fd("after exec\n", 2); return (0); } diff --git a/42sh/src/exec/exec_great.c b/42sh/src/exec/exec_great.c index bfb6d558..ee07977d 100644 --- a/42sh/src/exec/exec_great.c +++ b/42sh/src/exec/exec_great.c @@ -12,9 +12,11 @@ #include "exec.h" -int exec_great(t_btree *ast) +int exec_great(t_btree *ast, t_data *data) { (void)ast; ft_putendl("exec_great"); + ft_exec(ast->left, data); + ft_exec(ast->right, data); return (0); } diff --git a/42sh/src/exec/exec_less.c b/42sh/src/exec/exec_less.c index 47a4061d..2937adfc 100644 --- a/42sh/src/exec/exec_less.c +++ b/42sh/src/exec/exec_less.c @@ -12,9 +12,11 @@ #include "exec.h" -int exec_less(t_btree *ast) +int exec_less(t_btree *ast, t_data *data) { (void)ast; ft_putendl("exec_less"); + ft_exec(ast->left, data); + ft_exec(ast->right, data); return (0); } diff --git a/42sh/src/exec/exec_pipe.c b/42sh/src/exec/exec_pipe.c index 92353c15..af5d1932 100644 --- a/42sh/src/exec/exec_pipe.c +++ b/42sh/src/exec/exec_pipe.c @@ -1,17 +1,17 @@ #include "exec.h" -int exec_pipe(t_btree *ast) +int exec_pipe(t_btree *ast, t_data *data) { int filedes[2]; pipe(filedes); - ft_debug(); - dup2(filedes[1], 1); - ft_debug(); - ft_exec(ast->left); + ft_printf("doing dup2\n"); + if ((dup2(filedes[1], 1)) == -1) + return (-1); + ft_exec(ast->left, data); close(filedes[1]); dup2(filedes[0], 0); - ft_exec(ast->right); + ft_exec(ast->right, data); close(filedes[0]); return (0); } diff --git a/42sh/src/exec/exec_semi.c b/42sh/src/exec/exec_semi.c index d73f4120..6569181e 100644 --- a/42sh/src/exec/exec_semi.c +++ b/42sh/src/exec/exec_semi.c @@ -1,8 +1,8 @@ #include "exec.h" -int exec_semi(t_btree *ast) +int exec_semi(t_btree *ast, t_data *data) { - ft_exec(ast->left); - ft_exec(ast->right); + ft_exec(ast->left, data); + ft_exec(ast->right, data); return (0); } diff --git a/42sh/src/exec/ft_exec.c b/42sh/src/exec/ft_exec.c index 78bc14ce..7c00c00e 100644 --- a/42sh/src/exec/ft_exec.c +++ b/42sh/src/exec/ft_exec.c @@ -10,7 +10,7 @@ t_exec g_exec[] = {0, 0}, }; -int ft_exec(t_btree *ast) +int ft_exec(t_btree *ast, t_data *data) { t_astnode *item; int i; @@ -22,7 +22,7 @@ int ft_exec(t_btree *ast) while (g_exec[i].type) { if (item->type == g_exec[i].type) - return ((*g_exec[i].f)(ast)); + return ((*g_exec[i].f)(ast, data)); i++; } return (0); diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 195a324f..e68d5a39 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -38,7 +38,7 @@ int main(void) btree_apply_infix(ast, &ft_putast2); /* ft_lstdel(&token, &token_free); */ token = NULL; - if (ft_exec(ast)) + if (ft_exec(ast, &data)) return (1); } diff --git a/42sh/src/main/sig_handler.c b/42sh/src/main/sig_handler.c index 31892118..49efa24d 100644 --- a/42sh/src/main/sig_handler.c +++ b/42sh/src/main/sig_handler.c @@ -5,6 +5,7 @@ void sig_handler(int signo) { if (signo == SIGINT) { + exit(1); if (g_pid) kill(g_pid, SIGINT); } diff --git a/42sh/src/minishell-exec/ft_cmd.c b/42sh/src/minishell-exec/ft_cmd.c index 372fafab..a3e2a8f3 100644 --- a/42sh/src/minishell-exec/ft_cmd.c +++ b/42sh/src/minishell-exec/ft_cmd.c @@ -14,7 +14,7 @@ int ft_cmd_process(char **argv, char ***env_p) execpath = argv[0]; else if (!(execpath = ft_findexec(path, argv[0]))) { - ft_printf("minishell: command not found: %s\n", argv[0]); + ft_dprintf(2, "minishell: command not found: %s\n", argv[0]); return (-1); } return (ft_cmd_exec(execpath, argv, env_p)); @@ -25,12 +25,10 @@ int ft_cmd_exec(char *execpath, char **argv, char ***env_p) pid_t pid; int status; char **environ; - char **sstr; - sstr = NULL; if (access(execpath, X_OK) == -1) { - ft_printf("minishell: permission denied: %s\n", argv[0]); + ft_dprintf(2, "minishell: permission denied: %s\n", argv[0]); return (-1); } if ((pid = fork()) == -1) @@ -44,14 +42,7 @@ int ft_cmd_exec(char *execpath, char **argv, char ***env_p) { g_pid = pid; wait(&status); - sstr = ft_sstradd(sstr, "?"); - sstr = ft_sstradd(sstr, ft_itoa(status)); - builtin_setenv(sstr, env_p); + builtin_setenv((char*[2]){"?", ft_itoa(status)}, env_p); } return (0); } - -char **ft_cmd_getav(char *cmd) -{ - return (ft_split_whitespaces(cmd)); -}