[lxc-devel] [PATCH 3/8] Add helper functions to convert va_list of char* to char**.

Christian Seiler christian at iwakd.de
Tue Aug 13 21:56:15 UTC 2013


Signed-off-by: Christian Seiler <christian at 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





More information about the lxc-devel mailing list