Env variables (setting/clearing)

This commit is contained in:
Robert Swiecki 2016-01-26 17:42:10 +01:00
parent fd98f4009e
commit aebc3dba41
3 changed files with 24 additions and 6 deletions

View File

@ -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));

View File

@ -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;
};

View File

@ -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]);