From 702ac5383430e4dd00f3610a78dadf6f84e4296b Mon Sep 17 00:00:00 2001 From: Enrico Scholz Date: Thu, 19 Aug 2004 14:09:34 +0000 Subject: [PATCH] handle plain-style char** args also git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@1665 94cd875c-1c1d-0410-91d2-eb244daf1a30 --- util-vserver/lib_internal/command-appendparameter.c | 18 ++++++++++++++++-- util-vserver/lib_internal/command-exec.c | 16 +++++++++++++--- util-vserver/lib_internal/command-free.c | 3 ++- util-vserver/lib_internal/command-init.c | 12 ++++++------ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/util-vserver/lib_internal/command-appendparameter.c b/util-vserver/lib_internal/command-appendparameter.c index 26c34c5..13a2ec3 100644 --- a/util-vserver/lib_internal/command-appendparameter.c +++ b/util-vserver/lib_internal/command-appendparameter.c @@ -21,10 +21,24 @@ #endif #include "command.h" +#include "util.h" void Command_appendParameter(struct Command *cmd, char const *param) { - char const ** p = Vector_pushback(&cmd->params); - *p = param; + switch (cmd->params_style_) { + case parNONE : + Vector_init(&cmd->params.v, 10); + cmd->params_style_ = parVEC; + /*@fallthrough@*/ + case parVEC : { + char const **p = Vector_pushback(&cmd->params.v); + *p = param; + break; + } + + default : + WRITE_MSG(2, "internal error: conflicting functions Command_appendParameter() and Command_setParams() used together; aborting...\n"); + abort(); + } } diff --git a/util-vserver/lib_internal/command-exec.c b/util-vserver/lib_internal/command-exec.c index 9f6b17a..d44b1ac 100644 --- a/util-vserver/lib_internal/command-exec.c +++ b/util-vserver/lib_internal/command-exec.c @@ -21,6 +21,7 @@ #endif #include "command.h" +#include "util.h" #include #include @@ -39,7 +40,8 @@ Command_exec(struct Command *cmd, bool do_fork) { int p[2]; - Vector_zeroEnd(&cmd->params); + if (cmd->params_style_==parVEC) + Vector_zeroEnd(&cmd->params.v); if (!do_fork) cmd->pid = 0; @@ -50,10 +52,18 @@ Command_exec(struct Command *cmd, bool do_fork) } if (cmd->pid==0) { + char const ** argv = { 0 }; + if (do_fork) close(p[0]); - execv(cmd->filename ? cmd->filename : ((char **)(Vector_begin(&cmd->params)))[0], - cmd->params.data); + switch (cmd->params_style_) { + case parVEC : argv = cmd->params.v.data; break; + case parDATA : argv = cmd->params.d; break; + default : break; + } + + execv(cmd->filename ? cmd->filename : argv[0], + reinterpret_cast(char **const)(argv)); cmd->err = errno; assert(cmd->err != 0); diff --git a/util-vserver/lib_internal/command-free.c b/util-vserver/lib_internal/command-free.c index 8163503..7075857 100644 --- a/util-vserver/lib_internal/command-free.c +++ b/util-vserver/lib_internal/command-free.c @@ -25,5 +25,6 @@ void Command_free(struct Command *cmd) { - Vector_free(&cmd->params); + if (cmd->params_style_==parVEC) + Vector_free(&cmd->params.v); } diff --git a/util-vserver/lib_internal/command-init.c b/util-vserver/lib_internal/command-init.c index 1484766..436d16b 100644 --- a/util-vserver/lib_internal/command-init.c +++ b/util-vserver/lib_internal/command-init.c @@ -23,11 +23,11 @@ #include "command.h" void -Command_init(struct Command *cmd, size_t UNUSED param_count) +Command_init(struct Command *cmd) { - Vector_init(&cmd->params, sizeof(char *)); - cmd->filename = 0; - cmd->pid = -1; - cmd->rc = -1; - cmd->err = 0; + cmd->filename = 0; + cmd->pid = -1; + cmd->rc = -1; + cmd->err = 0; + cmd->params_style_ = parNONE; } -- 1.8.1.5