diff options
| author | Dominik Kaiser | 2025-01-15 15:51:16 +0100 |
|---|---|---|
| committer | Dominik Kaiser | 2025-01-15 15:51:16 +0100 |
| commit | 5b268324df1b0543ef3116591e1c3a3fc1c0865b (patch) | |
| tree | 54470574e151447ebe004039b05b03b4faf86e3a /src/execute_cmd.c | |
| parent | 2d2df595dcf01315d080aa1b4fcf810d28f2a3a4 (diff) | |
| download | minishell-5b268324df1b0543ef3116591e1c3a3fc1c0865b.tar.gz minishell-5b268324df1b0543ef3116591e1c3a3fc1c0865b.zip | |
Refactor execute_cmd.c
Diffstat (limited to 'src/execute_cmd.c')
| -rw-r--r-- | src/execute_cmd.c | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/src/execute_cmd.c b/src/execute_cmd.c index bad6cf5..673fc31 100644 --- a/src/execute_cmd.c +++ b/src/execute_cmd.c @@ -6,13 +6,17 @@ /* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/17 19:21:35 by chuhlig #+# #+# */ -/* Updated: 2025/01/15 14:42:00 by dkaiser ### ########.fr */ +/* Updated: 2025/01/15 15:50:56 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +#include <stdio.h> #include <stdlib.h> +static void establish_pipeline(int original_stdin, int original_stdout); +static int exec_cmd(t_cmd *cmd, t_env **env, int original_std[2], int result); + int is_builtin(char *cmd) { return ((ft_strcmp(cmd, "export") == 0) || (ft_strcmp(cmd, "unset") == 0) @@ -42,41 +46,45 @@ int execute_builtin(char **args, t_env **env) int execute_cmd(t_cmd *cmd, t_env **env) { - char *cmd_path; - pid_t pid; - int status; - int original_stdout; - int original_stdin; + int original_std[2]; int result; - int i; - original_stdout = dup(STDOUT_FILENO); - original_stdin = dup(STDIN_FILENO); + original_std[1] = dup(STDOUT_FILENO); + original_std[0] = dup(STDIN_FILENO); if (handle_redirections(cmd->redirs) == -1) { - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); + establish_pipeline(original_std[0], original_std[1]); return (EXIT_FAILURE); } if (is_builtin(cmd->args[0])) { result = execute_builtin(cmd->args, env); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); + establish_pipeline(original_std[0], original_std[1]); return (result); } + return (exec_cmd(cmd, env, original_std, EXIT_SUCCESS)); +} + +static void establish_pipeline(int original_stdin, int original_stdout) +{ + dup2(original_stdout, STDOUT_FILENO); + dup2(original_stdin, STDIN_FILENO); + close(original_stdout); + close(original_stdin); +} + +static int exec_cmd(t_cmd *cmd, t_env **env, int original_std[2], int result) +{ + int i; + int status; + char *cmd_path; + pid_t pid; + pid = fork(); if (pid == -1) { perror("fork"); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); + establish_pipeline(original_std[0], original_std[1]); return (EXIT_FAILURE); } if (pid == 0) @@ -91,9 +99,6 @@ int execute_cmd(t_cmd *cmd, t_env **env) exit(EXIT_SUCCESS); } waitpid(pid, &status, 0); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); + establish_pipeline(original_std[0], original_std[1]); return (WEXITSTATUS(status)); } |
