aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--include/env.h3
-rw-r--r--include/minishell.h3
-rw-r--r--src/env.c5
-rw-r--r--src/env_to_strlst.c58
-rw-r--r--src/execute_cmd.c38
-rw-r--r--src/interpreter.c12
-rw-r--r--src/main.c3
8 files changed, 116 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index 3ae1359..7828678 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,7 @@ VPATH := src
SRC := main.c debug_tools.c init.c signal_handling.c repl.c new_token.c \
free_token.c new_node.c free_node.c tokenizer.c parser.c \
parse_cmd.c collect_redirs.c print_ast.c interpreter.c env.c \
- get_cmd_path.c
+ get_cmd_path.c env_to_strlst.c execute_cmd.c
OBJ_DIR := _obj
OBJ := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o))
diff --git a/include/env.h b/include/env.h
index f22ebdd..1e6941d 100644
--- a/include/env.h
+++ b/include/env.h
@@ -6,7 +6,7 @@
/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/08/08 16:53:39 by dkaiser #+# #+# */
-/* Updated: 2024/10/17 17:01:27 by dkaiser ### ########.fr */
+/* Updated: 2024/10/21 14:57:24 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -22,3 +22,4 @@ typedef struct s_env
void getenvlst(t_env **env, char **en);
void free_envlst(t_env **env);
char *env_get(t_env *env, char *name);
+char **env_to_strlst(t_env *env);
diff --git a/include/minishell.h b/include/minishell.h
index c84fda3..6282ea6 100644
--- a/include/minishell.h
+++ b/include/minishell.h
@@ -6,7 +6,7 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/22 17:14:49 by dkaiser #+# #+# */
-/* Updated: 2024/10/17 17:09:25 by dkaiser ### ########.fr */
+/* Updated: 2024/10/21 15:00:05 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -39,4 +39,5 @@ void print_ast(t_node *ast);
int eval(t_node *node, t_env *env);
char *get_cmd_path(char *cmd, t_env *env);
+int execute_cmd(t_cmd *cmd, t_env *env);
#endif
diff --git a/src/env.c b/src/env.c
index 77ba483..ed93ec0 100644
--- a/src/env.c
+++ b/src/env.c
@@ -6,13 +6,14 @@
/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/10/17 14:31:07 by chuhlig #+# #+# */
-/* Updated: 2024/10/17 15:58:28 by dkaiser ### ########.fr */
+/* Updated: 2024/10/21 15:07:51 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#include "env.h"
#include "get_next_line.h"
#include "libft.h"
+#include <stdlib.h>
void getenvlst(t_env **env, char **en)
{
@@ -51,7 +52,7 @@ void free_envlst(t_env **env)
}
}
-char *env_get(t_env *env, char *name)
+char *env_get(t_env *env, char *name)
{
while (env != NULL)
{
diff --git a/src/env_to_strlst.c b/src/env_to_strlst.c
new file mode 100644
index 0000000..3a58df9
--- /dev/null
+++ b/src/env_to_strlst.c
@@ -0,0 +1,58 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* env_to_strlst.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/10/21 14:52:08 by dkaiser #+# #+# */
+/* Updated: 2024/10/21 15:07:33 by dkaiser ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include "minishell.h"
+
+static char *get_var_assign(t_env *cur);
+
+char **env_to_strlst(t_env *env)
+{
+ int size;
+ t_env *cur;
+ char **result;
+ int i;
+
+ size = 0;
+ cur = env;
+ while (cur != NULL)
+ {
+ size++;
+ cur = cur->next;
+ }
+ result = malloc(sizeof(char *) * (size + 1));
+ if (result == NULL)
+ return (NULL);
+ i = 0;
+ cur = env;
+ while (i < size)
+ {
+ result[i] = get_var_assign(cur);
+ cur = cur->next;
+ i++;
+ }
+ result[i] = NULL;
+ return (result);
+}
+
+static char *get_var_assign(t_env *cur)
+{
+ char *left_side;
+ char *result;
+
+ left_side = ft_strjoin(cur->name, "=");
+ if (left_side == NULL)
+ return (NULL);
+ result = ft_strjoin(left_side, cur->value);
+ free(left_side);
+ return (result);
+}
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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/10/21 13:58:56 by dkaiser #+# #+# */
+/* Updated: 2024/10/21 15:07:37 by dkaiser ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "minishell.h"
+#include <stdlib.h>
+#include <sys/_types/_pid_t.h>
+#include <unistd.h>
+
+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);
+}
diff --git a/src/interpreter.c b/src/interpreter.c
index 0fa7ac1..1082644 100644
--- a/src/interpreter.c
+++ b/src/interpreter.c
@@ -6,11 +6,12 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/08/05 13:15:24 by dkaiser #+# #+# */
-/* Updated: 2024/10/17 17:05:51 by dkaiser ### ########.fr */
+/* Updated: 2024/10/21 15:07:27 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
+#include <sys/wait.h>
static int eval_pipe(t_pipe *pipe, t_env *env);
static int eval_cmd(t_cmd *cmd, t_env *env);
@@ -38,6 +39,13 @@ static int eval_pipe(t_pipe *pipe, t_env *env)
static int eval_cmd(t_cmd *cmd, t_env *env)
{
- printf("%s\n", get_cmd_path(cmd->args[0], env));
+ char *cmd_path;
+
+ 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);
}
diff --git a/src/main.c b/src/main.c
index e87bc99..c3e0ec7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,7 +6,7 @@
/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/22 17:14:03 by dkaiser #+# #+# */
-/* Updated: 2024/10/17 17:01:45 by dkaiser ### ########.fr */
+/* Updated: 2024/10/21 15:02:56 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -16,6 +16,7 @@ int main(int argc, char *argv[], char *envp[])
{
t_env *env;
+ env = NULL;
if (!argc && !argv)
return (1);
if (init())