env-util: add strv_env_assignf() helper

This commit is contained in:
Lennart Poettering 2023-12-19 19:09:17 +01:00
parent 207aafe7e1
commit 20f8b345db
3 changed files with 51 additions and 0 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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;