I reworked this patch according to Daniel's comments in https://www.redhat.com/archives/libvir-list/2011-March/msg01272.html Find the new version below. --- configure.ac | 2 + src/Makefile.am | 10 +++-- src/libvirt_private.syms | 16 ++++++++ src/libxl/libxl_driver.c | 94 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 116 insertions(+), 6 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/src/Makefile.am b/src/Makefile.am index c3729a6..9dc1f9b 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,10 +704,12 @@ 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) +libvirt_driver_libxl_la_LIBADD = $(LIBXL_LIBS) libvirt_xenxs.la if WITH_DRIVER_MODULES libvirt_driver_libxl_la_LIBADD += ../gnulib/lib/libgnu.la libvirt_driver_libxl_la_LDFLAGS += -module -avoid-version diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 11fd5c7..cec00e9 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -757,6 +757,22 @@ virSecurityManagerSetSavedStateLabel; virSecurityManagerSetSocketLabel; virSecurityManagerVerify; +# sexpr.h +sexpr_append; +sexpr_cons; +sexpr_float; +sexpr_fmt_node; +sexpr_free; +sexpr_has; +sexpr_int; +sexpr_lookup; +sexpr_nil; +sexpr_node; +sexpr_node_copy; +sexpr_string; +sexpr_u64; +sexpr2string; +string2sexpr; # storage_conf.h virStoragePartedFsTypeTypeToString; 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list