From: "Daniel P. Berrange" <berrange(a)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