if (r < 0)
return r;
- if (strv_length(l) > ENVIRONMENT_ASSIGNMENTS_MAX)
+ r = exec_context_apply_environment(u, c, l, flags);
+ if (r == -E2BIG)
return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
"Too many environment assignments.");
- if (!strv_env_is_valid(l))
+ if (r == -EINVAL)
return sd_bus_error_set(reterr_error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment block.");
-
- if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
- if (strv_isempty(l)) {
- c->environment = strv_free(c->environment);
- unit_write_setting(u, flags, name, "Environment=");
- } else {
- _cleanup_free_ char *joined = NULL;
- char **e;
-
- joined = unit_concat_strv(l, UNIT_ESCAPE_SPECIFIERS|UNIT_ESCAPE_C);
- if (!joined)
- return -ENOMEM;
-
- e = strv_env_merge(c->environment, l);
- if (!e)
- return -ENOMEM;
-
- strv_free_and_replace(c->environment, e);
- unit_write_settingf(u, flags, name, "Environment=%s", joined);
- }
- }
+ if (r < 0)
+ return r;
return 1;
c->private_hostname = mfree(c->private_hostname);
}
+int exec_context_apply_environment(
+ Unit *u,
+ ExecContext *c,
+ char **env,
+ UnitWriteFlags flags) {
+
+ assert(u);
+ assert(c);
+
+ if (strv_length(env) > ENVIRONMENT_ASSIGNMENTS_MAX)
+ return -E2BIG;
+ if (!strv_env_is_valid(env))
+ return -EINVAL;
+
+ if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
+ if (strv_isempty(env)) {
+ c->environment = strv_free(c->environment);
+ unit_write_setting(u, flags, "Environment", "Environment=");
+ } else {
+ _cleanup_free_ char *joined = unit_concat_strv(env, UNIT_ESCAPE_SPECIFIERS|UNIT_ESCAPE_C);
+ if (!joined)
+ return -ENOMEM;
+
+ char **e = strv_env_merge(c->environment, env);
+ if (!e)
+ return -ENOMEM;
+
+ strv_free_and_replace(c->environment, e);
+ unit_write_settingf(u, flags, "Environment", "Environment=%s", joined);
+ }
+ }
+
+ return 0;
+}
+
int exec_context_destroy_runtime_directory(const ExecContext *c, const char *runtime_prefix) {
assert(c);
void exec_context_done(ExecContext *c);
void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix);
+int exec_context_apply_environment(Unit *u, ExecContext *c, char **env, UnitWriteFlags flags);
+
int exec_context_destroy_runtime_directory(const ExecContext *c, const char *runtime_prefix);
int exec_context_destroy_mount_ns_dir(Unit *u);