]> xenbits.xensource.com Git - libvirt.git/commitdiff
Optional dlopen support for drivers
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 21 Nov 2008 12:16:08 +0000 (12:16 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 21 Nov 2008 12:16:08 +0000 (12:16 +0000)
16 files changed:
ChangeLog
configure.in
qemud/Makefile.am
qemud/qemud.c
src/Makefile.am
src/driver.c [new file with mode: 0644]
src/driver.h
src/libvirt.c
src/libvirt_sym.version.in
src/qemu_driver.c
src/qemu_driver.h
src/xen_unified.c
src/xen_unified.h
tests/Makefile.am
tests/testutils.c
tests/xmconfigtest.c

index 6af32c70ed00c0f5b013792ec83e236ba9174eb6..236e9655f5836e95d7aeca42ab1fb184697e5005 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+Fri Nov 21 12:03:14 BST 2008 Daniel P. Berrange <berrange@redhat.com>
+
+       Optional (disabled by default) dlopen support
+       * configure.in: Probe for dlopen
+       * qemud/Makefile.am: Don't link to drivers when dlopen is used
+       * qemud/qemud.c: Load external driver modules at startup
+       * src/Makefile.am: Don't link to drivers when dlopen is used
+       * src/driver.c, src/driver.h: Add API for dlopen'ing modules
+       * src/libvirt.c: Load external driver modules at startup
+       * src/libvirt_sym.version.in: Export more internal symbols
+       needed for external driver modules
+       * src/qemud_driver.c, src/qemu_driver.h, src/xen_unified.c,
+       src/xen_unified.h: Sanitize driver registration methodname
+       to match module name
+       * tests/Makefile.am: Set LIBVIRT_DRIVER_DIR when running
+       tests with dlopen enabled. Link to driver modules in Xen
+       test cases
+       * tests/testutils.c: Set LIBVIRT_DRIVER_DIR when running
+       external programs
+       * tests/xmconfigtest.c: Don't open test driver during xen
+       tests.
+
 Fri Nov 21 11:43:14 BST 2008 Daniel P. Berrange <berrange@redhat.com>
 
        * src/libvirt_sym.version.in: Add export of domain event
index 21931a131da188a446cbbbb62811a43d95cdf00e..25dcc38e49c3b09076891e3566dabb8242c2a705 100644 (file)
@@ -1066,6 +1066,38 @@ dnl Look for windres to build a Windows icon resource.
 AC_CHECK_TOOL([WINDRES], [windres], [no])
 AM_CONDITIONAL([WITH_WIN_ICON], [test "$WINDRES" != "no"])
 
+
+
+dnl Driver-Modules library
+AC_ARG_WITH([driver-modules],
+  [  --with-driver-modules       build drivers as loadable modules],
+  [],
+  [with_driver_modules=no])
+
+DRIVER_MODULES_CFLAGS=
+DRIVER_MODULES_LIBS=
+if test "x$with_driver_modules" = "xyes" ; then
+  old_cflags="$CFLAGS"
+  old_libs="$LIBS"
+  fail=0
+  AC_CHECK_HEADER([dlfcn.h],[],[fail=1])
+  AC_CHECK_LIB([dl], [dlopen],[],[fail=1])
+  test $fail = 1 &&
+      AC_MSG_ERROR([You must have dlfcn.h / dlopen() support to build driver modules])
+
+  CFLAGS="$old_cflags"
+  LIBS="$old_libs"
+fi
+if test "$with_driver_modules" = "yes"; then
+  DRIVER_MODULES_CFLAGS="-export-dynamic"
+  DRIVER_MODULES_LIBS="-ldl"
+  AC_DEFINE_UNQUOTED([WITH_DRIVER_MODULES], 1, [whether to build drivers as modules])
+fi
+AM_CONDITIONAL([WITH_DRIVER_MODULES], [test "$with_driver_modules" != "no"])
+AC_SUBST([DRIVER_MODULES_CFLAGS])
+AC_SUBST([DRIVER_MODULES_LIBS])
+
+
 # Set LV_LIBTOOL_OBJDIR to "." or $lt_cv_objdir, depending on whether
 # we're building shared libraries.  This is the name of the directory
 # in which .o files will be created.
@@ -1122,6 +1154,14 @@ AC_MSG_NOTICE([     LVM: $with_storage_lvm])
 AC_MSG_NOTICE([   iSCSI: $with_storage_iscsi])
 AC_MSG_NOTICE([    Disk: $with_storage_disk])
 AC_MSG_NOTICE([])
+AC_MSG_NOTICE([Driver Loadable Modules])
+AC_MSG_NOTICE([])
+if test "$with_driver_modules" != "no" ; then
+AC_MSG_NOTICE([  dlopen: $DRIVER_MODULES_CFLAGS $DRIVER_MODULES_LIBS])
+else
+AC_MSG_NOTICE([  dlopen: no])
+fi
+AC_MSG_NOTICE([])
 AC_MSG_NOTICE([Libraries])
 AC_MSG_NOTICE([])
 AC_MSG_NOTICE([  libxml: $LIBXML_CFLAGS $LIBXML_LIBS])
index b271796221caf7ec0621cdc0715e1c17f1b710a3..1e56b0bdb0f8382cd677550c541e7add7a462dc0 100644 (file)
@@ -91,6 +91,7 @@ libvirtd_DEPENDENCIES = ../src/libvirt.la
 libvirtd_LDADD =                                       \
                ../gnulib/lib/libgnu.la
 
+if ! WITH_DRIVER_MODULES
 if WITH_QEMU
 libvirtd_LDADD += ../src/libvirt_driver_qemu.la
 endif
@@ -110,6 +111,7 @@ endif
 if WITH_NETWORK
 libvirtd_LDADD += ../src/libvirt_driver_network.la
 endif
+endif
 
 libvirtd_LDADD += ../src/libvirt.la
 
index bb5cfcdcc16b7f90274ff1b7ab439ec7e9ba77a0..191164cab91b1d6eadb4e5bd60d3c68a9035d356 100644 (file)
@@ -61,6 +61,9 @@
 #include "mdns.h"
 #endif
 
+#ifdef WITH_DRIVER_MODULES
+#include "driver.h"
+#else
 #ifdef WITH_QEMU
 #include "qemu_driver.h"
 #endif
@@ -76,6 +79,7 @@
 #ifdef WITH_STORAGE_DIR
 #include "storage_driver.h"
 #endif
+#endif
 
 
 static int godaemon = 0;        /* -d: Be a daemon */
@@ -748,8 +752,20 @@ static struct qemud_server *qemudInitialize(int sigread) {
 
     virInitialize();
 
+#ifdef WITH_DRIVER_MODULES
+    /* We don't care if any of these fail, because the whole point
+     * is to allow users to only install modules they want to use.
+     * If they try to use a open a connection for a module that
+     * is not loaded they'll get a suitable error at that point
+     */
+    virDriverLoadModule("qemu");
+    virDriverLoadModule("lxc");
+    virDriverLoadModule("uml");
+    virDriverLoadModule("network");
+    virDriverLoadModule("storage");
+#else
 #ifdef WITH_QEMU
-    qemudRegister();
+    qemuRegister();
 #endif
 #ifdef WITH_LXC
     lxcRegister();
@@ -762,6 +778,7 @@ static struct qemud_server *qemudInitialize(int sigread) {
 #endif
 #ifdef WITH_STORAGE_DIR
     storageRegister();
+#endif
 #endif
 
     virEventRegisterImpl(virEventAddHandleImpl,
index 6e6b4d2dd8be6ffe11a9cc4c46c1abdc48179b20..a7ae633ac0618bd7e08da9676752cf7a6241e743 100644 (file)
@@ -6,7 +6,10 @@ INCLUDES = \
           -I@top_srcdir@/include \
           -I@top_srcdir@/qemud \
           $(LIBXML_CFLAGS) \
+          $(XEN_CFLAGS) \
           $(SELINUX_CFLAGS) \
+          $(DRIVER_MODULE_CFLAGS) \
+          -DLIBDIR=\""$(libdir)"\" \
           -DBINDIR=\""$(libexecdir)"\" \
           -DSBINDIR=\""$(sbindir)"\" \
           -DSYSCONF_DIR="\"$(sysconfdir)\"" \
@@ -30,6 +33,10 @@ EXTRA_DIST = libvirt_sym.version $(conf_DATA) $(ICON_FILES)
 
 lib_LTLIBRARIES = libvirt.la
 
+moddir = $(libdir)/libvirt/drivers
+mod_LTLIBRARIES =
+
+
 # These files are not related to driver APIs. Simply generic
 # helper APIs for various purposes
 UTIL_SOURCES =                                                 \
@@ -49,7 +56,7 @@ UTIL_SOURCES =                                                        \
 
 # Internal generic driver infrastructure
 DRIVER_SOURCES =                                               \
-               driver.h                                        \
+               driver.c driver.h                               \
                internal.h                                      \
                datatypes.c datatypes.h                         \
                domain_event.c domain_event.h                   \
@@ -169,73 +176,138 @@ libvirt_driver_la_CFLAGS = $(XEN_CFLAGS)
 libvirt_driver_la_LDFLAGS = $(XEN_LIBS)
 
 if WITH_TEST
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_test.la
+else
 noinst_LTLIBRARIES += libvirt_driver_test.la
 libvirt_la_LIBADD += libvirt_driver_test.la
+endif
+if WITH_DRIVER_MODULES
+libvirt_driver_test_la_LDFLAGS = -module -avoid-version
+endif
 libvirt_driver_test_la_SOURCES = $(TEST_DRIVER_SOURCES)
 endif
 
 if WITH_REMOTE
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_remote.la
+else
 noinst_LTLIBRARIES += libvirt_driver_remote.la
 libvirt_la_LIBADD += libvirt_driver_remote.la
+endif
 libvirt_driver_remote_la_CFLAGS =                              \
                $(GNUTLS_CFLAGS)                                \
                $(SASL_CFLAGS)
 libvirt_driver_remote_la_LDFLAGS =                             \
                $(GNUTLS_LIBS)                                  \
                $(SASL_LIBS)
+if WITH_DRIVER_MODULES
+libvirt_driver_remote_la_LDFLAGS += -module -avoid-version
+endif
 libvirt_driver_remote_la_SOURCES = $(REMOTE_DRIVER_SOURCES)
 endif
 
 if WITH_XEN
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_xen.la
+else
 noinst_LTLIBRARIES += libvirt_driver_xen.la
 libvirt_la_LIBADD += libvirt_driver_xen.la
+endif
 libvirt_driver_xen_la_CFLAGS = $(XEN_CFLAGS)
 libvirt_driver_xen_la_LDFLAGS = $(XEN_LIBS)
+if WITH_DRIVER_MODULES
+libvirt_driver_xen_la_LDFLAGS += -module -avoid-version
+endif
 libvirt_driver_xen_la_SOURCES = $(XEN_DRIVER_SOURCES)
 endif
 
 if WITH_OPENVZ
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_openvz.la
+else
 noinst_LTLIBRARIES += libvirt_driver_openvz.la
 libvirt_la_LIBADD += libvirt_driver_openvz.la
+endif
+if WITH_DRIVER_MODULES
+libvirt_driver_openvz_la_LDFLAGS = -module -avoid-version
+endif
 libvirt_driver_openvz_la_SOURCES = $(OPENVZ_DRIVER_SOURCES)
 endif
 
 if WITH_QEMU
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_qemu.la
+else
 noinst_LTLIBRARIES += libvirt_driver_qemu.la
 # Stateful, so linked to daemon instead
 #libvirt_la_LIBADD += libvirt_driver_qemu.la
+endif
 libvirt_driver_qemu_la_CFLAGS = $(NUMACTL_CFLAGS)
 libvirt_driver_qemu_la_LDFLAGS = $(NUMACTL_LIBS)
+if WITH_DRIVER_MODULES
+libvirt_driver_qemu_la_LDFLAGS += -module -avoid-version
+endif
 libvirt_driver_qemu_la_SOURCES = $(QEMU_DRIVER_SOURCES)
 endif
 
 if WITH_LXC
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_lxc.la
+else
 noinst_LTLIBRARIES += libvirt_driver_lxc.la
 # Stateful, so linked to daemon instead
 #libvirt_la_LIBADD += libvirt_driver_lxc.la
+endif
+if WITH_DRIVER_MODULES
+libvirt_driver_lxc_la_LDFLAGS = -module -avoid-version
+endif
 libvirt_driver_lxc_la_SOURCES = $(LXC_DRIVER_SOURCES)
 endif
 
 if WITH_UML
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_uml.la
+else
 noinst_LTLIBRARIES += libvirt_driver_uml.la
 # Stateful, so linked to daemon instead
 #libvirt_la_LIBADD += libvirt_driver_uml.la
+endif
+libvirt_driver_uml_la_CFLAGS = $(NUMACTL_CFLAGS)
+libvirt_driver_uml_la_LDFLAGS = $(NUMACTL_LIBS)
+if WITH_DRIVER_MODULES
+libvirt_driver_uml_la_LDFLAGS += -module -avoid-version
+endif
 libvirt_driver_uml_la_SOURCES = $(UML_DRIVER_SOURCES)
 endif
 
 if WITH_NETWORK
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_network.la
+else
 noinst_LTLIBRARIES += libvirt_driver_network.la
 # Stateful, so linked to daemon instead
 #libvirt_la_LIBADD += libvirt_driver_network.la
+endif
+if WITH_DRIVER_MODULES
+libvirt_driver_network_la_LDFLAGS = -module -avoid-version
+endif
 libvirt_driver_network_la_SOURCES = $(NETWORK_DRIVER_SOURCES)
 endif
 
 # Needed to keep automake quiet about conditionals
 libvirt_driver_storage_la_SOURCES =
 if WITH_STORAGE_DIR
+if WITH_DRIVER_MODULES
+mod_LTLIBRARIES += libvirt_driver_storage.la
+else
 noinst_LTLIBRARIES += libvirt_driver_storage.la
 # Stateful, so linked to daemon instead
 #libvirt_la_LIBADD += libvirt_driver_storage.la
+endif
+if WITH_DRIVER_MODULES
+libvirt_driver_storage_la_LDFLAGS = -module -avoid-version
+endif
 libvirt_driver_storage_la_SOURCES += $(STORAGE_DRIVER_SOURCES)
 libvirt_driver_storage_la_SOURCES += $(STORAGE_DRIVER_FS_SOURCES)
 endif
@@ -277,6 +349,7 @@ libvirt_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libvirt_sym.version \
                      -version-info @LIBVIRT_VERSION_INFO@ \
                     $(COVERAGE_CFLAGS:-f%=-Wc,-f%) \
                     $(LIBXML_LIBS) $(SELINUX_LIBS) \
+                   $(XEN_LIBS) $(DRIVER_MODULE_LIBS) \
                    @CYGWIN_EXTRA_LDFLAGS@ @MINGW_EXTRA_LDFLAGS@
 libvirt_la_CFLAGS = $(COVERAGE_CFLAGS) -DIN_LIBVIRT
 libvirt_la_DEPENDENCIES = $(libvirt_la_LIBADD) $(srcdir)/libvirt_sym.version
diff --git a/src/driver.c b/src/driver.c
new file mode 100644 (file)
index 0000000..3d4ee3c
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * driver.c: Helpers for loading drivers
+ *
+ * Copyright (C) 2006-2008 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ *
+ */
+
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include "driver.h"
+#include "memory.h"
+#include "logging.h"
+
+#define DEFAULT_DRIVER_DIR LIBDIR "/libvirt/drivers"
+
+#ifdef WITH_DRIVER_MODULES
+
+/* XXX re-implment this for other OS, or use libtools helper lib ? */
+
+#include <dlfcn.h>
+
+void *
+virDriverLoadModule(const char *name)
+{
+    const char *moddir = getenv("LIBVIRT_DRIVER_DIR");
+    char *modfile = NULL, *regfunc = NULL;
+    void *handle = NULL;
+    int (*regsym)(void);
+
+    if (moddir == NULL)
+        moddir = DEFAULT_DRIVER_DIR;
+
+    DEBUG("Module load %s", name);
+
+    if (asprintf(&modfile, "%s/libvirt_driver_%s.so", moddir, name) < 0)
+        return NULL;
+
+    if (access(modfile, R_OK) < 0) {
+        DEBUG("Moodule %s not accessible", modfile);
+        goto cleanup;
+    }
+
+    handle = dlopen(modfile, RTLD_NOW | RTLD_LOCAL);
+    if (!handle) {
+        DEBUG("failed to load module %s %s", modfile, dlerror());
+        goto cleanup;
+    }
+
+    if (asprintf(&regfunc, "%sRegister", name) < 0) {
+        regfunc = NULL;
+        goto cleanup;
+    }
+
+    regsym = dlsym(handle, regfunc);
+    if (!regsym) {
+        DEBUG("Missing module registration symbol %s", regfunc);
+        goto cleanup;
+    }
+
+    if ((*regsym)() < 0) {
+        DEBUG("Failed module registration %s", regfunc);
+        goto cleanup;
+    }
+
+    VIR_FREE(modfile);
+    VIR_FREE(regfunc);
+    return handle;
+
+cleanup:
+    VIR_FREE(modfile);
+    VIR_FREE(regfunc);
+    if (handle)
+        dlclose(handle);
+    return NULL;
+}
+
+
+/* XXX unload modules, but we can't until we can unregister libvirt drivers */
+
+#endif
index c79df95848c4ed6360b3297f0490a3448f0b7992..2382ac90d6ce5f5843a047904327adabb7f066dd 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <libxml/uri.h>
 
+#include "internal.h"
 /*
  * List of registered drivers numbers
  */
@@ -645,5 +646,6 @@ int virRegisterStorageDriver(virStorageDriverPtr);
 #ifdef WITH_LIBVIRTD
 int virRegisterStateDriver(virStateDriverPtr);
 #endif
+void *virDriverLoadModule(const char *name);
 
 #endif /* __VIR_DRIVER_H__ */
index a1edb693c6a01d23d0648585ff45f10c92ca29c4..31e698745044a02a6bcc7d4384517e8b6ed1c30e 100644 (file)
@@ -41,6 +41,7 @@
 #include "util.h"
 #include "memory.h"
 
+#ifndef WITH_DRIVER_MODULES
 #ifdef WITH_TEST
 #include "test.h"
 #endif
@@ -53,6 +54,7 @@
 #ifdef WITH_OPENVZ
 #include "openvz_driver.h"
 #endif
+#endif
 
 /*
  * TODO:
@@ -270,17 +272,29 @@ virInitialize(void)
      * Note that the order is important: the first ones have a higher
      * priority when calling virConnectOpen.
      */
+#ifdef WITH_DRIVER_MODULES
+    /* We don't care if any of these fail, because the whole point
+     * is to allow users to only install modules they want to use.
+     * If they try to use a open a connection for a module that
+     * is not loaded they'll get a suitable error at that point
+     */
+    virDriverLoadModule("test");
+    virDriverLoadModule("xen");
+    virDriverLoadModule("openvz");
+    virDriverLoadModule("remote");
+#else
 #ifdef WITH_TEST
     if (testRegister() == -1) return -1;
 #endif
 #ifdef WITH_XEN
-    if (xenUnifiedRegister () == -1) return -1;
+    if (xenRegister () == -1) return -1;
 #endif
 #ifdef WITH_OPENVZ
     if (openvzRegister() == -1) return -1;
 #endif
 #ifdef WITH_REMOTE
     if (remoteRegister () == -1) return -1;
+#endif
 #endif
 
     return(0);
@@ -458,6 +472,9 @@ virRegisterNetworkDriver(virNetworkDriverPtr driver)
         return(-1);
     }
 
+    DEBUG ("registering %s as network driver %d",
+           driver->name, virNetworkDriverTabCount);
+
     virNetworkDriverTab[virNetworkDriverTabCount] = driver;
     return virNetworkDriverTabCount++;
 }
@@ -486,6 +503,9 @@ virRegisterStorageDriver(virStorageDriverPtr driver)
         return(-1);
     }
 
+    DEBUG ("registering %s as storage driver %d",
+           driver->name, virStorageDriverTabCount);
+
     virStorageDriverTab[virStorageDriverTabCount] = driver;
     return virStorageDriverTabCount++;
 }
