[PATCH 02/16] virxml: Introduce virXMLPropLongLong()

Michal Privoznik mprivozn at redhat.com
Thu Jun 2 07:17:52 UTC 2022


So far, we have functions that parse an enum, int, tristate bool,
and what not but we have none for long long. Heavily inspired by
virXMLPropInt(), introduce virXMLPropLongLong() for parsing long
long attributes.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/libvirt_private.syms |  1 +
 src/util/virxml.c        | 62 ++++++++++++++++++++++++++++++++++++++++
 src/util/virxml.h        |  9 ++++++
 3 files changed, 72 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index bfedd85326..1e247878e3 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3652,6 +3652,7 @@ virXMLPickShellSafeComment;
 virXMLPropEnum;
 virXMLPropEnumDefault;
 virXMLPropInt;
+virXMLPropLongLong;
 virXMLPropString;
 virXMLPropTristateBool;
 virXMLPropTristateBoolAllowDefault;
diff --git a/src/util/virxml.c b/src/util/virxml.c
index d6e2e5dd91..22caf58131 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -721,6 +721,68 @@ virXMLPropUInt(xmlNodePtr node,
 }
 
 
+/**
+ * virXMLPropLongLong:
+ * @node: XML dom node pointer
+ * @name: Name of the property (attribute) to get
+ * @base: Number base, see strtol
+ * @flags: Bitwise or of virXMLPropFlags
+ * @result: The returned value
+ * @defaultResult: default value of @result in case the property is not found
+ *
+ * Convenience function to return value of an long long attribute.
+ *
+ * Returns 1 in case of success in which case @result is set,
+ *         or 0 if the attribute is not present,
+ *         or -1 and reports an error on failure.
+ */
+int
+virXMLPropLongLong(xmlNodePtr node,
+                   const char* name,
+                   int base,
+                   virXMLPropFlags flags,
+                   long long *result,
+                   long long defaultResult)
+{
+    g_autofree char *tmp = NULL;
+    long long val;
+
+    *result = defaultResult;
+
+    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 (virStrToLong_ll(tmp, NULL, base, &val) < 0) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Invalid value for attribute '%s' in element '%s': '%s'. Expected integer value"),
+                       name, node->name, tmp);
+        return -1;
+    }
+
+    if ((flags & VIR_XML_PROP_NONNEGATIVE) && (val < 0)) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Invalid value for attribute '%s' in element '%s': '%s'. Expected non-negative value"),
+                       name, node->name, tmp);
+        return -1;
+    }
+
+    if ((flags & VIR_XML_PROP_NONZERO) && (val == 0)) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Invalid value for attribute '%s' in element '%s': Zero is not permitted"),
+                       name, node->name);
+        return -1;
+    }
+
+    *result = val;
+    return 1;
+}
 /**
  * virXMLPropULongLong:
  * @node: XML dom node pointer
diff --git a/src/util/virxml.h b/src/util/virxml.h
index 539228a9ba..94f3b9760c 100644
--- a/src/util/virxml.h
+++ b/src/util/virxml.h
@@ -137,6 +137,15 @@ virXMLPropUInt(xmlNodePtr node,
                unsigned int *result)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5);
 
+int
+virXMLPropLongLong(xmlNodePtr node,
+                   const char* name,
+                   int base,
+                   virXMLPropFlags flags,
+                   long long *result,
+                   long long defaultResult)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5);
+
 int
 virXMLPropULongLong(xmlNodePtr node,
                     const char* name,
-- 
2.35.1



More information about the libvir-list mailing list