[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