[libvirt] [PATCH] virsh: Switch to close callback

Michal Privoznik mprivozn at redhat.com
Thu Aug 2 17:22:17 UTC 2012


Since we've introduced close callbacks we can drop this SIGINT magic
(which doesn't work now neither) and fully utilize the new feature.
---
 tools/virsh.c |   45 ++++++++++++++++-----------------------------
 1 files changed, 16 insertions(+), 29 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 4670ee6..b95a008 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -568,31 +568,16 @@ static int disconnected = 0; /* we may have been disconnected */
 /*
  * vshCatchDisconnect:
  *
- * We get here when a SIGPIPE is being raised, we can't do much in the
- * handler, just save the fact it was raised
- */
-static void vshCatchDisconnect(int sig, siginfo_t *siginfo,
-                               void *context ATTRIBUTE_UNUSED) {
-    if (sig == SIGPIPE ||
-        (SA_SIGINFO && siginfo->si_signo == SIGPIPE))
-        disconnected++;
-}
-
-/*
- * vshSetupSignals:
- *
- * Catch SIGPIPE signals which may arise when disconnection
- * from libvirtd occurs
+ * We get here when the connection was closed.  We can't do much in the
+ * handler, just save the fact it was raised.
  */
 static void
-vshSetupSignals(void) {
-    struct sigaction sig_action;
-
-    sig_action.sa_sigaction = vshCatchDisconnect;
-    sig_action.sa_flags = SA_SIGINFO;
-    sigemptyset(&sig_action.sa_mask);
-
-    sigaction(SIGPIPE, &sig_action, NULL);
+vshCatchDisconnect(virConnectPtr conn ATTRIBUTE_UNUSED,
+                   int reason,
+                   void *opaque ATTRIBUTE_UNUSED)
+{
+    if (reason != VIR_CONNECT_CLOSE_REASON_CLIENT)
+        disconnected++;
 }
 
 /*
@@ -614,10 +599,15 @@ vshReconnect(vshControl *ctl)
     ctl->conn = virConnectOpenAuth(ctl->name,
                                    virConnectAuthPtrDefault,
                                    ctl->readonly ? VIR_CONNECT_RO : 0);
-    if (!ctl->conn)
+    if (!ctl->conn) {
         vshError(ctl, "%s", _("Failed to reconnect to the hypervisor"));
-    else if (connected)
-        vshError(ctl, "%s", _("Reconnected to the hypervisor"));
+    } else {
+        if (virConnectRegisterCloseCallback(ctl->conn, vshCatchDisconnect,
+                                            NULL, NULL) < 0)
+            vshError(ctl, "%s", _("Unable to register disconnect callback"));
+        if (connected)
+            vshError(ctl, "%s", _("Reconnected to the hypervisor"));
+    }
     disconnected = 0;
     ctl->useGetInfo = false;
     ctl->useSnapshotOld = false;
@@ -2458,9 +2448,6 @@ vshInit(vshControl *ctl)
     /* set up the library error handler */
     virSetErrorFunc(NULL, virshErrorHandler);
 
-    /* set up the signals handlers to catch disconnections */
-    vshSetupSignals();
-
     if (virEventRegisterDefaultImpl() < 0)
         return false;
 
-- 
1.7.8.6




More information about the libvir-list mailing list