[lxc-devel] [PATCH 3/8] Add helper functions to convert va_list of char* to char**.
Serge Hallyn
serge.hallyn at ubuntu.com
Wed Aug 14 20:19:53 UTC 2013
Quoting Christian Seiler (christian at iwakd.de):
> Signed-off-by: Christian Seiler <christian at iwakd.de>
Ideally the conversion of lxcapi_startl would have been a part of
this patch rather than the next one, but I'm being nit-picky.
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
> ---
> 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 at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
More information about the lxc-devel
mailing list