[libvirt PATCH 11/14] src/nwfilter/nwfilter_driver: convert to use GLib DBus

Pavel Hrdina phrdina at redhat.com
Thu Sep 17 08:29:46 UTC 2020


Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 src/nwfilter/meson.build       |   1 -
 src/nwfilter/nwfilter_driver.c | 127 ++++++++++++---------------------
 2 files changed, 46 insertions(+), 82 deletions(-)

diff --git a/src/nwfilter/meson.build b/src/nwfilter/meson.build
index dcdc30f373..715282ee77 100644
--- a/src/nwfilter/meson.build
+++ b/src/nwfilter/meson.build
@@ -17,7 +17,6 @@ if conf.has('WITH_NWFILTER')
     ],
     dependencies: [
       access_dep,
-      dbus_dep,
       libnl_dep,
       libpcap_dep,
       src_dep,
diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
index 77c4467816..1b8e3dbad3 100644
--- a/src/nwfilter/nwfilter_driver.c
+++ b/src/nwfilter/nwfilter_driver.c
@@ -24,7 +24,7 @@
 
 #include <config.h>
 
-#include "virdbus.h"
+#include "virgdbus.h"
 #include "virlog.h"
 
 #include "internal.h"
@@ -50,17 +50,6 @@
 
 VIR_LOG_INIT("nwfilter.nwfilter_driver");
 
-#define DBUS_RULE_FWD_NAMEOWNERCHANGED \
-    "type='signal'" \
-    ",interface='"DBUS_INTERFACE_DBUS"'" \
-    ",member='NameOwnerChanged'" \
-    ",arg0='org.fedoraproject.FirewallD1'"
-
-#define DBUS_RULE_FWD_RELOADED \
-    "type='signal'" \
-    ",interface='org.fedoraproject.FirewallD1'" \
-    ",member='Reloaded'"
-
 
 static virNWFilterDriverStatePtr driver;
 
@@ -79,36 +68,30 @@ static void nwfilterDriverUnlock(void)
 
 #ifdef WITH_FIREWALLD
 
-static DBusHandlerResult
-nwfilterFirewalldDBusFilter(DBusConnection *connection G_GNUC_UNUSED,
-                            DBusMessage *message,
-                            void *user_data G_GNUC_UNUSED)
+static void
+nwfilterFirewalldDBusSignalCallback(GDBusConnection *connection G_GNUC_UNUSED,
+                                    const char *senderName G_GNUC_UNUSED,
+                                    const char *objectPath G_GNUC_UNUSED,
+                                    const char *interfaceName G_GNUC_UNUSED,
+                                    const char *signalName G_GNUC_UNUSED,
+                                    GVariant *parameters G_GNUC_UNUSED,
+                                    gpointer user_data G_GNUC_UNUSED)
 {
-    if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS,
-                               "NameOwnerChanged") ||
-        dbus_message_is_signal(message, "org.fedoraproject.FirewallD1",
-                               "Reloaded")) {
-        VIR_DEBUG("Reload in nwfilter_driver because of firewalld.");
-        nwfilterStateReload();
-    }
-
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    nwfilterStateReload();
 }
 
+static unsigned int restartID;
+static unsigned int reloadID;
+
 static void
 nwfilterDriverRemoveDBusMatches(void)
 {
-    DBusConnection *sysbus;
+    GDBusConnection *sysbus;
 
-    sysbus = virDBusGetSystemBus();
+    sysbus = virGDBusGetSystemBus();
     if (sysbus) {
-        dbus_bus_remove_match(sysbus,
-                              DBUS_RULE_FWD_NAMEOWNERCHANGED,
-                              NULL);
-        dbus_bus_remove_match(sysbus,
-                              DBUS_RULE_FWD_RELOADED,
-                              NULL);
-        dbus_connection_remove_filter(sysbus, nwfilterFirewalldDBusFilter, NULL);
+        g_dbus_connection_signal_unsubscribe(sysbus, restartID);
+        g_dbus_connection_signal_unsubscribe(sysbus, reloadID);
     }
 }
 
@@ -117,33 +100,29 @@ nwfilterDriverRemoveDBusMatches(void)
  *
  * Startup DBus matches for monitoring the state of firewalld
  */
