summaryrefslogtreecommitdiffstats
path: root/src/mxml.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mxml.c')
-rw-r--r--src/mxml.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/mxml.c b/src/mxml.c
index 9aef645..07f29ac 100644
--- a/src/mxml.c
+++ b/src/mxml.c
@@ -76,4 +76,58 @@ int nft_mxml_reg_parse(mxml_node_t *tree, const char *reg_name, uint32_t flags)
err:
return -1;
}
+
+int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name,
+ union nft_data_reg *data_reg)
+{
+ mxml_node_t *node;
+ const char *type;
+ char *tmpstr = NULL;
+ int ret;
+
+ node = mxmlFindElement(tree, tree, node_name, NULL, NULL,
+ MXML_DESCEND_FIRST);
+ if (node == NULL || node->child == NULL) {
+ errno = EINVAL;
+ goto err;
+ }
+
+ tmpstr = mxmlSaveAllocString(node, MXML_NO_CALLBACK);
+ if (tmpstr == NULL) {
+ errno = ENOMEM;
+ goto err;
+ }
+
+ ret = nft_data_reg_xml_parse(data_reg, tmpstr);
+ free(tmpstr);
+
+ if (ret < 0) {
+ errno = EINVAL;
+ goto err;
+ }
+
+ node = mxmlFindElement(node, node, "data_reg", NULL, NULL,
+ MXML_DESCEND);
+ if (node == NULL || node->child == NULL) {
+ errno = EINVAL;
+ goto err;
+ }
+
+ type = mxmlElementGetAttr(node, "type");
+ if (type == NULL) {
+ errno = EINVAL;
+ goto err;
+ }
+
+ if (strcmp(type, "value") == 0)
+ return DATA_VALUE;
+ else if (strcmp(type, "verdict") == 0)
+ return DATA_VERDICT;
+ else if (strcmp(type, "chain") == 0)
+ return DATA_CHAIN;
+ else
+ errno = EINVAL;
+err:
+ return -1;
+}
#endif