1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#define FOR_env
27#include "toys.h"
28
29GLOBALS(
30 struct arg_list *u;
31)
32
33void env_main(void)
34{
35 char **ev = toys.optargs, **ee = 0, **set QUIET, *path = getenv("PATH");
36 struct string_list *sl = 0;
37 struct arg_list *u;
38
39
40 if (*ev && **ev == '-' && !(*ev)[1]) {
41 toys.optflags |= FLAG_i;
42 ev++;
43 }
44
45 if (FLAG(i)) ee = set = xzalloc(sizeof(void *)*(toys.optc+1));
46 else for (u = TT.u; u; u = u->next) xunsetenv(u->arg);
47
48 for (; *ev; ev++) {
49 if (strchr(*ev, '=')) {
50 if (FLAG(i)) *set++ = *ev;
51 else xsetenv(xstrdup(*ev), 0);
52 if (!strncmp(*ev, "PATH=", 5)) path=(*ev)+5;
53 } else {
54
55 if (!strchr(*ev, '/') && path) {
56 errno = ENOENT;
57 for (sl = find_in_path(path, *ev); sl; sl = sl->next)
58 execve(sl->str, ev, ee ? : environ);
59 } else execve(*ev, ev, ee ? : environ);
60 perror_msg("exec %s", *ev);
61 _exit(126+(errno == ENOENT));
62 }
63 }
64
65 for (ev = ee ? : environ; *ev; ev++) xprintf("%s%c", *ev, '\n'*!FLAG(0));
66}
67