]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Add helper functions to convert va_list of char* to char**.
authorChristian Seiler <christian@iwakd.de>
Tue, 21 May 2013 12:56:00 +0000 (14:56 +0200)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Wed, 14 Aug 2013 21:50:59 +0000 (16:50 -0500)
Signed-off-by: Christian Seiler <christian@iwakd.de>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/lxc/utils.c
src/lxc/utils.h

index 89d335dffcba341b6f732e986bdd81f9daba143f..9dd742b3f20c314c9bb592db2d00e85a6ac3fcc6 100644 (file)
@@ -26,6 +26,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <stddef.h>
+#include <string.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/mman.h>
@@ -447,3 +448,48 @@ int sha1sum_file(char *fnam, unsigned char *digest)
        return ret;
 }
 #endif
+
+char** lxc_va_arg_list_to_argv(va_list ap, size_t skip, int do_strdup)
+{
+       va_list ap2;
+       size_t count = 1 + skip;
+       char **result;
+
+       /* first determine size of argument list, we don't want to reallocate
+        * constantly...
+        */
+       va_copy(ap2, ap);
+       while (1) {
+               char* arg = va_arg(ap2, char*);
+               if (!arg)
+                       break;
+               count++;
+       }
+       va_end(ap2);
+
+       result = calloc(count, sizeof(char*));
+       if (!result)
+               return NULL;
+       count = skip;
+       while (1) {
+               char* arg = va_arg(ap, char*);
+               if (!arg)
+                       break;
+               arg = do_strdup ? strdup(arg) : arg;
+               if (!arg)
+                       goto oom;
+               result[count++] = arg;
+       }
+
+       /* calloc has already set last element to NULL*/
+       return result;
+
+oom:
+       free(result);
+       return NULL;
+}
+
+const char** lxc_va_arg_list_to_argv_const(va_list ap, size_t skip)
+{
+       return (const char**)lxc_va_arg_list_to_argv(ap, skip, 0);
+}
index 455d7d2416d505cb76cf0fd5fd1ff5558f974232..1818ee3de05bf3be400586c7ad7f2a9265bab647 100644 (file)
@@ -24,6 +24,7 @@
 #define _utils_h
 
 #include <errno.h>
+#include <stdarg.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include "config.h"
@@ -182,4 +183,8 @@ extern ssize_t lxc_read_nointr_expect(int fd, void* buf, size_t count, const voi
 extern int sha1sum_file(char *fnam, unsigned char *md_value);
 #endif
 
+/* convert variadic argument lists to arrays (for execl type argument lists) */
+extern char** lxc_va_arg_list_to_argv(va_list ap, size_t skip, int do_strdup);
+extern const char** lxc_va_arg_list_to_argv_const(va_list ap, size_t skip);
+
 #endif