diff --git a/inc/executor.h b/inc/executor.h index 1c256de..9331b8c 100644 --- a/inc/executor.h +++ b/inc/executor.h @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:06:07 by willem #+# #+# */ -/* Updated: 2025/02/11 17:06:54 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 20:24:20 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,5 +16,12 @@ # include "minishell.h" char *executor_absolute_path(t_list *env, char *cmd); +void executor_child(t_command *command); +int executor_fork(t_command *command); +void executor_create_pipes(t_minishell *minishell); +void executor_execute_pipeline(t_minishell *minishell); + + + #endif // EXECUTOR_H diff --git a/inc/typedef.h b/inc/typedef.h index e5372e5..601c08a 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/12 18:47:30 by willem ######## odam.nl */ +/* Updated: 2025/02/12 20:35:09 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -50,9 +50,10 @@ typedef struct s_command { char *command; char **args; - char **environment; + t_list *environment; int fd_in; int fd_out; + int n_pipes; } t_command; typedef struct s_minishell diff --git a/src/executor/executor.c b/src/executor/executor.c index fe28b48..d2cc485 100644 --- a/src/executor/executor.c +++ b/src/executor/executor.c @@ -12,19 +12,28 @@ #include "minishell.h" +void executor_close_pipes(int n_pipes) +{ + int i; + + i = 3; + while (i < n_pipes + 3) + { + close(i); + i++; + } +} + void executor_child(t_command *command) { + char *path; if (command->fd_in != 0) - { dup2(command->fd_in, 0); - close(command->fd_in); - } if (command->fd_out != 1) - { dup2(command->fd_out, 1); - close(command->fd_out); - } - execve(command->command, command->args, command->environment); + executor_close_pipes(command->n_pipes); + path = executor_absolute_path(command->environment, command->command); + execve(path, command->args, environment_get_arr(command->environment)); } int executor_fork(t_command *command) @@ -35,6 +44,10 @@ int executor_fork(t_command *command) pid = fork(); if (pid > 0) { + if(command->fd_in != 0) + close(command->fd_in); + if(command->fd_out != 1) + close(command->fd_out); waitpid(pid, &status, 0); return (((status) & 0xff00) >> 8); } @@ -45,18 +58,70 @@ int executor_fork(t_command *command) return (EXIT_FAILURE); } -int main(int argc, char **argv, char **envp) +void executer_create_pipes(t_minishell *minishell) { - t_minishell minishell; - t_command command; + t_list *current; + t_command *command; + int fd[2]; + int fd_in; + - command.command = "/bin/ls"; - command.args = (char *[]){"ls", "-l", NULL}; - command.environment = envp; - command.fd_in = 0; - command.fd_out = 1; + fd_in = 0; + current = minishell->commands; + while (current) + { + command = (t_command *)current->content; + if (current->next) + { + pipe(fd); + command->fd_out = fd[1]; + } + else + command->fd_out = 1; + command->fd_in = fd_in; + command->n_pipes = (ft_lstsize(minishell->commands) - 1) * 2; + fd_in = fd[0]; + current = current->next; + } +} +void executor_execute_pipeline(t_minishell *minishell) +{ + t_list *current; + t_command *command; - printf("exit status: %d\n", executor_fork(&command)); - return (0); -} \ No newline at end of file + executer_create_pipes(minishell); + current = minishell->commands; + while (current) + { + command = (t_command *)current->content; + command->environment = minishell->environment; + executor_fork(command); + current = current->next; + } +} + +// int main(int argc, char **argv, char **envp) +// { +// t_minishell minishell; +// t_command command[3]; + +// minishell.commands = ft_lstnew(&command[0]); +// ft_lstadd_back(&minishell.commands, ft_lstnew(&command[1])); +// ft_lstadd_back(&minishell.commands, ft_lstnew(&command[2])); + +// command[0].command = "/bin/ls"; +// command[0].args = (char *[]){"ls", "-l", NULL}; +// command[0].environment = envp; + +// command[1].command = "/usr/bin/grep"; +// command[1].args = (char *[]){"grep", "src", NULL}; +// command[1].environment = envp; + +// command[2].command = "/usr/bin/wc"; +// command[2].args = (char *[]){"wc", "-l", NULL}; +// command[2].environment = envp; + +// executor_execute_pipeline(&minishell); +// return (0); +// } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 6a1a2b4..44b4751 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/12 12:54:01 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 20:46:11 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,13 +14,13 @@ #include "minishell.h" #include "utils.h" -static void token_print(void *param) -{ - t_token *token; +// static void token_print(void *param) +// { +// t_token *token; - token = (t_token *)param; - printf("token type %i, value %s\n", token->type, token->value); -} +// token = (t_token *)param; +// printf("token type %i, value %s\n", token->type, token->value); +// } int main(int argc, char **argv, char **envp) { @@ -37,7 +37,7 @@ int main(int argc, char **argv, char **envp) minishell->line = ft_prompt(minishell); minishell->lexer = ft_lexer_new(minishell->line); minishell->tokens = ft_parse_input(minishell->lexer); - ft_lstiter(minishell->tokens, token_print); + //ft_lstiter(minishell->tokens, token_print); minishell->commands = parser_get_commands(minishell->tokens); simple_builtins(minishell); free_minishell_line(minishell); diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 6e9fab9..786e143 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -1,33 +1,33 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* parser_get_commands.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/11 16:25:36 by qmennen ### ########.fr */ +/* :::::::: */ +/* parser_get_commands.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ +/* Updated: 2025/02/12 20:49:00 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -static void print_cmds(void *content) -{ - t_command *cmd; - int i; +// static void print_cmds(void *content) +// { +// t_command *cmd; +// int i; - cmd = (t_command *)content; - printf("cmd: %s\n", cmd->command); - printf("args: "); - i = 0; - while (cmd->args[i]) - { - printf("%s ", cmd->args[i]); - i++; - } - printf("\n"); -} +// cmd = (t_command *)content; +// printf("cmd: %s\n", cmd->command); +// printf("args: "); +// i = 0; +// while (cmd->args[i]) +// { +// printf("%s ", cmd->args[i]); +// i++; +// } +// printf("\n"); +// } t_list *parser_get_commands(t_list *list) { @@ -51,6 +51,6 @@ t_list *parser_get_commands(t_list *list) if (current && ((t_token *)current->content)->type != T_WORD) current = current->next; } - ft_lstiter(command_list, print_cmds); + //ft_lstiter(command_list, print_cmds); return (command_list); } diff --git a/src/utils/simple_builtins.c b/src/utils/simple_builtins.c index e50b454..d197f8e 100644 --- a/src/utils/simple_builtins.c +++ b/src/utils/simple_builtins.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/12 12:52:30 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 20:25:23 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -81,8 +81,6 @@ void fork_execve(t_minishell *minishell, char *path, char **argv) void simple_builtins(t_minishell *minishell) { - char *path; - if (!minishell->tokens) return ; if (cmp_value(minishell->tokens, "clear")) @@ -100,13 +98,6 @@ void simple_builtins(t_minishell *minishell) environment_del(&(minishell->environment), ((t_token *)minishell->tokens->next->content)->value); else { - path = executor_absolute_path(minishell->environment, ((t_token *)minishell->tokens->content)->value); - if (path == NULL) - printf("minishell: %s: command not found\n", ((t_token *)minishell->tokens->content)->value); - else - { - printf("found excutable: %s\n", path); - fork_execve(minishell, path, ft_split(((t_token *)minishell->tokens->content)->value, ' ')); - } + executor_execute_pipeline(minishell); } }