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(a)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,
--
1.7.4.4