mirror of https://gitee.com/openkylin/libvirt.git
Improve error reporting in virsh
This commit is contained in:
parent
fa7f51b813
commit
f84c166013
|
@ -1,3 +1,8 @@
|
|||
Mon Feb 9 14:19:02 GMT 2009 John Levon <john.levon@sun.com>
|
||||
|
||||
* src/virsh.c: rather than verbosely printing every error, save
|
||||
the last error and report that only if the entire command fails.
|
||||
|
||||
Mon Feb 9 14:07:51 GMT 2009 John Levon <john.levon@sun.com>
|
||||
|
||||
* include/libvirt/virterror.h:
|
||||
|
|
59
src/virsh.c
59
src/virsh.c
|
@ -92,22 +92,6 @@ typedef enum {
|
|||
VSH_ERR_ERROR
|
||||
} vshErrorLevel;
|
||||
|
||||
/*
|
||||
* The error handler for virsh
|
||||
*/
|
||||
static void
|
||||
virshErrorHandler(void *unused, virErrorPtr error)
|
||||
{
|
||||
if ((unused != NULL) || (error == NULL))
|
||||
return;
|
||||
|
||||
/* Suppress the VIR_ERR_NO_XEN error which fails as non-root */
|
||||
if ((error->code == VIR_ERR_NO_XEN) || (error->code == VIR_ERR_OK))
|
||||
return;
|
||||
|
||||
virDefaultErrorFunc(error);
|
||||
}
|
||||
|
||||
/*
|
||||
* virsh command line grammar:
|
||||
*
|
||||
|
@ -321,6 +305,46 @@ static int namesorter(const void *a, const void *b) {
|
|||
return strcasecmp(*sa, *sb);
|
||||
}
|
||||
|
||||
static virErrorPtr last_error;
|
||||
|
||||
/*
|
||||
* Quieten libvirt until we're done with the command.
|
||||
*/
|
||||
static void
|
||||
virshErrorHandler(void *unused ATTRIBUTE_UNUSED, virErrorPtr error)
|
||||
{
|
||||
virFreeError(last_error);
|
||||
last_error = virSaveLastError();
|
||||
if (getenv("VIRSH_DEBUG") != NULL)
|
||||
virDefaultErrorFunc(error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Report an error when a command finishes. This is better than before
|
||||
* (when correct operation would report errors), but it has some
|
||||
* problems: we lose the smarter formatting of virDefaultErrorFunc(),
|
||||
* and it can become harder to debug problems, if errors get reported
|
||||
* twice during one command. This case shouldn't really happen anyway,
|
||||
* and it's IMHO a bug that libvirt does that sometimes.
|
||||
*/
|
||||
static void
|
||||
virshReportError(vshControl *ctl)
|
||||
{
|
||||
if (last_error == NULL)
|
||||
return;
|
||||
|
||||
if (last_error->code == VIR_ERR_OK) {
|
||||
vshError(ctl, FALSE, "%s", _("unknown error"));
|
||||
goto out;
|
||||
}
|
||||
|
||||
vshError(ctl, FALSE, "%s", last_error->message);
|
||||
|
||||
out:
|
||||
virFreeError(last_error);
|
||||
last_error = NULL;
|
||||
}
|
||||
|
||||
|
||||
/* ---------------
|
||||
* Commands
|
||||
|
@ -6103,6 +6127,9 @@ vshCommandRun(vshControl *ctl, const vshCmd *cmd)
|
|||
if (ctl->timing)
|
||||
GETTIMEOFDAY(&after);
|
||||
|
||||
if (ret == FALSE)
|
||||
virshReportError(ctl);
|
||||
|
||||
if (STREQ(cmd->def->name, "quit")) /* hack ... */
|
||||
return ret;
|
||||
|
||||
|
|
Loading…
Reference in New Issue