if (last_error->code != VIR_ERR_NO_SUPPORT)
goto cleanup;
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
if (virDomainBlockStats(dom, device, &stats,
sizeof(stats)) == -1) {
virDomainFree(dom);
return false;
} else {
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
}
} else {
/* Only print something if a security model is active */
/* check if the command is actually supported */
if (last_error && last_error->code == VIR_ERR_NO_SUPPORT) {
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
goto fallback;
}
unsigned int newflags = flags & (VIR_CONNECT_LIST_DOMAINS_ACTIVE |
VIR_CONNECT_LIST_DOMAINS_INACTIVE);
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
if ((ret = virConnectListAllDomains(ctl->conn, &list->domains,
newflags)) >= 0) {
list->ndomains = ret;
if (has_managed_save < 0) {
if (last_error->code != VIR_ERR_NO_SUPPORT)
goto error;
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
has_managed_save = 0;
}
if (has_snapshots < 0) {
if (last_error->code != VIR_ERR_NO_SUPPORT)
goto error;
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
has_snapshots = 0;
}
if (has_snapshots) {
if (has_snapshots_metadata < 0) {
/* The server did not know the new flag, assume that all
snapshots have metadata. */
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
has_snapshots_metadata = has_snapshots;
} else {
/* The server knew the new flag, all aspects of
vshPrint(ctl,
_("Storage volume '%s'(%s) is not managed by libvirt. "
"Remove it manually.\n"), target, source);
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
continue;
}
vlist[nvols].source = source;
if (rc == 0 || (last_error->code != VIR_ERR_NO_SUPPORT &&
last_error->code != VIR_ERR_INVALID_ARG))
goto out;
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
}
/* The new API is unsupported or unsafe; fall back to doing things
virshReportError(ctl);
goto cleanup;
}
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
rc = virDomainHasManagedSaveImage(dom, 0);
if (rc < 0) {
/* No managed save image to remove */
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
} else if (rc > 0) {
if (virDomainManagedSaveRemove(dom, 0) < 0) {
virshReportError(ctl);
if (!tmp || virStrToLong_i(tmp + 1, &tmp, 10, &count) < 0)
count = -1;
}
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
VIR_FREE(xml);
}
} else {
vshPrint(ctl, "%d\n", count);
}
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
}
if (all || (maximum && live)) {
} else {
vshPrint(ctl, "%d\n", count);
}
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
}
if (all || (active && config)) {
} else {
vshPrint(ctl, "%d\n", count);
}
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
}
if (all || (active && live)) {
} else {
vshPrint(ctl, "%d\n", count);
}
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
}
virDomainFree(dom);
/* The server side libvirt doesn't support
* VIR_NETWORK_XML_INACTIVE, so retry without it.
*/
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
flags &= ~VIR_NETWORK_XML_INACTIVE;
doc = virNetworkGetXMLDesc(network, flags);
}
if (!(tmp_desc = virStoragePoolGetXMLDesc(pool, flags))) {
if (last_error->code == VIR_ERR_INVALID_ARG) {
flags &= ~VIR_STORAGE_XML_INACTIVE;
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
} else {
goto cleanup;
}
(flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT)) {
int persistent;
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
persistent = virDomainIsPersistent(dom);
if (persistent < 0) {
virshReportError(ctl);
virshReportError(ctl);
vshError(ctl, "%s", _("unable to determine if snapshot has parent"));
} else {
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
}
if (parent)
virDomainSnapshotFree(parent);
last_error->code == VIR_ERR_NO_SUPPORT)) {
/* We can emulate --from. */
/* XXX can we also emulate --leaves? */
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
ctl->useSnapshotOld = true;
flags &= ~VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS;
goto global;
/* XXX can we also emulate --leaves? */
if (!from && count < 0 && last_error->code == VIR_ERR_INVALID_ARG &&
(flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS)) {
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
roots = true;
flags &= ~VIR_DOMAIN_SNAPSHOT_LIST_ROOTS;
count = virDomainSnapshotNum(dom, flags);
if (result < 0 && force &&
last_error->code == VIR_ERR_SNAPSHOT_REVERT_RISKY) {
flags |= VIR_DOMAIN_SNAPSHOT_REVERT_FORCE;
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
result = virDomainRevertToSnapshot(snapshot, flags);
}
if (result < 0)
virDefaultErrorFunc(error);
}
+/*
+ * Reset libvirt error on graceful fallback paths
+ */
+static void
+vshResetLibvirtError(void)
+{
+ virFreeError(last_error);
+ last_error = NULL;
+}
+
/*
* Report an error when a command finishes. This is better than before
* (when correct operation would report errors), but it has some
vshError(ctl, "%s", last_error->message);
out:
- virFreeError(last_error);
- last_error = NULL;
+ vshResetLibvirtError();
}
static volatile sig_atomic_t intCaught = 0;