From: Peter Krempa Date: Wed, 27 Mar 2013 13:37:01 +0000 (+0100) Subject: virsh: Register and unregister the close callback also in cmdConnect X-Git-Tag: v1.0.5-rc1~235 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69ab07560a134e82e36b6391be3c806d3dbdb16c;p=thirdparty%2Flibvirt.git virsh: Register and unregister the close callback also in cmdConnect This patch improves the error message after disconnecting from the hypervisor and adds the close callback operations required not to leak the callback reference. --- diff --git a/tools/virsh.c b/tools/virsh.c index 297591d13f..b7a5cc1f27 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -391,10 +391,14 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd) if (ctl->conn) { int ret; - if ((ret = virConnectClose(ctl->conn)) != 0) { - vshError(ctl, _("Failed to disconnect from the hypervisor, %d leaked reference(s)"), ret); - return false; - } + + 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 = NULL; } @@ -411,10 +415,16 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd) ctl->conn = virConnectOpenAuth(ctl->name, virConnectAuthPtrDefault, ctl->readonly ? VIR_CONNECT_RO : 0); - if (!ctl->conn) + if (!ctl->conn) { vshError(ctl, "%s", _("Failed to connect to the hypervisor")); + return false; + } + + if (virConnectRegisterCloseCallback(ctl->conn, vshCatchDisconnect, + NULL, NULL) < 0) + vshError(ctl, "%s", _("Unable to register disconnect callback")); - return !!ctl->conn; + return true; }