mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
Revert "src/xenconfig: Xen-xl parser"
This reverts commit 2c78051a14
.
Conflicts:
src/Makefile.am
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
This commit is contained in:
parent
cb4befc748
commit
f7a30375bd
1
.gitignore
vendored
1
.gitignore
vendored
@ -140,7 +140,6 @@
|
|||||||
/src/remote/*_protocol.[ch]
|
/src/remote/*_protocol.[ch]
|
||||||
/src/rpc/virkeepaliveprotocol.[ch]
|
/src/rpc/virkeepaliveprotocol.[ch]
|
||||||
/src/rpc/virnetprotocol.[ch]
|
/src/rpc/virnetprotocol.[ch]
|
||||||
/src/xenconfig/xen_xl_disk.[ch]
|
|
||||||
/src/test_libvirt*.aug
|
/src/test_libvirt*.aug
|
||||||
/src/test_virtlockd.aug
|
/src/test_virtlockd.aug
|
||||||
/src/util/virkeymaps.h
|
/src/util/virkeymaps.h
|
||||||
|
3
cfg.mk
3
cfg.mk
@ -89,9 +89,8 @@ distdir: sc_vulnerable_makefile_CVE-2012-3386.z
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Files that should never cause syntax check failures.
|
# Files that should never cause syntax check failures.
|
||||||
# (^(HACKING|docs/(news\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$
|
|
||||||
VC_LIST_ALWAYS_EXCLUDE_REGEX = \
|
VC_LIST_ALWAYS_EXCLUDE_REGEX = \
|
||||||
(^(HACKING|docs/(news\.html\.in|.*\.patch)|src/xenconfig/xen_xl_disk.[chl])|\.(po|fig|gif|ico|png))$$
|
(^(HACKING|docs/(news\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$
|
||||||
|
|
||||||
# Functions like free() that are no-ops on NULL arguments.
|
# Functions like free() that are no-ops on NULL arguments.
|
||||||
useless_free_options = \
|
useless_free_options = \
|
||||||
|
@ -146,7 +146,6 @@ m4_ifndef([LT_INIT], [
|
|||||||
])
|
])
|
||||||
AM_PROG_CC_C_O
|
AM_PROG_CC_C_O
|
||||||
AM_PROG_LD
|
AM_PROG_LD
|
||||||
AM_PROG_LEX
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for how to mark DSO non-deletable at runtime])
|
AC_MSG_CHECKING([for how to mark DSO non-deletable at runtime])
|
||||||
LIBVIRT_NODELETE=
|
LIBVIRT_NODELETE=
|
||||||
|
@ -247,7 +247,6 @@ src/xenapi/xenapi_driver.c
|
|||||||
src/xenapi/xenapi_utils.c
|
src/xenapi/xenapi_utils.c
|
||||||
src/xenconfig/xen_common.c
|
src/xenconfig/xen_common.c
|
||||||
src/xenconfig/xen_sxpr.c
|
src/xenconfig/xen_sxpr.c
|
||||||
src/xenconfig/xen_xl.c
|
|
||||||
src/xenconfig/xen_xm.c
|
src/xenconfig/xen_xm.c
|
||||||
tests/virpolkittest.c
|
tests/virpolkittest.c
|
||||||
tools/libvirt-guests.sh.in
|
tools/libvirt-guests.sh.in
|
||||||
|
@ -1000,22 +1000,11 @@ CPU_SOURCES = \
|
|||||||
VMX_SOURCES = \
|
VMX_SOURCES = \
|
||||||
vmx/vmx.c vmx/vmx.h
|
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_SOURCES = \
|
||||||
xenconfig/xenxs_private.h \
|
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_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
|
pkgdata_DATA = cpu/cpu_map.xml
|
||||||
|
|
||||||
@ -1070,19 +1059,10 @@ libvirt_vmx_la_SOURCES = $(VMX_SOURCES)
|
|||||||
endif WITH_VMX
|
endif WITH_VMX
|
||||||
|
|
||||||
if WITH_XENCONFIG
|
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$(srcdir)/conf $(AM_CFLAGS) -Wno-unused-parameter
|
|
||||||
libvirt_xenxldiskparser_la_SOURCES = \
|
|
||||||
$(XENXLDISKPARSER_SOURCES)
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES += libvirt_xenconfig.la
|
noinst_LTLIBRARIES += libvirt_xenconfig.la
|
||||||
libvirt_la_BUILT_LIBADD += libvirt_xenconfig.la
|
libvirt_la_BUILT_LIBADD += libvirt_xenconfig.la
|
||||||
libvirt_xenconfig_la_CFLAGS = \
|
libvirt_xenconfig_la_CFLAGS = \
|
||||||
-I$(srcdir)/conf $(AM_CFLAGS)
|
-I$(srcdir)/conf $(AM_CFLAGS)
|
||||||
libvirt_xenconfig_la_LIBADD = libvirt_xenxldiskparser.la
|
|
||||||
libvirt_xenconfig_la_SOURCES = $(XENCONFIG_SOURCES)
|
libvirt_xenconfig_la_SOURCES = $(XENCONFIG_SOURCES)
|
||||||
endif WITH_XENCONFIG
|
endif WITH_XENCONFIG
|
||||||
|
|
||||||
@ -1844,7 +1824,6 @@ EXTRA_DIST += \
|
|||||||
$(VBOX_DRIVER_EXTRA_DIST) \
|
$(VBOX_DRIVER_EXTRA_DIST) \
|
||||||
$(VMWARE_DRIVER_SOURCES) \
|
$(VMWARE_DRIVER_SOURCES) \
|
||||||
$(XENCONFIG_SOURCES) \
|
$(XENCONFIG_SOURCES) \
|
||||||
$(XENXLDISKPARSER_SOURCES) \
|
|
||||||
$(ACCESS_DRIVER_POLKIT_POLICY)
|
$(ACCESS_DRIVER_POLKIT_POLICY)
|
||||||
|
|
||||||
check-local: check-augeas
|
check-local: check-augeas
|
||||||
|
@ -16,10 +16,6 @@ xenParseSxprChar;
|
|||||||
xenParseSxprSound;
|
xenParseSxprSound;
|
||||||
xenParseSxprString;
|
xenParseSxprString;
|
||||||
|
|
||||||
#xenconfig/xen_xl.h
|
|
||||||
xenFormatXL;
|
|
||||||
xenParseXL;
|
|
||||||
|
|
||||||
# xenconfig/xen_xm.h
|
# xenconfig/xen_xm.h
|
||||||
xenFormatXM;
|
xenFormatXM;
|
||||||
xenParseXM;
|
xenParseXM;
|
||||||
|
@ -1812,8 +1812,7 @@ xenFormatVfb(virConfPtr conf, virDomainDefPtr def, int xendConfigVersion)
|
|||||||
{
|
{
|
||||||
int hvm = STREQ(def->os.type, "hvm") ? 1 : 0;
|
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 (hvm || (xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF)) {
|
||||||
if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
||||||
if (xenConfigSetInt(conf, "sdl", 1) < 0)
|
if (xenConfigSetInt(conf, "sdl", 1) < 0)
|
||||||
|
@ -1,499 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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
|
|
||||||
* <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Author: Kiarie Kahurani <davidkiarie4@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#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 <diskspec> 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 = <devtype>
|
|
||||||
* backendtype = <backend-type>
|
|
||||||
* parameters not taken care of
|
|
||||||
* backend = <domain-name>
|
|
||||||
* script = <script>
|
|
||||||
* direct-io-safe
|
|
||||||
*
|
|
||||||
* ================================================================
|
|
||||||
* The parser does not take any deprecated parameters
|
|
||||||
*
|
|
||||||
* For more information refer to /xen/docs/misc/xl-disk-configuration.txt
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
xenParseXLDisk(virConfPtr conf, virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
virConfValuePtr list = virConfGetValue(conf, "disk");
|
|
||||||
xenXLDiskParserContext dpc;
|
|
||||||
virDomainDiskDefPtr disk;
|
|
||||||
|
|
||||||
memset(&dpc, 0, sizeof(dpc));
|
|
||||||
|
|
||||||
if (list && list->type == VIR_CONF_LIST) {
|
|
||||||
list = list->list;
|
|
||||||
while (list) {
|
|
||||||
char *disk_spec = list->str;
|
|
||||||
const char *driver;
|
|
||||||
|
|
||||||
if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
|
|
||||||
goto skipdisk;
|
|
||||||
|
|
||||||
if (!(disk = virDomainDiskDefNew()))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
disk->src->readonly = 0;
|
|
||||||
disk->src->format = VIR_STORAGE_FILE_LAST;
|
|
||||||
|
|
||||||
if (xenXLDiskParserPrep(&dpc, disk_spec, disk))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
xl_disk_lex(dpc.scanner);
|
|
||||||
|
|
||||||
if (dpc.err)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
if (disk->src->format == VIR_STORAGE_FILE_LAST)
|
|
||||||
disk->src->format = VIR_STORAGE_FILE_RAW;
|
|
||||||
|
|
||||||
if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
|
|
||||||
disk->removable = true;
|
|
||||||
disk->src->readonly = true;
|
|
||||||
if (virDomainDiskSetDriver(disk, "qemu") < 0)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
|
|
||||||
if (!disk->src->path || STREQ(disk->src->path, ""))
|
|
||||||
disk->src->format = VIR_STORAGE_FILE_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (STRPREFIX(disk->dst, "xvd") || !STREQ(def->os.type, "hvm"))
|
|
||||||
disk->bus = VIR_DOMAIN_DISK_BUS_XEN;
|
|
||||||
else if (STRPREFIX(disk->dst, "sd"))
|
|
||||||
disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
|
|
||||||
else
|
|
||||||
disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
|
|
||||||
|
|
||||||
driver = virDomainDiskGetDriver(disk);
|
|
||||||
if (!driver) {
|
|
||||||
switch (disk->src->format) {
|
|
||||||
case VIR_STORAGE_FILE_QCOW:
|
|
||||||
case VIR_STORAGE_FILE_QCOW2:
|
|
||||||
case VIR_STORAGE_FILE_VHD:
|
|
||||||
driver = "qemu";
|
|
||||||
if (virDomainDiskSetDriver(disk, "qemu") < 0)
|
|
||||||
goto fail;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
driver = "phy";
|
|
||||||
if (virDomainDiskSetDriver(disk, "phy") < 0)
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (STREQ(driver, "phy"))
|
|
||||||
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_BLOCK);
|
|
||||||
else
|
|
||||||
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
|
|
||||||
|
|
||||||
if (VIR_APPEND_ELEMENT(def->disks, def->ndisks, disk) < 0)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
skipdisk:
|
|
||||||
list = list->next;
|
|
||||||
xenXLDiskParserCleanup(&dpc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
xenXLDiskParserCleanup(&dpc);
|
|
||||||
virDomainDiskDefFree(disk);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
virDomainDefPtr
|
|
||||||
xenParseXL(virConfPtr conf, virCapsPtr caps, int xendConfigVersion)
|
|
||||||
{
|
|
||||||
virDomainDefPtr def = NULL;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(def) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
def->virtType = VIR_DOMAIN_VIRT_XEN;
|
|
||||||
def->id = -1;
|
|
||||||
|
|
||||||
if (xenParseConfigCommon(conf, def, caps, xendConfigVersion) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (xenParseXLDisk(conf, def) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (xenParseXLSpice(conf, def) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
return def;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virDomainDefFree(def);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
xenFormatXLDisk(virConfValuePtr list, virDomainDiskDefPtr disk)
|
|
||||||
{
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
virConfValuePtr val, tmp;
|
|
||||||
const char *src = virDomainDiskGetSource(disk);
|
|
||||||
int format = virDomainDiskGetFormat(disk);
|
|
||||||
|
|
||||||
/* target */
|
|
||||||
virBufferAsprintf(&buf, "%s,", src);
|
|
||||||
/* format */
|
|
||||||
switch (format) {
|
|
||||||
case VIR_STORAGE_FILE_RAW:
|
|
||||||
virBufferAddLit(&buf, "raw,");
|
|
||||||
break;
|
|
||||||
case VIR_STORAGE_FILE_VHD:
|
|
||||||
virBufferAddLit(&buf, "xvhd,");
|
|
||||||
break;
|
|
||||||
case VIR_STORAGE_FILE_QCOW:
|
|
||||||
virBufferAddLit(&buf, "qcow,");
|
|
||||||
break;
|
|
||||||
case VIR_STORAGE_FILE_QCOW2:
|
|
||||||
virBufferAddLit(&buf, "qcow2,");
|
|
||||||
break;
|
|
||||||
/* set default */
|
|
||||||
default:
|
|
||||||
virBufferAddLit(&buf, "raw,");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* device */
|
|
||||||
virBufferAdd(&buf, disk->dst, -1);
|
|
||||||
|
|
||||||
virBufferAddLit(&buf, ",");
|
|
||||||
|
|
||||||
if (disk->src->readonly)
|
|
||||||
virBufferAddLit(&buf, "r,");
|
|
||||||
else if (disk->src->shared)
|
|
||||||
virBufferAddLit(&buf, "!,");
|
|
||||||
else
|
|
||||||
virBufferAddLit(&buf, "w,");
|
|
||||||
if (disk->transient) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
_("transient disks not supported yet"));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
|
|
||||||
virBufferAddLit(&buf, "devtype=cdrom");
|
|
||||||
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(val) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
val->type = VIR_CONF_STRING;
|
|
||||||
val->str = virBufferContentAndReset(&buf);
|
|
||||||
tmp = list->list;
|
|
||||||
while (tmp && tmp->next)
|
|
||||||
tmp = tmp->next;
|
|
||||||
if (tmp)
|
|
||||||
tmp->next = val;
|
|
||||||
else
|
|
||||||
list->list = val;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virBufferFreeAndReset(&buf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
xenFormatXLDomainDisks(virConfPtr conf, virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
virConfValuePtr diskVal = NULL;
|
|
||||||
size_t i = 0;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(diskVal) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
diskVal->type = VIR_CONF_LIST;
|
|
||||||
diskVal->list = NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < def->ndisks; i++) {
|
|
||||||
if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
|
|
||||||
continue;
|
|
||||||
if (xenFormatXLDisk(diskVal, def->disks[i]) < 0)
|
|
||||||
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (diskVal->list != NULL) {
|
|
||||||
int ret = virConfSetValue(conf, "disk", diskVal);
|
|
||||||
diskVal = NULL;
|
|
||||||
if (ret < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virConfFreeValue(diskVal);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
xenFormatXLSpice(virConfPtr conf, virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
const char *listenAddr = NULL;
|
|
||||||
|
|
||||||
if (STREQ(def->os.type, "hvm")) {
|
|
||||||
if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
|
|
||||||
/* set others to false but may not be necessary */
|
|
||||||
if (xenConfigSetInt(conf, "sdl", 0) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (xenConfigSetInt(conf, "vnc", 0) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (xenConfigSetInt(conf, "spice", 1) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (xenConfigSetInt(conf, "spiceport",
|
|
||||||
def->graphics[0]->data.spice.port) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (xenConfigSetInt(conf, "spicetls_port",
|
|
||||||
def->graphics[0]->data.spice.tlsPort) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (def->graphics[0]->data.spice.auth.passwd) {
|
|
||||||
if (xenConfigSetInt(conf, "spicedisable_ticketing", 1) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (def->graphics[0]->data.spice.auth.passwd &&
|
|
||||||
xenConfigSetString(conf, "spicepasswd",
|
|
||||||
def->graphics[0]->data.spice.auth.passwd) < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
listenAddr = virDomainGraphicsListenGetAddress(def->graphics[0], 0);
|
|
||||||
if (listenAddr &&
|
|
||||||
xenConfigSetString(conf, "spicehost", listenAddr) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (xenConfigSetInt(conf, "spicemouse_mouse",
|
|
||||||
def->graphics[0]->data.spice.mousemode) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (def->graphics[0]->data.spice.copypaste) {
|
|
||||||
if (xenConfigSetInt(conf, "spicedvagent", 1) < 0)
|
|
||||||
return -1;
|
|
||||||
if (xenConfigSetInt(conf, "spice_clipboard_sharing",
|
|
||||||
def->graphics[0]->data.spice.copypaste) < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
virConfPtr
|
|
||||||
xenFormatXL(virDomainDefPtr def, virConnectPtr conn, int xendConfigVersion)
|
|
||||||
{
|
|
||||||
virConfPtr conf = NULL;
|
|
||||||
|
|
||||||
if (!(conf = virConfNew()))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (xenFormatConfigCommon(conf, def, conn, xendConfigVersion) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (xenFormatXLDomainDisks(conf, def) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (xenFormatXLSpice(conf, def) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
return conf;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
if (conf)
|
|
||||||
virConfFree(conf);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* xen_xl.h: 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
|
|
||||||
* <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Author: Kiarie Kahurani<davidkiarie4@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __VIR_XEN_XL_H__
|
|
||||||
# define __VIR_XEN_XL_H__
|
|
||||||
|
|
||||||
# include "virconf.h"
|
|
||||||
# include "domain_conf.h"
|
|
||||||
# include "xen_common.h"
|
|
||||||
|
|
||||||
virDomainDefPtr xenParseXL(virConfPtr conn, virCapsPtr caps,
|
|
||||||
int xendConfigVersion);
|
|
||||||
virConfPtr xenFormatXL(virDomainDefPtr def,
|
|
||||||
virConnectPtr, int xendConfigVersion);
|
|
||||||
|
|
||||||
#endif /* __VIR_XEN_XL_H__ */
|
|
@ -1,256 +0,0 @@
|
|||||||
/*
|
|
||||||
* xen_xl_disk.l - parser for disk specification strings
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011 Citrix Ltd.
|
|
||||||
* Author Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
*
|
|
||||||
* This program 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; version 2.1 only. with the special
|
|
||||||
* exception on linking described in file LICENSE.
|
|
||||||
*
|
|
||||||
* This program 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parsing the old xm/xend/xl-4.1 disk specs is a tricky problem,
|
|
||||||
* because the target string might in theory contain "," which is the
|
|
||||||
* delimiter we use for stripping off things on the RHS, and ":",
|
|
||||||
* which is the delimiter we use for stripping off things on the LHS.
|
|
||||||
*
|
|
||||||
* In this parser we do not support such target strings in the old
|
|
||||||
* syntax; if the target string has to contain "," or ":" the new
|
|
||||||
* syntax's "target=" should be used.
|
|
||||||
*/
|
|
||||||
%{
|
|
||||||
# include <config.h>
|
|
||||||
|
|
||||||
# include <stdio.h>
|
|
||||||
|
|
||||||
# include "viralloc.h"
|
|
||||||
# include "virstoragefile.h"
|
|
||||||
# include "virstring.h"
|
|
||||||
# include "domain_conf.h"
|
|
||||||
# include "xen_xl.h"
|
|
||||||
# include "xen_xl_disk_i.h"
|
|
||||||
|
|
||||||
#define YY_NO_INPUT
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_NONE
|
|
||||||
|
|
||||||
/* Some versions of flex have a bug (Fedora bugzilla 612465) which causes
|
|
||||||
* it to fail to declare these functions, which it defines. So declare
|
|
||||||
* them ourselves. Hopefully we won't have to simultaneously support
|
|
||||||
* a flex version which declares these differently somehow. */
|
|
||||||
int xl_disk_lexget_column(yyscan_t yyscanner);
|
|
||||||
void xl_disk_lexset_column(int column_no, yyscan_t yyscanner);
|
|
||||||
|
|
||||||
|
|
||||||
/*----- useful macros and functions used in actions -----
|
|
||||||
* we use macros in the actual rules to keep the actions short
|
|
||||||
* and particularly to avoid repeating boilerplate values such as
|
|
||||||
* DPC->disk, yytext, etc. */
|
|
||||||
|
|
||||||
/* For actions whose patterns contain '=', finds the start of the value */
|
|
||||||
#define FROMEQUALS (strchr(yytext,'=')+1)
|
|
||||||
|
|
||||||
/* Chops the delimiter off, modifying yytext and yyleng. */
|
|
||||||
#define STRIP(delim) do{ \
|
|
||||||
if (yyleng>0 && yytext[yyleng-1]==(delim)) \
|
|
||||||
yytext[--yyleng] = 0; \
|
|
||||||
}while(0)
|
|
||||||
|
|
||||||
/* Sets a string value, checking it hasn't been set already. */
|
|
||||||
#define SAVESTRING(what,loc,val) do{ \
|
|
||||||
savestring(DPC, what " respecified", &DPC->disk->loc, (val)); \
|
|
||||||
}while(0)
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
savestring(xenXLDiskParserContext *dpc,
|
|
||||||
const char *what_respecified,
|
|
||||||
char **update,
|
|
||||||
const char *value)
|
|
||||||
{
|
|
||||||
if (*update) {
|
|
||||||
if (**update) {
|
|
||||||
xenXLDiskParserError(dpc, value, what_respecified);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
VIR_FREE(*update); /* do not complain about overwriting empty strings */
|
|
||||||
}
|
|
||||||
|
|
||||||
ignore_value(VIR_STRDUP(*update, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DPC dpc /* our convention in lexer helper functions */
|
|
||||||
|
|
||||||
/* Sets ->readwrite from the string. */
|
|
||||||
static void
|
|
||||||
setaccess(xenXLDiskParserContext *dpc, const char *str)
|
|
||||||
{
|
|
||||||
if (STREQ(str, "rw") || STREQ(str, "w")) {
|
|
||||||
dpc->disk->src->readonly = 0;
|
|
||||||
} else if (STREQ(str, "r") || STREQ(str, "ro")) {
|
|
||||||
dpc->disk->src->readonly = 1;
|
|
||||||
} else if (STREQ(str, "w!") || STREQ(str, "!")) {
|
|
||||||
dpc->disk->src->readonly = 0;
|
|
||||||
dpc->disk->src->shared = 1;
|
|
||||||
} else {
|
|
||||||
xenXLDiskParserError(dpc, str, "unknown value for access");
|
|
||||||
}
|
|
||||||
dpc->access_set = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sets ->format from the string. IDL should provide something for this. */
|
|
||||||
static void
|
|
||||||
setformat(xenXLDiskParserContext *dpc, const char *str)
|
|
||||||
{
|
|
||||||
if (STREQ(str, "") || STREQ(str, "raw"))
|
|
||||||
virDomainDiskSetFormat(dpc->disk, VIR_STORAGE_FILE_RAW);
|
|
||||||
else if (STREQ(str, "qcow"))
|
|
||||||
virDomainDiskSetFormat(dpc->disk, VIR_STORAGE_FILE_QCOW);
|
|
||||||
else if (STREQ(str, "qcow2"))
|
|
||||||
virDomainDiskSetFormat(dpc->disk, VIR_STORAGE_FILE_QCOW2);
|
|
||||||
else if (STREQ(str, "vhd"))
|
|
||||||
virDomainDiskSetFormat(dpc->disk, VIR_STORAGE_FILE_VHD);
|
|
||||||
else
|
|
||||||
xenXLDiskParserError(dpc, str, "unknown value for format");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Sets ->backend from the string. IDL should provide something for this. */
|
|
||||||
static void
|
|
||||||
setdrivertype(xenXLDiskParserContext *dpc, const char *str)
|
|
||||||
{
|
|
||||||
if (STREQ(str, "phy"))
|
|
||||||
ignore_value(virDomainDiskSetDriver(dpc->disk, "phy"));
|
|
||||||
else if (STREQ(str, "tap"))
|
|
||||||
ignore_value(virDomainDiskSetDriver(dpc->disk, "tap"));
|
|
||||||
else if (STREQ(str, "file") || STREQ(str, ""))
|
|
||||||
ignore_value(virDomainDiskSetDriver(dpc->disk, "qemu"));
|
|
||||||
else
|
|
||||||
xenXLDiskParserError(dpc, str, "unknown value for backendtype");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Handles a vdev positional parameter which includes a devtype. */
|
|
||||||
static int
|
|
||||||
vdev_and_devtype(xenXLDiskParserContext *dpc, char *str)
|
|
||||||
{
|
|
||||||
/* returns 1 if it was <vdev>:<devtype>, 0 (doing nothing) otherwise */
|
|
||||||
char *colon = strrchr(str, ':');
|
|
||||||
if (!colon)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
*colon++ = 0;
|
|
||||||
SAVESTRING("vdev", dst, str);
|
|
||||||
|
|
||||||
if (STREQ(colon,"cdrom")) {
|
|
||||||
DPC->disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
|
|
||||||
} else if (STREQ(colon, "disk")) {
|
|
||||||
DPC->disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
|
|
||||||
} else {
|
|
||||||
xenXLDiskParserError(DPC, colon, "unknown deprecated type");
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef DPC /* needs to be defined differently the actual lexer */
|
|
||||||
#define DPC ((xenXLDiskParserContext*)yyextra)
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
%option warn
|
|
||||||
%option nodefault
|
|
||||||
%option batch
|
|
||||||
%option 8bit
|
|
||||||
%option noyywrap
|
|
||||||
%option reentrant
|
|
||||||
%option nounput
|
|
||||||
|
|
||||||
%x LEXERR
|
|
||||||
|
|
||||||
%%
|
|
||||||
|
|
||||||
/*----- the scanner rules which do the parsing -----*/
|
|
||||||
|
|
||||||
[ \t\n]+/([^ \t\n].*)? { /* ignore whitespace before parameters */ }
|
|
||||||
|
|
||||||
/* ordinary parameters setting enums or strings */
|
|
||||||
|
|
||||||
format=[^,]*,? { STRIP(','); setformat(DPC, FROMEQUALS); }
|
|
||||||
|
|
||||||
cdrom,? { DPC->disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM; }
|
|
||||||
devtype=cdrom,? { DPC->disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM; }
|
|
||||||
devtype=disk,? { DPC->disk->device = VIR_DOMAIN_DISK_DEVICE_DISK; }
|
|
||||||
devtype=[^,]*,? { xenXLDiskParserError(DPC, yytext,"unknown value for type"); }
|
|
||||||
|
|
||||||
access=[^,]*,? { STRIP(','); setaccess(DPC, FROMEQUALS); }
|
|
||||||
backendtype=[^,]*,? { STRIP(','); setdrivertype(DPC, FROMEQUALS); }
|
|
||||||
|
|
||||||
vdev=[^,]*,? { STRIP(','); SAVESTRING("vdev", dst, FROMEQUALS); }
|
|
||||||
|
|
||||||
/* the target magic parameter, eats the rest of the string */
|
|
||||||
|
|
||||||
target=.* { STRIP(','); SAVESTRING("target", src->path, FROMEQUALS); }
|
|
||||||
|
|
||||||
/* unknown parameters */
|
|
||||||
|
|
||||||
[a-z][-a-z0-9]*=[^,],? { xenXLDiskParserError(DPC, yytext, "unknown parameter"); }
|
|
||||||
|
|
||||||
/* the "/.*" in these patterns ensures that they count as if they
|
|
||||||
* matched the whole string, so these patterns take precedence */
|
|
||||||
|
|
||||||
(raw|qcow2?|vhd):/.* {
|
|
||||||
STRIP(':');
|
|
||||||
DPC->had_depr_prefix=1;
|
|
||||||
setformat(DPC, yytext);
|
|
||||||
}
|
|
||||||
|
|
||||||
tapdisk:/.* { DPC->had_depr_prefix=1; }
|
|
||||||
tap2?:/.* { DPC->had_depr_prefix=1; }
|
|
||||||
aio:/.* { DPC->had_depr_prefix=1; }
|
|
||||||
ioemu:/.* { DPC->had_depr_prefix=1; }
|
|
||||||
file:/.* { DPC->had_depr_prefix=1; }
|
|
||||||
phy:/.* { DPC->had_depr_prefix=1; }
|
|
||||||
[a-z][a-z0-9]*:/([^a-z0-9].*)? {
|
|
||||||
xenXLDiskParserError(DPC, yytext, "unknown deprecated disk prefix");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* positional parameters */
|
|
||||||
|
|
||||||
[^=,]*,|[^=,]+,? {
|
|
||||||
STRIP(',');
|
|
||||||
|
|
||||||
if (DPC->err) {
|
|
||||||
/* previous errors may just lead to subsequent ones */
|
|
||||||
} else if (!DPC->disk->src->path) {
|
|
||||||
SAVESTRING("target", src->path, yytext);
|
|
||||||
} else if (DPC->disk->src->format == VIR_STORAGE_FILE_LAST){
|
|
||||||
setformat(DPC, yytext);
|
|
||||||
}
|
|
||||||
else if (!DPC->disk->dst) {
|
|
||||||
if (!vdev_and_devtype(DPC, yytext))
|
|
||||||
SAVESTRING("vdev", dst, yytext);
|
|
||||||
} else if (!DPC->access_set) {
|
|
||||||
DPC->access_set = 1;
|
|
||||||
setaccess(DPC, yytext);
|
|
||||||
} else {
|
|
||||||
xenXLDiskParserError(DPC, yytext, "too many positional parameters");
|
|
||||||
return 0; /* don't print any more errors */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
. {
|
|
||||||
BEGIN(LEXERR);
|
|
||||||
yymore();
|
|
||||||
}
|
|
||||||
<LEXERR>.* {
|
|
||||||
xenXLDiskParserError(DPC, yytext, "bad disk syntax");
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* xen_xl_disk_i.h - common header for disk spec parser
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011 Citrix Ltd.
|
|
||||||
* Author Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
*
|
|
||||||
* This program 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; version 2.1 only. with the special
|
|
||||||
* exception on linking described in file LICENSE.
|
|
||||||
*
|
|
||||||
* This program 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __VIR_XEN_XL_DISK_I_H__
|
|
||||||
# define __VIR_XEN_XL_DISK_I_H__
|
|
||||||
|
|
||||||
# include "virconf.h"
|
|
||||||
# include "domain_conf.h"
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int err;
|
|
||||||
void *scanner;
|
|
||||||
YY_BUFFER_STATE buf;
|
|
||||||
virDomainDiskDefPtr disk;
|
|
||||||
int access_set;
|
|
||||||
int had_depr_prefix;
|
|
||||||
const char *spec;
|
|
||||||
} xenXLDiskParserContext;
|
|
||||||
|
|
||||||
void xenXLDiskParserError(xenXLDiskParserContext *dpc,
|
|
||||||
const char *erroneous,
|
|
||||||
const char *message);
|
|
||||||
|
|
||||||
#endif /* __VIR_XEN_XL_DISK_I_H__ */
|
|
Loading…
Reference in New Issue
Block a user