[libvirt] [PATCH 13/16] util: Implement virRun as a wrapper around virCommand

Daniel P. Berrange berrange at redhat.com
Wed May 11 10:35:04 UTC 2011


On Tue, May 10, 2011 at 04:07:52PM -0400, Cole Robinson wrote:
> 
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
>  src/util/util.c |   68 ++++++------------------------------------------------
>  1 files changed, 8 insertions(+), 60 deletions(-)
> 
> diff --git a/src/util/util.c b/src/util/util.c
> index 2f2fbc8..f83b2d0 100644
> --- a/src/util/util.c
> +++ b/src/util/util.c
> @@ -769,69 +769,17 @@ virExecWithHook(const char *const*argv,
>  int
>  virRun(const char *const*argv, int *status)
>  {
> -    pid_t childpid;
> -    int exitstatus, execret, waitret;
> -    int ret = -1;
> -    int errfd = -1, outfd = -1;
> -    char *outbuf = NULL;
> -    char *errbuf = NULL;
> -
> -    if ((execret = virExecWithHook(argv, NULL, NULL,
> -                             &childpid, -1, &outfd, &errfd,
> -                             VIR_EXEC_NONE, NULL, NULL, NULL)) < 0) {
> -        ret = execret;
> -        goto error;
> -    }
> -
> -    if (virPipeReadUntilEOF(outfd, errfd, &outbuf, &errbuf) < 0) {
> -        while (waitpid(childpid, &exitstatus, 0) == -1 && errno == EINTR)
> -            ;
> -        goto error;
> -    }
> -
> -    if (outbuf)
> -        VIR_DEBUG("Command stdout: %s", outbuf);
> -    if (errbuf)
> -        VIR_DEBUG("Command stderr: %s", errbuf);
> -
> -    while ((waitret = waitpid(childpid, &exitstatus, 0) == -1) &&
> -            errno == EINTR);
> -    if (waitret == -1) {
> -        virReportSystemError(errno,
> -                             _("cannot wait for '%s'"),
> -                             argv[0]);
> -        goto error;
> -    }
> -
> -    if (status == NULL) {
> -        errno = EINVAL;
> -        if (exitstatus) {
> -            char *str = virCommandTranslateStatus(exitstatus);
> -            char *argv_str = virArgvToString(argv);
> -            if (!argv_str) {
> -                virReportOOMError();
> -                goto error;
> -            }
> -
> -            virUtilError(VIR_ERR_INTERNAL_ERROR,
> -                         _("'%s' exited unexpectedly: %s"),
> -                         argv_str, NULLSTR(str));
> +    virCommandPtr cmd = virCommandNew(argv[0]);
> +    const char * const *tmp;
> +    int ret;
>  
> -            VIR_FREE(str);
> -            VIR_FREE(argv_str);
> -            goto error;
> -        }
> -    } else {
> -        *status = exitstatus;
> +    tmp = argv;
> +    while (*(++tmp)) {
> +        virCommandAddArg(cmd, *tmp);
>      }
>  
> -    ret = 0;
> -
> -  error:
> -    VIR_FREE(outbuf);
> -    VIR_FREE(errbuf);
> -    VIR_FORCE_CLOSE(outfd);
> -    VIR_FORCE_CLOSE(errfd);
> +    ret = virCommandRun(cmd, status);
> +    virCommandFree(cmd);
>      return ret;
>  }

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