-static int
-nwfilterDriverInstallDBusMatches(DBusConnection *sysbus)
+static void
+nwfilterDriverInstallDBusMatches(GDBusConnection *sysbus)
 {
-    int ret = 0;
-
-    if (!sysbus) {
-        ret = -1;
-    } else {
-        /* add matches for
-         * NameOwnerChanged on org.freedesktop.DBus for firewalld start/stop
-         * Reloaded on org.fedoraproject.FirewallD1 for firewalld reload
-         */
-        dbus_bus_add_match(sysbus,
-                           DBUS_RULE_FWD_NAMEOWNERCHANGED,
-                           NULL);
-        dbus_bus_add_match(sysbus,
-                           DBUS_RULE_FWD_RELOADED,
-                           NULL);
-        if (!dbus_connection_add_filter(sysbus, nwfilterFirewalldDBusFilter,
-                                        NULL, NULL)) {
-            VIR_WARN(("Adding a filter to the DBus connection failed"));
-            nwfilterDriverRemoveDBusMatches();
-            ret =  -1;
-        }
-    }
-
-    return ret;
+    restartID = g_dbus_connection_signal_subscribe(sysbus,
+                                                   NULL,
+                                                   "org.freedesktop.DBus",
+                                                   "NameOwnerChanged",
+                                                   NULL,
+                                                   "org.fedoraproject.FirewallD1",
+                                                   G_DBUS_SIGNAL_FLAGS_NONE,
+                                                   nwfilterFirewalldDBusSignalCallback,
+                                                   NULL,
+                                                   NULL);
+    reloadID = g_dbus_connection_signal_subscribe(sysbus,
+                                                  NULL,
+                                                  "org.fedoraproject.FirewallD1",
+                                                  "Reloaded",
+                                                  NULL,
+                                                  NULL,
+                                                  G_DBUS_SIGNAL_FLAGS_NONE,
+                                                  nwfilterFirewalldDBusSignalCallback,
+                                                  NULL,
+                                                  NULL);
 }
 
 #else /* WITH_FIREWALLD */
@@ -153,10 +132,9 @@ nwfilterDriverRemoveDBusMatches(void)
 {
 }
 
-static int
-nwfilterDriverInstallDBusMatches(DBusConnection *sysbus G_GNUC_UNUSED)
+static void
+nwfilterDriverInstallDBusMatches(GDBusConnection *sysbus G_GNUC_UNUSED)
 {
-    return 0;
 }
 
 #endif /* WITH_FIREWALLD */
@@ -181,7 +159,7 @@ nwfilterStateInitialize(bool privileged,
                         virStateInhibitCallback callback G_GNUC_UNUSED,
                         void *opaque G_GNUC_UNUSED)
 {
-    DBusConnection *sysbus = NULL;
+    GDBusConnection *sysbus = NULL;
 
     if (root != NULL) {
         virReportError(VIR_ERR_INVALID_ARG, "%s",
@@ -189,8 +167,8 @@ nwfilterStateInitialize(bool privileged,
         return -1;
     }
 
-    if (virDBusHasSystemBus() &&
-        !(sysbus = virDBusGetSystemBus()))
+    if (virGDBusHasSystemBus() &&
+        !(sysbus = virGDBusGetSystemBus()))
         return VIR_DRV_STATE_INIT_ERROR;
 
     driver = g_new0(virNWFilterDriverState, 1);
@@ -241,21 +219,8 @@ nwfilterStateInitialize(bool privileged,
      * startup the DBus late so we don't get a reload signal while
      * initializing
      */
-    if (sysbus &&
-        nwfilterDriverInstallDBusMatches(sysbus) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("DBus matches could not be installed. "
-                       "Disabling nwfilter driver"));
-        /*
-         * unfortunately this is fatal since virNWFilterTechDriversInit
-         * may have caused the ebiptables driver to use the firewall tool
-         * but now that the watches don't work, we just disable the nwfilter
-         * driver
-         *
-         * This may only happen if the system bus is available.
-         */
-        goto error;
-    }
+    if (sysbus)
+        nwfilterDriverInstallDBusMatches(sysbus);
 
     driver->configDir = g_strdup(SYSCONFDIR "/libvirt/nwfilter");
 
-- 
2.26.2




More information about the libvir-list mailing list