summaryrefslogtreecommitdiffstats
path: root/src/expr/immediate.c
diff options
context:
space:
mode:
authorArturo Borrero <arturo.borrero.glez@gmail.com>2013-07-05 16:28:06 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2013-07-06 00:11:55 +0200
commit1e8e5d4b55efe4f11334a5b55483b802cb704071 (patch)
treec9e948fca996743999917e7a55275432345728d5 /src/expr/immediate.c
parent9e540bd2dd2a53dc017f4ca6bd8b46bd4a3e5c65 (diff)
src: xml: consolidate parsing of data_reg via nft_mxml_data_reg_parse
Move common code for XML parsing of data_reg to the new nft_mxml_data_reg_parse function. Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/expr/immediate.c')
-rw-r--r--src/expr/immediate.c47
1 files changed, 12 insertions, 35 deletions
diff --git a/src/expr/immediate.c b/src/expr/immediate.c
index c5757c6..847d0c4 100644
--- a/src/expr/immediate.c
+++ b/src/expr/immediate.c
@@ -200,9 +200,7 @@ nft_rule_expr_immediate_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)
{
#ifdef XML_PARSING
struct nft_expr_immediate *imm = (struct nft_expr_immediate *)e->data;
- mxml_node_t *node = NULL;
- mxml_node_t *save = NULL;
- union nft_data_reg data_regtmp;
+ int datareg_type;
int32_t reg;
reg = nft_mxml_reg_parse(tree, "dreg", MXML_DESCEND_FIRST);
@@ -212,43 +210,22 @@ nft_rule_expr_immediate_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)
imm->dreg = reg;
e->flags |= (1 << NFT_EXPR_IMM_DREG);
- /* Get and set <immdata>. Is mandatory */
- node = mxmlFindElement(tree, tree, "immdata", NULL, NULL,
- MXML_DESCEND);
- if (node == NULL)
+ datareg_type = nft_mxml_data_reg_parse(tree, "immdata", &imm->data);
+ if (datareg_type < 0)
return -1;
- /* hack for mxmSaveAllocString to print just the current node */
- save = node->next;
- node->next = NULL;
-
- if (nft_data_reg_xml_parse(&data_regtmp,
- mxmlSaveAllocString(node, MXML_NO_CALLBACK)) < 0)
- return -1;
- node->next = save;
-
- /* data_reg type switch */
- node = mxmlFindElement(tree, tree, "data_reg", NULL, NULL,
- MXML_DESCEND);
- if (node == NULL)
- return -1;
-
- if (mxmlElementGetAttr(node, "type") == NULL)
- return -1;
-
- if (strcmp(mxmlElementGetAttr(node, "type"), "value") == 0) {
- memcpy(&imm->data.val, data_regtmp.val, data_regtmp.len);
- imm->data.len = data_regtmp.len;
+ switch (datareg_type) {
+ case DATA_VALUE:
e->flags |= (1 << NFT_EXPR_IMM_DATA);
- } else if (strcmp(mxmlElementGetAttr(node, "type"), "verdict") == 0) {
- imm->data.verdict = data_regtmp.verdict;
+ break;
+ case DATA_VERDICT:
e->flags |= (1 << NFT_EXPR_IMM_VERDICT);
- } else if (strcmp(mxmlElementGetAttr(node, "type"), "chain") == 0) {
- if (imm->data.chain)
- free(imm->data.chain);
-
- imm->data.chain = strdup(data_regtmp.chain);
+ break;
+ case DATA_CHAIN:
e->flags |= (1 << NFT_EXPR_IMM_CHAIN);
+ break;
+ default:
+ return -1;
}
return 0;