summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/conf-files.c10
-rw-r--r--src/shared/strv.h29
2 files changed, 31 insertions, 8 deletions
diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c
index ed4070c662..7ba4bee43b 100644
--- a/src/shared/conf-files.c
+++ b/src/shared/conf-files.c
@@ -148,18 +148,12 @@ int conf_files_list_strv(char ***strv, const char *suffix, const char *root, con
}
int conf_files_list(char ***strv, const char *suffix, const char *root, const char *dir, ...) {
- _cleanup_strv_free_ char **dirs = NULL;
- va_list ap;
+ char **dirs;
assert(strv);
assert(suffix);
- va_start(ap, dir);
- dirs = strv_new_ap(dir, ap);
- va_end(ap);
-
- if (!dirs)
- return -ENOMEM;
+ dirs = strv_from_stdarg_alloca(dir);
return conf_files_list_strv_internal(strv, suffix, root, dirs);
}
diff --git a/src/shared/strv.h b/src/shared/strv.h
index cccf2e6a92..737728a3c6 100644
--- a/src/shared/strv.h
+++ b/src/shared/strv.h
@@ -85,3 +85,32 @@ bool strv_overlap(char **a, char **b) _pure_;
char **strv_sort(char **l);
void strv_print(char **l);
+
+#define strv_from_stdarg_alloca(first) \
+ ({ \
+ char **_l; \
+ \
+ if (!first) \
+ _l = ((char*[1]) { NULL }); \
+ else { \
+ unsigned _n; \
+ va_list _ap; \
+ \
+ _n = 1; \
+ va_start(_ap, first); \
+ while (va_arg(_ap, char*)) \
+ _n++; \
+ va_end(_ap); \
+ \
+ _l = newa(char*, _n+1); \
+ _l[_n = 0] = (char*) first; \
+ va_start(_ap, first); \
+ for (;;) { \
+ _l[++_n] = va_arg(_ap, char*); \
+ if (!_l[_n]) \
+ break; \
+ } \
+ va_end(_ap); \
+ } \
+ _l; \
+ })