Env variables (setting/clearing)
authorRobert Swiecki <swiecki@google.com>
Tue, 26 Jan 2016 16:42:10 +0000 (17:42 +0100)
committerRobert Swiecki <swiecki@google.com>
Tue, 26 Jan 2016 16:42:10 +0000 (17:42 +0100)
cmdline.c
common.h
subproc.c

index bd3a2fa98fa423f930dcd074cabcc184fcf2abe4..845910a360afd8f18a9489354441444cd207acaa 100644 (file)
--- a/cmdline.c
+++ b/cmdline.c
@@ -282,6 +282,7 @@ bool cmdlineParse(int argc, char *argv[], struct nsjconf_t * nsjconf)
        };
        /*  *INDENT-OFF* */
 
+       TAILQ_INIT(&nsjconf->envs);
        TAILQ_INIT(&nsjconf->pids);
        TAILQ_INIT(&nsjconf->mountpts);
 
@@ -312,6 +313,7 @@ bool cmdlineParse(int argc, char *argv[], struct nsjconf_t * nsjconf)
                {{"daemon", no_argument, NULL, 'd'}, "Daemonize after start? (default: false)"},
                {{"verbose", no_argument, NULL, 'v'}, "Verbose output (default: false)"},
                {{"keep_env", no_argument, NULL, 'e'}, "Should all environment variables be passed to the child? (default: false)"},
+               {{"env", required_argument, NULL, 'E'}, "Environment variable (can be used multiple times)"},
                {{"keep_caps", no_argument, NULL, 0x0501}, "Don't drop capabilities (DANGEROUS) (default: false)"},
                {{"silent", no_argument, NULL, 0x0502}, "Redirect child's fd:0/1/2 to /dev/null (default: false)"},
                {{"disable_sandbox", no_argument, NULL, 0x0503}, "Don't enable the seccomp-bpf sandboxing (default: false)"},
@@ -351,8 +353,8 @@ bool cmdlineParse(int argc, char *argv[], struct nsjconf_t * nsjconf)
 
        int opt_index = 0;
        for (;;) {
-               int c =
-                   getopt_long(argc, argv, "H:D:c:p:i:u:g:l:t:M:Ndveh?R:B:T:I:", opts, &opt_index);
+               int c = getopt_long(argc, argv, "H:D:c:p:i:u:g:l:t:M:Ndveh?E:R:B:T:I:", opts,
+                                   &opt_index);
                if (c == -1) {
                        break;
                }
@@ -477,6 +479,13 @@ bool cmdlineParse(int argc, char *argv[], struct nsjconf_t * nsjconf)
                case 0x0603:
                        nsjconf->mount_proc = false;
                        break;
+               case 'E':
+                       {
+                               struct charptr_t *p = util_malloc(sizeof(struct charptr_t));
+                               p->val = optarg;
+                               TAILQ_INSERT_TAIL(&nsjconf->envs, p, pointers);
+                       }
+                       break;
                case 'R':
                        {
                                struct mounts_t *p = util_malloc(sizeof(struct mounts_t));
index 4820d0618d8524e9f8fd1c9ba8daf84bd2e65bc4..1b4270222dc68fd96db1785600f21ec3f5efcfcd 100644 (file)
--- a/common.h
+++ b/common.h
@@ -55,6 +55,11 @@ enum mode_t {
        MODE_STANDALONE_RERUN
 };
 
+struct charptr_t {
+       char *val;
+        TAILQ_ENTRY(charptr_t) pointers;
+};
+
 struct nsjconf_t {
        const char *hostname;
        const char *cwd;
@@ -93,6 +98,7 @@ struct nsjconf_t {
        unsigned int max_conns_per_ip;
        size_t tmpfs_size;
        bool mount_proc;
+        TAILQ_HEAD(envlist, charptr_t) envs;
         TAILQ_HEAD(pidslist, pids_t) pids;
         TAILQ_HEAD(mountptslist, mounts_t) mountpts;
 };
index 74e56ced82e2390b5dd26a796de2786b7abca7eb..0b73e2fa6a90f659d798e5b776d7a0d7501f7659 100644 (file)
--- a/subproc.c
+++ b/subproc.c
@@ -76,16 +76,19 @@ static int subprocNewProc(struct nsjconf_t *nsjconf, int fd_in, int fd_out, int
                exit(1);
        }
 
-       char *const *env = { NULL };
-       if (nsjconf->keep_env == true) {
-               env = environ;
+       if (nsjconf->keep_env == false) {
+               clearenv();
+       }
+       struct charptr_t *p;
+       TAILQ_FOREACH(p, &nsjconf->envs, pointers) {
+               putenv(p->val);
        }
 
        LOG_D("Trying to execve('%s')", nsjconf->argv[0]);
        for (int i = 0; nsjconf->argv[i]; i++) {
                LOG_D(" Arg[%d]: '%s'", i, nsjconf->argv[i]);
        }
-       execve(nsjconf->argv[0], &nsjconf->argv[0], env);
+       execv(nsjconf->argv[0], &nsjconf->argv[0]);
 
        PLOG_E("execve('%s') failed", nsjconf->argv[0]);