index d0e5fc555d1be8bed4e1ddc232d7c0a22a2ef15a..943eb9ae8ec460841c5f73be8cbbe1bbd9b3e023 100644 (file)
@@ -283,8 +283,12 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virCapabilitiesAddGuest;
        virCapabilitiesAddGuestDomain;
        virCapabilitiesAddGuestFeature;
+       virCapabilitiesAddHostMigrateTransport;
        virCapabilitiesAddHostNUMACell;
+       virCapabilitiesAddHostFeature;
+       virCapabilitiesDefaultGuestArch;
        virCapabilitiesDefaultGuestEmulator;
+       virCapabilitiesDefaultGuestMachine;
        virCapabilitiesFormatXML;
        virCapabilitiesFree;
        virCapabilitiesNew;
@@ -296,6 +300,7 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virConfReadFile;
        virConfReadMem;
        virConfFree;
+       virConfFreeValue;
        virConfGetValue;
        virConfSetValue;
        virConfWriteFile;
@@ -307,6 +312,7 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virGetNetwork;
        virGetStoragePool;
        virGetStorageVol;
+       virUnrefDomain;
 
 
        /* domain_conf.h */
@@ -314,25 +320,43 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virDiskNameToIndex;
        virDomainAssignDef;
        virDomainConfigFile;
