From: Viktor Mihajlovski Date: Tue, 26 Mar 2013 09:54:55 +0000 (+0100) Subject: virsh: Unregister the connection close notifier upon termination X-Git-Tag: v1.0.5-rc1~237 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e964ba2786f6736613de1f14db4d3407f6928f50;p=thirdparty%2Flibvirt.git virsh: Unregister the connection close notifier upon termination Before closing the connection we unregister the close callback to prevent a reference leak. Further, the messages on virConnectClose != 0 are a bit more specific now. Signed-off-by: Viktor Mihajlovski --- diff --git a/tools/virsh.c b/tools/virsh.c index 7ff12ec24f..d6c0e8cd2d 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -321,9 +321,18 @@ vshReconnect(vshControl *ctl) { bool connected = false; - if (ctl->conn != NULL) { + if (ctl->conn) { + int ret; + connected = true; - virConnectClose(ctl->conn); + + virConnectUnregisterCloseCallback(ctl->conn, vshCatchDisconnect); + ret = virConnectClose(ctl->conn); + if (ret < 0) + vshError(ctl, "%s", _("Failed to disconnect from the hypervisor")); + else if (ret > 0) + vshError(ctl, "%s", _("One or more references were leaked after " + "disconnect from the hypervisor")); } ctl->conn = virConnectOpenAuth(ctl->name, @@ -2660,9 +2669,13 @@ vshDeinit(vshControl *ctl) VIR_FREE(ctl->name); if (ctl->conn) { int ret; - if ((ret = virConnectClose(ctl->conn)) != 0) { - vshError(ctl, _("Failed to disconnect from the hypervisor, %d leaked reference(s)"), ret); - } + virConnectUnregisterCloseCallback(ctl->conn, vshCatchDisconnect); + ret = virConnectClose(ctl->conn); + if (ret < 0) + vshError(ctl, "%s", _("Failed to disconnect from the hypervisor")); + else if (ret > 0) + vshError(ctl, "%s", _("One or more references were leaked after " + "disconnect from the hypervisor")); } virResetLastError();