[PATCH 2/6] util: xml: Return GPtrArray from virXMLNodeGetSubelement

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Rework the helper to use a GPtrArray structure to simplify callers.

Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx>
---
 src/conf/domain_conf.c   | 40 ++++++++++++++++++++--------------------
 src/conf/network_conf.c  | 33 +++++++++++++++++----------------
 src/conf/nwfilter_conf.c | 20 +++++++++++---------
 src/util/virxml.c        | 21 ++++++++-------------
 src/util/virxml.h        |  5 ++---
 5 files changed, 58 insertions(+), 61 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 82672b30a0..db3d12cb49 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -16396,23 +16396,23 @@ virDomainFeaturesKVMDefParse(virDomainDef *def,
                              xmlNodePtr node)
 {
     g_autofree virDomainFeatureKVM *kvm = g_new0(virDomainFeatureKVM, 1);
-    g_autofree xmlNodePtr *feats = NULL;
-    size_t nfeats = virXMLNodeGetSubelementList(node, NULL, &feats);
+    g_autoptr(GPtrArray) feats = virXMLNodeGetSubelementList(node, NULL);
     size_t i;

-    for (i = 0; i < nfeats; i++) {
+    for (i = 0; i < feats->len; i++) {
+        xmlNodePtr feat = g_ptr_array_index(feats, i);
         int feature;
         virTristateSwitch value;

-        feature = virDomainKVMTypeFromString((const char *)feats[i]->name);
+        feature = virDomainKVMTypeFromString((const char *)feat->name);
         if (feature < 0) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("unsupported KVM feature: %1$s"),
-                           feats[i]->name);
+                           feat->name);
             return -1;
         }

