[PATCH 01/17] util: xml: Extract implementation of xml property -> enum parsing to a common helper

Peter Krempa pkrempa at redhat.com
Thu May 6 15:30:53 UTC 2021


virXMLPropTristateBool/virXMLPropTristateSwitch/virXMLPropEnum can be
implemented using the same internal code. Extract it into a new function
called virXMLPropEnumInternal, which will also simplify adding versions
of these functions with a custom default value.

This way we'll be able to always initialize @result so that unused value
bugs can be prevented.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/util/virxml.c | 108 ++++++++++++++++++----------------------------
 1 file changed, 42 insertions(+), 66 deletions(-)

diff --git a/src/util/virxml.c b/src/util/virxml.c
index 7cc73ab9a0..9929064993 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -557,6 +557,40 @@ virXMLNodeContentString(xmlNodePtr node)
     return ret;
 }

+static int
+virXMLPropEnumInternal(xmlNodePtr node,
+                       const char* name,
+                       int (*strToInt)(const char*),
+                       virXMLPropFlags flags,
+                       unsigned int *result)
+
+{
+    g_autofree char *tmp = NULL;
+    int ret;
+
+    if (!(tmp = virXMLPropString(node, name))) {
+        if (!(flags & VIR_XML_PROP_REQUIRED))
+            return 0;
+
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Missing required attribute '%s' in element '%s'"),
+                       name, node->name);
+        return -1;
+    }
+
+    ret = strToInt(tmp);
+    if (ret < 0 ||
+        ((flags & VIR_XML_PROP_NONZERO) && (ret == 0))) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Invalid value for attribute '%s' in element '%s': '%s'."),
+                       name, node->name, NULLSTR(tmp));
+        return -1;
+    }
+
+    *result = ret;
+    return 1;
+}
+

 /**
  * virXMLPropTristateBool:
@@ -577,28 +611,10 @@ virXMLPropTristateBool(xmlNodePtr node,
                        virXMLPropFlags flags,
                        virTristateBool *result)
 {
-    g_autofree char *tmp = NULL;
-    int val;
-
-    if (!(tmp = virXMLPropString(node, name))) {
-        if (!(flags & VIR_XML_PROP_REQUIRED))
-            return 0;
-
-        virReportError(VIR_ERR_XML_ERROR,
-                       _("Missing required attribute '%s' in element '%s'"),
-                       name, node->name);
-        return -1;
-    }
-
-    if ((val = virTristateBoolTypeFromString(tmp)) <= 0) {
-        virReportError(VIR_ERR_XML_ERROR,
-                       _("Invalid value for attribute '%s' in element '%s': '%s'. Expected 'yes' or 'no'"),
-                       name, node->name, tmp);
-        return -1;
-    }
+    flags |= VIR_XML_PROP_NONZERO;

-    *result = val;
-    return 1;
+    return virXMLPropEnumInternal(node, name, virTristateBoolTypeFromString,
+                                  flags, result);
 }


@@ -621,28 +637,10 @@ virXMLPropTristateSwitch(xmlNodePtr node,
                          virXMLPropFlags flags,
                          virTristateSwitch *result)
 {
-    g_autofree char *tmp = NULL;
-    int val;
-
-    if (!(tmp = virXMLPropString(node, name))) {
-        if (!(flags & VIR_XML_PROP_REQUIRED))
-            return 0;
-
-        virReportError(VIR_ERR_XML_ERROR,
-                       _("Missing required attribute '%s' in element '%s'"),
-                       name, node->name);
-        return -1;
-    }
-
-    if ((val = virTristateSwitchTypeFromString(tmp)) <= 0) {
-        virReportError(VIR_ERR_XML_ERROR,
-                       _("Invalid value for attribute '%s' in element '%s': '%s'. Expected 'on' or 'off'"),
-                       name, node->name, tmp);
-        return -1;
-    }
+    flags |= VIR_XML_PROP_NONZERO;

-    *result = val;
-    return 1;
+    return virXMLPropEnumInternal(node, name, virTristateSwitchTypeFromString,
+                                  flags, result);
 }


@@ -833,32 +831,10 @@ virXMLPropEnum(xmlNodePtr node,
                virXMLPropFlags flags,
                unsigned int *result)
 {
-    g_autofree char *tmp = NULL;
-    int ret;
-
-    if (!(tmp = virXMLPropString(node, name))) {
-        if (!(flags & VIR_XML_PROP_REQUIRED))
-            return 0;
-
-        virReportError(VIR_ERR_XML_ERROR,
-                       _("Missing required attribute '%s' in element '%s'"),
-                       name, node->name);
-        return -1;
-    }
-
-    ret = strToInt(tmp);
-    if (ret < 0 ||
-        ((flags & VIR_XML_PROP_NONZERO) && (ret == 0))) {
-        virReportError(VIR_ERR_XML_ERROR,
-                       _("Invalid value for attribute '%s' in element '%s': '%s'."),
-                       name, node->name, NULLSTR(tmp));
-        return -1;
-    }
-
-    *result = ret;
-    return 1;
+    return virXMLPropEnumInternal(node, name, strToInt, flags, result);
 }

+
 /**
  * virXPathBoolean:
  * @xpath: the XPath string to evaluate
-- 
2.30.2




More information about the libvir-list mailing list