+       virDomainCpuSetFormat;
+       virDomainCpuSetParse;
+       virDomainChrDefFree;
+       virDomainChrTypeFromString;
+       virDomainChrTypeToString;
        virDomainDefDefaultEmulator;
        virDomainDefFormat;
        virDomainDefFree;
        virDomainDefParseFile;
+       virDomainDefParseNode;
        virDomainDefParseString;
        virDomainDeleteConfig;
+       virDomainDeviceDefFree;
        virDomainDeviceDefParse;
        virDomainDiskBusTypeToString;
+       virDomainDiskDefFree;
        virDomainDiskDeviceTypeToString;
        virDomainDiskQSort;
        virDomainFindByID;
        virDomainFindByName;
        virDomainFindByUUID;
+       virDomainGraphicsTypeFromString;
+       virDomainGraphicsDefFree;
+       virDomainInputDefFree;
+       virDomainLifecycleTypeFromString;
+       virDomainLifecycleTypeToString;
        virDomainLoadAllConfigs;
+       virDomainNetDefFree;
+       virDomainObjFree;
        virDomainObjListFree;
        virDomainRemoveInactive;
        virDomainSaveConfig;
+       virDomainSoundDefFree;
+       virDomainSoundModelTypeFromString;
        virDomainSoundModelTypeToString;
        virDomainVirtTypeToString;
