[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCHv2 4/4] 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.
---
 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]