diff options
-rw-r--r-- | lib/env.c | 6 | ||||
-rw-r--r-- | lib/lib.h | 1 | ||||
-rw-r--r-- | toys/posix/env.c | 15 |
3 files changed, 11 insertions, 11 deletions
@@ -80,6 +80,12 @@ void xsetenv(char *name, char *val) environ[i] = new; } +void xunsetenv(char *name) +{ + if (strchr(name, '=')) error_exit("xunsetenv %s name has =", name); + xsetenv(name, 0); +} + // reset environment for a user, optionally clearing most of it void reset_env(struct passwd *p, int clear) { @@ -275,6 +275,7 @@ int human_readable(char *buf, unsigned long long num, int style); long environ_bytes(); void xsetenv(char *name, char *val); +void xunsetenv(char *name); void xclearenv(void); // linestack.c diff --git a/toys/posix/env.c b/toys/posix/env.c index d1bb580d..3a251334 100644 --- a/toys/posix/env.c +++ b/toys/posix/env.c @@ -40,18 +40,11 @@ void env_main(void) } if (FLAG(i)) xclearenv(); - else for (u = TT.u; u; u = u->next) - if (strchr(u->arg, '=')) error_msg("bad -u %s", u->arg); - else xsetenv(u->arg, 0); + else for (u = TT.u; u; u = u->next) xunsetenv(u->arg); - for (; *ev; ev++) { - char *val = strchr(*ev, '='); - - if (val) { - *(val++) = 0; - xsetenv(*ev, val); - } else xexec(ev); - } + for (; *ev; ev++) + if (strchr(*ev, '=')) xsetenv(xstrdup(*ev), 0); + else xexec(ev); for (ev = environ; *ev; ev++) xprintf("%s%c", *ev, '\n'*!FLAG(0)); } |