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