[libvirt] [PATCH 2/3] virdbus: Add virDBusGetSessionBus helper

Daniel P. Berrange berrange at redhat.com
Tue Oct 9 08:54:30 UTC 2012


On Mon, Oct 08, 2012 at 04:57:48PM +0200, Alexander Larsson wrote:
> This splits out some common code from virDBusGetSystemBus and
> uses it to implement a new virDBusGetSessionBus helper.
> ---
>  src/util/virdbus.c | 84 +++++++++++++++++++++++++++++++++++++++++-------------
>  src/util/virdbus.h |  1 +
>  2 files changed, 65 insertions(+), 20 deletions(-)
> 
> diff --git a/src/util/virdbus.c b/src/util/virdbus.c
> index 4acce12..2dc7265 100644
> --- a/src/util/virdbus.c
> +++ b/src/util/virdbus.c
> @@ -32,40 +32,49 @@
>  #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 */
> diff --git a/src/util/virdbus.h b/src/util/virdbus.h
> index 27dca00..e443fbe 100644
> --- a/src/util/virdbus.h
> +++ b/src/util/virdbus.h
> @@ -30,5 +30,6 @@
>  # include "internal.h"
>  
>  DBusConnection *virDBusGetSystemBus(void);
> +DBusConnection *virDBusGetSessionBus(void);
>  
>  #endif /* __VIR_DBUS_H__ */

ACK, but we need to add a line to libvirt_private.syms when pushing


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list