[libvirt] [PATCHv2 4/4] virsh: Register and unregister the close callback also in cmdConnect

Peter Krempa pkrempa at redhat.com
Wed Mar 27 14:05:35 UTC 2013


This patch improves the error message after disconnecting from the
hypervisor and adds the close callback operations required not to leak
the callback reference.
---
 tools/virsh.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 0f9bb28..9fb517f 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -391,10 +391,15 @@ 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, _("Leaked %d reference(s) after disconnect "
+                            "from the hypervisor"), ret);
+
         ctl->conn = NULL;
     }

@@ -411,10 +416,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;
+    }

-    return !!ctl->conn;
+    if (virConnectRegisterCloseCallback(ctl->conn, vshCatchDisconnect,
+                                        NULL, NULL) < 0)
+        vshError(ctl, "%s", _("Unable to register disconnect callback"));
+
+    return true;
 }


-- 
1.8.1.5




More information about the libvir-list mailing list