[libvirt] [PATCH] Pull DBus event code out into common area

Daniel P. Berrange berrange at redhat.com
Thu Apr 12 19:14:33 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

The policy kit and HAL node device drivers both require a
DBus connection. The HAL device code further requires that
the DBus connection is integrated with the event loop and
provides such glue logic itself.

The forthcoming FirewallD integration also requires a
dbus connection with event loop integration. Thus we need
to pull the current event loop glue out of the HAL driver.

Thus we create src/util/virdbus.{c,h} files. This contains
just one method virDBusGetSystemBus() which obtains a handle
to the single shared system bus instance, with event glue
automagically setup.

NB, I have not actually tested this on a system with HAL or
PolicyKit-0 installed, so it may well not compile. Hopefully
someone on list has a suitable system where they can test
those two. If not, I'll install a VM next week to test it in.

---
 .gitignore             |    6 ++--
 configure.ac           |    3 +-
 daemon/Makefile.am     |    3 +-
 daemon/libvirtd.c      |    4 ---
 src/Makefile.am        |    3 +-
 src/rpc/virnetserver.c |    6 ----
 src/rpc/virnetserver.h |    4 ---
 src/util/virdbus.c     |   68 ++++++++++++++++++++++-------------------------
 8 files changed, 40 insertions(+), 57 deletions(-)