+       virDomainFSDefFree;
 
 
        /* domain_event.h */
@@ -340,6 +364,34 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virDomainEventCallbackListFree;
        virDomainEventCallbackListRemove;
        virDomainEventCallbackListRemoveConn;
+       virDomainEventQueueFree;
+       virDomainEventCallbackQueuePop;
+       virDomainEventCallbackQueuePush;
+
+
+       /* driver.h */
+       virDriverLoadModule;
+
+
+       /* event.h */
+       virEventAddHandle;
+       virEventAddTimeout;
+       virEventRemoveHandle;
+       virEventRemoveTimeout;
+       virEventUpdateHandle;
+       virEventUpdateTimeout;
+
+
+       /* hash.h */
+       virHashAddEntry;
+       virHashCreate;
+       virHashForEach;
+       virHashFree;
+       virHashLookup;
+       virHashRemoveEntry;
+       virHashRemoveSet;
+       virHashSearch;
+       virHashSize;
 
 
        /* iptables.h */
@@ -397,12 +449,15 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virNetworkAssignDef;
        virNetworkDefFormat;
        virNetworkDefFree;
+       virNetworkDefParseFile;
+       virNetworkDefParseNode;
        virNetworkDefParseString;
        virNetworkDeleteConfig;
        virNetworkFindByName;
        virNetworkFindByUUID;
        virNetworkLoadAllConfigs;
        virNetworkObjListFree;
