From: Christian Seiler Date: Tue, 21 May 2013 12:56:00 +0000 (+0200) Subject: Add helper functions to convert va_list of char* to char**. X-Git-Tag: lxc-1.0.0.alpha1~1^2~87 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61a1d519f472c1ac95c641d974401c932f82be66;p=thirdparty%2Flxc.git Add helper functions to convert va_list of char* to char**. Signed-off-by: Christian Seiler Acked-by: Serge E. Hallyn --- diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 89d335dff..9dd742b3f 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -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); +} diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 455d7d241..1818ee3de 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -24,6 +24,7 @@ #define _utils_h #include +#include #include #include #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