]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: xml: Introduce virXMLPropLongLong
authorPeter Krempa <pkrempa@redhat.com>
Fri, 16 Sep 2022 12:40:46 +0000 (14:40 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 3 Oct 2022 12:43:17 +0000 (14:43 +0200)
Add a helper for parsing long long values from XML properties with
semantics like virXMLPropInt.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/libvirt_private.syms
src/util/virxml.c
src/util/virxml.h

index 01bb349e058fc84c36f3cf88b5bb51d6e035bb4b..5be40dbefe525d28c88e45f9b70313888e275f4f 100644 (file)
@@ -3682,6 +3682,7 @@ virXMLPickShellSafeComment;
 virXMLPropEnum;
 virXMLPropEnumDefault;
 virXMLPropInt;
+virXMLPropLongLong;
 virXMLPropString;
 virXMLPropStringRequired;
 virXMLPropTristateBool;
index 7d5f4478c34c2c2cef100af0a954d8261f8faeb6..a53a52dcf85ca8d0ae264f26fb594e2704688b50 100644 (file)
@@ -750,6 +750,70 @@ 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 a 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 long long 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
index 59342105d5c2c4cbe9b9a6f3352100bfc1e4cfe3..d1427e497819deb4ab8eb311a2f421a66489a734 100644 (file)
@@ -141,6 +141,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,