[libvirt] [PATCH 16/16] command: Report stdout/stderr if command fails

Daniel P. Berrange berrange at redhat.com
Wed May 11 10:38:24 UTC 2011


On Tue, May 10, 2011 at 04:07:55PM -0400, Cole Robinson wrote:
> Just reporting the exit status isn't all that enlightening most of the
> time. This makes the message pretty wordy, but it will reduce user confusion
> for many errors.
> 
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
>  src/util/command.c |   29 ++++++++++++++++++++++-------
>  1 files changed, 22 insertions(+), 7 deletions(-)
> 
> diff --git a/src/util/command.c b/src/util/command.c
> index 5e65fc7..e20c331 100644
> --- a/src/util/command.c
> +++ b/src/util/command.c
> @@ -1899,13 +1899,28 @@ virCommandWait(virCommandPtr cmd, int *exitstatus)
>  
>      if (exitstatus == NULL) {
>          if (status != 0) {
> -            char *str = virCommandToString(cmd);
> -            char *st = virCommandTranslateStatus(status);
> -            virCommandError(VIR_ERR_INTERNAL_ERROR,
> -                            _("Child process (%s) status unexpected: %s"),
> -                            str ? str : cmd->args[0], NULLSTR(st));
> -            VIR_FREE(str);
> -            VIR_FREE(st);
> +            char *cmdstr = virCommandToString(cmd);
> +            char *statusstr = virCommandTranslateStatus(status);
> +            const char *out = cmd->outbuf ? *cmd->outbuf : "";
> +            const char *err = cmd->errbuf ? *cmd->errbuf : "";
> +            char *outstr = NULL;
> +            char *errstr = NULL;
> +
> +            if (virAsprintf(&outstr, "stdout: %s\n", NULLSTR(out)) < 0 ||
> +                virAsprintf(&errstr, "stderr: %s\n", NULLSTR(err)) < 0) {
> +                virReportOOMError();
> +            } else {
> +                virCommandError(VIR_ERR_INTERNAL_ERROR,
> +                        _("Child process (%s) status unexpected: %s\n%s%s"),
> +                        cmdstr ? cmdstr: cmd->args[0], statusstr,
> +                        (out && *out) ? outstr : "",
> +                        (err && *err) ? errstr : "");
> +            }
> +
> +            VIR_FREE(outstr);
> +            VIR_FREE(errstr);
> +            VIR_FREE(cmdstr);
> +            VIR_FREE(statusstr);
>              return -1;
>          }
>      } else {

Hmm, the stdout/stderr output can be pretty huge for many commands
that we run. eg, qemu -help failing could result it a 250 line
error message.

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