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