+       virNetworkDefParseNode;
        virNetworkRemoveInactive;
        virNetworkSaveConfig;
 
@@ -411,8 +466,15 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virNodeInfoPopulate;
 
 
+       /* qparams.h */
+       qparam_get_query;
+       qparam_query_parse;
+       free_qparam_set;
+
+
        /* stats_linux.h */
        linuxDomainInterfaceStats;
+       xenLinuxDomainBlockStats;
 
 
        /* storage_backend.h */
@@ -429,6 +491,7 @@ LIBVIRT_PRIVATE_@VERSION@ {
 
 
        /* storage_conf.h */
+        virStorageBackendPoolOptionsForType;
        virStoragePoolDefFormat;
        virStoragePoolDefFree;
        virStoragePoolDefParse;
@@ -461,6 +524,7 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virStrToLong_i;
        virStrToLong_ll;
        virStrToLong_ull;
+       virFileLinkPointsTo;
        saferead;
        safewrite;
        virMacAddrCompare;
@@ -469,6 +533,8 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virEventAddHandle;
        virEventRemoveHandle;
        virExec;
+       virFormatMacAddr;
+       virParseMacAddr;
        virFileDeletePid;
        virFileExists;
        virFileHasSuffix;
@@ -479,18 +545,26 @@ LIBVIRT_PRIVATE_@VERSION@ {
        virFileReadPid;
        virParseNumber;
        virRun;
+       virSkipSpaces;
 
 
        /* uuid.h */
        virUUIDFormat;
+       virUUIDGenerate;
+       virUUIDParse;
 
 
        /* virterror_internal.h */
        virReportErrorHelper;
+       virErrorMsg;
+       virRaiseError;
 
 
        /* xml.h */
+       virXPathLong;
+       virXPathNodeSet;
        virXPathString;
+       virXMLPropString;
 
 
        /* Finally everything else is totally private */
index 7bec116bdcb7869ce8af276cbfbafd861217d201..835e2bdebd3b1d0adcf0e9bb6916e18c07937954 100644 (file)
@@ -3804,7 +3804,7 @@ static virStateDriver qemuStateDriver = {
     .active = qemudActive,
 };
 
-int qemudRegister(void) {
+int qemuRegister(void) {
     virRegisterDriver(&qemuDriver);
     virRegisterStateDriver(&qemuStateDriver);
     return 0;
index e0662e0ad80c3add097fabc37dcc040e2a366e9e..17b184fa89b370ec2597cd3b54e890da8a4400d3 100644 (file)
@@ -47,6 +47,6 @@
 #  define KVM_CAP_NR_VCPUS 9       /* returns max vcpus per vm */
 #endif
 
-int qemudRegister(void);
+int qemuRegister(void);
 
 #endif /* QEMUD_DRIVER_H */
index 20c413abe971edc39945a26b2761b56bf29101aa..36d244fbda75cb6823ccb0a8382410a0d64bdd63 100644 (file)
@@ -1359,14 +1359,14 @@ static virDriver xenUnifiedDriver = {
 };
 
 /**
- * xenUnifiedRegister:
+ * xenRegister:
  *
  * Register xen related drivers
  *
  * Returns the driver priority or -1 in case of error.
  */
 int
-xenUnifiedRegister (void)
+xenRegister (void)
 {
     /* Ignore failures here. */
     (void) xenHypervisorInit ();
index 48415a80044a429bcf385da2badac4367b30d688..445086e793876c1ec0ff547fee851f32ca6d63d9 100644 (file)
@@ -22,7 +22,7 @@
 #include <winsock2.h>
 #endif
 
-extern int xenUnifiedRegister (void);
+extern int xenRegister (void);
 
 #define XEN_UNIFIED_HYPERVISOR_OFFSET 0
 #define XEN_UNIFIED_PROXY_OFFSET 1
index 3b4f0dcfaa73668ebc78287c015e7c1907a7a00e..d2d12544d0dde395afaac18686aa1ddd2fdf3838 100644 (file)
@@ -19,6 +19,11 @@ INCLUDES = \
          $(COVERAGE_CFLAGS) \
          $(WARN_CFLAGS)
 
+if WITH_DRIVER_MODULES
+INCLUDES += \
+       -DTEST_DRIVER_DIR=\"$(top_builddir)/src/.libs\"
+endif
+
 LDADDS = \
        @STATIC_BINARIES@ \
        $(LIBXML_LIBS) \
@@ -83,6 +88,7 @@ TESTS_ENVIRONMENT =                           \
   abs_srcdir=`cd '$(srcdir)'; pwd`             \
   PATH="$(path_add)$(PATH_SEPARATOR)$$PATH"    \
   SHELL="$(SHELL)"                             \
+  LIBVIRT_DRIVER_DIR="$(abs_top_builddir)/src/.libs" \
   $(VG)
 
 valgrind:
@@ -100,17 +106,17 @@ xmlrpctest_LDADD = $(LDADDS)
 xml2sexprtest_SOURCES = \
        xml2sexprtest.c testutilsxen.c testutilsxen.h \
        testutils.c testutils.h
-xml2sexprtest_LDADD = $(LDADDS)
+xml2sexprtest_LDADD = ../src/libvirt_driver_xen.la $(LDADDS)
 
 sexpr2xmltest_SOURCES = \
        sexpr2xmltest.c \
        testutils.c testutils.h
-sexpr2xmltest_LDADD = $(LDADDS)
+sexpr2xmltest_LDADD = ../src/libvirt_driver_xen.la $(LDADDS)
 
 xmconfigtest_SOURCES = \
        xmconfigtest.c testutilsxen.c testutilsxen.h \
        testutils.c testutils.h
-xmconfigtest_LDADD = $(LDADDS)
+xmconfigtest_LDADD = ../src/libvirt_driver_xen.la $(LDADDS)
 
 if WITH_QEMU
 qemuxml2argvtest_SOURCES = \
@@ -137,7 +143,7 @@ conftest_LDADD = $(LDADDS)
 
 xencapstest_SOURCES = \
        xencapstest.c testutils.h testutils.c
-xencapstest_LDADD = $(LDADDS)
+xencapstest_LDADD = ../src/libvirt_driver_xen.la $(LDADDS)
 
 nodeinfotest_SOURCES = \
        nodeinfotest.c testutils.h testutils.c
index 571c1b961c03a45d0f8140910e3f48fc20fbf24c..0255bdff4d201f1d46a9a2b9d19ce4ff71f88289 100644 (file)
@@ -151,6 +151,9 @@ void virtTestCaptureProgramExecChild(const char *const argv[],
     int stderrfd = -1;
     const char *const env[] = {
         "LANG=C",
+#if WITH_DRIVER_MODULES
+        "LIBVIRT_DRIVER_DIR=" TEST_DRIVER_DIR,
+#endif
         NULL
     };
 
index d16b94ee5d64fc0d3e82f1a5fd39b2a033b107a3..b88637f1c5424636f37882bd01e505fd861b782c 100644 (file)
@@ -55,13 +55,11 @@ static int testCompareParseXML(const char *xmcfg, const char *xml,
     int ret = -1;
     virConnectPtr conn;
     int wrote = MAX_FILE;
-    void *old_priv = NULL;
     struct _xenUnifiedPrivate priv;
     virDomainDefPtr def = NULL;
 
-    conn = virConnectOpenReadOnly("test:///default");
+    conn = virGetConnect();
     if (!conn) goto fail;
-    old_priv = conn->privateData;
 
     if (virtTestLoadFile(xml, &xmlPtr, MAX_FILE) < 0)
         goto fail;
@@ -95,10 +93,7 @@ static int testCompareParseXML(const char *xmcfg, const char *xml,
     if (conf)
         virConfFree(conf);
     virDomainDefFree(def);
-    if (conn) {
-        conn->privateData = old_priv;
-        virConnectClose(conn);
-    }
+    virUnrefConnect(conn);
 
     return ret;
 }
@@ -113,13 +108,11 @@ static int testCompareFormatXML(const char *xmcfg, const char *xml,
     virConfPtr conf = NULL;
     int ret = -1;
     virConnectPtr conn;
-    void *old_priv;
     struct _xenUnifiedPrivate priv;
     virDomainDefPtr def = NULL;
 
-    conn = virConnectOpenReadOnly("test:///default");
+    conn = virGetConnect();
     if (!conn) goto fail;
-    old_priv = conn->privateData;
 
     if (virtTestLoadFile(xml, &xmlPtr, MAX_FILE) < 0)
         goto fail;
@@ -153,10 +146,7 @@ static int testCompareFormatXML(const char *xmcfg, const char *xml,
         virConfFree(conf);
     VIR_FREE(gotxml);
     virDomainDefFree(def);
-    if (conn) {
-        conn->privateData = old_priv;
-        virConnectClose(conn);
-    }
+    virUnrefConnect(conn);
 
     return ret;
 }