From fa6ba9b8c785114cb32a55fd953b0989aed4f328 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 5 Oct 2022 14:33:57 +0200 Subject: [PATCH] virNetDevIPRouteParseXML: Refactor to use 'virXMLProp*' instead of XPath MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The function extracts multiple attributes form a single element. Modify the function to stop using multiple XPath lookups. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/conf/domain_conf.c | 2 +- src/conf/network_conf.c | 4 +-- src/conf/networkcommon_conf.c | 61 +++++++++-------------------------- src/conf/networkcommon_conf.h | 3 +- 4 files changed, 19 insertions(+), 51 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8be37a4040..cdf05e8fae 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -6263,7 +6263,7 @@ virDomainNetIPInfoParseXML(const char *source, for (i = 0; i < nrouteNodes; i++) { virNetDevIPRoute *route = NULL; - if (!(route = virNetDevIPRouteParseXML(source, routeNodes[i], ctxt))) + if (!(route = virNetDevIPRouteParseXML(source, routeNodes[i]))) goto error; VIR_APPEND_ELEMENT(def->routes, def->nroutes, route); diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index be43894050..44ac5408d1 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -1824,9 +1824,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt, for (i = 0; i < nRoutes; i++) { virNetDevIPRoute *route = NULL; - if (!(route = virNetDevIPRouteParseXML(def->name, - routeNodes[i], - ctxt))) + if (!(route = virNetDevIPRouteParseXML(def->name, routeNodes[i]))) return NULL; def->routes[i] = route; def->nroutes++; diff --git a/src/conf/networkcommon_conf.c b/src/conf/networkcommon_conf.c index 7bfcd2e9b4..275847853d 100644 --- a/src/conf/networkcommon_conf.c +++ b/src/conf/networkcommon_conf.c @@ -211,58 +211,29 @@ virNetDevIPRouteCreate(const char *errorDetail, virNetDevIPRoute * virNetDevIPRouteParseXML(const char *errorDetail, - xmlNodePtr node, - xmlXPathContextPtr ctxt) + xmlNodePtr node) { - /* - * virNetDevIPRoute object is already allocated as part - * of an array. On failure clear: it out, but don't free it. - */ - - VIR_XPATH_NODE_AUTORESTORE(ctxt) - g_autofree char *family = NULL; - g_autofree char *address = NULL; - g_autofree char *netmask = NULL; - g_autofree char *gateway = NULL; - unsigned long prefix = 0, metric = 0; - int prefixRc, metricRc; + g_autofree char *family = virXMLPropString(node, "family"); + g_autofree char *address = virXMLPropString(node, "address"); + g_autofree char *netmask = virXMLPropString(node, "netmask"); + g_autofree char *gateway = virXMLPropString(node, "gateway"); + unsigned int prefix = 0; + unsigned int metric = 0; bool hasPrefix = false; bool hasMetric = false; + int rc; - ctxt->node = node; + if ((rc = virXMLPropUInt(node, "prefix", 10, VIR_XML_PROP_NONE, &prefix)) < 0) + return NULL; - /* grab raw data from XML */ - family = virXPathString("string(./@family)", ctxt); - address = virXPathString("string(./@address)", ctxt); - netmask = virXPathString("string(./@netmask)", ctxt); - gateway = virXPathString("string(./@gateway)", ctxt); - prefixRc = virXPathULong("string(./@prefix)", ctxt, &prefix); - if (prefixRc == -2) { - virReportError(VIR_ERR_XML_ERROR, - _("%s: Invalid prefix specified " - "in route definition"), - errorDetail); + if (rc == 1) + hasPrefix = true; + + if ((rc = virXMLPropUInt(node, "metric", 10, VIR_XML_PROP_NONZERO, &metric)) < 0) return NULL; - } - hasPrefix = (prefixRc == 0); - metricRc = virXPathULong("string(./@metric)", ctxt, &metric); - if (metricRc == -2) { - virReportError(VIR_ERR_XML_ERROR, - _("%s: Invalid metric specified " - "in route definition"), - errorDetail); - return NULL; - } - if (metricRc == 0) { + + if (rc == 1) hasMetric = true; - if (metric == 0) { - virReportError(VIR_ERR_XML_ERROR, - _("%s: Invalid metric value, must be > 0 " - "in route definition"), - errorDetail); - return NULL; - } - } return virNetDevIPRouteCreate(errorDetail, family, address, netmask, gateway, prefix, hasPrefix, metric, diff --git a/src/conf/networkcommon_conf.h b/src/conf/networkcommon_conf.h index b5955d9f99..9ac981d0d7 100644 --- a/src/conf/networkcommon_conf.h +++ b/src/conf/networkcommon_conf.h @@ -42,8 +42,7 @@ virNetDevIPRouteCreate(const char *networkName, virNetDevIPRoute * virNetDevIPRouteParseXML(const char *networkName, - xmlNodePtr node, - xmlXPathContextPtr ctxt); + xmlNodePtr node); int virNetDevIPRouteFormat(virBuffer *buf, const virNetDevIPRoute *def);