[libvirt PATCH 00/10] Refactor more XML parsing boilerplate code, part III

For background, see https://listman.redhat.com/archives/libvir-list/2021-April/msg00668.html Tim Wiederhake (10): virDomainKeyWrapCipherDefParseXML: Use virXMLProp* virDomainKeyWrapDef: Make members virTristateSwitch qemuAppendKeyWrapMachineParm: Stricten parameter types virxml: Add virXMLPropULongLong virDomainDeviceDimmAddressParseXML: Use virXMLProp* virDomainHostdevSubsysSCSIHostDefParseXML: Use virXMLProp* virStorageEncryptionInfoParseCipher: Use virXMLProp* virDomainDeviceInfoParseXML: Use virXMLProp* virDomainDiskSourceNetworkParse: Use virXMLProp* virDomainMemorytuneDefParseMemory: Use virXMLProp* src/conf/domain_conf.c | 214 ++++++++--------------------- src/conf/domain_conf.h | 4 +- src/conf/storage_encryption_conf.c | 16 +-- src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 3 +- src/util/virxml.c | 56 ++++++++ src/util/virxml.h | 8 ++ 7 files changed, 125 insertions(+), 177 deletions(-) -- 2.26.3

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/conf/domain_conf.c | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0a00be4e80..cc0bdeed56 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1449,46 +1449,28 @@ static int virDomainKeyWrapCipherDefParseXML(virDomainKeyWrapDef *keywrap, xmlNodePtr node) { - int state_type; - int name_type; - g_autofree char *name = NULL; - g_autofree char *state = NULL; - - if (!(name = virXMLPropString(node, "name"))) { - virReportError(VIR_ERR_CONF_SYNTAX, "%s", - _("missing name for cipher")); - return -1; - } + virDomainKeyWrapCipherName name; + virTristateSwitch state; - if ((name_type = virDomainKeyWrapCipherNameTypeFromString(name)) < 0) { - virReportError(VIR_ERR_CONF_SYNTAX, - _("%s is not a supported cipher name"), name); + if (virXMLPropEnum(node, "name", virDomainKeyWrapCipherNameTypeFromString, + VIR_XML_PROP_REQUIRED, &name) < 0) return -1; - } - if (!(state = virXMLPropString(node, "state"))) { - virReportError(VIR_ERR_CONF_SYNTAX, - _("missing state for cipher named %s"), name); + if (virXMLPropTristateSwitch(node, "state", VIR_XML_PROP_REQUIRED, + &state) < 0) return -1; - } - - if ((state_type = virTristateSwitchTypeFromString(state)) < 0) { - virReportError(VIR_ERR_CONF_SYNTAX, - _("%s is not a supported cipher state"), state); - return -1; - } - switch ((virDomainKeyWrapCipherName) name_type) { + switch (name) { case VIR_DOMAIN_KEY_WRAP_CIPHER_NAME_AES: if (keywrap->aes != VIR_TRISTATE_SWITCH_ABSENT) { virReportError(VIR_ERR_INTERNAL_ERROR, _("A domain definition can have no more than " "one cipher node with name %s"), - virDomainKeyWrapCipherNameTypeToString(name_type)); + virDomainKeyWrapCipherNameTypeToString(name)); return -1; } - keywrap->aes = state_type; + keywrap->aes = state; break; case VIR_DOMAIN_KEY_WRAP_CIPHER_NAME_DEA: @@ -1496,11 +1478,11 @@ virDomainKeyWrapCipherDefParseXML(virDomainKeyWrapDef *keywrap, virReportError(VIR_ERR_INTERNAL_ERROR, _("A domain definition can have no more than " "one cipher node with name %s"), - virDomainKeyWrapCipherNameTypeToString(name_type)); + virDomainKeyWrapCipherNameTypeToString(name)); return -1; } - keywrap->dea = state_type; + keywrap->dea = state; break; case VIR_DOMAIN_KEY_WRAP_CIPHER_NAME_LAST: -- 2.26.3

With the last usage of `aes` and `dea` as int gone, these two can become virTristateSwitch. Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/conf/domain_conf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 4d1826362f..8e55d6e25f 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2615,8 +2615,8 @@ struct _virDomainPerfDef { }; struct _virDomainKeyWrapDef { - int aes; /* enum virTristateSwitch */ - int dea; /* enum virTristateSwitch */ + virTristateSwitch aes; + virTristateSwitch dea; }; typedef enum { -- 2.26.3

Follow up to the last patch. Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/qemu/qemu_command.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 2ceff15512..be93182092 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6804,7 +6804,8 @@ qemuBuildCpuCommandLine(virCommand *cmd, static bool qemuAppendKeyWrapMachineParm(virBuffer *buf, virQEMUCaps *qemuCaps, - int flag, const char *pname, int pstate) + virQEMUCapsFlags flag, const char *pname, + virTristateSwitch pstate) { if (pstate != VIR_TRISTATE_SWITCH_ABSENT) { if (!virQEMUCapsGet(qemuCaps, flag)) { -- 2.26.3

Convenience function to return the value of an unsigned long long XML attribute. Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/libvirt_private.syms | 1 + src/util/virxml.c | 56 ++++++++++++++++++++++++++++++++++++++++ src/util/virxml.h | 8 ++++++ 3 files changed, 65 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index abd3dc4bd1..0e6bf3d5b3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3554,6 +3554,7 @@ virXMLPropStringLimit; virXMLPropTristateBool; virXMLPropTristateSwitch; virXMLPropUInt; +virXMLPropULongLong; virXMLSaveFile; virXMLValidateAgainstSchema; virXMLValidatorFree; diff --git a/src/util/virxml.c b/src/util/virxml.c index 5ceef73814..b79050db35 100644 --- a/src/util/virxml.c +++ b/src/util/virxml.c @@ -755,6 +755,62 @@ virXMLPropUInt(xmlNodePtr node, } +/** + * virXMLPropULongLong: + * @node: XML dom node pointer + * @name: Name of the property (attribute) to get + * @base: Number base, see strtol + * @flags: Bitwise or of virXMLPropFlags + * @result: The returned value + * + * Convenience function to return value of an unsigned long long attribute. + * + * Returns 1 in case of success in which case @result is set, + * or 0 if the attribute is not present, + * or -1 and reports an error on failure. + */ +int +virXMLPropULongLong(xmlNodePtr node, + const char* name, + int base, + virXMLPropFlags flags, + unsigned long long *result) +{ + g_autofree char *tmp = NULL; + int ret; + unsigned long long val; + + if (!(tmp = virXMLPropString(node, name))) { + if (!(flags & VIR_XML_PROP_REQUIRED)) + return 0; + + virReportError(VIR_ERR_XML_ERROR, + _("Missing required attribute '%s' in element '%s'"), + name, node->name); + return -1; + } + + ret = virStrToLong_ullp(tmp, NULL, base, &val); + + if (ret < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid value for attribute '%s' in element '%s': '%s'. Expected integer value"), + name, node->name, tmp); + return -1; + } + + if ((flags & VIR_XML_PROP_NONZERO) && (val == 0)) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid value for attribute '%s' in element '%s': Zero is not permitted"), + name, node->name); + return -1; + } + + *result = val; + return 1; +} + + /** * virXMLPropEnum: * @node: XML dom node pointer diff --git a/src/util/virxml.h b/src/util/virxml.h index c83d16a14a..13c543fbb6 100644 --- a/src/util/virxml.h +++ b/src/util/virxml.h @@ -134,6 +134,14 @@ virXMLPropUInt(xmlNodePtr node, unsigned int *result) ATTRIBUTE_NONNULL(0) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4); +int +virXMLPropULongLong(xmlNodePtr node, + const char* name, + int base, + virXMLPropFlags flags, + unsigned long long *result) + ATTRIBUTE_NONNULL(0) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4); + int virXMLPropEnum(xmlNodePtr node, const char* name, -- 2.26.3

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/conf/domain_conf.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cc0bdeed56..c1ed206119 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -6508,24 +6508,13 @@ static int virDomainDeviceDimmAddressParseXML(xmlNodePtr node, virDomainDeviceDimmAddress *addr) { - g_autofree char *tmp = NULL; - - if (!(tmp = virXMLPropString(node, "slot")) || - virStrToLong_uip(tmp, NULL, 10, &addr->slot) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("invalid or missing dimm slot id '%s'"), - NULLSTR(tmp)); + if (virXMLPropUInt(node, "slot", 10, VIR_XML_PROP_REQUIRED, + &addr->slot) < 0) return -1; - } - VIR_FREE(tmp); - if ((tmp = virXMLPropString(node, "base"))) { - if (virStrToLong_ullp(tmp, NULL, 16, &addr->base) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("invalid dimm base address '%s'"), tmp); - return -1; - } - } + if (virXMLPropULongLong(node, "base", 16, VIR_XML_PROP_NONE, + &addr->base) < 0) + return -1; return 0; } -- 2.26.3

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/conf/domain_conf.c | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c1ed206119..eaa1398de1 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -7027,9 +7027,6 @@ virDomainHostdevSubsysSCSIHostDefParseXML(xmlNodePtr sourcenode, virDomainXMLOption *xmlopt) { virDomainHostdevSubsysSCSIHost *scsihostsrc = &scsisrc->u.host; - g_autofree char *bus = NULL; - g_autofree char *target = NULL; - g_autofree char *unit = NULL; xmlNodePtr addressnode = NULL; VIR_XPATH_NODE_AUTORESTORE(ctxt) @@ -7041,32 +7038,17 @@ virDomainHostdevSubsysSCSIHostDefParseXML(xmlNodePtr sourcenode, return -1; } - if (!(bus = virXMLPropString(addressnode, "bus")) || - !(target = virXMLPropString(addressnode, "target")) || - !(unit = virXMLPropString(addressnode, "unit"))) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("'bus', 'target', and 'unit' must be specified " - "for scsi hostdev source address")); - return -1; - } - - if (virStrToLong_uip(bus, NULL, 0, &scsihostsrc->bus) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse bus '%s'"), bus); + if (virXMLPropUInt(addressnode, "bus", 0, VIR_XML_PROP_REQUIRED, + &scsihostsrc->bus) < 0) return -1; - } - if (virStrToLong_uip(target, NULL, 0, &scsihostsrc->target) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse target '%s'"), target); + if (virXMLPropUInt(addressnode, "target", 0, VIR_XML_PROP_REQUIRED, + &scsihostsrc->target) < 0) return -1; - } - if (virStrToLong_ullp(unit, NULL, 0, &scsihostsrc->unit) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse unit '%s'"), unit); + if (virXMLPropULongLong(addressnode, "unit", 0, VIR_XML_PROP_REQUIRED, + &scsihostsrc->unit) < 0) return -1; - } if (!(scsihostsrc->adapter = virXPathString("string(./adapter/@name)", ctxt))) { virReportError(VIR_ERR_XML_ERROR, "%s", -- 2.26.3

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/conf/storage_encryption_conf.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/conf/storage_encryption_conf.c b/src/conf/storage_encryption_conf.c index c2c7c1dd43..9112b96cc7 100644 --- a/src/conf/storage_encryption_conf.c +++ b/src/conf/storage_encryption_conf.c @@ -176,27 +176,15 @@ static int virStorageEncryptionInfoParseCipher(xmlNodePtr info_node, virStorageEncryptionInfoDef *info) { - g_autofree char *size_str = NULL; - if (!(info->cipher_name = virXMLPropString(info_node, "name"))) { virReportError(VIR_ERR_XML_ERROR, "%s", _("cipher info missing 'name' attribute")); return -1; } - if ((size_str = virXMLPropString(info_node, "size")) && - virStrToLong_uip(size_str, NULL, 10, &info->cipher_size) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("cannot parse cipher size: '%s'"), - size_str); - return -1; - } - - if (!size_str) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("cipher info missing 'size' attribute")); + if (virXMLPropUInt(info_node, "size", 10, VIR_XML_PROP_REQUIRED, + &info->cipher_size) < 0) return -1; - } info->cipher_mode = virXMLPropString(info_node, "mode"); info->cipher_hash = virXMLPropString(info_node, "hash"); -- 2.26.3

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/conf/domain_conf.c | 40 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index eaa1398de1..367258bf7a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -6622,15 +6622,13 @@ virDomainDeviceInfoParseXML(virDomainXMLOption *xmlopt, virDomainDeviceInfo *info, unsigned int flags) { + xmlNodePtr acpi = NULL; xmlNodePtr address = NULL; xmlNodePtr master = NULL; xmlNodePtr boot = NULL; xmlNodePtr rom = NULL; int ret = -1; - g_autofree char *romenabled = NULL; - g_autofree char *rombar = NULL; g_autofree char *aliasStr = NULL; - g_autofree char *acpiIndex = NULL; VIR_XPATH_NODE_AUTORESTORE(ctxt) virDomainDeviceInfoClear(info); @@ -6657,24 +6655,14 @@ virDomainDeviceInfoParseXML(virDomainXMLOption *xmlopt, if ((flags & VIR_DOMAIN_DEF_PARSE_ALLOW_ROM) && (rom = virXPathNode("./rom", ctxt))) { - if ((romenabled = virXPathString("string(./rom/@enabled)", ctxt))) { - int value; - if ((value = virTristateBoolTypeFromString(romenabled)) <= 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown rom enabled value '%s'"), romenabled); - goto cleanup; - } - info->romenabled = value; - } - if ((rombar = virXPathString("string(./rom/@bar)", ctxt))) { - int value; - if ((value = virTristateSwitchTypeFromString(rombar)) <= 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown rom bar value '%s'"), rombar); - goto cleanup; - } - info->rombar = value; - } + if (virXMLPropTristateBool(rom, "enabled", VIR_XML_PROP_NONE, + &info->romenabled) < 0) + goto cleanup; + + if (virXMLPropTristateSwitch(rom, "bar", VIR_XML_PROP_NONE, + &info->rombar) < 0) + goto cleanup; + info->romfile = virXMLPropString(rom, "file"); if (info->romenabled == VIR_TRISTATE_BOOL_NO && @@ -6685,12 +6673,10 @@ virDomainDeviceInfoParseXML(virDomainXMLOption *xmlopt, } } - acpiIndex = virXPathString("string(./acpi/@index)", ctxt); - if (acpiIndex && - virStrToLong_ui(acpiIndex, NULL, 10, &info->acpiIndex) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Cannot parse ACPI index value '%s'"), acpiIndex); - goto cleanup; + if ((acpi = virXPathNode("./acpi", ctxt))) { + if (virXMLPropUInt(acpi, "index", 10, VIR_XML_PROP_NONE, + &info->acpiIndex) < 0) + goto cleanup; } if ((address = virXPathNode("./address", ctxt)) && -- 2.26.3

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/conf/domain_conf.c | 55 ++++++++++++------------------------------ 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 367258bf7a..113f4123d7 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8273,24 +8273,14 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, virStorageSource *src, unsigned int flags) { - int tlsCfgVal; - g_autofree char *protocol = NULL; - g_autofree char *haveTLS = NULL; - g_autofree char *tlsCfg = NULL; - g_autofree char *sslverifystr = NULL; + virStorageNetProtocol protocol; xmlNodePtr tmpnode; - if (!(protocol = virXMLPropString(node, "protocol"))) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("missing network source protocol type")); + if (virXMLPropEnum(node, "protocol", virStorageNetProtocolTypeFromString, + VIR_XML_PROP_REQUIRED, &protocol) < 0) return -1; - } - if ((src->protocol = virStorageNetProtocolTypeFromString(protocol)) <= 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown protocol type '%s'"), protocol); - return -1; - } + src->protocol = protocol; if (!(src->path = virXMLPropString(node, "name")) && src->protocol != VIR_STORAGE_NET_PROTOCOL_NBD) { @@ -8299,26 +8289,16 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, return -1; } - if ((haveTLS = virXMLPropString(node, "tls"))) { - int value; - - if ((value = virTristateBoolTypeFromString(haveTLS)) <= 0) { - virReportError(VIR_ERR_XML_ERROR, - _("unknown disk source 'tls' setting '%s'"), haveTLS); - return -1; - } - src->haveTLS = value; - } + if (virXMLPropTristateBool(node, "tls", VIR_XML_PROP_NONE, + &src->haveTLS) < 0) + return -1; - if ((flags & VIR_DOMAIN_DEF_PARSE_STATUS) && - (tlsCfg = virXMLPropString(node, "tlsFromConfig"))) { - if (virStrToLong_i(tlsCfg, NULL, 10, &tlsCfgVal) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Invalid tlsFromConfig value: %s"), - tlsCfg); + if (flags & VIR_DOMAIN_DEF_PARSE_STATUS) { + int value; + if (virXMLPropInt(node, "tlsFromConfig", 10, VIR_XML_PROP_NONE, + &value) < 0) return -1; - } - src->tlsFromConfig = !!tlsCfgVal; + src->tlsFromConfig = !!value; } /* for historical reasons we store the volume and image name in one XML @@ -8364,15 +8344,10 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, if ((src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTPS || src->protocol == VIR_STORAGE_NET_PROTOCOL_FTPS) && - (sslverifystr = virXPathString("string(./ssl/@verify)", ctxt))) { - int verify; - if ((verify = virTristateBoolTypeFromString(sslverifystr)) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("invalid ssl verify mode '%s'"), sslverifystr); + (tmpnode = virXPathNode("./ssl", ctxt))) { + if (virXMLPropTristateBool(tmpnode, "verify", VIR_XML_PROP_NONE, + &src->sslverify) < 0) return -1; - } - - src->sslverify = verify; } if ((src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTP || -- 2.26.3

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/conf/domain_conf.c | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 113f4123d7..c53ed60bae 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -20047,36 +20047,16 @@ virDomainMemorytuneDefParseMemory(xmlXPathContextPtr ctxt, VIR_XPATH_NODE_AUTORESTORE(ctxt) unsigned int id; unsigned int bandwidth; - g_autofree char *tmp = NULL; ctxt->node = node; - tmp = virXMLPropString(node, "id"); - if (!tmp) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Missing memorytune attribute 'id'")); + if (virXMLPropUInt(node, "id", 10, VIR_XML_PROP_REQUIRED, &id) < 0) return -1; - } - if (virStrToLong_uip(tmp, NULL, 10, &id) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Invalid memorytune attribute 'id' value '%s'"), - tmp); - return -1; - } - VIR_FREE(tmp); - tmp = virXMLPropString(node, "bandwidth"); - if (!tmp) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Missing memorytune attribute 'bandwidth'")); + if (virXMLPropUInt(node, "bandwidth", 10, VIR_XML_PROP_REQUIRED, + &bandwidth) < 0) return -1; - } - if (virStrToLong_uip(tmp, NULL, 10, &bandwidth) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Invalid memorytune attribute 'bandwidth' value '%s'"), - tmp); - return -1; - } + if (virResctrlAllocSetMemoryBandwidth(alloc, id, bandwidth) < 0) return -1; -- 2.26.3

On 4/21/21 5:51 PM, Tim Wiederhake wrote:
For background, see https://listman.redhat.com/archives/libvir-list/2021-April/msg00668.html
Tim Wiederhake (10): virDomainKeyWrapCipherDefParseXML: Use virXMLProp* virDomainKeyWrapDef: Make members virTristateSwitch qemuAppendKeyWrapMachineParm: Stricten parameter types virxml: Add virXMLPropULongLong virDomainDeviceDimmAddressParseXML: Use virXMLProp* virDomainHostdevSubsysSCSIHostDefParseXML: Use virXMLProp* virStorageEncryptionInfoParseCipher: Use virXMLProp* virDomainDeviceInfoParseXML: Use virXMLProp* virDomainDiskSourceNetworkParse: Use virXMLProp* virDomainMemorytuneDefParseMemory: Use virXMLProp*
src/conf/domain_conf.c | 214 ++++++++--------------------- src/conf/domain_conf.h | 4 +- src/conf/storage_encryption_conf.c | 16 +-- src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 3 +- src/util/virxml.c | 56 ++++++++ src/util/virxml.h | 8 ++ 7 files changed, 125 insertions(+), 177 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> and pushed. Michal
participants (2)
-
Michal Privoznik
-
Tim Wiederhake