From: Yu Watanabe Date: Mon, 27 Mar 2023 09:21:06 +0000 (+0900) Subject: env-util: introduce strv_env_assign_many() X-Git-Tag: v254-rc1~902 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=409759634e7fefc8120fca3f69b1a9aa0a68f396;p=thirdparty%2Fsystemd.git env-util: introduce strv_env_assign_many() --- diff --git a/src/basic/env-util.c b/src/basic/env-util.c index 55ac11a5124..41fad1d1b9e 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -459,6 +459,48 @@ int strv_env_assign(char ***l, const char *key, const char *value) { return strv_env_replace_consume(l, p); } +int _strv_env_assign_many(char ***l, ...) { + va_list ap; + int r; + + assert(l); + + va_start(ap, l); + for (;;) { + const char *key, *value; + + key = va_arg(ap, const char *); + if (!key) + break; + + if (!env_name_is_valid(key)) { + va_end(ap); + return -EINVAL; + } + + value = va_arg(ap, const char *); + if (!value) { + strv_env_unset(*l, key); + continue; + } + + char *p = strjoin(key, "=", value); + if (!p) { + va_end(ap); + return -ENOMEM; + } + + r = strv_env_replace_consume(l, p); + if (r < 0) { + va_end(ap); + return r; + } + } + va_end(ap); + + return 0; +} + char *strv_env_get_n(char **l, const char *name, size_t k, unsigned flags) { assert(name); diff --git a/src/basic/env-util.h b/src/basic/env-util.h index b927ac7a488..b0ff5a11d1a 100644 --- a/src/basic/env-util.h +++ b/src/basic/env-util.h @@ -49,6 +49,8 @@ int strv_env_replace_consume(char ***l, char *p); /* In place ... */ int strv_env_replace_strdup(char ***l, const char *assignment); int strv_env_replace_strdup_passthrough(char ***l, const char *assignment); int strv_env_assign(char ***l, const char *key, const char *value); +int _strv_env_assign_many(char ***l, ...) _sentinel_; +#define strv_env_assign_many(l, ...) _strv_env_assign_many(l, __VA_ARGS__, NULL) 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_; diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c index 4796e3c2080..1f9d385ec0b 100644 --- a/src/test/test-env-util.c +++ b/src/test/test-env-util.c @@ -133,6 +133,32 @@ TEST(strv_env_assign) { assert_se(streq(a[0], "a=A")); } +TEST(strv_env_assign_many) { + _cleanup_strv_free_ char **a = NULL; + + assert_se(strv_env_assign_many(&a, "a", "a", "b", "b") >= 0); + + assert_se(strv_length(a) == 2); + assert_se(strv_contains(a, "a=a")); + assert_se(strv_contains(a, "b=b")); + + assert_se(strv_env_assign_many(&a, "a", "A", "b", "b", "c", "c") >= 0); + assert_se(strv_length(a) == 3); + assert_se(strv_contains(a, "a=A")); + assert_se(strv_contains(a, "b=b")); + assert_se(strv_contains(a, "c=c")); + + assert_se(strv_env_assign_many(&a, "b", NULL, "c", "C") >= 0); + assert_se(strv_length(a) == 2); + assert_se(strv_contains(a, "a=A")); + assert_se(strv_contains(a, "c=C")); + + assert_se(strv_env_assign_many(&a, "a=", "B") == -EINVAL); + assert_se(strv_length(a) == 2); + assert_se(strv_contains(a, "a=A")); + assert_se(strv_contains(a, "c=C")); +} + TEST(env_strv_get_n) { const char *_env[] = { "FOO=NO NO NO",