Signed-off-by: Christian Seiler <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/lxc-devel