[libvirt] [PATCH 4/6] command: Add virCommandExec helper
Daniel P. Berrange
berrange at redhat.com
Tue May 10 09:47:50 UTC 2011
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 at 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 :|
More information about the libvir-list
mailing list