From f095398a4718a2910a60830e96a9a97f60359e14 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Fri, 6 May 2011 10:37:36 -0400 Subject: [PATCH] command: Add virCommandExec helper 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 --- src/libvirt_private.syms | 1 + src/util/command.c | 22 ++++++++++++++++++++++ src/util/command.h | 10 ++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 528fcdc088..7e5b1d7e92 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -107,6 +107,7 @@ virCommandAddEnvPassCommon; virCommandAddEnvString; virCommandClearCaps; virCommandDaemonize; +virCommandExec; virCommandFree; virCommandNew; virCommandNewArgList; diff --git a/src/util/command.c b/src/util/command.c index ff4869dceb..78586e8157 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 69e9169ea4..aa5136b2dd 100644 --- a/src/util/command.h +++ b/src/util/command.h @@ -255,6 +255,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