diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-14 17:09:59 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-14 17:09:59 +0100 |
| commit | 7a98e998c5cda484611d19854649ab8535f503d4 (patch) | |
| tree | 43f7dae6921ced5ee9001f1d31c662351678a718 /lib/exec/exec.c | |
| parent | c0178363472e162a7cb21e381c512979130dfdb0 (diff) | |
add simplet init system
Diffstat (limited to 'lib/exec/exec.c')
| -rw-r--r-- | lib/exec/exec.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/exec/exec.c b/lib/exec/exec.c new file mode 100644 index 0000000..42fd2c1 --- /dev/null +++ b/lib/exec/exec.c @@ -0,0 +1,38 @@ +#include "exec.h" +#include "../sys/execve.h" +#include "../env/env.h" +#include "../cstr/cstr.h" +#include "../malloc/malloc.h" + +int exec(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; + } + + return execve(argv[0], argv, getenvp()); +} |