diff --git a/.gitignore b/.gitignore
index 5aa9c9b..14a21d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,12 +48,12 @@
 /daemon/*_dispatch.h
 /daemon/libvirt_qemud
 /daemon/libvirtd
-/daemon/libvirtd.init
-/daemon/libvirtd.service
 /daemon/libvirtd*.logrotate
 /daemon/libvirtd.8
 /daemon/libvirtd.8.in
+/daemon/libvirtd.init
 /daemon/libvirtd.pod
+/daemon/libvirtd.service
 /docs/devhelp/libvirt.devhelp
 /docs/hvsupport.html.in
 /docs/libvirt-api.xml
@@ -118,6 +118,7 @@
 /tests/eventtest
 /tests/hashtest
 /tests/jsontest
+/tests/libvirtdconftest
 /tests/networkxml2argvtest
 /tests/nodeinfotest
 /tests/nwfilterxml2xmltest
@@ -150,7 +151,6 @@
 /tests/vmx2xmltest
 /tests/xencapstest
 /tests/xmconfigtest
-/tests/libvirtdconftest
 /tools/*.[18]
 /tools/libvirt-guests.init
 /tools/virsh
diff --git a/configure.ac b/configure.ac
index 3863119..f49b620 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1116,9 +1116,8 @@ if test "$with_dbus" = "yes" || test "$with_dbus" = "check" ; then
        AC_MSG_ERROR([You must install DBus >= $DBUS_REQUIRED to compile libvirt])
      fi])
 fi
-echo ">>>>>>>>>> $with_dbus <<<<<<<<<<<<<<<<<"
+
 if test "$with_dbus" = "yes" ; then
-echo ">>>>>>>>>> $with_dbus <<<<<<<<<<<<<<<<<"
   AC_DEFINE_UNQUOTED([HAVE_DBUS], 1, [enable communication with DBus])
 
   save_LIBS="$LIBS"
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 5d9f5d7..24cce8f 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -94,7 +94,7 @@ libvirtd_SOURCES = $(DAEMON_SOURCES)
 #-D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_POSIX_C_SOURCE=199506L
 libvirtd_CFLAGS = \
 	$(LIBXML_CFLAGS) $(GNUTLS_CFLAGS) $(SASL_CFLAGS) \
-	$(XDR_CFLAGS) $(POLKIT_CFLAGS) \
+	$(XDR_CFLAGS) $(POLKIT_CFLAGS) $(DBUS_CFLAGS) \
 	$(WARN_CFLAGS) \
 	$(COVERAGE_CFLAGS) \
 	-DQEMUD_PID_FILE="\"$(QEMUD_PID_FILE)\"" \
@@ -108,6 +108,7 @@ libvirtd_LDADD =					\
 	$(LIBXML_LIBS)					\
 	$(GNUTLS_LIBS)					\
 	$(SASL_LIBS)					\
+	$(DBUS_LIBS)					\
 	$(POLKIT_LIBS)
 
 if WITH_DTRACE_PROBES
diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index ce931d4..b098f6a 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -812,7 +812,6 @@ int main(int argc, char **argv) {
     struct daemonConfig *config;
     bool privileged = geteuid() == 0 ? true : false;
     bool implicit_conf = false;
-    bool use_polkit_dbus;
     char *run_dir = NULL;
     mode_t old_umask;
 
@@ -1008,8 +1007,6 @@ int main(int argc, char **argv) {
         goto cleanup;
     }
 
-    use_polkit_dbus = config->auth_unix_rw == REMOTE_AUTH_POLKIT ||
-            config->auth_unix_ro == REMOTE_AUTH_POLKIT;
     if (!(srv = virNetServerNew(config->min_workers,
                                 config->max_workers,
                                 config->prio_workers,
@@ -1018,7 +1015,6 @@ int main(int argc, char **argv) {
                                 config->keepalive_count,
                                 !!config->keepalive_required,
                                 config->mdns_adv ? config->mdns_name : NULL,
-                                use_polkit_dbus,
                                 remoteClientInitHook))) {
         ret = VIR_DAEMON_ERR_INIT;
         goto cleanup;
diff --git a/src/Makefile.am b/src/Makefile.am
index c6b7033..b8a19b4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1523,7 +1523,7 @@ libvirt_lxc_LDFLAGS = $(WARN_CFLAGS) $(AM_LDFLAGS)
 libvirt_lxc_LDADD = $(CAPNG_LIBS) $(YAJL_LIBS) \
 		$(LIBXML_LIBS) $(NUMACTL_LIBS) $(THREAD_LIBS) \
 		$(LIBNL_LIBS) $(AUDIT_LIBS) $(DEVMAPPER_LIBS) \
-		$(RT_LIBS) \
+		$(RT_LIBS) $(DBUS_LIBS) \
 		../gnulib/lib/libgnu.la
 if WITH_DTRACE_PROBES
 libvirt_lxc_LDADD += probes.o
@@ -1540,6 +1540,7 @@ libvirt_lxc_CFLAGS =				\
 		$(CAPNG_CFLAGS)			\
 		$(YAJL_CFLAGS)			\
 		$(AUDIT_CFLAGS)			\
+		$(DBUS_CFLAGS)			\
 		-I$(top_srcdir)/src/conf	\
 		$(AM_CFLAGS)
 if HAVE_LIBBLKID
diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index 0e0edd3..3965fc2 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -304,7 +304,6 @@ virNetServerPtr virNetServerNew(size_t min_workers,
                                 unsigned int keepaliveCount,
                                 bool keepaliveRequired,
                                 const char *mdnsGroupName,
-                                bool connectDBus ATTRIBUTE_UNUSED,
                                 virNetServerClientInitHook clientInitHook)
 {
     virNetServerPtr srv;
@@ -794,11 +793,6 @@ void virNetServerFree(virNetServerPtr srv)
     virNetServerMDNSFree(srv->mdns);
 #endif
 
-#if HAVE_DBUS
-    if (srv->sysbus)
-        dbus_connection_unref(srv->sysbus);
-#endif
-
     virNetServerUnlock(srv);
     virMutexDestroy(&srv->lock);
     VIR_FREE(srv);
diff --git a/src/rpc/virnetserver.h b/src/rpc/virnetserver.h
index a9dec18..0ebe00e 100644
--- a/src/rpc/virnetserver.h
+++ b/src/rpc/virnetserver.h
@@ -25,9 +25,6 @@
 # define __VIR_NET_SERVER_H__
 
 # include <signal.h>
-# if HAVE_DBUS
-#  include <dbus/dbus.h>
-# endif
 
 # include "virnettlscontext.h"
 # include "virnetserverprogram.h"
@@ -45,7 +42,6 @@ virNetServerPtr virNetServerNew(size_t min_workers,
                                 unsigned int keepaliveCount,
                                 bool keepaliveRequired,
                                 const char *mdnsGroupName,
-                                bool connectDBus,
                                 virNetServerClientInitHook clientInitHook);
 
 typedef int (*virNetServerAutoShutdownFunc)(virNetServerPtr srv, void *opaque);
diff --git a/src/util/virdbus.c b/src/util/virdbus.c
index 636cd45..badfe8c 100644
--- a/src/util/virdbus.c
+++ b/src/util/virdbus.c
@@ -22,6 +22,10 @@
 #include <config.h>
 
 #include "virdbus.h"
+#include "memory.h"
+#include "virterror_internal.h"
+#include "logging.h"
+#include "threads.h"
 
 #define VIR_FROM_THIS VIR_FROM_DBUS
 
@@ -33,7 +37,7 @@
 
 static DBusConnection *systembus = NULL;
 static virOnceControl once = VIR_ONCE_CONTROL_INITIALIZER;
-static DBusError err;
+static DBusError dbuserr;
 
 static dbus_bool_t virDBusAddWatch(DBusWatch *watch, void *data);
 static void virDBusRemoveWatch(DBusWatch *watch, void *data);
@@ -41,24 +45,21 @@ static void virDBusToggleWatch(DBusWatch *watch, void *data);
 
 static void virDBusSystemBusInit(void)
 {
-    DBusConnection *dbus_conn = NULL;
-    DBusError err;
-
     /* Allocate and initialize a new HAL context */
     dbus_connection_set_change_sigpipe(FALSE);
     dbus_threads_init_default();
 
