diff --git a/cmdline.c b/cmdline.c index bd3a2fa..845910a 100644 --- 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)); diff --git a/common.h b/common.h index 4820d06..1b42702 100644 --- 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; }; diff --git a/subproc.c b/subproc.c index 74e56ce..0b73e2f 100644 --- 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]);