]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: network: Refactor XML parsing in virNetworkDHCPDefParseXML
authorPeter Krempa <pkrempa@redhat.com>
Wed, 15 Feb 2023 16:10:18 +0000 (17:10 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 5 Jun 2023 11:23:06 +0000 (13:23 +0200)
Use virXMLNodeGetSubelement(List) instead of the looped parser and
simplify the code.

Note that handling of the 'bootp' element now conforms to the schema
where we allow just one and the 'file' attribute is mandatory.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/conf/network_conf.c

index 5add0ef902c2ddc2c4af6ea6ed6c50ba85bcdf1e..73788b6d8727658ed541ff25de63af3b3a8b6bb5 100644 (file)
@@ -605,53 +605,43 @@ virNetworkDHCPDefParseXML(const char *networkName,
                           xmlNodePtr node,
                           virNetworkIPDef *def)
 {
-    xmlNodePtr cur;
-    virNetworkDHCPRangeDef range;
-    virNetworkDHCPHostDef host;
+    g_autofree xmlNodePtr *rangeNodes = NULL;
+    size_t nrangeNodes = virXMLNodeGetSubelementList(node, "range", &rangeNodes);
+    g_autofree xmlNodePtr *hostNodes = NULL;
+    size_t nhostNodes = virXMLNodeGetSubelementList(node, "host", &hostNodes);
+    xmlNodePtr bootp = virXMLNodeGetSubelement(node, "bootp");
+    size_t i;
 
-    memset(&range, 0, sizeof(range));
-    memset(&host, 0, sizeof(host));
+    for (i = 0; i < nrangeNodes; i++) {
+        virNetworkDHCPRangeDef range = { 0 };
 
-    cur = node->children;
-    while (cur != NULL) {
-        if (cur->type == XML_ELEMENT_NODE &&
-            virXMLNodeNameEqual(cur, "range")) {
+        if (virNetworkDHCPRangeDefParseXML(networkName, def, rangeNodes[i], &range) < 0)
+            return -1;
 
-            if (virNetworkDHCPRangeDefParseXML(networkName, def, cur, &range) < 0)
-                return -1;
-            VIR_APPEND_ELEMENT(def->ranges, def->nranges, range);
+        VIR_APPEND_ELEMENT(def->ranges, def->nranges, range);
+    }
 
-        } else if (cur->type == XML_ELEMENT_NODE &&
-            virXMLNodeNameEqual(cur, "host")) {
+    for (i = 0; i < nhostNodes; i++) {
+        virNetworkDHCPHostDef host = { 0 };
 
-            if (virNetworkDHCPHostDefParseXML(networkName, def, cur,
-                                              &host, false) < 0)
-                return -1;
-            VIR_APPEND_ELEMENT(def->hosts, def->nhosts, host);
-        } else if (VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_INET) &&
-                   cur->type == XML_ELEMENT_NODE &&
-                   virXMLNodeNameEqual(cur, "bootp")) {
-            g_autofree char *file = NULL;
-            g_autofree char *server = NULL;
-            virSocketAddr inaddr;
-            memset(&inaddr, 0, sizeof(inaddr));
-
-            if (!(file = virXMLPropString(cur, "file"))) {
-                cur = cur->next;
-                continue;
-            }
-            server = virXMLPropString(cur, "server");
+        if (virNetworkDHCPHostDefParseXML(networkName, def, hostNodes[i],
+                                          &host, false) < 0)
+            return -1;
 
-            if (server &&
-                virSocketAddrParse(&inaddr, server, AF_UNSPEC) < 0) {
-                return -1;
-            }
+        VIR_APPEND_ELEMENT(def->hosts, def->nhosts, host);
+    }
 
-            def->bootfile = g_steal_pointer(&file);
-            def->bootserver = inaddr;
-        }
+    if (bootp &&
+        VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_INET)) {
+        g_autofree char *server = virXMLPropString(bootp, "server");
 
-        cur = cur->next;
+        if (!(def->bootfile = virXMLPropStringRequired(bootp, "file")))
+            return -1;
+
+        if (server &&
+            virSocketAddrParse(&def->bootserver, server, AF_UNSPEC) < 0) {
+            return -1;
+        }
     }
 
     return 0;