]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
env-util: introduce strv_env_get_merged()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 25 Oct 2024 17:01:19 +0000 (02:01 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 31 Oct 2024 02:02:35 +0000 (11:02 +0900)
src/basic/env-util.c
src/basic/env-util.h
src/test/test-env-util.c

index 3b4b570b9c502ccdedb7e4c0cf62a9d0d63281fe..99ce1a1842023fc466d1d71f5faf190231f47297 100644 (file)
@@ -564,6 +564,34 @@ 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);
+
+        /* This converts a strv with pairs of environment variable name + value into a strv of name and
+         * value concatenated with a "=" separator. E.g.
+         * input  : { "NAME", "value", "FOO", "var" }
+         * output : { "NAME=value", "FOO=var" } */
+
+        STRV_FOREACH_PAIR(key, value, l) {
+                char *s;
+
+                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;
 
index f5ceba453a882ad322fd29e7339e3ebbcf959382..203ed65bd1d3cf9dff6636e0acce1fc1b8b2af60 100644 (file)
@@ -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);
index e2c009dc9c5a6ef23122d239985269cf8b8fed31..7eda66bd3ec068ea7f9139392711dd9060a4acec 100644 (file)
@@ -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);