aboutsummaryrefslogtreecommitdiff
path: root/src/execute_cmd.c
diff options
context:
space:
mode:
authorDominik Kaiser2025-01-14 18:32:42 +0100
committerGitHub2025-01-14 18:32:42 +0100
commitd4f3525a01f2566afed0da9209cb1c64bf188776 (patch)
tree14d1f541418576d565f42f0d70faf1369fc17d1b /src/execute_cmd.c
parent3e692dac63577011bd5862a66767ef412183f26b (diff)
parentda80405b345b58f9e1bd83039b1df3771b5ca193 (diff)
downloadminishell-d4f3525a01f2566afed0da9209cb1c64bf188776.tar.gz
minishell-d4f3525a01f2566afed0da9209cb1c64bf188776.zip
Merge branch 'miau' into uwu
Diffstat (limited to 'src/execute_cmd.c')
-rw-r--r--src/execute_cmd.c155
1 files changed, 85 insertions, 70 deletions
diff --git a/src/execute_cmd.c b/src/execute_cmd.c
index 7f93c5a..b9faf71 100644
--- a/src/execute_cmd.c
+++ b/src/execute_cmd.c
@@ -6,81 +6,96 @@
/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/17 19:21:35 by chuhlig #+# #+# */
-/* Updated: 2025/01/09 16:07:01 by chuhlig ### ########.fr */
+/* Updated: 2025/01/14 16:56:24 by chuhlig ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
-#include <fcntl.h>
-#include <stdlib.h>
-#include <sys/_types/_pid_t.h>
-#include <sys/_types/_s_ifmt.h>
-#include <sys/fcntl.h>
-#include <unistd.h>
-// static void format_args(char **args, t_env *env);
+int is_builtin(char *cmd)
+{
+ return ((ft_strcmp(cmd, "export") == 0)
+ || (ft_strcmp(cmd, "unset") == 0)
+ || (ft_strcmp(cmd, "cd") == 0)
+ || (ft_strcmp(cmd, "exit") == 0)
+ || (ft_strcmp(cmd, "echo") == 0)
+ || (ft_strcmp(cmd, "pwd") == 0)
+ || (ft_strcmp(cmd, "env") == 0));
+}
-// int execute_cmd(t_cmd *cmd, t_env **env)
-// {
-// int result;
-// char *cmd_path;
-// int fd;
+int execute_builtin(char **args, t_env **env)
+{
+ if (ft_strcmp(args[0], "export") == 0)
+ return (export(args, env));
+ else if (ft_strcmp(args[0], "unset") == 0)
+ return (unset(args, env));
+ else if (ft_strcmp(args[0], "cd") == 0)
+ return (cd(env, args));
+ else if (ft_strcmp(args[0], "echo") == 0)
+ return (echo(args));
+ else if (ft_strcmp(args[0], "pwd") == 0)
+ return (pwd(*env));
+ else if (ft_strcmp(args[0], "env") == 0)
+ return (ft_env(*env));
+ else if (ft_strcmp(args[0], "exit") == 0)
+ return (builtin_exit(args, env));
+ return (1);
+}
-// 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);
-// }
+int execute_cmd(t_cmd *cmd, t_env **env)
+{
+ char *cmd_path;
+ pid_t pid;
+ int status;
+ int original_stdout;
+ int original_stdin;
+ int 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
+ 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("command not found\n");
+ 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));
+}