aboutsummaryrefslogtreecommitdiff
path: root/smash/exec.c
diff options
context:
space:
mode:
authorNathan P. Reiner <nathan@nathanreiner.xyz>2022-12-16 10:47:35 +0100
committerNathan P. Reiner <nathan@nathanreiner.xyz>2022-12-16 10:47:35 +0100
commitd5ed22276d65a0ef3d9bbe586ff4a2bbfd779714 (patch)
tree6d70fcc56e098ad1eb5f5c2363cc906edc428064 /smash/exec.c
parent39f40b08ca9ac010dbdb5ec42fafee736f66e701 (diff)
add env path execution
Diffstat (limited to 'smash/exec.c')
-rw-r--r--smash/exec.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/smash/exec.c b/smash/exec.c
index cd18ca4..11620a5 100644
--- a/smash/exec.c
+++ b/smash/exec.c
@@ -9,6 +9,8 @@
#include "../lib/sys/exit.h"
#include "../lib/cstr/cstr.h"
#include "../lib/io/io.h"
+#include "../lib/env/env.h"
+#include "../lib/malloc/malloc.h"
#include "parser.h"
#include "builtin.h"
@@ -22,11 +24,43 @@ void print_call(char **argv)
}
}
+void __execenv(const char **argv)
+{
+ const char *path = getenv("PATH");
+ const char *end;
+ char *filename;
+
+ while (*path) {
+ end = path;
+
+ while (*end && *end != ':') ++end;
+
+ filename = malloc((end - path) + cstr_length(argv[0]) + 2);
+
+ for (int i = 0; i < end - path; ++i)
+ filename[i] = path[i];
+
+ filename[end - path] = '/';
+
+ for (int i = 0; i < cstr_length(argv[0]) + 1; ++i)
+ filename[(end - path) + i + 1] = argv[0][i];
+
+ execve(filename, argv, getenvp());
+ free(filename);
+
+ path = end;
+
+ if (*path == ':')
+ ++path;
+ }
+
+ execve(argv[0], argv, getenvp());
+}
+
void exec(char *line)
{
expression_list_t *exps = new_expression_from_line(line);
expression_list_t *exp = exps;
- char **envp = { 0 };
int pid;
int pipefd[2][2];
@@ -57,7 +91,7 @@ void exec(char *line)
close(pipefd[1][PIPE_OUT]);
close(pipefd[1][PIPE_IN]);
- execve(argv[0], argv, envp);
+ __execenv(argv);
wstdf("command not found: %s\n", argv[0]);
exit(-1);
}
@@ -80,3 +114,11 @@ void exec(char *line)
free_expression(exps);
}
+#ifdef EXEC_UNIT_TEST
+
+int main() {
+ char *argv[] = { "ls" };
+ __execenv(argv);
+}
+
+#endif