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; virXMLNodeToString;
virXMLParseHelper; virXMLParseHelper;
virXMLPickShellSafeComment; virXMLPickShellSafeComment;
virXMLPropInt;
virXMLPropString; virXMLPropString;
virXMLPropStringLimit; virXMLPropStringLimit;
virXMLPropTristateBool; 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: * virXPathBoolean:
* @xpath: the XPath string to evaluate * @xpath: the XPath string to evaluate

View File

@ -37,6 +37,7 @@ xmlXPathContextPtr virXMLXPathContextNew(xmlDocPtr xml)
typedef enum { typedef enum {
VIR_XML_PROP_OPTIONAL = 0, /* Attribute may be absent */ VIR_XML_PROP_OPTIONAL = 0, /* Attribute may be absent */
VIR_XML_PROP_REQUIRED = 1 << 0, /* Attribute may not 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; } virXMLPropFlags;
@ -117,6 +118,14 @@ virXMLPropTristateSwitch(xmlNodePtr node,
virTristateSwitch *result) virTristateSwitch *result)
ATTRIBUTE_NONNULL(0) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); 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. */ /* Internal function; prefer the macros below. */
xmlDocPtr xmlDocPtr
virXMLParseHelper(int domcode, virXMLParseHelper(int domcode,