From b23715a8077cff0241b721889f17b3c3665d38f1 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Mon, 21 Oct 2024 15:08:10 +0200 Subject: Add basic command execution --- src/execute_cmd.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/execute_cmd.c (limited to 'src/execute_cmd.c') diff --git a/src/execute_cmd.c b/src/execute_cmd.c new file mode 100644 index 0000000..3730d4b --- /dev/null +++ b/src/execute_cmd.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* execute_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser +#include +#include + +int execute_cmd(t_cmd *cmd, t_env *env) +{ + int result; + pid_t pid; + + pid = fork(); + if (pid < 0) + return (EXIT_FAILURE); + if (pid == 0) + { + result = execve(cmd->args[0], cmd->args, env_to_strlst(env)); + exit(result); + } + else + { + // only wait if cmd is on rightmost side of pipe? + // so in cmd1 | cmd2 | cmd3 | cmd4 only wait for cmd4 + waitpid(pid, &result, 0); + } + return (result); +} -- cgit v1.2.3 From 0a5684e637cd6ec084575ddf9930cfde55d3cca7 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 22 Oct 2024 15:42:28 +0200 Subject: Add pipe basics TODO: Add actual piping --- src/execute_cmd.c | 21 ++++----------- src/interpreter.c | 79 +++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 58 insertions(+), 42 deletions(-) (limited to 'src/execute_cmd.c') diff --git a/src/execute_cmd.c b/src/execute_cmd.c index 3730d4b..33ba11c 100644 --- a/src/execute_cmd.c +++ b/src/execute_cmd.c @@ -6,7 +6,7 @@ /* By: dkaiser args[0], cmd->args, env_to_strlst(env)); - exit(result); - } - else - { - // only wait if cmd is on rightmost side of pipe? - // so in cmd1 | cmd2 | cmd3 | cmd4 only wait for cmd4 - waitpid(pid, &result, 0); - } + cmd_path = get_cmd_path(cmd->args[0], env); + cmd->args[0] = cmd_path; + result = execve(cmd->args[0], cmd->args, env_to_strlst(env)); return (result); } diff --git a/src/interpreter.c b/src/interpreter.c index 1082644..f6757c4 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -6,46 +6,73 @@ /* By: dkaiser +#include +#include #include +#include -static int eval_pipe(t_pipe *pipe, t_env *env); -static int eval_cmd(t_cmd *cmd, t_env *env); +int eval_rec(t_node *node, 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)); + pid_t pid; + int result; + + result = 0; + pid = fork(); + if (pid < 0) + { + return (EXIT_FAILURE); + } + if (pid == 0) + { + result = eval_rec(node, env); + exit(result); + } else { - panic(UNREACHABLE); - return (-1); + waitpid(pid, &result, 0); } + return (result); } -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) +int eval_rec(t_node *node, t_env *env) { - char *cmd_path; + pid_t pid; + int result; - cmd_path = get_cmd_path(cmd->args[0], env); - if (cmd_path == NULL) - return (1); - free(cmd->args[0]); - cmd->args[0] = cmd_path; - execute_cmd(cmd, env); - return (0); + if (node->type == PIPE_NODE) + { + pid = fork(); + if (pid < 0) + { + return (EXIT_FAILURE); + } + if (pid == 0) + { + result = execute_cmd(&node->content.pipe.left->content.cmd, env); + exit(result); + } + else + { + result = eval(node->content.pipe.right, env); + } + } + else if (node->type == CMD_NODE) + { + result = execute_cmd(&node->content.cmd, env); + } + else + { + panic(UNREACHABLE); + return (EXIT_FAILURE); + } + return (result); } -- cgit v1.2.3 From 15d8385f8ecf30e1ca74025b12fed7e45349b706 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Fri, 25 Oct 2024 13:44:13 +0200 Subject: Handle all redirections except APPEND TODO: Add APPEND handling TODO: Fix permissions --- src/execute_cmd.c | 34 +++++++++++++++++++++++++++++++++- src/interpreter.c | 4 +++- 2 files changed, 36 insertions(+), 2 deletions(-) (limited to 'src/execute_cmd.c') diff --git a/src/execute_cmd.c b/src/execute_cmd.c index 33ba11c..fa7677f 100644 --- a/src/execute_cmd.c +++ b/src/execute_cmd.c @@ -6,22 +6,54 @@ /* By: dkaiser #include +#include +#include #include +#include int execute_cmd(t_cmd *cmd, t_env *env) { int result; char *cmd_path; + int fd; 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); + 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); + 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); } diff --git a/src/interpreter.c b/src/interpreter.c index e08d289..458f2af 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -6,7 +6,7 @@ /* By: dkaiser