diff --git a/.gitignore b/.gitignore index 9d09709c5f..eac2203265 100644 --- a/.gitignore +++ b/.gitignore @@ -140,6 +140,7 @@ /src/remote/*_protocol.[ch] /src/rpc/virkeepaliveprotocol.[ch] /src/rpc/virnetprotocol.[ch] +/src/xenconfig/xen_xl_disk.[ch] /src/test_libvirt*.aug /src/test_virtlockd.aug /src/util/virkeymaps.h diff --git a/cfg.mk b/cfg.mk index 21f83c3435..3df3dcbc31 100644 --- a/cfg.mk +++ b/cfg.mk @@ -89,8 +89,9 @@ distdir: sc_vulnerable_makefile_CVE-2012-3386.z endif # Files that should never cause syntax check failures. +# (^(HACKING|docs/(news\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$ VC_LIST_ALWAYS_EXCLUDE_REGEX = \ - (^(HACKING|docs/(news\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$ + (^(HACKING|docs/(news\.html\.in|.*\.patch)|src/xenconfig/xen_xl_disk.[chl])|\.(po|fig|gif|ico|png))$$ # Functions like free() that are no-ops on NULL arguments. useless_free_options = \ diff --git a/configure.ac b/configure.ac index 9d12079458..167b875c9b 100644 --- a/configure.ac +++ b/configure.ac @@ -146,6 +146,7 @@ m4_ifndef([LT_INIT], [ ]) AM_PROG_CC_C_O AM_PROG_LD +AM_PROG_LEX AC_MSG_CHECKING([for how to mark DSO non-deletable at runtime]) LIBVIRT_NODELETE= diff --git a/po/POTFILES.in b/po/POTFILES.in index e7cb2cc197..094c8e3704 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -247,6 +247,7 @@ src/xenapi/xenapi_driver.c src/xenapi/xenapi_utils.c src/xenconfig/xen_common.c src/xenconfig/xen_sxpr.c +src/xenconfig/xen_xl.c src/xenconfig/xen_xm.c tests/virpolkittest.c tools/libvirt-guests.sh.in diff --git a/src/Makefile.am b/src/Makefile.am index 550362cca3..8ccc27384b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1000,11 +1000,22 @@ CPU_SOURCES = \ VMX_SOURCES = \ vmx/vmx.c vmx/vmx.h +AM_LFLAGS = -Pxl_disk_ --header-file=../$*.h +LEX_OUTPUT_ROOT = lex.xl_disk_ +BUILT_SOURCES += xenconfig/xen_xl_disk.c xenconfig/xen_xl_disk.h +# Generated header file is not implicitly added to dist +EXTRA_DIST += xenconfig/xen_xl_disk.h +CLEANFILES += xenconfig/xen_xl_disk.h xenconfig/xen_xl_disk.c + +XENXLDISKPARSER_SOURCES = xenconfig/xen_xl_disk.l + XENCONFIG_SOURCES = \ xenconfig/xenxs_private.h \ - xenconfig/xen_common.c xenconfig/xen_common.h \ + xenconfig/xen_common.c xenconfig/xen_common.h \ xenconfig/xen_sxpr.c xenconfig/xen_sxpr.h \ - xenconfig/xen_xm.c xenconfig/xen_xm.h + xenconfig/xen_xm.c xenconfig/xen_xm.h \ + xenconfig/xen_xl.c xenconfig/xen_xl.h \ + xenconfig/xen_xl_disk_i.h pkgdata_DATA = cpu/cpu_map.xml @@ -1059,10 +1070,19 @@ libvirt_vmx_la_SOURCES = $(VMX_SOURCES) endif WITH_VMX if WITH_XENCONFIG +# Flex generated XL disk parser needs to be compiled without WARN_FLAGS +# Add the generated object to its own library to control CFLAGS +noinst_LTLIBRARIES += libvirt_xenxldiskparser.la +libvirt_xenxldiskparser_la_CFLAGS = \ + -I$(top_srcdir)/src/conf $(AM_CFLAGS) -Wno-unused-parameter +libvirt_xenxldiskparser_la_SOURCES = \ + $(XENXLDISKPARSER_SOURCES) + noinst_LTLIBRARIES += libvirt_xenconfig.la libvirt_la_BUILT_LIBADD += libvirt_xenconfig.la libvirt_xenconfig_la_CFLAGS = \ -I$(top_srcdir)/src/conf $(AM_CFLAGS) +libvirt_xenconfig_la_LIBADD = libvirt_xenxldiskparser.la libvirt_xenconfig_la_SOURCES = $(XENCONFIG_SOURCES) endif WITH_XENCONFIG @@ -1824,6 +1844,7 @@ EXTRA_DIST += \ $(VBOX_DRIVER_EXTRA_DIST) \ $(VMWARE_DRIVER_SOURCES) \ $(XENCONFIG_SOURCES) \ + $(XENXLDISKPARSER_SOURCES) \ $(ACCESS_DRIVER_POLKIT_POLICY) check-local: check-augeas diff --git a/src/libvirt_xenconfig.syms b/src/libvirt_xenconfig.syms index 6541685fe5..3e2e5d6cbd 100644 --- a/src/libvirt_xenconfig.syms +++ b/src/libvirt_xenconfig.syms @@ -16,6 +16,10 @@ xenParseSxprChar; xenParseSxprSound; xenParseSxprString; +#xenconfig/xen_xl.h +xenFormatXL; +xenParseXL; + # xenconfig/xen_xm.h xenFormatXM; xenParseXM; diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index cbacc2ad84..e612fdc30a 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -1801,7 +1801,8 @@ xenFormatVfb(virConfPtr conf, virDomainDefPtr def, int xendConfigVersion) { int hvm = STREQ(def->os.type, "hvm") ? 1 : 0; - if (def->ngraphics == 1) { + if (def->ngraphics == 1 && + def->graphics[0]->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { if (hvm || (xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF)) { if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) { if (xenConfigSetInt(conf, "sdl", 1) < 0) diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c new file mode 100644 index 0000000000..8d1d2a79ff --- /dev/null +++ b/src/xenconfig/xen_xl.c @@ -0,0 +1,499 @@ +/* + * xen_xl.c: Xen XL parsing functions + * + * 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, see + * . + * + * Author: Kiarie Kahurani + */ + +#include + +#include "virconf.h" +#include "virerror.h" +#include "domain_conf.h" +#include "viralloc.h" +#include "virstring.h" +#include "xen_xl.h" +#include "xen_xl_disk.h" +#include "xen_xl_disk_i.h" + +#define VIR_FROM_THIS VIR_FROM_NONE + + +static int +xenParseXLSpice(virConfPtr conf, virDomainDefPtr def) +{ + virDomainGraphicsDefPtr graphics = NULL; + unsigned long port; + char *listenAddr = NULL; + int val; + + if (STREQ(def->os.type, "hvm")) { + if (xenConfigGetBool(conf, "spice", &val, 0) < 0) + return -1; + + if (val) { + if (VIR_ALLOC(graphics) < 0) + return -1; + + graphics->type = VIR_DOMAIN_GRAPHICS_TYPE_SPICE; + if (xenConfigCopyStringOpt(conf, "spicehost", &listenAddr) < 0) + goto cleanup; + if (listenAddr && + virDomainGraphicsListenSetAddress(graphics, 0, listenAddr, + -1, true) < 0) { + goto cleanup; + } + VIR_FREE(listenAddr); + + if (xenConfigGetULong(conf, "spicetls_port", &port, 0) < 0) + goto cleanup; + graphics->data.spice.tlsPort = (int)port; + + if (xenConfigGetULong(conf, "spiceport", &port, 0) < 0) + goto cleanup; + + graphics->data.spice.port = (int)port; + + if (!graphics->data.spice.tlsPort && + !graphics->data.spice.port) + graphics->data.spice.autoport = 1; + + if (xenConfigGetBool(conf, "spicedisable_ticketing", &val, 0) < 0) + goto cleanup; + if (val) { + if (xenConfigCopyStringOpt(conf, "spicepasswd", + &graphics->data.spice.auth.passwd) < 0) + goto cleanup; + } + + if (xenConfigGetBool(conf, "spiceagent_mouse", + &graphics->data.spice.mousemode, 0) < 0) + goto cleanup; + if (xenConfigGetBool(conf, "spicedvagent", &val, 0) < 0) + goto cleanup; + if (val) { + if (xenConfigGetBool(conf, "spice_clipboard_sharing", + &graphics->data.spice.copypaste, + 0) < 0) + goto cleanup; + } + + if (VIR_ALLOC_N(def->graphics, 1) < 0) + goto cleanup; + def->graphics[0] = graphics; + def->ngraphics = 1; + } + } + + return 0; + + cleanup: + virDomainGraphicsDefFree(graphics); + return -1; +} + + +void +xenXLDiskParserError(xenXLDiskParserContext *dpc, + const char *erroneous, + const char *message) +{ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("disk config %s not supported: %s"), + erroneous, message); + + if (!dpc->err) + dpc->err = EINVAL; +} + + +static int +xenXLDiskParserPrep(xenXLDiskParserContext *dpc, + const char *spec, + virDomainDiskDefPtr disk) +{ + int err; + + dpc->spec = spec; + dpc->disk = disk; + dpc->access_set = 0; + + err = xl_disk_lex_init_extra(dpc, &dpc->scanner); + if (err) + goto fail; + + dpc->buf = xl_disk__scan_bytes(spec, strlen(spec), dpc->scanner); + if (!dpc->buf) { + err = ENOMEM; + goto fail; + } + + return 0; + + fail: + virReportSystemError(errno, "%s", + _("failed to initialize disk configuration parser")); + return err; +} + + +static void +xenXLDiskParserCleanup(xenXLDiskParserContext *dpc) +{ + if (dpc->buf) { + xl_disk__delete_buffer(dpc->buf, dpc->scanner); + dpc->buf = NULL; + } + + if (dpc->scanner) { + xl_disk_lex_destroy(dpc->scanner); + dpc->scanner = NULL; + } +} + + +/* + * positional parameters + * (If the strings are not separated by "=" + * the string is split following ',' and assigned to + * the following options in the following order) + * target,format,vdev,access + * ================================================================ + * + * The parameters below cannot be specified as positional parameters: + * + * other parameters + * devtype = + * backendtype = + * parameters not taken care of + * backend = + * script =