[libvirt] [PATCH] util: include stderr in log message when an external command fails

Daniel P. Berrange berrange at redhat.com
Tue Aug 7 11:38:41 UTC 2012


On Mon, Aug 06, 2012 at 08:07:32PM -0400, Laine Stump wrote:
> This patch is in response to:
> 
>   https://bugzilla.redhat.com/show_bug.cgi?id=818467
> 
> If a caller to virCommandRun doesn't ask for the exitstatus of the
> program it's running, the virCommand functions assume that they should
> log an error message and return failure if the exit code isn't
> 0. However, only the commandline and exit status are logged, while
> potentially useful information sent by the program to stderr is
> discarded.
> 
> Fortunately, virCommandRun is already checking if the caller had asked
> for stderr to be saved and, if not, sets things up to save it in
> *cmd->errbuf. This makes it fairly simple for virCommandWait to
> include *cmd->errbuf in the error log (there are still other callers
> that don't setup errbuf, and even virCommandRun won't set it up if the
> command is being daemonized, so we have to check that it's non-zero).
> ---
> 
> Note that the minor change to the first virReportError string was made
> because I noticed that virCommandTranslateStatus already puts the word
> "status" in its string. The new message is less awkward.
> 
>  src/util/command.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/src/util/command.c b/src/util/command.c
> index 334ca89..7755572 100644
> --- a/src/util/command.c
> +++ b/src/util/command.c
> @@ -2269,7 +2269,7 @@ virPidWait(pid_t pid, int *exitstatus)
>          if (status != 0) {
>              char *st = virCommandTranslateStatus(status);
>              virReportError(VIR_ERR_INTERNAL_ERROR,
> -                           _("Child process (%lld) status unexpected: %s"),
> +                           _("Child process (%lld) unexpected %s"),
>                             (long long) pid, NULLSTR(st));
>              VIR_FREE(st);
>              return -1;
> @@ -2327,9 +2327,13 @@ virCommandWait(virCommandPtr cmd, int *exitstatus)
>          if (status) {
>              char *str = virCommandToString(cmd);
>              char *st = virCommandTranslateStatus(status);
> +            bool haveErrMsg = cmd->errbuf && *cmd->errbuf && (*cmd->errbuf)[0];
> +
>              virReportError(VIR_ERR_INTERNAL_ERROR,
> -                           _("Child process (%s) status unexpected: %s"),
> -                           str ? str : cmd->args[0], NULLSTR(st));
> +                           _("Child process (%s) unexpected %s%s%s"),
> +                           str ? str : cmd->args[0], NULLSTR(st),
> +                           haveErrMsg ? ": " : "",
> +                           haveErrMsg ? *cmd->errbuf : "");
>              VIR_FREE(str);
>              VIR_FREE(st);
>              return -1;

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