]> xenbits.xensource.com Git - libvirt.git/commitdiff
virdbus: Add virDBusGetSessionBus helper
authorAlexander Larsson <alexl@redhat.com>
Wed, 31 Oct 2012 19:03:49 +0000 (19:03 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 27 Nov 2012 19:37:00 +0000 (19:37 +0000)
This splits out some common code from virDBusGetSystemBus and
uses it to implement a new virDBusGetSessionBus helper.

src/libvirt_private.syms
src/util/virdbus.c
src/util/virdbus.h

index 63e187a45c499ae1a17e845f98ace8838a734fab..05ef0f698f24a144597ca08a4726507f5b77f1c8 100644 (file)
@@ -1335,6 +1335,7 @@ virConsoleOpen;
 
 
 # virdbus.h
+virDBusGetSessionBus;
 virDBusGetSystemBus;
 
 
index 4acce129309fba02077e79fef6f673d14cff44f1..2a96778d82f7cc671427ab622e9849d369101b9e 100644 (file)
 #ifdef HAVE_DBUS
 
 static DBusConnection *systembus = NULL;
-static virOnceControl once = VIR_ONCE_CONTROL_INITIALIZER;
-static DBusError dbuserr;
+static DBusConnection *sessionbus = NULL;
+static virOnceControl systemonce = VIR_ONCE_CONTROL_INITIALIZER;
+static virOnceControl sessiononce = VIR_ONCE_CONTROL_INITIALIZER;
+static DBusError systemdbuserr;
+static DBusError sessiondbuserr;
 
 static dbus_bool_t virDBusAddWatch(DBusWatch *watch, void *data);
 static void virDBusRemoveWatch(DBusWatch *watch, void *data);
 static void virDBusToggleWatch(DBusWatch *watch, void *data);
 
-static void virDBusSystemBusInit(void)
+static DBusConnection *virDBusBusInit(DBusBusType type, DBusError *dbuserr)
 {
+    DBusConnection *bus;
+
     /* Allocate and initialize a new HAL context */
     dbus_connection_set_change_sigpipe(FALSE);
     dbus_threads_init_default();
 
-    dbus_error_init(&dbuserr);
-    if (!(systembus = dbus_bus_get(DBUS_BUS_SYSTEM, &dbuserr)))
-        return;
+    dbus_error_init(dbuserr);
+    if (!(bus = dbus_bus_get(type, dbuserr)))
+        return NULL;
 
-    dbus_connection_set_exit_on_disconnect(systembus, FALSE);
+    dbus_connection_set_exit_on_disconnect(bus, FALSE);
 
     /* Register dbus watch callbacks */
-    if (!dbus_connection_set_watch_functions(systembus,
+    if (!dbus_connection_set_watch_functions(bus,
                                              virDBusAddWatch,
                                              virDBusRemoveWatch,
                                              virDBusToggleWatch,
-                                             NULL, NULL)) {
-        systembus = NULL;
-        return;
+                                             bus, NULL)) {
+        return NULL;
     }
+    return bus;
 }
 
+static void virDBusSystemBusInit(void)
+{
+    systembus = virDBusBusInit(DBUS_BUS_SYSTEM, &systemdbuserr);
+}
 
 DBusConnection *virDBusGetSystemBus(void)
 {
-    if (virOnce(&once, virDBusSystemBusInit) < 0) {
+    if (virOnce(&systemonce, virDBusSystemBusInit) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("Unable to run one time DBus initializer"));
         return NULL;
@@ -74,7 +83,7 @@ DBusConnection *virDBusGetSystemBus(void)
     if (!systembus) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unable to get DBus system bus connection: %s"),
-                       dbuserr.message ? dbuserr.message : "watch setup failed");
+                       systemdbuserr.message ? systemdbuserr.message : "watch setup failed");
         return NULL;
     }
 
@@ -82,13 +91,45 @@ DBusConnection *virDBusGetSystemBus(void)
 }
 
 
+static void virDBusSessionBusInit(void)
+{
+    sessionbus = virDBusBusInit(DBUS_BUS_SESSION, &sessiondbuserr);
+}
+
+DBusConnection *virDBusGetSessionBus(void)
+{
+    if (virOnce(&sessiononce, virDBusSessionBusInit) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Unable to run one time DBus initializer"));
+        return NULL;
+    }
+
+    if (!sessionbus) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Unable to get DBus session bus connection: %s"),
+                       sessiondbuserr.message ? sessiondbuserr.message : "watch setup failed");
+        return NULL;
+    }
+
+    return sessionbus;
+}
+
+struct virDBusWatch
+{
+    int watch;
+    DBusConnection *bus;
+};
+
 static void virDBusWatchCallback(int fdatch ATTRIBUTE_UNUSED,
                                  int fd ATTRIBUTE_UNUSED,
                                  int events, void *opaque)
 {
     DBusWatch *watch = opaque;
+    struct virDBusWatch *info;
     int dbus_flags = 0;
 
+    info = dbus_watch_get_data(watch);
+
     if (events & VIR_EVENT_HANDLE_READABLE)
         dbus_flags |= DBUS_WATCH_READABLE;
     if (events & VIR_EVENT_HANDLE_WRITABLE)
@@ -100,7 +141,7 @@ static void virDBusWatchCallback(int fdatch ATTRIBUTE_UNUSED,
 
     (void)dbus_watch_handle(watch, dbus_flags);
 
-    while (dbus_connection_dispatch(systembus) == DBUS_DISPATCH_DATA_REMAINS)
+    while (dbus_connection_dispatch(info->bus) == DBUS_DISPATCH_DATA_REMAINS)
         /* keep dispatching while data remains */;
 }
 
@@ -120,18 +161,13 @@ static int virDBusTranslateWatchFlags(int dbus_flags)
 }
 
 
-struct virDBusWatch
-{
-    int watch;
-};
-
 static void virDBusWatchFree(void *data) {
     struct virDBusWatch *info = data;
     VIR_FREE(info);
 }
 
 static dbus_bool_t virDBusAddWatch(DBusWatch *watch,
-                                  void *data ATTRIBUTE_UNUSED)
+                                   void *data)
 {
     int flags = 0;
     int fd;
@@ -148,6 +184,7 @@ static dbus_bool_t virDBusAddWatch(DBusWatch *watch,
 # else
     fd = dbus_watch_get_fd(watch);
 # endif
+    info->bus = (DBusConnection *)data;
     info->watch = virEventAddHandle(fd, flags,
                                     virDBusWatchCallback,
                                     watch, NULL);
@@ -194,4 +231,11 @@ DBusConnection *virDBusGetSystemBus(void)
     return NULL;
 }
 
+DBusConnection *virDBusGetSessionBus(void)
+{
+    virReportError(VIR_ERR_INTERNAL_ERROR,
+                   "%s", _("DBus support not compiled into this binary"));
+    return NULL;
+}
+
 #endif /* ! HAVE_DBUS */
index 27dca00f679b46c223aeeddc847a227cf611fd5d..e443fbe3fab5e770f31df8120dbae09bd469147d 100644 (file)
@@ -30,5 +30,6 @@
 # include "internal.h"
 
 DBusConnection *virDBusGetSystemBus(void);
+DBusConnection *virDBusGetSessionBus(void);
 
 #endif /* __VIR_DBUS_H__ */