]> xenbits.xensource.com Git - libvirt.git/commitdiff
Refactoring virDomainHostdevSubsysPCIDefParseXML() to use XPath
authorKristina Hanicova <khanicov@redhat.com>
Tue, 4 May 2021 11:40:00 +0000 (13:40 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 5 May 2021 07:11:58 +0000 (09:11 +0200)
Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c

index 197b9d0381143ba768a52728ab0be7e630973d4a..2f6c8fe07c1381a26e5a8181313387d0bf8da718 100644 (file)
@@ -6798,12 +6798,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;
@@ -6816,29 +6820,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;
 }