Signed-off-by: Christian Seiler <christ...@iwakd.de> --- src/lxc/utils.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/lxc/utils.h | 5 +++++ 2 files changed, 51 insertions(+)
diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 89d335d..9dd742b 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -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); +} diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 455d7d2..1818ee3 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -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 -- 1.7.10.4 ------------------------------------------------------------------------------ Get 100% visibility into Java/.NET code with AppDynamics Lite! It's a free troubleshooting tool designed for production. Get down to code-level detail for bottlenecks, with <2% overhead. Download for free and get started troubleshooting in minutes. http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel