
On Fri, May 06, 2011 at 01:26:09PM -0400, Cole Robinson wrote:
Actually execs the argv/env we've generated, replacing the current process. Kind of has a limited usage, but allows us to use virCommand in LXC driver to launch the 'init' process
Signed-off-by: Cole Robinson <crobinso@redhat.com> --- src/libvirt_private.syms | 1 + src/util/command.c | 22 ++++++++++++++++++++++ src/util/command.h | 10 ++++++++++ 3 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d89b191..6e96692 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -106,6 +106,7 @@ virCommandAddEnvPassCommon; virCommandAddEnvString; virCommandClearCaps; virCommandDaemonize; +virCommandExec; virCommandFree; virCommandNew; virCommandNewArgList; diff --git a/src/util/command.c b/src/util/command.c index ff4869d..78586e8 100644 --- a/src/util/command.c +++ b/src/util/command.c @@ -980,6 +980,28 @@ cleanup: return ret; }
+/* + * Exec the command, replacing the current process. Meant to be called + * after already forking / cloning, so does not attempt to daemonize or + * preserve any FDs. + * + * Returns -1 on any error executing the command. + * Will not return on success. + */ +int virCommandExec(virCommandPtr cmd) +{ + if (!cmd ||cmd->has_error == ENOMEM) { + virReportOOMError(); + return -1; + } + if (cmd->has_error) { + virCommandError(VIR_ERR_INTERNAL_ERROR, "%s", + _("invalid use of command API")); + return -1; + } + + return execve(cmd->args[0], cmd->args, cmd->env); +}
/* * Run the command and wait for completion. diff --git a/src/util/command.h b/src/util/command.h index 69e9169..aa5136b 100644 --- a/src/util/command.h +++ b/src/util/command.h @@ -256,6 +256,16 @@ char *virCommandToString(virCommandPtr cmd) ATTRIBUTE_RETURN_CHECK; char *virCommandTranslateStatus(int exitstatus) ATTRIBUTE_RETURN_CHECK;
/* + * Exec the command, replacing the current process. Meant to be called + * after already forking / cloning, so does not attempt to daemonize or + * preserve any FDs. + * + * Returns -1 on any error executing the command. + * Will not return on success. + */ +int virCommandExec(virCommandPtr cmd) ATTRIBUTE_RETURN_CHECK; + +/* * Run the command and wait for completion. * Returns -1 on any error executing the * command. Returns 0 if the command executed,
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|