-    dbus_error_init(&err);
-    if (!(systembus = dbus_bus_get(DBUS_BUS_SYSTEM, &err)))
+    dbus_error_init(&dbuserr);
+    if (!(systembus = dbus_bus_get(DBUS_BUS_SYSTEM, &dbuserr)))
         return;
 
     dbus_connection_set_exit_on_disconnect(systembus, FALSE);
 
     /* Register dbus watch callbacks */
     if (!dbus_connection_set_watch_functions(systembus,
-                                             add_dbus_watch,
-                                             remove_dbus_watch,
-                                             toggle_dbus_watch,
+                                             virDBusAddWatch,
+                                             virDBusRemoveWatch,
+                                             virDBusToggleWatch,
                                              NULL, NULL)) {
         systembus = NULL;
         return;
@@ -77,7 +78,7 @@ DBusConnection *virDBusGetSystemBus(void)
     if (!systembus) {
         virDBusReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Unable to get DBus system bus connection: %s"),
-                           err->message ? err->message : "watch setup failed");
+                           dbuserr.message ? dbuserr.message : "watch setup failed");
         return NULL;
     }
 
@@ -85,13 +86,11 @@ DBusConnection *virDBusGetSystemBus(void)
 }
 
 
-static void dbus_watch_callback(int fdatch ATTRIBUTE_UNUSED,
-                                int fd ATTRIBUTE_UNUSED,
-                                int events, void *opaque)
+static void virDBusWatchCallback(int fdatch ATTRIBUTE_UNUSED,
+                                 int fd ATTRIBUTE_UNUSED,
+                                 int events, void *opaque)
 {
     DBusWatch *watch = opaque;
-    LibHalContext *hal_ctx;
-    DBusConnection *dbus_conn;
     int dbus_flags = 0;
 
     if (events & VIR_EVENT_HANDLE_READABLE)
@@ -105,16 +104,12 @@ static void dbus_watch_callback(int fdatch ATTRIBUTE_UNUSED,
 
     (void)dbus_watch_handle(watch, dbus_flags);
 
-    nodeDeviceLock(driverState);
-    hal_ctx = DRV_STATE_HAL_CTX(driverState);
-    dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
-    nodeDeviceUnlock(driverState);
-    while (dbus_connection_dispatch(dbus_conn) == DBUS_DISPATCH_DATA_REMAINS)
+    while (dbus_connection_dispatch(systembus) == DBUS_DISPATCH_DATA_REMAINS)
         /* keep dispatching while data remains */;
 }
 
 
-static int xlate_dbus_watch_flags(int dbus_flags)
+static int virDBusTranslateWatchFlags(int dbus_flags)
 {
     unsigned int flags = 0;
     if (dbus_flags & DBUS_WATCH_READABLE)
@@ -129,50 +124,51 @@ static int xlate_dbus_watch_flags(int dbus_flags)
 }
 
 
-struct nodeDeviceWatchInfo
+struct virDBusWatch
 {
     int watch;
 };
 
-static void nodeDeviceWatchFree(void *data) {
-    struct nodeDeviceWatchInfo *info = data;
+static void virDBusWatchFree(void *data) {
+    struct virDBusWatch *info = data;
     VIR_FREE(info);
 }
 
-static dbus_bool_t add_dbus_watch(DBusWatch *watch,
+static dbus_bool_t virDBusAddWatch(DBusWatch *watch,
                                   void *data ATTRIBUTE_UNUSED)
 {
     int flags = 0;
     int fd;
-    struct nodeDeviceWatchInfo *info;
+    struct virDBusWatch *info;
 
     if (VIR_ALLOC(info) < 0)
         return 0;
 
     if (dbus_watch_get_enabled(watch))
-        flags = xlate_dbus_watch_flags(dbus_watch_get_flags(watch));
+        flags = virDBusTranslateWatchFlags(dbus_watch_get_flags(watch));
 
 # if HAVE_DBUS_WATCH_GET_UNIX_FD
     fd = dbus_watch_get_unix_fd(watch);
 # else
     fd = dbus_watch_get_fd(watch);
 # endif
-    info->watch = virEventAddHandle(fd, flags, dbus_watch_callback,
+    info->watch = virEventAddHandle(fd, flags,
+                                    virDBusWatchCallback,
                                     watch, NULL);
     if (info->watch < 0) {
         VIR_FREE(info);
         return 0;
     }
-    dbus_watch_set_data(watch, info, nodeDeviceWatchFree);
+    dbus_watch_set_data(watch, info, virDBusWatchFree);
 
     return 1;
 }
 
 
-static void remove_dbus_watch(DBusWatch *watch,
-                              void *data ATTRIBUTE_UNUSED)
+static void virDBusRemoveWatch(DBusWatch *watch,
+                               void *data ATTRIBUTE_UNUSED)
 {
-    struct nodeDeviceWatchInfo *info;
+    struct virDBusWatch *info;
 
     info = dbus_watch_get_data(watch);
 
@@ -180,14 +176,14 @@ static void remove_dbus_watch(DBusWatch *watch,
 }
 
 
-static void toggle_dbus_watch(DBusWatch *watch,
-                              void *data ATTRIBUTE_UNUSED)
+static void virDBusToggleWatch(DBusWatch *watch,
+                               void *data ATTRIBUTE_UNUSED)
 {
     int flags = 0;
-    struct nodeDeviceWatchInfo *info;
+    struct virDBusWatch *info;
 
     if (dbus_watch_get_enabled(watch))
-        flags = xlate_dbus_watch_flags(dbus_watch_get_flags(watch));
+        flags = virDBusTranslateWatchFlags(dbus_watch_get_flags(watch));
 
     info = dbus_watch_get_data(watch);
 
-- 
1.7.7.6




More information about the libvir-list mailing list