---
configure.ac | 2 +
daemon/Makefile.am | 3 +
src/Makefile.am | 8 ++-
src/libxl/libxl_driver.c | 94 +++++++++++++++++++++++++++++++++++++++++++++-
4 files changed, 102 insertions(+), 5 deletions(-)
diff --git a/configure.ac b/configure.ac
index 9c0221c..f4458d0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -607,6 +607,8 @@ AM_CONDITIONAL([WITH_XEN], [test "$with_xen" =
"yes"])
AC_SUBST([XEN_CFLAGS])
AC_SUBST([XEN_LIBS])
+AM_CONDITIONAL([WITH_XENXS], [test "$with_libxl" = "yes" || test
"$with_xen" = "yes"])
+
dnl
dnl check for kernel headers required by xen_inotify
dnl
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 9e3a557..4344127 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -108,6 +108,9 @@ endif
if WITH_LIBXL
libvirtd_LDADD += ../src/libvirt_driver_libxl.la
+ libvirtd_LDADD += ../src/libvirt_xenxs.la
+ libvirtd_LDADD += ../src/libvirt_util.la
+ libvirtd_LDADD += ../src/libvirt_conf.la
endif
if WITH_UML
diff --git a/src/Makefile.am b/src/Makefile.am
index c3729a6..ae0c6ed 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -474,7 +474,7 @@ libvirt_vmx_la_CFLAGS = \
libvirt_vmx_la_SOURCES = $(VMX_SOURCES)
endif
-if WITH_XEN
+if WITH_XENXS
noinst_LTLIBRARIES += libvirt_xenxs.la
libvirt_la_BUILT_LIBADD += libvirt_xenxs.la
libvirt_xenxs_la_CFLAGS = \
@@ -704,8 +704,10 @@ noinst_LTLIBRARIES += libvirt_driver_libxl.la
# Stateful, so linked to daemon instead
#libvirt_la_BUILT_LIBADD += libvirt_driver_libxl.la
endif
-libvirt_driver_libxl_la_CFLAGS = $(LIBXL_CFLAGS) \
- -I@top_srcdir@/src/conf $(AM_CFLAGS)
+libvirt_driver_libxl_la_CFLAGS = $(LIBXL_CFLAGS) \
+ -I@top_srcdir@/src/conf \
+ -I@top_srcdir@/src/xenxs \
+ $(AM_CFLAGS)
libvirt_driver_libxl_la_LDFLAGS = $(AM_LDFLAGS)
libvirt_driver_libxl_la_LIBADD = $(LIBXL_LIBS)
if WITH_DRIVER_MODULES
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 3251e66..7d83975 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -33,6 +33,7 @@
#include "internal.h"
#include "logging.h"
#include "virterror_internal.h"
+#include "conf.h"
#include "datatypes.h"
#include "files.h"
#include "memory.h"
@@ -41,6 +42,7 @@
#include "command.h"
#include "libxl_driver.h"
#include "libxl_conf.h"
+#include "xen_xm.h"
#define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -51,6 +53,8 @@
#define LIBXL_DOM_REQ_CRASH 3
#define LIBXL_DOM_REQ_HALT 4
+#define LIBXL_CONFIG_FORMAT_XM "xen-xm"
+
static libxlDriverPrivatePtr libxl_driver = NULL;
@@ -1636,6 +1640,92 @@ libxlDomainDumpXML(virDomainPtr dom, int flags)
return ret;
}
+static char *
+libxlDomainXMLFromNative(virConnectPtr conn, const char * nativeFormat,
+ const char * nativeConfig,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ libxlDriverPrivatePtr driver = conn->privateData;
+ const libxl_version_info *ver_info;
+ virDomainDefPtr def = NULL;
+ virConfPtr conf = NULL;
+ char *xml = NULL;
+
+ if (STRNEQ(nativeFormat, LIBXL_CONFIG_FORMAT_XM)) {
+ libxlError(VIR_ERR_INVALID_ARG,
+ _("unsupported config type %s"), nativeFormat);
+ goto cleanup;
+ }
+
+ if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
+ VIR_ERROR0(_("cannot get version information from libxenlight"));
+ goto cleanup;
+ }
+
+ if (!(conf = virConfReadMem(nativeConfig, strlen(nativeConfig), 0)))
+ goto cleanup;
+
+ if (!(def = xenParseXM(conf, ver_info->xen_version_major, driver->caps))) {
+ libxlError(VIR_ERR_INTERNAL_ERROR, "%s", _("parsing xm config
failed"));
+ goto cleanup;
+ }
+
+ xml = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE);
+
+cleanup:
+ virDomainDefFree(def);
+ if (conf)
+ virConfFree(conf);
+ return xml;
+}
+
+#define MAX_CONFIG_SIZE (1024 * 65)
+static char *
+libxlDomainXMLToNative(virConnectPtr conn, const char * nativeFormat,
+ const char * domainXml,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ libxlDriverPrivatePtr driver = conn->privateData;
+ const libxl_version_info *ver_info;
+ virDomainDefPtr def = NULL;
+ virConfPtr conf = NULL;
+ int len = MAX_CONFIG_SIZE;
+ char *ret = NULL;
+
+ if (STRNEQ(nativeFormat, LIBXL_CONFIG_FORMAT_XM)) {
+ libxlError(VIR_ERR_INVALID_ARG,
+ _("unsupported config type %s"), nativeFormat);
+ goto cleanup;
+ }
+
+ if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
+ VIR_ERROR0(_("cannot get version information from libxenlight"));
+ goto cleanup;
+ }
+
+ if (!(def = virDomainDefParseString(driver->caps, domainXml, 0)))
+ goto cleanup;
+
+ if (!(conf = xenFormatXM(conn, def, ver_info->xen_version_major)))
+ goto cleanup;
+
+ if (VIR_ALLOC_N(ret, len) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ if (virConfWriteMem(ret, &len, conf) < 0) {
+ VIR_FREE(ret);
+ goto cleanup;
+ }
+
+cleanup:
+ virDomainDefFree(def);
+ if (conf)
+ virConfFree(conf);
+ return ret;
+}
+
static int
libxlListDefinedDomains(virConnectPtr conn,
char **const names, int nnames)
@@ -1994,8 +2084,8 @@ static virDriver libxlDriver = {
NULL, /* domainGetSecurityLabel */
NULL, /* nodeGetSecurityModel */
libxlDomainDumpXML, /* domainDumpXML */
- NULL, /* domainXmlFromNative */
- NULL, /* domainXmlToNative */
+ libxlDomainXMLFromNative, /* domainXmlFromNative */
+ libxlDomainXMLToNative, /* domainXmlToNative */
libxlListDefinedDomains, /* listDefinedDomains */
libxlNumDefinedDomains, /* numOfDefinedDomains */
libxlDomainCreate, /* domainCreate */
--
1.7.4.1