226 lines
7.6 KiB
Diff
226 lines
7.6 KiB
Diff
Return-Path: alexl@redhat.com
|
|
Received: from zmta04.collab.prod.int.phx2.redhat.com (LHLO
|
|
zmta04.collab.prod.int.phx2.redhat.com) (10.5.81.11) by
|
|
zmail20.collab.prod.int.phx2.redhat.com with LMTP; Tue, 9 Oct 2012 11:26:38
|
|
-0400 (EDT)
|
|
Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
|
|
by zmta04.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id D4096D0927
|
|
for <alexl@mail.corp.redhat.com>; Tue, 9 Oct 2012 11:26:38 -0400 (EDT)
|
|
Received: from localhost.localdomain (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1])
|
|
by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q99FQV93016417;
|
|
Tue, 9 Oct 2012 11:26:33 -0400
|
|
From: Alexander Larsson <alexl@redhat.com>
|
|
To: libvir-list@redhat.com
|
|
Cc: Alexander Larsson <alexl@redhat.com>
|
|
Subject: [PATCH 1/2] virdbus: Add virDBusGetSessionBus helper
|
|
Date: Tue, 9 Oct 2012 17:26:28 +0200
|
|
Message-Id: <1349796389-6122-2-git-send-email-alexl@redhat.com>
|
|
In-Reply-To: <1349796389-6122-1-git-send-email-alexl@redhat.com>
|
|
References: <1349796389-6122-1-git-send-email-alexl@redhat.com>
|
|
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
|
|
|
|
This splits out some common code from virDBusGetSystemBus and
|
|
uses it to implement a new virDBusGetSessionBus helper.
|
|
---
|
|
src/libvirt_private.syms | 1 +
|
|
src/util/virdbus.c | 84 ++++++++++++++++++++++++++++++++++++------------
|
|
src/util/virdbus.h | 1 +
|
|
3 files changed, 66 insertions(+), 20 deletions(-)
|
|
|
|
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
|
index a8c81e7..88f1b2f 100644
|
|
--- a/src/libvirt_private.syms
|
|
+++ b/src/libvirt_private.syms
|
|
@@ -1310,6 +1310,7 @@ virConsoleOpen;
|
|
|
|
# virdbus.h
|
|
virDBusGetSystemBus;
|
|
+virDBusGetSessionBus;
|
|
|
|
|
|
# virdomainlist.h
|
|
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__ */
|
|
--
|
|
1.7.12.1
|
|
|