diff options
Diffstat (limited to 'smash/exec.c')
| -rw-r--r-- | smash/exec.c | 46 |
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 |