stuck at dup2

This commit is contained in:
Jack Halford 2016-11-26 23:05:23 +01:00
parent aa456796ac
commit b0e7229c54
11 changed files with 39 additions and 38 deletions

View file

@ -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

@ -1 +1 @@
Subproject commit 2a60fb6dcefcf969d29c0c70f4da61a305f9ccf2
Subproject commit 509c754e17e269f4655286ebad1bf1cf543fbf97

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);

View file

@ -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);
}

View file

@ -5,6 +5,7 @@ void sig_handler(int signo)
{
if (signo == SIGINT)
{
exit(1);
if (g_pid)
kill(g_pid, SIGINT);
}

View file

@ -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));
}