summaryrefslogtreecommitdiffstats
path: root/src/mxml.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mxml.c')
-rw-r--r--src/mxml.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/mxml.c b/src/mxml.c
index 07f29ac..8cb1f6c 100644
--- a/src/mxml.c
+++ b/src/mxml.c
@@ -11,6 +11,8 @@
*/
#include "internal.h"
#include "expr_ops.h"
+#include <stdint.h>
+#include <limits.h>
#include <linux/netfilter/nf_tables.h>
#include <libnftables/rule.h>
@@ -58,7 +60,6 @@ err:
int nft_mxml_reg_parse(mxml_node_t *tree, const char *reg_name, uint32_t flags)
{
mxml_node_t *node;
- char *endptr;
uint64_t val;
node = mxmlFindElement(tree, tree, reg_name, NULL, NULL, flags);
@@ -67,8 +68,11 @@ int nft_mxml_reg_parse(mxml_node_t *tree, const char *reg_name, uint32_t flags)
goto err;
}
- val = strtoull(node->child->value.opaque, &endptr, 10);
- if (val > NFT_REG_MAX || val < 0 || *endptr) {
+ if (nft_strtoi(node->child->value.opaque, BASE_DEC, &val,
+ NFT_TYPE_U64) != 0)
+ goto err;
+
+ if (val > NFT_REG_MAX) {
errno = ERANGE;
goto err;
}
@@ -130,4 +134,20 @@ int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name,
err:
return -1;
}
+
+int
+nft_mxml_num_parse(mxml_node_t *tree, const char *node_name,
+ uint32_t mxml_flags, int base, void *number,
+ enum nft_type type)
+{
+ mxml_node_t *node = NULL;
+
+ node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags);
+ if (node == NULL || node->child == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return nft_strtoi(node->child->value.opaque, base, number, type);
+}
#endif