mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
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>
|
Mon Feb 9 14:07:51 GMT 2009 John Levon <john.levon@sun.com>
|
||||||
|
|
||||||
* include/libvirt/virterror.h:
|
* include/libvirt/virterror.h:
|
||||||
|
59
src/virsh.c
59
src/virsh.c
@ -92,22 +92,6 @@ typedef enum {
|
|||||||
VSH_ERR_ERROR
|
VSH_ERR_ERROR
|
||||||
} vshErrorLevel;
|
} 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:
|
* virsh command line grammar:
|
||||||
*
|
*
|
||||||
@ -321,6 +305,46 @@ static int namesorter(const void *a, const void *b) {
|
|||||||
return strcasecmp(*sa, *sb);
|
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
|
* Commands
|
||||||
@ -6103,6 +6127,9 @@ vshCommandRun(vshControl *ctl, const vshCmd *cmd)
|
|||||||
if (ctl->timing)
|
if (ctl->timing)
|
||||||
GETTIMEOFDAY(&after);
|
GETTIMEOFDAY(&after);
|
||||||
|
|
||||||
|
if (ret == FALSE)
|
||||||
|
virshReportError(ctl);
|
||||||
|
|
||||||
if (STREQ(cmd->def->name, "quit")) /* hack ... */
|
if (STREQ(cmd->def->name, "quit")) /* hack ... */
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user