new->root_nsuid_map = NULL;
new->root_nsgid_map = NULL;
INIT_LIST_HEAD(&new->environment);
+ INIT_LIST_HEAD(&new->environment_runtime);
+ INIT_LIST_HEAD(&new->environment_hooks);
INIT_LIST_HEAD(&new->limits);
INIT_LIST_HEAD(&new->sysctls);
INIT_LIST_HEAD(&new->procs);
return 0;
}
-int lxc_clear_environment(struct lxc_conf *c)
+int lxc_clear_environment(struct list_head *environment)
{
struct environment_entry *env, *nenv;
- list_for_each_entry_safe(env, nenv, &c->environment, head) {
+ list_for_each_entry_safe(env, nenv, environment, head) {
list_del(&env->head);
free(env->key);
free(env->val);
free(env);
}
- INIT_LIST_HEAD(&c->environment);
+ INIT_LIST_HEAD(environment);
return 0;
}
lxc_clear_mount_entries(conf);
lxc_clear_idmaps(conf);
lxc_clear_groups(conf);
- lxc_clear_environment(conf);
+ lxc_clear_environment(&conf->environment);
lxc_clear_limits(conf, "lxc.prlimit");
lxc_clear_sysctls(conf, "lxc.sysctl");
lxc_clear_procs(conf, "lxc.proc");
ERROR("lxc.idmap = g 0 %u %u", gid, grange);
}
-int lxc_set_environment(const struct lxc_conf *conf)
+int lxc_set_environment(const struct list_head *environment)
{
struct environment_entry *env;
- list_for_each_entry(env, &conf->environment, head) {
+ list_for_each_entry(env, environment, head) {
int ret;
ret = setenv(env->key, env->val, 1);
lxc_config_define(console_size);
lxc_config_define(unsupported_key);
lxc_config_define(environment);
+lxc_config_define(environment_runtime);
+lxc_config_define(environment_hooks);
lxc_config_define(ephemeral);
lxc_config_define(execute_cmd);
lxc_config_define(group);
{ "lxc.console.rotate", true, set_config_console_rotate, get_config_console_rotate, clr_config_console_rotate, },
{ "lxc.console.size", true, set_config_console_size, get_config_console_size, clr_config_console_size, },
{ "lxc.sched.core", true, set_config_sched_core, get_config_sched_core, clr_config_sched_core, },
+ { "lxc.environment.runtime", true, set_config_environment_runtime, get_config_environment_runtime, clr_config_environment_runtime },
+ { "lxc.environment.hooks", true, set_config_environment_hooks, get_config_environment_hooks, clr_config_environment_hooks },
{ "lxc.environment", true, set_config_environment, get_config_environment, clr_config_environment, },
{ "lxc.ephemeral", true, set_config_ephemeral, get_config_ephemeral, clr_config_ephemeral, },
{ "lxc.execute.cmd", true, set_config_execute_cmd, get_config_execute_cmd, clr_config_execute_cmd, },
return 0;
}
-static int set_config_environment(const char *key, const char *value,
- struct lxc_conf *lxc_conf, void *data)
+static int set_config_environment_impl(const char *value,
+ struct list_head *environment)
{
__do_free char *dup = NULL, *val = NULL;
__do_free struct environment_entry *new_env = NULL;
char *env_val;
if (lxc_config_value_empty(value))
- return lxc_clear_environment(lxc_conf);
+ return lxc_clear_environment(environment);
new_env = zalloc(sizeof(struct environment_entry));
if (!new_env)
new_env->key = move_ptr(dup);
new_env->val = move_ptr(val);
- list_add_tail(&new_env->head, &lxc_conf->environment);
+ list_add_tail(&new_env->head, environment);
move_ptr(new_env);
return 0;
}
+static int set_config_environment(const char *key, const char *value,
+ struct lxc_conf *lxc_conf, void *data)
+{
+ return set_config_environment_impl(value, &lxc_conf->environment);
+}
+
+static int set_config_environment_runtime(const char *key, const char* value,
+ struct lxc_conf *lxc_conf, void *data)
+{
+ return set_config_environment_impl(value, &lxc_conf->environment_runtime);
+}
+
+static int set_config_environment_hooks(const char *key, const char* value,
+ struct lxc_conf *lxc_conf, void *data)
+{
+ return set_config_environment_impl(value, &lxc_conf->environment_hooks);
+}
+
static int set_config_tty_max(const char *key, const char *value,
struct lxc_conf *lxc_conf, void *data)
{
return fulllen;
}
-static int get_config_environment(const char *key, char *retv, int inlen,
- struct lxc_conf *c, void *data)
+static int get_config_environment_impl(char *retv, int inlen,
+ struct list_head *environment)
{
int len, fulllen = 0;
struct environment_entry *env;
else
memset(retv, 0, inlen);
- list_for_each_entry(env, &c->environment, head) {
+ list_for_each_entry(env, environment, head) {
strprint(retv, inlen, "%s=%s\n", env->key, env->val);
}
return fulllen;
}
+static int get_config_environment(const char *key, char *retv, int inlen,
+ struct lxc_conf *c, void *data)
+{
+ return get_config_environment_impl(retv, inlen, &c->environment);
+}
+
+static int get_config_environment_runtime(const char *key, char *retv,
+ int inlen, struct lxc_conf *c,
+ void *data)
+{
+ return get_config_environment_impl(retv, inlen, &c->environment_runtime);
+}
+
+static int get_config_environment_hooks(const char *key, char *retv, int inlen,
+ struct lxc_conf *c, void *data)
+{
+ return get_config_environment_impl(retv, inlen, &c->environment_hooks);
+}
+
static int get_config_execute_cmd(const char *key, char *retv, int inlen,
struct lxc_conf *c, void *data)
{
static inline int clr_config_environment(const char *key, struct lxc_conf *c,
void *data)
{
- return lxc_clear_environment(c);
+ return lxc_clear_environment(&c->environment);
+}
+
+static inline int clr_config_environment_runtime(const char *key,
+ struct lxc_conf *c, void *data)
+{
+ return lxc_clear_environment(&c->environment_runtime);
+}
+
+static inline int clr_config_environment_hooks(const char *key,
+ struct lxc_conf *c, void *data)
+{
+ return lxc_clear_environment(&c->environment_hooks);
}
static inline int clr_config_execute_cmd(const char *key, struct lxc_conf *c,
} else if (strequal(key, "lxc.console")) {
strprint(retv, inlen, "logfile\n");
strprint(retv, inlen, "path\n");
+ } else if (strequal(key, "lxc.environment")) {
+ strprint(retv, inlen, "runtime\n");
+ strprint(retv, inlen, "hooks\n");
} else if (strequal(key, "lxc.seccomp")) {
strprint(retv, inlen, "profile\n");
} else if (strequal(key, "lxc.signal")) {