aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/env.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/posix/env.c')
-rw-r--r--toys/posix/env.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/toys/posix/env.c b/toys/posix/env.c
new file mode 100644
index 00000000..7cda85f9
--- /dev/null
+++ b/toys/posix/env.c
@@ -0,0 +1,52 @@
+/* vi: set sw=4 ts=4:
+ *
+ * env.c - Set the environment for command invocation.
+ *
+ * Copyright 2012 Tryn Mirell <tryn@mirell.org>
+ * env.c
+
+USE_ENV(NEWTOY(env, "^i", TOYFLAG_USR|TOYFLAG_BIN))
+
+config ENV
+ bool "env"
+ default y
+ help
+ usage: env [-i] [NAME=VALUE...] [command [option...]]
+
+ Set the environment for command invocation.
+
+ -i Clear existing environment.
+*/
+
+#include "toys.h"
+
+extern char **environ;
+
+void env_main(void)
+{
+ char **ev;
+ char **command = NULL;
+ char *del = "=";
+
+ if (toys.optflags & 1) clearenv();
+
+ for (ev = toys.optargs; *ev != NULL; ev++) {
+ char *env, *val = NULL;
+
+ env = strtok(*ev, del);
+
+ if (env) val = strtok(NULL, del);
+
+ if (val) setenv(env, val, 1);
+ else {
+ command = ev;
+ break;
+ }
+ }
+
+ if (!command) {
+ char **ep;
+ for (ep = environ; *ep; ep++) xputs(*ep);
+ return;
+ } else xexec(command);
+}