From c650e460bdc7f8197b1035a4f0166ef6d6e70f07 Mon Sep 17 00:00:00 2001 From: Jonathon Jongsma Date: Tue, 8 Nov 2022 14:12:32 -0600 Subject: [PATCH] util: add virXMLPropUIntDefault() function MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This function allows you to specify a default value to return if the property is not found rather than always setting *result to 0. Signed-off-by: Jonathon Jongsma Reviewed-by: Ján Tomko --- src/conf/cpu_conf.c | 9 +++------ src/conf/domain_conf.c | 6 +----- src/conf/numa_conf.c | 7 +------ src/util/virxml.c | 29 ++++++++++++++++++++++++++++- src/util/virxml.h | 9 +++++++++ 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index 9f5e8cb848..ba7428bc93 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -561,7 +561,6 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, } if ((topology = virXPathNode("./topology[1]", ctxt))) { - int rc; if (virXMLPropUInt(topology, "sockets", 10, VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO, @@ -569,12 +568,10 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, return -1; } - if ((rc = virXMLPropUInt(topology, "dies", 10, - VIR_XML_PROP_NONZERO, - &def->dies)) < 0) { + if (virXMLPropUIntDefault(topology, "dies", 10, + VIR_XML_PROP_NONZERO, + &def->dies, 1) < 0) { return -1; - } else if (rc == 0) { - def->dies = 1; } if (virXMLPropUInt(topology, "cores", 10, diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 694e119525..26ef31ee6e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -17085,7 +17085,6 @@ virDomainVcpuParse(virDomainDef *def, unsigned int vcpus; g_autofree char *tmp = NULL; g_autofree xmlNodePtr *nodes = NULL; - int rc; vcpus = maxvcpus = 1; @@ -17100,11 +17099,8 @@ virDomainVcpuParse(virDomainDef *def, } VIR_FREE(tmp); - if ((rc = virXMLPropUInt(vcpuNode, "current", 10, VIR_XML_PROP_NONE, &vcpus)) < 0) { + if (virXMLPropUIntDefault(vcpuNode, "current", 10, VIR_XML_PROP_NONE, &vcpus, maxvcpus) < 0) return -1; - } else if (rc == 0) { - vcpus = maxvcpus; - } if (virXMLPropEnumDefault(vcpuNode, "placement", virDomainCpuPlacementModeTypeFromString, diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c index b55bb3ffcb..7ef7aa5138 100644 --- a/src/conf/numa_conf.c +++ b/src/conf/numa_conf.c @@ -916,16 +916,11 @@ virDomainNumaDefParseXML(virDomainNuma *def, for (i = 0; i < n; i++) { VIR_XPATH_NODE_AUTORESTORE(ctxt) g_autofree char *tmp = NULL; - int rc; unsigned int cur_cell; - if ((rc = virXMLPropUInt(cell[i], "id", 10, VIR_XML_PROP_NONE, - &cur_cell)) < 0) + if (virXMLPropUIntDefault(cell[i], "id", 10, VIR_XML_PROP_NONE, &cur_cell, i) < 0) return -1; - if (rc == 0) - cur_cell = i; - /* cells are in order of parsing or explicitly numbered */ if (cur_cell >= n) { virReportError(VIR_ERR_XML_ERROR, "%s", diff --git a/src/util/virxml.c b/src/util/virxml.c index 9b6ccfd6c9..af4be4e443 100644 --- a/src/util/virxml.c +++ b/src/util/virxml.c @@ -560,12 +560,39 @@ virXMLPropUInt(xmlNodePtr node, int base, virXMLPropFlags flags, unsigned int *result) +{ + return virXMLPropUIntDefault(node, name, base, flags, result, 0); +} + + +/** + * virXMLPropUIntDefault: + * @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 + * @defaultResult: Default value of @result in case the property is not found + * + * Convenience function to return value of an unsigned integer 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 +virXMLPropUIntDefault(xmlNodePtr node, + const char *name, + int base, + virXMLPropFlags flags, + unsigned int *result, + unsigned int defaultResult) { g_autofree char *tmp = NULL; int ret; unsigned int val; - *result = 0; + *result = defaultResult; if (!(tmp = virXMLPropString(node, name))) { if (!(flags & VIR_XML_PROP_REQUIRED)) diff --git a/src/util/virxml.h b/src/util/virxml.h index d5b998263c..cca9f222ab 100644 --- a/src/util/virxml.h +++ b/src/util/virxml.h @@ -132,6 +132,15 @@ virXMLPropUInt(xmlNodePtr node, unsigned int *result) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5); +int +virXMLPropUIntDefault(xmlNodePtr node, + const char *name, + int base, + virXMLPropFlags flags, + unsigned int *result, + unsigned int defaultResult) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5); + int virXMLPropLongLong(xmlNodePtr node, const char *name, -- 2.47.2