From 9bc7493098a9b2cfc044e07be6d2690a2be99e13 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 22 Feb 2024 10:47:23 +0100 Subject: [PATCH] strv: add helper to extend strv from both sides Also, use the more correct type of 'const char* const*' for the input strv. This requires adding the cast in a few places, but also allows to remove some casts in others. --- src/basic/conf-files.c | 2 +- src/basic/path-lookup.c | 4 ++-- src/basic/strv.c | 4 ++-- src/basic/strv.h | 5 ++++- src/test/test-strv.c | 18 +++++++++++++++++- src/tmpfiles/tmpfiles.c | 4 ++-- .../xdg-autostart-generator.c | 2 +- 7 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/basic/conf-files.c b/src/basic/conf-files.c index 9cb66c099b0..7fdcc71356f 100644 --- a/src/basic/conf-files.c +++ b/src/basic/conf-files.c @@ -369,7 +369,7 @@ int conf_files_list_dropins( assert(dirs); suffix = strjoina("/", dropin_dirname); - r = strv_extend_strv_concat(&dropin_dirs, (char**) dirs, suffix); + r = strv_extend_strv_concat(&dropin_dirs, dirs, suffix); if (r < 0) return r; diff --git a/src/basic/path-lookup.c b/src/basic/path-lookup.c index 1b31a4e23a5..8a03e29f65a 100644 --- a/src/basic/path-lookup.c +++ b/src/basic/path-lookup.c @@ -214,7 +214,7 @@ static char** user_dirs( persistent_config) < 0) return NULL; - if (strv_extend_strv_concat(&res, config_dirs, "/systemd/user") < 0) + if (strv_extend_strv_concat(&res, (const char* const*) config_dirs, "/systemd/user") < 0) return NULL; /* global config has lower priority than the user config of the same type */ @@ -232,7 +232,7 @@ static char** user_dirs( data_home) < 0) return NULL; - if (strv_extend_strv_concat(&res, data_dirs, "/systemd/user") < 0) + if (strv_extend_strv_concat(&res, (const char* const*) data_dirs, "/systemd/user") < 0) return NULL; if (strv_extend_strv(&res, (char**) user_data_unit_paths, false) < 0) diff --git a/src/basic/strv.c b/src/basic/strv.c index 37199ebf045..b7946c8ba2f 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -242,13 +242,13 @@ rollback: return -ENOMEM; } -int strv_extend_strv_concat(char ***a, char * const *b, const char *suffix) { +int strv_extend_strv_biconcat(char ***a, const char *prefix, const char* const *b, const char *suffix) { int r; STRV_FOREACH(s, b) { char *v; - v = strjoin(*s, suffix); + v = strjoin(strempty(prefix), *s, suffix); if (!v) return -ENOMEM; diff --git a/src/basic/strv.h b/src/basic/strv.h index 91337b92870..169737d1d8c 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -43,7 +43,10 @@ int strv_copy_unless_empty(char * const *l, char ***ret); size_t strv_length(char * const *l) _pure_; int strv_extend_strv(char ***a, char * const *b, bool filter_duplicates); -int strv_extend_strv_concat(char ***a, char * const *b, const char *suffix); +int strv_extend_strv_biconcat(char ***a, const char *prefix, const char* const *b, const char *suffix); +static inline int strv_extend_strv_concat(char ***a, const char* const *b, const char *suffix) { + return strv_extend_strv_biconcat(a, NULL, b, suffix); +} int strv_prepend(char ***l, const char *value); /* _with_size() are lower-level functions where the size can be provided externally, diff --git a/src/test/test-strv.c b/src/test/test-strv.c index da8721214a2..47ad0eb639c 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -527,6 +527,22 @@ TEST(strv_sort) { assert_se(streq(input_table[4], "durian")); } +TEST(strv_extend_strv_biconcat) { + _cleanup_strv_free_ char **a = NULL, **b = NULL; + + a = strv_new("without", "suffix"); + b = strv_new("with", "suffix"); + assert_se(a); + assert_se(b); + + assert_se(strv_extend_strv_biconcat(&a, "prefix_", (const char* const*) b, "_suffix") >= 0); + + assert_se(streq(a[0], "without")); + assert_se(streq(a[1], "suffix")); + assert_se(streq(a[2], "prefix_with_suffix")); + assert_se(streq(a[3], "prefix_suffix_suffix")); +} + TEST(strv_extend_strv_concat) { _cleanup_strv_free_ char **a = NULL, **b = NULL; @@ -535,7 +551,7 @@ TEST(strv_extend_strv_concat) { assert_se(a); assert_se(b); - assert_se(strv_extend_strv_concat(&a, b, "_suffix") >= 0); + assert_se(strv_extend_strv_concat(&a, (const char* const*) b, "_suffix") >= 0); assert_se(streq(a[0], "without")); assert_se(streq(a[1], "suffix")); diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 958341bc5b8..e4854f31b5d 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -369,7 +369,7 @@ static int user_config_paths(char*** ret) { if (r < 0 && !ERRNO_IS_NOINFO(r)) return r; - r = strv_extend_strv_concat(&res, config_dirs, "/user-tmpfiles.d"); + r = strv_extend_strv_concat(&res, (const char* const*) config_dirs, "/user-tmpfiles.d"); if (r < 0) return r; @@ -381,7 +381,7 @@ static int user_config_paths(char*** ret) { if (r < 0) return r; - r = strv_extend_strv_concat(&res, data_dirs, "/user-tmpfiles.d"); + r = strv_extend_strv_concat(&res, (const char* const*) data_dirs, "/user-tmpfiles.d"); if (r < 0) return r; diff --git a/src/xdg-autostart-generator/xdg-autostart-generator.c b/src/xdg-autostart-generator/xdg-autostart-generator.c index 616c0173577..71e1a664351 100644 --- a/src/xdg-autostart-generator/xdg-autostart-generator.c +++ b/src/xdg-autostart-generator/xdg-autostart-generator.c @@ -37,7 +37,7 @@ static int enumerate_xdg_autostart(Hashmap *all_services) { r = xdg_user_dirs(&config_dirs, &data_dirs); if (r < 0) return r; - r = strv_extend_strv_concat(&autostart_dirs, config_dirs, "/autostart"); + r = strv_extend_strv_concat(&autostart_dirs, (const char* const*) config_dirs, "/autostart"); if (r < 0) return r; -- 2.47.3