assert(p);
- /* Replace first occurrence of the env var or add a new one in the string list. Drop other occurrences. Edits
- * in-place. Does not copy p. p must be a valid key=value assignment.
- */
+ /* Replace first occurrence of the env var or add a new one in the string list. Drop other
+ * occurrences. Edits in-place. Does not copy p. p must be a valid key=value assignment. */
t = strchr(p, '=');
if (!t)
return 1;
}
+int strv_env_replace_strdup(char ***l, const char *assignment) {
+ int r;
+
+ /* Like strv_env_replace(), but copies the argument. */
+
+ _cleanup_free_ char *p = strdup(assignment);
+ if (!p)
+ return -ENOMEM;
+
+ r = strv_env_replace(l, p);
+ if (r < 0)
+ return r;
+
+ TAKE_PTR(p);
+ return r;
+}
+
char **strv_env_set(char **x, const char *p) {
_cleanup_strv_free_ char **ret = NULL;
size_t n, m;
char **strv_env_unset(char **l, const char *p); /* In place ... */
char **strv_env_unset_many(char **l, ...) _sentinel_;
int strv_env_replace(char ***l, char *p); /* In place ... */
+int strv_env_replace_strdup(char ***l, const char *assignment);
char *strv_env_get_n(char **l, const char *name, size_t k, unsigned flags) _pure_;
char *strv_env_get(char **x, const char *n) _pure_;
/* Import locale variables LC_*= from configuration */
(void) locale_setup(&m->transient_environment);
} else {
- _cleanup_free_ char *k = NULL;
-
- /* The user manager passes its own environment
- * along to its children, except for $PATH. */
+ /* The user manager passes its own environment along to its children, except for $PATH. */
m->transient_environment = strv_copy(environ);
if (!m->transient_environment)
return log_oom();
- k = strdup("PATH=" DEFAULT_USER_PATH);
- if (!k)
- return log_oom();
-
- r = strv_env_replace(&m->transient_environment, k);
+ r = strv_env_replace_strdup(&m->transient_environment, "PATH=" DEFAULT_USER_PATH);
if (r < 0)
return log_oom();
- TAKE_PTR(k);
}
sanitize_environment(m->transient_environment);
break;
case ARG_SETENV: {
- _cleanup_free_ char **l = NULL, **k = NULL;
+ _cleanup_free_ char **l = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *ne = NULL;
JsonVariant *e;
}
if (!env_assignment_is_valid(optarg))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Environment assignment '%s' not valid.", optarg);
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Environment assignment '%s' not valid.", optarg);
e = json_variant_by_key(arg_identity_extra, "environment");
if (e) {
return log_error_errno(r, "Failed to parse JSON environment field: %m");
}
- k = strv_env_set(l, optarg);
- if (!k)
- return log_oom();
+ r = strv_env_replace_strdup(&l, optarg);
+ if (r < 0)
+ return log_error_errno(r, "Failed to replace JSON environment field: %m");
- strv_sort(k);
+ strv_sort(l);
- r = json_variant_new_array_strv(&ne, k);
+ r = json_variant_new_array_strv(&ne, l);
if (r < 0)
return log_error_errno(r, "Failed to allocate environment list JSON: %m");
break;
case 'E': {
- char **n;
-
if (!env_assignment_is_valid(optarg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Environment variable assignment '%s' is not valid.", optarg);
+ r = strv_env_replace_strdup(&arg_setenv, optarg);
+ if (r < 0)
+ return r;
- n = strv_env_set(arg_setenv, optarg);
- if (!n)
- return log_oom();
-
- strv_free_and_replace(arg_setenv, n);
arg_settings_mask |= SETTING_ENVIRONMENT;
break;
}
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an array.", strna(name));
for (i = 0; i < json_variant_elements(variant); i++) {
- _cleanup_free_ char *c = NULL;
JsonVariant *e;
const char *a;
if (!env_assignment_is_valid(a))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an array of environment variables.", strna(name));
- c = strdup(a);
- if (!c)
- return json_log_oom(variant, flags);
-
- r = strv_env_replace(&n, c);
+ r = strv_env_replace_strdup(&n, a);
if (r < 0)
return json_log_oom(variant, flags);
-
- c = NULL;
}
- strv_free_and_replace(*l, n);
- return 0;
+ return strv_free_and_replace(*l, n);
}
int json_dispatch_user_disposition(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {