diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index d53d5a3b44..1d29ce642a 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -935,13 +935,3 @@ virCapabilitiesGenerateMac(virCapsPtr caps, { virMacAddrGenerate(caps->macPrefix, mac); } - -extern void -virCapabilitiesSetEmulatorRequired(virCapsPtr caps) { - caps->emulatorRequired = 1; -} - -extern unsigned int -virCapabilitiesIsEmulatorRequired(virCapsPtr caps) { - return caps->emulatorRequired; -} diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index a3838e61a6..5e7a5f6a77 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -163,7 +163,6 @@ struct _virCaps { /* Move to virDomainXMLOption later */ unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN]; - unsigned int emulatorRequired : 1; int defaultDiskDriverType; /* enum virStorageFileFormat */ int (*defaultConsoleTargetType)(const char *ostype, virArch guestarch); bool hasWideScsiBus; @@ -186,12 +185,6 @@ extern void virCapabilitiesGenerateMac(virCapsPtr caps, virMacAddrPtr mac); -extern void -virCapabilitiesSetEmulatorRequired(virCapsPtr caps); - -extern unsigned int -virCapabilitiesIsEmulatorRequired(virCapsPtr caps); - extern int virCapabilitiesAddHostFeature(virCapsPtr caps, const char *name); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 3237fb1e9a..062469635a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9165,8 +9165,10 @@ virDomainLeaseRemove(virDomainDefPtr def, } -static char *virDomainDefDefaultEmulator(virDomainDefPtr def, - virCapsPtr caps) { +char * +virDomainDefGetDefaultEmulator(virDomainDefPtr def, + virCapsPtr caps) +{ const char *type; const char *emulator; char *retemu; @@ -9185,13 +9187,13 @@ static char *virDomainDefDefaultEmulator(virDomainDefPtr def, if (!emulator) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("no emulator for domain %s os type %s on architecture %s"), + _("no emulator for domain %s os type %s " + "on architecture %s"), type, def->os.type, virArchToString(def->os.arch)); return NULL; } - retemu = strdup(emulator); - if (!retemu) + if (!(retemu = strdup(emulator))) virReportOOMError(); return retemu; @@ -10385,11 +10387,6 @@ virDomainDefParseXML(xmlDocPtr xml, } def->emulator = virXPathString("string(./devices/emulator[1])", ctxt); - if (!def->emulator && virCapabilitiesIsEmulatorRequired(caps)) { - def->emulator = virDomainDefDefaultEmulator(def, caps); - if (!def->emulator) - goto error; - } /* analysis of the disk devices */ if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e54dadc9bd..19a66ed1ab 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2476,4 +2476,6 @@ int virDomainObjListExport(virDomainObjListPtr doms, virDomainVcpuPinDefPtr virDomainLookupVcpuPin(virDomainDefPtr def, int vcpuid); +char *virDomainDefGetDefaultEmulator(virDomainDefPtr def, virCapsPtr caps); + #endif /* __DOMAIN_CONF_H */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2930104da3..36e4ee06f7 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -21,9 +21,7 @@ virCapabilitiesFormatXML; virCapabilitiesFreeMachines; virCapabilitiesFreeNUMAInfo; virCapabilitiesGenerateMac; -virCapabilitiesIsEmulatorRequired; virCapabilitiesNew; -virCapabilitiesSetEmulatorRequired; virCapabilitiesSetHostCPU; virCapabilitiesSetMacPrefix; @@ -118,6 +116,7 @@ virDomainDefFormat; virDomainDefFormatInternal; virDomainDefFree; virDomainDefGenSecurityLabelDef; +virDomainDefGetDefaultEmulator; virDomainDefGetSecurityLabelDef; virDomainDefParseFile; virDomainDefParseNode; diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c index 377d8af117..ce8c2b5b6e 100644 --- a/src/lxc/lxc_conf.c +++ b/src/lxc/lxc_conf.c @@ -119,9 +119,6 @@ virCapsPtr lxcCapsInit(virLXCDriverPtr driver) goto error; } - /* LXC Requires an emulator in the XML */ - virCapabilitiesSetEmulatorRequired(caps); - if (driver) { /* Security driver data */ const char *doi, *model; @@ -159,11 +156,12 @@ error: virDomainXMLOptionPtr lxcDomainXMLConfInit(void) { - return virDomainXMLOptionNew(NULL, + return virDomainXMLOptionNew(&virLXCDriverDomainDefParserConfig, &virLXCDriverPrivateDataCallbacks, NULL); } + int lxcLoadDriverConfig(virLXCDriverPtr driver) { char *filename; diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index 08cf8f6b34..80907895c9 100644 --- a/src/lxc/lxc_domain.c +++ b/src/lxc/lxc_domain.c @@ -79,3 +79,20 @@ virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks = { .format = virLXCDomainObjPrivateXMLFormat, .parse = virLXCDomainObjPrivateXMLParse, }; + +static int +virLXCDomainDefPostParse(virDomainDefPtr def, + virCapsPtr caps, + void *opaque ATTRIBUTE_UNUSED) +{ + /* check for emulator and create a default one if needed */ + if (!def->emulator && + !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) + return -1; + + return 0; +} + +virDomainDefParserConfig virLXCDriverDomainDefParserConfig = { + .domainPostParseCallback = virLXCDomainDefPostParse, +}; diff --git a/src/lxc/lxc_domain.h b/src/lxc/lxc_domain.h index 007ea84e68..12753aadbd 100644 --- a/src/lxc/lxc_domain.h +++ b/src/lxc/lxc_domain.h @@ -39,5 +39,6 @@ struct _virLXCDomainObjPrivate { }; extern virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks; +extern virDomainDefParserConfig virLXCDriverDomainDefParserConfig; #endif /* __LXC_DOMAIN_H__ */ diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index aa381b4ea7..748fd408a0 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -909,9 +909,6 @@ virCapsPtr virQEMUCapsInit(virQEMUCapsCachePtr cache) i) < 0) goto error; - /* QEMU Requires an emulator in the XML */ - virCapabilitiesSetEmulatorRequired(caps); - caps->defaultConsoleTargetType = virQEMUCapsDefaultConsoleType; return caps; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2e7a98612e..30732578a6 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -662,6 +662,20 @@ virDomainXMLNamespace virQEMUDriverDomainXMLNamespace = { }; +static int +qemuDomainDefPostParse(virDomainDefPtr def, + virCapsPtr caps, + void *opaque ATTRIBUTE_UNUSED) +{ + /* check for emulator and create a default one if needed */ + if (!def->emulator && + !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) + return -1; + + return 0; +} + + static int qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virDomainDefPtr def ATTRIBUTE_UNUSED, @@ -703,6 +717,7 @@ no_memory: virDomainDefParserConfig virQEMUDriverDomainDefParserConfig = { .devicesPostParseCallback = qemuDomainDeviceDefPostParse, + .domainPostParseCallback = qemuDomainDefPostParse, }; diff --git a/tests/lxcxml2xmldata/lxc-hostdev.xml b/tests/lxcxml2xmldata/lxc-hostdev.xml index 02a87a7b13..b022cc714b 100644 --- a/tests/lxcxml2xmldata/lxc-hostdev.xml +++ b/tests/lxcxml2xmldata/lxc-hostdev.xml @@ -13,6 +13,7 @@ restart destroy + /usr/libexec/libvirt_lxc diff --git a/tests/lxcxml2xmldata/lxc-systemd.xml b/tests/lxcxml2xmldata/lxc-systemd.xml index 2f36eeeeee..fd3a606d7e 100644 --- a/tests/lxcxml2xmldata/lxc-systemd.xml +++ b/tests/lxcxml2xmldata/lxc-systemd.xml @@ -15,6 +15,7 @@ restart destroy + /usr/libexec/libvirt_lxc