mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 08:25:20 +09:00
basic/env-util: add variant of strv_env_replace() that does strdup internally
This commit is contained in:
@@ -370,9 +370,8 @@ int strv_env_replace(char ***l, char *p) {
|
||||
|
||||
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)
|
||||
@@ -395,6 +394,23 @@ int strv_env_replace(char ***l, char *p) {
|
||||
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;
|
||||
|
||||
@@ -46,6 +46,7 @@ char **strv_env_set(char **x, const char *p); /* New copy ... */
|
||||
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_;
|
||||
|
||||
@@ -641,22 +641,14 @@ int manager_default_environment(Manager *m) {
|
||||
/* 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);
|
||||
|
||||
@@ -2511,7 +2511,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
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;
|
||||
|
||||
@@ -2524,7 +2524,8 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
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) {
|
||||
@@ -2533,13 +2534,13 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
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");
|
||||
|
||||
|
||||
@@ -1109,17 +1109,13 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -620,7 +620,6 @@ static int json_dispatch_environment(const char *name, JsonVariant *variant, Jso
|
||||
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;
|
||||
|
||||
@@ -633,19 +632,12 @@ static int json_dispatch_environment(const char *name, JsonVariant *variant, Jso
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user