-        if (virXMLPropTristateSwitch(feats[i], "state", VIR_XML_PROP_REQUIRED,
+        if (virXMLPropTristateSwitch(feat, "state", VIR_XML_PROP_REQUIRED,
                                      &value) < 0)
             return -1;

@@ -16422,7 +16422,7 @@ virDomainFeaturesKVMDefParse(virDomainDef *def,
         if (feature == VIR_DOMAIN_KVM_DIRTY_RING &&
             value == VIR_TRISTATE_SWITCH_ON) {

-            if (virXMLPropUInt(feats[i], "size", 0, VIR_XML_PROP_REQUIRED,
+            if (virXMLPropUInt(feat, "size", 0, VIR_XML_PROP_REQUIRED,
                                &kvm->dirty_ring_size) < 0) {
                 return -1;
             }
@@ -16449,25 +16449,25 @@ static int
 virDomainFeaturesXENDefParse(virDomainDef *def,
                              xmlNodePtr node)
 {
-    g_autofree xmlNodePtr *feats = NULL;
-    size_t nfeats = virXMLNodeGetSubelementList(node, NULL, &feats);
+    g_autoptr(GPtrArray) feats = virXMLNodeGetSubelementList(node, NULL);
     size_t i;

     def->features[VIR_DOMAIN_FEATURE_XEN] = VIR_TRISTATE_SWITCH_ON;

-    for (i = 0; i < nfeats; i++) {
+    for (i = 0; i < feats->len; i++) {
+        xmlNodePtr feat = g_ptr_array_index(feats, i);
         int feature;
         virTristateSwitch value;

-        feature = virDomainXenTypeFromString((const char *)feats[i]->name);
+        feature = virDomainXenTypeFromString((const char *)feat->name);
         if (feature < 0) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("unsupported Xen feature: %1$s"),
-                           feats[i]->name);
+                           feat->name);
             return -1;
         }

-        if (virXMLPropTristateSwitch(feats[i], "state",
+        if (virXMLPropTristateSwitch(feat, "state",
                                      VIR_XML_PROP_REQUIRED, &value) < 0)
             return -1;

@@ -16481,7 +16481,7 @@ virDomainFeaturesXENDefParse(virDomainDef *def,
             if (value != VIR_TRISTATE_SWITCH_ON)
                 break;

-            if (virXMLPropEnum(feats[i], "mode",
+            if (virXMLPropEnum(feat, "mode",
                                virDomainXenPassthroughModeTypeFromString,
                                VIR_XML_PROP_NONZERO,
                                &def->xen_passthrough_mode) < 0)
@@ -16501,8 +16501,7 @@ static int
 virDomainFeaturesCapabilitiesDefParse(virDomainDef *def,
                                       xmlNodePtr node)
 {
-    g_autofree xmlNodePtr *caps = NULL;
-    size_t ncaps = virXMLNodeGetSubelementList(node, NULL, &caps);
+    g_autoptr(GPtrArray) caps = virXMLNodeGetSubelementList(node, NULL);
     virDomainCapabilitiesPolicy policy;
     size_t i;

@@ -16514,17 +16513,18 @@ virDomainFeaturesCapabilitiesDefParse(virDomainDef *def,

     def->features[VIR_DOMAIN_FEATURE_CAPABILITIES] = policy;

-    for (i = 0; i < ncaps; i++) {
+    for (i = 0; i < caps->len; i++) {
+        xmlNodePtr cap = g_ptr_array_index(caps, i);
         virTristateSwitch state;
-        int val = virDomainProcessCapsFeatureTypeFromString((const char *)caps[i]->name);
+        int val = virDomainProcessCapsFeatureTypeFromString((const char *)cap->name);
         if (val < 0) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("unexpected capability feature '%1$s'"), caps[i]->name);
+                           _("unexpected capability feature '%1$s'"), cap->name);
             return -1;
         }


-        if (virXMLPropTristateSwitch(caps[i], "state", VIR_XML_PROP_NONE, &state) < 0)
+        if (virXMLPropTristateSwitch(cap, "state", VIR_XML_PROP_NONE, &state) < 0)
             return -1;

         if (state == VIR_TRISTATE_SWITCH_ABSENT)
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 0449b6f07c..0b966d2c20 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -606,26 +606,28 @@ virNetworkDHCPDefParseXML(const char *networkName,
                           xmlNodePtr node,
                           virNetworkIPDef *def)
 {
-    g_autofree xmlNodePtr *rangeNodes = NULL;
-    size_t nrangeNodes = virXMLNodeGetSubelementList(node, "range", &rangeNodes);
-    g_autofree xmlNodePtr *hostNodes = NULL;
-    size_t nhostNodes = virXMLNodeGetSubelementList(node, "host", &hostNodes);
+
+    g_autoptr(GPtrArray) rangeNodes = virXMLNodeGetSubelementList(node, "range");
+    g_autoptr(GPtrArray) hostNodes = virXMLNodeGetSubelementList(node, "host");
     xmlNodePtr bootp = virXMLNodeGetSubelement(node, "bootp");
     size_t i;

-    for (i = 0; i < nrangeNodes; i++) {
+    for (i = 0; i < rangeNodes->len; i++) {
         virNetworkDHCPRangeDef range = { 0 };

-        if (virNetworkDHCPRangeDefParseXML(networkName, def, rangeNodes[i], &range) < 0)
+        if (virNetworkDHCPRangeDefParseXML(networkName, def,
+                                           g_ptr_array_index(rangeNodes, i),
+                                           &range) < 0)
             return -1;

         VIR_APPEND_ELEMENT(def->ranges, def->nranges, range);
     }

-    for (i = 0; i < nhostNodes; i++) {
+    for (i = 0; i < hostNodes->len; i++) {
         virNetworkDHCPHostDef host = { 0 };

-        if (virNetworkDHCPHostDefParseXML(networkName, def, hostNodes[i],
+        if (virNetworkDHCPHostDefParseXML(networkName, def,
+                                          g_ptr_array_index(hostNodes, i),
                                           &host, false) < 0)
             return -1;

@@ -655,17 +657,16 @@ virNetworkDNSHostDefParseXML(const char *networkName,
                              virNetworkDNSHostDef *def,
                              bool partialOkay)
 {
-    g_autofree xmlNodePtr *hostnameNodes = NULL;
-    size_t nhostnameNodes = virXMLNodeGetSubelementList(node, "hostname", &hostnameNodes);
+    g_autoptr(GPtrArray) hostnameNodes = virXMLNodeGetSubelementList(node, "hostname");
     size_t i;
     g_auto(GStrv) hostnames = NULL;
     g_autofree char *ip = virXMLPropString(node, "ip");

-    if (nhostnameNodes > 0) {
-        hostnames = g_new0(char *, nhostnameNodes + 1);
+    if (hostnameNodes->len > 0) {
+        hostnames = g_new0(char *, hostnameNodes->len + 1);

-        for (i = 0; i < nhostnameNodes; i++) {
-            if (!(hostnames[i] = virXMLNodeContentString(hostnameNodes[i])))
+        for (i = 0; i < hostnameNodes->len; i++) {
+            if (!(hostnames[i] = virXMLNodeContentString(g_ptr_array_index(hostnameNodes, i))))
                 return -1;

             if (*hostnames[i] == '\0') {
@@ -699,7 +700,7 @@ virNetworkDNSHostDefParseXML(const char *networkName,
             return -1;
         }

-        if (nhostnameNodes == 0) {
+        if (hostnameNodes->len == 0) {
             virReportError(VIR_ERR_XML_DETAIL,
                            _("Missing ip and hostname in network '%1$s' DNS HOST record"),
                            networkName);
@@ -708,7 +709,7 @@ virNetworkDNSHostDefParseXML(const char *networkName,
     }

     def->names = g_steal_pointer(&hostnames);
-    def->nnames = nhostnameNodes;
+    def->nnames = hostnameNodes->len;
     return 0;
 }

diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
index 35f6efbbe2..e949503cab 100644
--- a/src/conf/nwfilter_conf.c
+++ b/src/conf/nwfilter_conf.c
@@ -2362,8 +2362,7 @@ static virNWFilterRuleDef *
 virNWFilterRuleParse(xmlNodePtr node)
 {
     g_autofree char *statematch = NULL;
-    g_autofree xmlNodePtr *attrNodes = NULL;
-    size_t nattrNodes = 0;
+    g_autoptr(GPtrArray) attrNodes = NULL;
     g_autoptr(virNWFilterRuleDef) ret = NULL;

     ret = g_new0(virNWFilterRuleDef, 1);
@@ -2389,17 +2388,18 @@ virNWFilterRuleParse(xmlNodePtr node)
         (STREQ(statematch, "0") || STRCASEEQ(statematch, "false")))
         ret->flags |= RULE_FLAG_NO_STATEMATCH;

-    nattrNodes = virXMLNodeGetSubelementList(node, NULL, &attrNodes);
+    attrNodes = virXMLNodeGetSubelementList(node, NULL);

-    if (nattrNodes > 0) {
+    if (attrNodes->len > 0) {
         size_t i;
         size_t attr = 0;

         /* First we look up the type of the first valid element. The rest of
          * the parsing then only considers elements with same name. */
-        for (i = 0; i < nattrNodes; i++) {
+        for (i = 0; i < attrNodes->len; i++) {
             for (attr = 0; virAttr[attr].id; attr++) {
-                if (virXMLNodeNameEqual(attrNodes[i], virAttr[attr].id)) {
+                if (virXMLNodeNameEqual(g_ptr_array_index(attrNodes, i),
+                                        virAttr[attr].id)) {
                     ret->prtclType = virAttr[attr].prtclType;
                     break;
                 }
@@ -2411,15 +2411,17 @@ virNWFilterRuleParse(xmlNodePtr node)
         }

         /* parse the correct subelements now */
-        for (i = 0; i < nattrNodes; i++) {
+        for (i = 0; i < attrNodes->len; i++) {
+            xmlNodePtr attrNode = g_ptr_array_index(attrNodes, i);
+
             /* no valid elements */
             if (!virAttr[attr].id)
                 break;

-            if (!virXMLNodeNameEqual(attrNodes[i], virAttr[attr].id))
+            if (!virXMLNodeNameEqual(attrNode, virAttr[attr].id))
                 continue;

-            if (virNWFilterRuleDetailsParse(attrNodes[i], ret, virAttr[attr].att) < 0)
+            if (virNWFilterRuleDetailsParse(attrNode, ret, virAttr[attr].att) < 0)
                 return NULL;
         }

diff --git a/src/util/virxml.c b/src/util/virxml.c
index 6d0c8f0311..a7b75fd7b3 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -904,33 +904,28 @@ virXMLNodeGetSubelement(xmlNodePtr node,
  * virXMLNodeGetSubelementList:
  * @node: node to get subelement of
  * @name: name of subelement to fetch (NULL to fetch all sub-elements)
- * @list: If non-NULL, filled with a list of pointers to the nodes. Caller is
- *        responsible for freeing the list but not the members.
  *
- * Find and return a sub-elements node of @node named @name in a list.
- * Returns the number of subelements with @name
+ * Find and return a sub-elements node of @node named @name in a GPtrArray
+ * populated with the xmlNodePtr objects. Caller is responsible for freeing the
+ * array but not the contained xmlNode objects.
  */
-size_t
+GPtrArray *
 virXMLNodeGetSubelementList(xmlNodePtr node,
-                            const char *name,
-                            xmlNodePtr **list)
+                            const char *name)
 {
+    GPtrArray *ret = g_ptr_array_new();
     xmlNodePtr n;
-    size_t nelems = 0;

     for (n = node->children; n; n = n->next) {
         if (n->type == XML_ELEMENT_NODE) {
             if (name && !virXMLNodeNameEqual(n, name))
                 continue;

-            if (list)
-                VIR_APPEND_ELEMENT_COPY(*list, nelems, n);
-            else
-                nelems++;
+            g_ptr_array_add(ret, n);
         }
     }

-    return nelems;
+    return ret;
 }


diff --git a/src/util/virxml.h b/src/util/virxml.h
index 03a85bfb25..06ba324df0 100644
--- a/src/util/virxml.h
+++ b/src/util/virxml.h
@@ -77,10 +77,9 @@ xmlNodePtr
 virXMLNodeGetSubelement(xmlNodePtr node,
                         const char *name);

-size_t
+GPtrArray *
 virXMLNodeGetSubelementList(xmlNodePtr node,
-                            const char *name,
-                            xmlNodePtr **list);
+                            const char *name);

 xmlNodePtr
 virXPathNode(const char *xpath,
-- 
2.43.0
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux