[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