]> git.dkaiser.de - 42/minishell.git/commitdiff
running version but with comments
authorChristopher Uhlig <chuhlig@3-H-2.42heilbronn.de>
Mon, 13 Jan 2025 12:30:32 +0000 (13:30 +0100)
committerChristopher Uhlig <chuhlig@3-H-2.42heilbronn.de>
Mon, 13 Jan 2025 12:30:32 +0000 (13:30 +0100)
src/collect_redirs.c
src/execute_cmd.c
src/interpreter.c

index be0e00f28af1f52a1ef55428973ac77919323d1c..4b7b955e38e98971573e52c526eacc0273a4b2f9 100644 (file)
@@ -6,14 +6,50 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/08/02 13:49:31 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/13 09:52:00 by chuhlig          ###   ########.fr       */
+/*   Updated: 2025/01/11 11:43:13 by chuhlig          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "minishell.h"
 
+// static t_token      *collect_redir(t_token **tokens, t_redirection *result,
+//                                     t_token *cur);
+// static void         collect_and_check_redir(t_token **tokens, t_redirection *result,
+//                                     t_token **cur);
 static void            collect_and_check_redir(t_redirection *result, t_token **cur);
 static void            set_redir(t_redirection *redir, int type, char *specifier);
+// static int          is_output_redir(int i);
+
+// static char *read_heredoc(char *delimiter)
+// {
+//     char    *line;
+//     char    *result;
+//     size_t  len;
+
+//     result = NULL;
+//     while (1)
+//     {
+//             line = readline("> ");
+//             if (!line || ft_strcmp(line, delimiter) == 0)
+//             {
+//                     free(line);
+//                     break ;
+//             }
+//             if (result)
+//                     len = ft_strlen(result);
+//             else
+//                     len = 0;
+//             result = realloc(result, len + ft_strlen(line) + 2);
+//             if (!result)
+//                     return (NULL);
+//             ft_strcpy(result + len, line);
+//             strcat(result, "\n");
+//             free(line);
+//     }
+//     return (result);
+// }
+
+//v2.0
 
 static char    *read_heredoc(char *delimiter)
 {
@@ -73,7 +109,7 @@ t_redirection        *collect_redirs(t_token **tokens)
        while (cur != NULL && cur->next != NULL)
        {
                if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN)
-                       collect_and_check_redir(result, &cur);
+                       collect_and_check_redir(result, &cur);// her is diff
                else if (cur->type == REDIR_TOKEN)
                        return (free(result), NULL);
                else
@@ -84,12 +120,62 @@ t_redirection      *collect_redirs(t_token **tokens)
        return (result);
 }
 
+// static void collect_and_check_redir(t_token **tokens, t_redirection *result,
+//             t_token **cur)
+// {
+//     int     is_redir_only;
+
+//     is_redir_only = 0;
+//     if ((*cur)->previous == NULL && (*cur)->next->next == NULL)
+//             is_redir_only = 1;
+//     *cur = collect_redir(tokens, result, *cur);
+//     if (is_redir_only)
+//             *tokens = NULL;
+// }
+
+// static t_token      *collect_redir(t_token **tokens, t_redirection *result,
+//             t_token *cur)
+// {
+//     set_redir(&result[is_output_redir(cur->content.redir_type)],
+//             cur->content.redir_type, cur->next->content.string);
+//     cur = cur->next;
+//     free_token_and_connect(cur->previous);
+//     if (cur->next != NULL)
+//     {
+//             if (cur->previous == NULL)
+//                     *tokens = cur->next;
+//             cur = cur->next;
+//             free_token_and_connect(cur->previous);
+//     }
+//     else
+//     {
+//             free_token(cur);
+//             return (NULL);
+//     }
+//     return (cur);
+// }
+
 static void    set_redir(t_redirection *redir, int type, char *specifier)
 {
        redir->type = type;
        redir->specifier = specifier;
 }
 
+// static int  is_output_redir(int i)
+// {
+//     if (i & (INPUT_FILE | INPUT_LIMITER))
+//             return (0);
+//     else if (i & (OUTPUT_APPEND | OUTPUT_OVERRIDE))
+//             return (1);
+//     else
+//     {
+//             panic(UNREACHABLE);
+//             return (-1);
+//     }
+// }
+
+//2.0
+
 static void    collect_and_check_redir(t_redirection *result, t_token **cur)
 {
        char    *heredoc_data;
@@ -98,6 +184,7 @@ static void  collect_and_check_redir(t_redirection *result, t_token **cur)
        heredoc_data = NULL;
        if ((*cur)->content.redir_type == INPUT_LIMITER)
        {
+               // Handle Here Document (<<)
                heredoc_data = read_heredoc((*cur)->next->content.string);
                if (!heredoc_data)
                {
@@ -107,20 +194,35 @@ static void       collect_and_check_redir(t_redirection *result, t_token **cur)
                set_redir(&result[0], INPUT_LIMITER, heredoc_data);
        }
        else if ((*cur)->content.redir_type == INPUT_FILE)
+       {
+               // Handle Input File (<)
                set_redir(&result[0], INPUT_FILE, ft_strdup((*cur)->next->content.string));
+       }
        else if ((*cur)->content.redir_type == OUTPUT_OVERRIDE)
+       {
+               // Handle Output File Overwrite (>)
                set_redir(&result[1], OUTPUT_OVERRIDE, ft_strdup((*cur)->next->content.string));
+       }
        else if ((*cur)->content.redir_type == OUTPUT_APPEND)
+       {
+               // Handle Output File Append (>>)
                set_redir(&result[1], OUTPUT_APPEND, ft_strdup((*cur)->next->content.string));
+       }
        else
+       {
+               // Handle unexpected cases
                printf("Unknown redirection type encountered\n");
+       }
+    // Advance the token pointer to skip the redirection token and its argument
        next_token = (*cur)->next;
-       free_token_and_connect(*cur);
+       free_token_and_connect(*cur);  // Free the current redirection token
        if (next_token)
        {
-               *cur = next_token->next;
-               free_token_and_connect(next_token);
+               *cur = next_token->next;   // Move to the next token after the argument
+               free_token_and_connect(next_token);  // Free the argument token
        }
        else
-               *cur = NULL;
-}
+       {
+               *cur = NULL;  // No more tokens
+       }
+}
\ No newline at end of file
index 803d88fec1121d257e59084d24efea35fe2fe3b1..7f93c5a50c5aee9692690fa71616ee1124d667cc 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/12/17 19:21:35 by chuhlig           #+#    #+#             */
-/*   Updated: 2025/01/13 09:50:56 by chuhlig          ###   ########.fr       */
+/*   Updated: 2025/01/09 16:07:01 by chuhlig          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include <sys/fcntl.h>
 #include <unistd.h>
 
-int    execute_cmd(t_cmd *cmd, t_env **env)
-{
-       char    *cmd_path;
-       pid_t   pid;
-       int             status;
-       int             result;
-       int             original_stdout;
-       int             original_stdin;
+// static void format_args(char **args, t_env *env);
 
-       original_stdout = dup(STDOUT_FILENO);
-       original_stdin = 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);
-               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);
-               return (result);
-       }
-       pid = fork();
-       if (pid == -1)
-       {
-               perror("fork");
-               dup2(original_stdout, STDOUT_FILENO);
-               dup2(original_stdin, STDIN_FILENO);
-               close(original_stdout);
-               close(original_stdin);
-               return (EXIT_FAILURE);
-       }
-       if (pid == 0)
-       {
-               cmd_path = get_cmd_path(cmd->args[0], *env);
-               if (!cmd_path)
-               {
-                       printf("%s: command not found\n", cmd->args[0]);
-                       exit(EXIT_FAILURE);
-               }
-               execve(cmd_path, cmd->args, env_to_strlst(*env));
-               perror("execve");
-               exit(EXIT_FAILURE);
-       }
-       waitpid(pid, &status, 0);
-       dup2(original_stdout, STDOUT_FILENO);
-       dup2(original_stdin, STDIN_FILENO);
-       close(original_stdout);
-       close(original_stdin);
-       return (WEXITSTATUS(status));
-}
\ No newline at end of file
+// int execute_cmd(t_cmd *cmd, t_env **env)
+// {
+//     int             result;
+//     char    *cmd_path;
+//     int             fd;
+
+//     if (ft_strncmp(cmd->args[0], "pwd", 4) == 0)
+//             return (pwd(*env));
+//     else if (ft_strncmp(cmd->args[0], "echo", 5) == 0)
+//             return (echo(cmd->args));
+//     else if (ft_strncmp(cmd->args[0], "env", 4) == 0)
+//             return (ft_env(*env));
+//     else if (ft_strncmp(cmd->args[0], "cd", 3) == 0)
+//             return (cd(env, cmd->args));
+//     else if (ft_strncmp(cmd->args[0], "unset", 6) == 0)
+//             return (unset(cmd->args, env));
+//     else if (ft_strncmp(cmd->args[0], "export", 7) == 0)
+//             return (export(cmd->args, env));
+//     format_args(cmd->args, *env);
+//     cmd_path = get_cmd_path(cmd->args[0], *env);
+//     cmd->args[0] = cmd_path;
+//     if (cmd->redirs[0].type == INPUT_FILE)
+//     {
+//             fd = open(cmd->redirs[0].specifier, O_RDONLY);
+//             if (fd < 0)
+//                     return (EXIT_FAILURE);
+//             dup2(fd, STDIN_FILENO);
+//     }
+//     else if (cmd->redirs[0].type == INPUT_LIMITER)
+//     {
+//             dbg("INPUT_LIMITER");
+//     }
+//     if (cmd->redirs[1].type == OUTPUT_APPEND)
+//     {
+//             dbg("OUTPUT_APPEND");
+//             fd = open(cmd->redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 644);
+//             if (fd < 0)
+//                     return (EXIT_FAILURE);
+//             dup2(fd, STDOUT_FILENO);
+//     }
+//     else if (cmd->redirs[1].type == OUTPUT_OVERRIDE)
+//     {
+//             fd = open(cmd->redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 644);
+//             if (fd < 0)
+//                     return (EXIT_FAILURE);
+//             dup2(fd, STDOUT_FILENO);
+//             dbg("OUTPUT_OVERRIDE");
+//     }
+//     result = execve(cmd->args[0], cmd->args, env_to_strlst(*env));
+//     return (result);
+// }
+
+// static void format_args(char **args, t_env *env)
+// {
+//     char    *formatted;
+
+//     while (*args != NULL)
+//     {
+//             formatted = format_string(*args, env);
+//             /* free(*args); */
+//             *args = formatted;
+//             args++;
+//     }
+// }
\ No newline at end of file
index 7b0306f91f1f3e9f24ec241b6abdcc4d47015482..33d945c526477eca3fb7768f07d458733b104f43 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/12/17 19:15:49 by chuhlig           #+#    #+#             */
-/*   Updated: 2025/01/13 09:53:33 by chuhlig          ###   ########.fr       */
+/*   Updated: 2025/01/11 12:52:57 by chuhlig          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include <sys/fcntl.h>
 #include <sys/types.h>
 
+
+// static int  eval_rec(t_node *node, t_env **env, int in_fd);
+
+// int eval(t_node *node, t_env **env)
+// {
+//     pid_t   pid;
+//     int             result;
+
+//     if (node == NULL)
+//             return (EXIT_FAILURE);
+//     result = 0;
+//     pid = fork();
+//     if (pid < 0)
+//     {
+//             return (EXIT_FAILURE);
+//     }
+//     if (pid == 0)
+//     {
+//             result = eval_rec(node, env, STDIN_FILENO);
+//             exit(result);
+//     }
+//     else
+//     {
+//             waitpid(pid, &result, 0);
+//     }
+//     return (result);
+// }
+
+// static int  eval_rec(t_node *node, t_env **env, int in_fd)
+// {
+//     pid_t   pid;
+//     int             result;
+//     int             p[2];
+
+//     result = pipe(p);
+//     if (result == -1)
+//             return (EXIT_FAILURE);
+//     if (node->type == PIPE_NODE)
+//     {
+//             pid = fork();
+//             if (pid < 0)
+//             {
+//                     return (EXIT_FAILURE);
+//             }
+//             if (pid == 0)
+//             {
+//                     close(p[0]);
+//                     dup2(in_fd, STDIN_FILENO);
+//                     dup2(p[1], STDOUT_FILENO);
+//                     result = execute_cmd(&node->content.pipe.left->content.cmd, env);
+//                     exit(result);
+//             }
+//             else
+//             {
+//                     close(p[1]);
+//                     dup2(p[0], STDIN_FILENO);
+//                     result = eval_rec(node->content.pipe.right, env, p[0]);
+//             }
+//     }
+//     else if (node->type == CMD_NODE)
+//     {
+//             result = execute_cmd(&node->content.cmd, env);
+//     }
+//     else
+//     {
+//             panic(UNREACHABLE);
+//             return (EXIT_FAILURE);
+//     }
+//     return (result);
+// }
+
+
+//old interpreter
+// #include "minishell.h"
+// #include <stdio.h>
+
+// static int  eval_pipe(t_pipe *pipe, t_env *env);
+// static int  eval_cmd(t_cmd *cmd, t_env **env);
+
+// int eval(t_node *node, t_env **env)
+// {
+//     if (node->type == PIPE_NODE)
+//             return (eval_pipe(&node->content.pipe, *env));
+//     else if (node->type == CMD_NODE)
+//             return (eval_cmd(&node->content.cmd, env));
+//     else
+//     {
+//             panic(UNREACHABLE);
+//             return (-1);
+//     }
+// }
+
+// static int  eval_pipe(t_pipe *pipe, t_env *env)
+// {
+//     dbg("TODO: PIPE");
+//     eval_cmd(&pipe->left->content.cmd, &env);
+//     eval_cmd(&pipe->right->content.cmd, &env);
+//     return (0);
+// }
+
+// static int  eval_cmd(t_cmd *cmd, t_env **env)
+// {
+//     if (ft_strncmp(cmd->args[0], "pwd", 4) == 0)
+//             pwd(*env);
+//     else if (ft_strncmp(cmd->args[0], "echo", 5) == 0)
+//             echo(cmd->args);
+//     else if (ft_strncmp(cmd->args[0], "env", 4) == 0)
+//             ft_env(*env);
+//     else if (ft_strncmp(cmd->args[0], "cd", 3) == 0)
+//             cd(env, cmd->args);
+//     else if (ft_strncmp(cmd->args[0], "unset", 6) == 0)
+//             unset(cmd->args, env);
+//     else if (ft_strncmp(cmd->args[0], "export", 7) == 0)
+//             export(cmd->args, env);
+//     return (0);
+// }
+
+//v2.0
+
 int    is_builtin(char *cmd)
 {
        return ((ft_strcmp(cmd, "export") == 0)
@@ -49,65 +168,162 @@ int       execute_builtin(char **args, t_env **env)
                return (ft_env(*env));
        return (1);
 }
+// v1.0
+
+// static int  handle_redirections(t_redirection *redirs)
+// {
+//     int     fd;
+//     int     pipe_fds[2];
 
+//     if (redirs[0].type == INPUT_LIMITER)
+//     {
+//             if (pipe(pipe_fds) == -1)
+//             {
+//                     perror("pipe");
+//                     return (-1);
+//             }
+//             write(pipe_fds[1], redirs[0].specifier, strlen(redirs[0].specifier));
+//             close(pipe_fds[1]);
+//             dup2(pipe_fds[0], STDIN_FILENO);
+//             close(pipe_fds[0]);
+//     }
+//     else if (redirs[0].type == INPUT_FILE)
+//     {
+//             fd = open(redirs[0].specifier, O_RDONLY);
+//             if (fd == -1)
+//             {
+//                     perror(redirs[0].specifier);
+//                     return (-1);
+//             }
+//             dup2(fd, STDIN_FILENO);
+//             close(fd);
+//     }
+//     if (redirs[1].type == OUTPUT_OVERRIDE)
+//     {
+//             fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+//             if (fd == -1)
+//             {
+//                     perror(redirs[1].specifier);
+//                     return (-1);
+//             }
+//             dup2(fd, STDOUT_FILENO);
+//             close(fd);
+//     }
+//     else if (redirs[1].type == OUTPUT_APPEND)
+//     {
+//             fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644);
+//             if (fd == -1)
+//             {
+//                     perror(redirs[1].specifier);
+//                     return (-1);
+//             }
+//             dup2(fd, STDOUT_FILENO);
+//             close(fd);
+//     }
+//     return (0);
+// }
+//v 3.0
 static int     handle_redirections(t_redirection *redirs)
 {
-       int     fd;
+    int        fd;
 
-       if (redirs[0].type == INPUT_FILE)
-       {
-               fd = open(redirs[0].specifier, O_RDONLY);
-               if (fd < 0)
-               {
-                       perror("open");
-                       return (-1);
-               }
-               dup2(fd, STDIN_FILENO);
-               close(fd);
-       }
-       else if (redirs[0].type == INPUT_LIMITER)
-       {
-               fd = open("/tmp/heredoc_tmp", O_WRONLY | O_CREAT | O_TRUNC, 0644);
-               if (fd < 0)
-               {
-                       perror("open");
-                       return (-1);
-               }
-               write(fd, redirs[0].specifier, ft_strlen(redirs[0].specifier));
-               close(fd);
-               fd = open("/tmp/heredoc_tmp", O_RDONLY);
-               if (fd < 0)
-               {
-                       perror("open");
-                       return (-1);
-               }
-               dup2(fd, STDIN_FILENO);
-               close(fd);
-       }
-       if (redirs[1].type == OUTPUT_OVERRIDE)
-       {
-               fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-               if (fd < 0)
-               {
-                       perror("open");
-                       return (-1);
-               }
-               dup2(fd, STDOUT_FILENO);
-               close(fd);
-       }
-       else if (redirs[1].type == OUTPUT_APPEND)
-       {
-               fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644);
-               if (fd < 0)
-               {
-                       perror("open");
-                       return (-1);
-               }
-               dup2(fd, STDOUT_FILENO);
-               close(fd);
-       }
-       return (0);
-       }
+    if (redirs[0].type == INPUT_FILE)
+    {
+        fd = open(redirs[0].specifier, O_RDONLY);
+        if (fd < 0)
+        {
+            perror("open");
+            return (-1);
+        }
+        dup2(fd, STDIN_FILENO);
+        close(fd);
+    }
+    else if (redirs[0].type == INPUT_LIMITER)
+    {
+        // Handle here document (<<)
+        // Assuming heredoc_data is stored in redirs[0].specifier
+        fd = open("/tmp/heredoc_tmp", O_WRONLY | O_CREAT | O_TRUNC, 0644);
+        if (fd < 0)
+        {
+            perror("open");
+            return (-1);
+        }
+        write(fd, redirs[0].specifier, strlen(redirs[0].specifier));
+        close(fd);
+        fd = open("/tmp/heredoc_tmp", O_RDONLY);
+        if (fd < 0)
+        {
+            perror("open");
+            return (-1);
+        }
+        dup2(fd, STDIN_FILENO);
+        close(fd);
+    }
+    if (redirs[1].type == OUTPUT_OVERRIDE)
+    {
+        fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+        if (fd < 0)
+        {
+            perror("open");
+            return (-1);
+        }
+        dup2(fd, STDOUT_FILENO);
+        close(fd);
+    }
+    else if (redirs[1].type == OUTPUT_APPEND)
+    {
+        fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644);
+        if (fd < 0)
+        {
+            perror("open");
+            return (-1);
+        }
+        dup2(fd, STDOUT_FILENO);
+        close(fd);
+    }
+    return (0);
+}
+//v 2.0
+// static int  eval_rec(t_node *node, t_env **env, int in_fd)
+// {
+//     pid_t   pid;
+//     int             p[2];
+//     int             result;
+//     int             status;
+
+//     if (node->type == PIPE_NODE)
+//     {
+//             pipe(p);
+//             pid = fork();
+//             if (pid == 0)
+//             {
+//                     close(p[0]);
+//                     dup2(in_fd, STDIN_FILENO);
+//                     dup2(p[1], STDOUT_FILENO);
+//                     result = eval_rec(node->content.pipe.left, env, in_fd);
+//                     exit(result);
+//             }
+//             else
+//             {
+//                     close(p[1]);
+//                     dup2(p[0], STDIN_FILENO);
+//                     result = eval_rec(node->content.pipe.right, env, p[0]);
+//                     waitpid(pid, &status, 0);
+//             }
+//     }
+//     else if (node->type == CMD_NODE)
+//     {
+//             result = execute_cmd(&node->content.cmd, env);
+//     }
+//     else
+//     {
+//             panic("UNREACHABLE");
+//             result = EXIT_FAILURE;
+//     }
+//     return (result);
+// }
+
+//v 3.0
 
 static int     eval_rec(t_node *node, t_env **env, int in_fd)
 {
@@ -157,3 +373,101 @@ int eval(t_node *node, t_env **env)
 {
        return (eval_rec(node, env, STDIN_FILENO));
 }
+//v was auch immmer 
+
+// int execute_cmd(t_cmd *cmd, t_env **env)
+// {
+//     char    *cmd_path;
+//     pid_t   pid;
+//     int status;
+
+//     if (handle_redirections(cmd->redirs) == -1)
+//     {
+//             return (EXIT_FAILURE);
+//     }
+//     if (is_builtin(cmd->args[0]))
+//     {
+//             return (execute_builtin(cmd->args, env));
+//     }
+//     pid = fork();
+//     if (pid == -1)
+//     {
+//             perror("fork");
+//             return (EXIT_FAILURE);
+//     }
+//     if (pid == 0)
+//     {
+//             cmd_path = get_cmd_path(cmd->args[0], *env);
+//             if (!cmd_path)
+//             {
+//                     printf("%s: command not found\n", cmd->args[0]);
+//                     return (EXIT_FAILURE);
+//             }
+//             execve(cmd_path, cmd->args, env_to_strlst(*env));
+//             perror("execve");
+//             exit(EXIT_FAILURE);
+//     }
+//     waitpid(pid, &status, 0);
+//     return (WEXITSTATUS(status));
+// }
+int    execute_cmd(t_cmd *cmd, t_env **env)
+{
+    char       *cmd_path;
+    pid_t      pid;
+    int                status;
+    int                original_stdout;
+    int                original_stdin;
+
+    original_stdout = dup(STDOUT_FILENO);
+    original_stdin = 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);
+        return (EXIT_FAILURE);
+    }
+
+    if (is_builtin(cmd->args[0]))
+    {
+        int result = execute_builtin(cmd->args, env);
+        dup2(original_stdout, STDOUT_FILENO);
+        dup2(original_stdin, STDIN_FILENO);
+        close(original_stdout);
+        close(original_stdin);
+        return (result);
+    }
+
+    pid = fork();
+    if (pid == -1)
+    {
+        perror("fork");
+        dup2(original_stdout, STDOUT_FILENO);
+        dup2(original_stdin, STDIN_FILENO);
+        close(original_stdout);
+        close(original_stdin);
+        return (EXIT_FAILURE);
+    }
+    if (pid == 0)
+    {
+        cmd_path = get_cmd_path(cmd->args[0], *env);
+        if (!cmd_path)
+        {
+            printf("%s: command not found\n", cmd->args[0]);
+            exit(EXIT_FAILURE);
+        }
+        execve(cmd_path, cmd->args, env_to_strlst(*env));
+        perror("execve");
+        exit(EXIT_FAILURE);
+    }
+    waitpid(pid, &status, 0);
+
+    dup2(original_stdout, STDOUT_FILENO);
+    dup2(original_stdin, STDIN_FILENO);
+    close(original_stdout);
+    close(original_stdin);
+
+    return (WEXITSTATUS(status));
+}
\ No newline at end of file