From: Lennart Poettering Date: Tue, 19 Dec 2023 18:09:17 +0000 (+0100) Subject: env-util: add strv_env_assignf() helper X-Git-Tag: v256-rc1~1428^2~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20f8b345db15382fe7c54db6b1da0dee2fb661a6;p=thirdparty%2Fsystemd.git env-util: add strv_env_assignf() helper --- diff --git a/src/basic/env-util.c b/src/basic/env-util.c index d3bf73385fb..7ac47732ba8 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -458,6 +458,35 @@ int strv_env_assign(char ***l, const char *key, const char *value) { return strv_env_replace_consume(l, p); } +int strv_env_assignf(char ***l, const char *key, const char *valuef, ...) { + int r; + + assert(l); + assert(key); + + if (!env_name_is_valid(key)) + return -EINVAL; + + if (!valuef) { + strv_env_unset(*l, key); + return 0; + } + + _cleanup_free_ char *value = NULL; + va_list ap; + va_start(ap, valuef); + r = vasprintf(&value, valuef, ap); + va_end(ap); + if (r < 0) + return -ENOMEM; + + char *p = strjoin(key, "=", value); + if (!p) + return -ENOMEM; + + return strv_env_replace_consume(l, p); +} + int _strv_env_assign_many(char ***l, ...) { va_list ap; int r; diff --git a/src/basic/env-util.h b/src/basic/env-util.h index f7fb1e90823..8e77cc71d6b 100644 --- a/src/basic/env-util.h +++ b/src/basic/env-util.h @@ -49,6 +49,7 @@ 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_assignf(char ***l, const char *key, const char *valuef, ...) _printf_(3, 4); int _strv_env_assign_many(char ***l, ...) _sentinel_; #define strv_env_assign_many(l, ...) _strv_env_assign_many(l, __VA_ARGS__, NULL) diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c index dffbad6327b..c267c2e3418 100644 --- a/src/test/test-env-util.c +++ b/src/test/test-env-util.c @@ -133,6 +133,27 @@ TEST(strv_env_assign) { assert_se(streq(a[0], "a=A")); } +TEST(strv_env_assignf) { + _cleanup_strv_free_ char **a = NULL; + + assert_se(strv_env_assignf(&a, "a", "a") > 0); + assert_se(strv_env_assignf(&a, "a", "%c", 'a') == 0); + + assert_se(strv_env_assignf(&a, "c", "xxx%iyyy", 5) > 0); + assert_se(strv_length(a) == 2); + assert_se(strv_equal(a, STRV_MAKE("a=a", "c=xxx5yyy"))); + assert_se(strv_env_assignf(&a, "c", NULL) == 0); + + assert_se(strv_env_assignf(&a, "b", "b") > 0); + assert_se(strv_env_assignf(&a, "a", "A") == 0); + assert_se(strv_env_assignf(&a, "b", NULL) == 0); + + assert_se(strv_env_assignf(&a, "a=", "B") == -EINVAL); + + assert_se(strv_length(a) == 1); + assert_se(streq(a[0], "a=A")); +} + TEST(strv_env_assign_many) { _cleanup_strv_free_ char **a = NULL;