env-util: introduce strv_env_assign_many()
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user