#include "../lib/io/io.h" #include "../lib/sys/sizes.h" #include "../lib/sys/execve.h" #include "../lib/env/env.h" #include "../lib/sys/types.h" #include "../lib/cstr/cstr.h" char buf[BUFSIZ] = ""; void add_to_env(char *line, u64 linenumber) { char *begin = line; char *key; char *value; key = line; while (*line != '=' && *line) ++line; if (!*line) { wff(STDERR_FD, "error: '%s' %i no valid environment line\n", begin, linenumber); return; } *(line++) = 0; value = line; while (*line != '\n' && *line) ++line; if (*line == '\n') *line = 0; setenv(key, value); } int main(int argc, const char **argv) { if (argc == 1) { const char**envp = getenvp(); while (*envp) { wstdf("%s\n", *envp); ++envp; } return 0; } u64 fd = STDIN_FD; i64 size; char *p; u64 linenumber = 1; const char **execargv = argv + 1; if (argv[1][0] == '-' && argv[1][1] == 'f') { if (argc > 3) { fd = open(argv[2], OPEN_READ_ONLY, 0); if (fd < 0) { wff(STDERR_FD, "venv: cannot open file '%s'\n", argv[2]); return -1; } execargv = argv + 3; } else { wf(STDERR_FD, "venv [-f file] command [args...]\n"); return -1; } } while ((size = get_next_line_from_fd(fd, buf)) >= 0) { if (cstr_length(buf)) { add_to_env(buf, linenumber++); } } execve(execargv[0], execargv, getenvp()); wff(STDERR_FD, "cannot execute '%s'\n", execargv[0]); return -1; }