virxml: Add virXMLPropInt

Convenience function to return the value of an integer XML attribute.

Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Tim Wiederhake 2021-04-16 11:41:47 +02:00 committed by Peter Krempa
parent 8861d96c88
commit de17e0d30d
3 changed files with 63 additions and 0 deletions

View File

@ -3548,6 +3548,7 @@ virXMLNodeSanitizeNamespaces;
virXMLNodeToString;
virXMLParseHelper;
virXMLPickShellSafeComment;
virXMLPropInt;
virXMLPropString;
virXMLPropStringLimit;
virXMLPropTristateBool;

View File

@ -646,6 +646,59 @@ virXMLPropTristateSwitch(xmlNodePtr node,
}
/**
* virXMLPropInt:
* @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
*
* Convenience function to return value of an integer 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
virXMLPropInt(xmlNodePtr node,
const char *name,
int base,
virXMLPropFlags flags,
int *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 (virStrToLong_i(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_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;
}
/**
* virXPathBoolean:
* @xpath: the XPath string to evaluate

View File

@ -37,6 +37,7 @@ xmlXPathContextPtr virXMLXPathContextNew(xmlDocPtr xml)
typedef enum {
VIR_XML_PROP_OPTIONAL = 0, /* Attribute may be absent */
VIR_XML_PROP_REQUIRED = 1 << 0, /* Attribute may not be absent */
VIR_XML_PROP_NONZERO = 1 << 1, /* Attribute may not be zero */
} virXMLPropFlags;
@ -117,6 +118,14 @@ virXMLPropTristateSwitch(xmlNodePtr node,
virTristateSwitch *result)
ATTRIBUTE_NONNULL(0) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
int
virXMLPropInt(xmlNodePtr node,
const char *name,
int base,
virXMLPropFlags flags,
int *result)
ATTRIBUTE_NONNULL(0) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4);
/* Internal function; prefer the macros below. */
xmlDocPtr
virXMLParseHelper(int domcode,