[PATCH v2 06/19] Refactoring virDomainHostdevSubsysPCIDefParseXML() to use XPath

Kristina Hanicova khanicov at redhat.com
Tue May 4 11:40:00 UTC 2021


Signed-off-by: Kristina Hanicova <khanicov at redhat.com>
---
 src/conf/domain_conf.c | 37 +++++++++++++------------------------
 1 file changed, 13 insertions(+), 24 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 3ca5211a35..c5d4469b72 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6841,12 +6841,16 @@ virDomainHostdevSubsysPCIOrigStatesDefParseXML(xmlNodePtr node,
 
 static int
 virDomainHostdevSubsysPCIDefParseXML(xmlNodePtr node,
-                                     xmlXPathContextPtr ctxt G_GNUC_UNUSED,
+                                     xmlXPathContextPtr ctxt,
                                      virDomainHostdevDef *def,
                                      unsigned int flags)
 {
     g_autofree char *filtering = NULL;
-    xmlNodePtr cur;
+    xmlNodePtr address = NULL;
+    xmlNodePtr origstates = NULL;
+    VIR_XPATH_NODE_AUTORESTORE(ctxt)
+
+    ctxt->node = node;
 
     if ((filtering = virXMLPropString(node, "writeFiltering"))) {
         int val;
@@ -6859,29 +6863,14 @@ virDomainHostdevSubsysPCIDefParseXML(xmlNodePtr node,
         def->writeFiltering = val;
     }
 
-    cur = node->children;
-    while (cur != NULL) {
-        if (cur->type == XML_ELEMENT_NODE) {
-            if (virXMLNodeNameEqual(cur, "address")) {
-                virPCIDeviceAddress *addr =
-                    &def->source.subsys.u.pci.addr;
+    if ((address = virXPathNode("./address", ctxt)) &&
+        virPCIDeviceAddressParseXML(address, &def->source.subsys.u.pci.addr) < 0)
+        return -1;
 
-                if (virPCIDeviceAddressParseXML(cur, addr) < 0)
-                    return -1;
-            } else if ((flags & VIR_DOMAIN_DEF_PARSE_PCI_ORIG_STATES) &&
-                       virXMLNodeNameEqual(cur, "origstates")) {
-                virDomainHostdevOrigStates *states = &def->origstates;
-                if (virDomainHostdevSubsysPCIOrigStatesDefParseXML(cur, states) < 0)
-                    return -1;
-            } else {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("unknown pci source type '%s'"),
-                               cur->name);
-                return -1;
-            }
-        }
-        cur = cur->next;
-    }
+    if ((flags & VIR_DOMAIN_DEF_PARSE_PCI_ORIG_STATES) &&
+        (origstates = virXPathNode("./origstates", ctxt)) &&
+        virDomainHostdevSubsysPCIOrigStatesDefParseXML(origstates, &def->origstates) < 0)
+        return -1;
 
     return 0;
 }
-- 
2.30.2




More information about the libvir-list mailing list