[virt-viewer] [PATCH] Listen to virNetwork's Lifecycle events

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

 



Apart from the usual virDomain's Lifecycle events, we have to listen to
the virNetwork's Lifecycle events in order to get notifications about
libvirt deamon being started/stopped/restarted, which is useful when
connecting to guest through qemu+ssh://

Resolves: rhbz#1164052
https://bugzilla.redhat.com/show_bug.cgi?id=1164052
---
 src/virt-viewer.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 49 insertions(+), 4 deletions(-)

diff --git a/src/virt-viewer.c b/src/virt-viewer.c
index dc16b3f..c785f75 100644
--- a/src/virt-viewer.c
+++ b/src/virt-viewer.c
@@ -506,6 +506,38 @@ virt_viewer_domain_event(virConnectPtr conn G_GNUC_UNUSED,
     return 0;
 }
 
+static int
+virt_viewer_network_event(virConnectPtr conn G_GNUC_UNUSED,
+                          virNetworkPtr net G_GNUC_UNUSED,
+                          int event,
+                          int detail G_GNUC_UNUSED,
+                          void *opaque)
+{
+    VirtViewer *self = opaque;
+    VirtViewerApp *app = VIRT_VIEWER_APP(self);
+    GError *error = NULL;
+
+    g_debug("Got domain event %d %d", event, detail);
+
+    switch (event) {
+    case VIR_NETWORK_EVENT_STOPPED:
+        //virt_viewer_deactivate(self);
+        break;
+
+    case VIR_NETWORK_EVENT_STARTED:
+        virt_viewer_app_activate(app, &error);
+        if (error) {
+            /* we may want to consolidate error reporting in
+               app_activate() instead */
+            g_warning("%s", error->message);
+            g_clear_error(&error);
+        }
+        break;
+    }
+
+    return 0;
+}
+
 static void
 virt_viewer_conn_event(virConnectPtr conn G_GNUC_UNUSED,
                        int reason,
@@ -787,6 +819,8 @@ virt_viewer_connect(VirtViewerApp *app)
         .cbdata = app,
     };
     int oflags = 0;
+    int lifecycle_event = -1;
+    int network_event = -1;
     GError *error = NULL;
 
     if (!virt_viewer_app_get_attach(app))
@@ -820,10 +854,21 @@ virt_viewer_connect(VirtViewerApp *app)
         return -1;
     }
 
-    if (virConnectDomainEventRegister(priv->conn,
-                                      virt_viewer_domain_event,
-                                      self,
-                                      NULL) < 0)
+    lifecycle_event = virConnectDomainEventRegisterAny(priv->conn,
+                                                       priv->dom,
+                                                       VIR_DOMAIN_EVENT_ID_LIFECYCLE,
+                                                       VIR_DOMAIN_EVENT_CALLBACK(virt_viewer_domain_event),
+                                                       self,
+                                                       NULL);
+
+    network_event = virConnectNetworkEventRegisterAny(priv->conn,
+                                                      NULL,
+                                                      VIR_NETWORK_EVENT_ID_LIFECYCLE,
+                                                      VIR_NETWORK_EVENT_CALLBACK(virt_viewer_network_event),
+                                                      self,
+                                                      NULL);
+
+    if (lifecycle_event < 0 || network_event < 0)
         priv->withEvents = FALSE;
     else
         priv->withEvents = TRUE;
-- 
2.1.0

_______________________________________________
virt-tools-list mailing list
virt-tools-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/virt-tools-list




[Index of Archives]     [Linux Virtualization]     [KVM Development]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]     [Video 4 Linux]

  Powered by Linux