diff --git a/src/basic/env-util.c b/src/basic/env-util.c index 3b4b570b9c5..6c3881c762d 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -564,6 +564,29 @@ char* strv_env_pairs_get(char **l, const char *name) { return result; } +int strv_env_get_merged(char **l, char ***ret) { + _cleanup_strv_free_ char **v = NULL; + size_t n = 0; + int r; + + assert(ret); + + STRV_FOREACH_PAIR(key, value, l) { + char *s = NULL; + + s = strjoin(*key, "=", *value); + if (!s) + return -ENOMEM; + + r = strv_consume_with_size(&v, &n, s); + if (r < 0) + return r; + } + + *ret = TAKE_PTR(v); + return 0; +} + char** strv_env_clean_with_callback(char **e, void (*invalid_callback)(const char *p, void *userdata), void *userdata) { int k = 0; diff --git a/src/basic/env-util.h b/src/basic/env-util.h index f5ceba453a8..203ed65bd1d 100644 --- a/src/basic/env-util.h +++ b/src/basic/env-util.h @@ -60,6 +60,7 @@ static inline char* strv_env_get(char * const *x, const char *n) { } char* strv_env_pairs_get(char **l, const char *name) _pure_; +int strv_env_get_merged(char **l, char ***ret); int getenv_bool(const char *p); int secure_getenv_bool(const char *p); diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c index e2c009dc9c5..7eda66bd3ec 100644 --- a/src/test/test-env-util.c +++ b/src/test/test-env-util.c @@ -581,4 +581,15 @@ TEST(getenv_path_list) { assert_se(unsetenv("TEST_GETENV_PATH_LIST") >= 0); } +TEST(strv_env_get_merged) { + char **l = STRV_MAKE("ONE", "1", "TWO", "2", "THREE", "3", "FOUR", "4", "FIVE", "5"), + **expected = STRV_MAKE("ONE=1", "TWO=2", "THREE=3", "FOUR=4", "FIVE=5"); + _cleanup_strv_free_ char **m = NULL; + + ASSERT_OK(strv_env_get_merged(NULL, &m)); + ASSERT_NULL(m); + ASSERT_OK(strv_env_get_merged(l, &m)); + ASSERT_TRUE(strv_equal(m, expected)); +} + DEFINE_TEST_MAIN(LOG_DEBUG);