From f4befc129827632209779c71d804f6139ac03541 Mon Sep 17 00:00:00 2001 From: Arturo Borrero Gonzalez Date: Fri, 13 Sep 2013 14:05:51 +0200 Subject: src: xml: add parsing optional/mandatory flag Add an optional/mandatory flag to XML parsing. In some elements (ie regs), no flag is used because is always mandatory. DATA_NONE is created to indicate a non-parsed data_reg. Signed-off-by: Arturo Borrero Gonzalez Signed-off-by: Pablo Neira Ayuso --- src/expr/bitwise.c | 10 ++++++---- src/expr/byteorder.c | 8 +++++--- src/expr/cmp.c | 6 +++--- src/expr/counter.c | 4 ++-- src/expr/ct.c | 7 ++++--- src/expr/data_reg.c | 11 +++++++---- src/expr/data_reg.h | 1 + src/expr/exthdr.c | 7 ++++--- src/expr/immediate.c | 5 +---- src/expr/limit.c | 4 ++-- src/expr/log.c | 10 ++++++---- src/expr/lookup.c | 3 ++- src/expr/match.c | 3 ++- src/expr/meta.c | 3 ++- src/expr/nat.c | 6 ++++-- src/expr/payload.c | 8 +++++--- src/expr/target.c | 3 ++- 17 files changed, 58 insertions(+), 41 deletions(-) (limited to 'src/expr') diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c index 11738a7..9d521b1 100644 --- a/src/expr/bitwise.c +++ b/src/expr/bitwise.c @@ -246,18 +246,20 @@ nft_rule_expr_bitwise_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 << NFT_EXPR_BITWISE_DREG); if (nft_mxml_num_parse(tree, "len", MXML_DESCEND_FIRST, - BASE_DEC, &bitwise->len, NFT_TYPE_U8) != 0) + BASE_DEC, &bitwise->len, NFT_TYPE_U8, + NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_BITWISE_LEN); - if (nft_mxml_data_reg_parse(tree, "mask", - &bitwise->mask) != DATA_VALUE) + if (nft_mxml_data_reg_parse(tree, "mask", &bitwise->mask, + NFT_XML_MAND) != DATA_VALUE) return -1; e->flags |= (1 << NFT_EXPR_BITWISE_MASK); - if (nft_mxml_data_reg_parse(tree, "xor", &bitwise->xor) != DATA_VALUE) + if (nft_mxml_data_reg_parse(tree, "xor", &bitwise->xor, + NFT_XML_MAND) != DATA_VALUE) return -1; e->flags |= (1 << NFT_EXPR_BITWISE_XOR); diff --git a/src/expr/byteorder.c b/src/expr/byteorder.c index 0277812..1034a31 100644 --- a/src/expr/byteorder.c +++ b/src/expr/byteorder.c @@ -260,7 +260,7 @@ nft_rule_expr_byteorder_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) byteorder->dreg = reg; e->flags |= (1 << NFT_EXPR_BYTEORDER_DREG); - op = nft_mxml_str_parse(tree, "op", MXML_DESCEND_FIRST); + op = nft_mxml_str_parse(tree, "op", MXML_DESCEND_FIRST, NFT_XML_MAND); if (op == NULL) return -1; @@ -272,13 +272,15 @@ nft_rule_expr_byteorder_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 << NFT_EXPR_BYTEORDER_OP); if (nft_mxml_num_parse(tree, "len", MXML_DESCEND_FIRST, BASE_DEC, - &byteorder->len, NFT_TYPE_U8) != 0) + &byteorder->len, NFT_TYPE_U8, + NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_BYTEORDER_LEN); if (nft_mxml_num_parse(tree, "size", MXML_DESCEND_FIRST, BASE_DEC, - &byteorder->size, NFT_TYPE_U8) != 0) + &byteorder->size, NFT_TYPE_U8, + NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_BYTEORDER_SIZE); diff --git a/src/expr/cmp.c b/src/expr/cmp.c index 543f774..b9f0f6a 100644 --- a/src/expr/cmp.c +++ b/src/expr/cmp.c @@ -224,7 +224,7 @@ static int nft_rule_expr_cmp_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre cmp->sreg = reg; e->flags |= (1 << NFT_EXPR_CMP_SREG); - op = nft_mxml_str_parse(tree, "op", MXML_DESCEND_FIRST); + op = nft_mxml_str_parse(tree, "op", MXML_DESCEND_FIRST, NFT_XML_MAND); if (op == NULL) return -1; @@ -236,9 +236,9 @@ static int nft_rule_expr_cmp_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre e->flags |= (1 << NFT_EXPR_CMP_OP); if (nft_mxml_data_reg_parse(tree, "cmpdata", - &cmp->data) != DATA_VALUE) { + &cmp->data, NFT_XML_MAND) != DATA_VALUE) return -1; - } + e->flags |= (1 << NFT_EXPR_CMP_DATA); return 0; diff --git a/src/expr/counter.c b/src/expr/counter.c index 53dc526..971b5b1 100644 --- a/src/expr/counter.c +++ b/src/expr/counter.c @@ -148,13 +148,13 @@ nft_rule_expr_counter_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) struct nft_expr_counter *ctr = nft_expr_data(e); if (nft_mxml_num_parse(tree, "pkts", MXML_DESCEND_FIRST, BASE_DEC, - &ctr->pkts, NFT_TYPE_U64) != 0) + &ctr->pkts, NFT_TYPE_U64, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_CTR_PACKETS); if (nft_mxml_num_parse(tree, "bytes", MXML_DESCEND_FIRST, BASE_DEC, - &ctr->bytes, NFT_TYPE_U64) != 0) + &ctr->bytes, NFT_TYPE_U64, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_CTR_BYTES); diff --git a/src/expr/ct.c b/src/expr/ct.c index 4655a96..2fc6629 100644 --- a/src/expr/ct.c +++ b/src/expr/ct.c @@ -241,7 +241,8 @@ static int nft_rule_expr_ct_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree ct->dreg = reg; e->flags |= (1 << NFT_EXPR_CT_DREG); - key_str = nft_mxml_str_parse(tree, "key", MXML_DESCEND_FIRST); + key_str = nft_mxml_str_parse(tree, "key", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (key_str == NULL) return -1; @@ -252,8 +253,8 @@ static int nft_rule_expr_ct_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree ct->key = key; e->flags |= (1 << NFT_EXPR_CT_KEY); - if (nft_mxml_num_parse(tree, "dir", MXML_DESCEND_FIRST, BASE_DEC, &dir, - NFT_TYPE_U8) != 0) + if (nft_mxml_num_parse(tree, "dir", MXML_DESCEND_FIRST, BASE_DEC, + &dir, NFT_TYPE_U8, NFT_XML_MAND) != 0) return -1; if (dir != IP_CT_DIR_ORIGINAL && dir != IP_CT_DIR_REPLY) diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c index 34537a7..fd1dd2e 100644 --- a/src/expr/data_reg.c +++ b/src/expr/data_reg.c @@ -133,7 +133,8 @@ static int nft_data_reg_verdict_xml_parse(union nft_data_reg *reg, char *xml) } /* Get and set */ - verdict_str = nft_mxml_str_parse(tree, "verdict", MXML_DESCEND); + verdict_str = nft_mxml_str_parse(tree, "verdict", MXML_DESCEND, + NFT_XML_MAND); if (verdict_str == NULL) { mxmlDelete(tree); return -1; @@ -183,7 +184,8 @@ static int nft_data_reg_chain_xml_parse(union nft_data_reg *reg, char *xml) if (reg->chain) xfree(reg->chain); - reg->chain = nft_mxml_str_parse(tree, "chain", MXML_DESCEND); + reg->chain = nft_mxml_str_parse(tree, "chain", MXML_DESCEND, + NFT_XML_MAND); if (reg->chain == NULL) { mxmlDelete(tree); return -1; @@ -234,7 +236,7 @@ static int nft_data_reg_value_xml_parse(union nft_data_reg *reg, char *xml) } if (nft_mxml_num_parse(tree, "len", MXML_DESCEND, BASE_DEC, ®->len, - NFT_TYPE_U8) != 0) { + NFT_TYPE_U8, NFT_XML_MAND) != 0) { mxmlDelete(tree); return -1; } @@ -244,7 +246,8 @@ static int nft_data_reg_value_xml_parse(union nft_data_reg *reg, char *xml) sprintf(node_name, "data%d", i); if (nft_mxml_num_parse(tree, node_name, MXML_DESCEND, BASE_HEX, - ®->val[i], NFT_TYPE_U32) != 0) { + ®->val[i], NFT_TYPE_U32, + NFT_XML_MAND) != 0) { mxmlDelete(tree); return -1; } diff --git a/src/expr/data_reg.h b/src/expr/data_reg.h index 7819919..3e0217d 100644 --- a/src/expr/data_reg.h +++ b/src/expr/data_reg.h @@ -2,6 +2,7 @@ #define _DATA_H_ enum { + DATA_NONE, DATA_VALUE, DATA_VERDICT, DATA_CHAIN, diff --git a/src/expr/exthdr.c b/src/expr/exthdr.c index af9d6bf..9ca66e5 100644 --- a/src/expr/exthdr.c +++ b/src/expr/exthdr.c @@ -249,7 +249,7 @@ nft_rule_expr_exthdr_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 << NFT_EXPR_EXTHDR_DREG); exthdr_type = nft_mxml_str_parse(tree, "exthdr_type", - MXML_DESCEND_FIRST); + MXML_DESCEND_FIRST, NFT_XML_MAND); if (exthdr_type == NULL) return -1; @@ -262,14 +262,15 @@ nft_rule_expr_exthdr_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) /* Get and set */ if (nft_mxml_num_parse(tree, "offset", MXML_DESCEND_FIRST, BASE_DEC, - &exthdr->offset, NFT_TYPE_U32) != 0) + &exthdr->offset, NFT_TYPE_U32, + NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_EXTHDR_OFFSET); /* Get and set */ if (nft_mxml_num_parse(tree, "len", MXML_DESCEND_FIRST, BASE_DEC, - &exthdr->len, NFT_TYPE_U32) != 0) + &exthdr->len, NFT_TYPE_U32, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_EXTHDR_LEN); diff --git a/src/expr/immediate.c b/src/expr/immediate.c index 0556999..facb8f5 100644 --- a/src/expr/immediate.c +++ b/src/expr/immediate.c @@ -232,10 +232,7 @@ nft_rule_expr_immediate_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 << NFT_EXPR_IMM_DREG); datareg_type = nft_mxml_data_reg_parse(tree, "immediatedata", - &imm->data); - if (datareg_type < 0) - return -1; - + &imm->data, NFT_XML_MAND); switch (datareg_type) { case DATA_VALUE: e->flags |= (1 << NFT_EXPR_IMM_DATA); diff --git a/src/expr/limit.c b/src/expr/limit.c index bd92cd1..6c06ce5 100644 --- a/src/expr/limit.c +++ b/src/expr/limit.c @@ -146,13 +146,13 @@ static int nft_rule_expr_limit_xml_parse(struct nft_rule_expr *e, mxml_node_t *t struct nft_expr_limit *limit = nft_expr_data(e); if (nft_mxml_num_parse(tree, "rate", MXML_DESCEND_FIRST, BASE_DEC, - &limit->rate, NFT_TYPE_U64) != 0) + &limit->rate, NFT_TYPE_U64, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_LIMIT_RATE); if (nft_mxml_num_parse(tree, "depth", MXML_DESCEND_FIRST, BASE_DEC, - &limit->depth, NFT_TYPE_U64) != 0) + &limit->depth, NFT_TYPE_U64, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_LIMIT_DEPTH); diff --git a/src/expr/log.c b/src/expr/log.c index 90fb32e..feb4184 100644 --- a/src/expr/log.c +++ b/src/expr/log.c @@ -202,7 +202,8 @@ static int nft_rule_expr_log_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre struct nft_expr_log *log = nft_expr_data(e); const char *prefix; - prefix = nft_mxml_str_parse(tree, "prefix", MXML_DESCEND_FIRST); + prefix = nft_mxml_str_parse(tree, "prefix", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (prefix == NULL) return -1; @@ -210,19 +211,20 @@ static int nft_rule_expr_log_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre e->flags |= (1 << NFT_EXPR_LOG_PREFIX); if (nft_mxml_num_parse(tree, "group", MXML_DESCEND_FIRST, BASE_DEC, - &log->group, NFT_TYPE_U16) != 0) + &log->group, NFT_TYPE_U16, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_LOG_GROUP); if (nft_mxml_num_parse(tree, "snaplen", MXML_DESCEND_FIRST, BASE_DEC, - &log->snaplen, NFT_TYPE_U32) != 0) + &log->snaplen, NFT_TYPE_U32, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_LOG_SNAPLEN); if (nft_mxml_num_parse(tree, "qthreshold", MXML_DESCEND_FIRST, - BASE_DEC, &log->qthreshold, NFT_TYPE_U16) != 0) + BASE_DEC, &log->qthreshold, + NFT_TYPE_U16, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_LOG_QTHRESHOLD); diff --git a/src/expr/lookup.c b/src/expr/lookup.c index 56ab253..b9b0229 100644 --- a/src/expr/lookup.c +++ b/src/expr/lookup.c @@ -180,7 +180,8 @@ nft_rule_expr_lookup_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) const char *set_name; int32_t reg; - set_name = nft_mxml_str_parse(tree, "set", MXML_DESCEND_FIRST); + set_name = nft_mxml_str_parse(tree, "set", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (set_name == NULL) return -1; diff --git a/src/expr/match.c b/src/expr/match.c index b18d594..9f98462 100644 --- a/src/expr/match.c +++ b/src/expr/match.c @@ -195,7 +195,8 @@ static int nft_rule_expr_match_xml_parse(struct nft_rule_expr *e, mxml_node_t *t struct nft_expr_match *mt = nft_expr_data(e); const char *name; - name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST); + name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (name == NULL) return -1; diff --git a/src/expr/meta.c b/src/expr/meta.c index d914569..91a689e 100644 --- a/src/expr/meta.c +++ b/src/expr/meta.c @@ -205,7 +205,8 @@ static int nft_rule_expr_meta_xml_parse(struct nft_rule_expr *e, mxml_node_t *tr meta->dreg = reg; e->flags |= (1 << NFT_EXPR_META_DREG); - key_str = nft_mxml_str_parse(tree, "key", MXML_DESCEND_FIRST); + key_str = nft_mxml_str_parse(tree, "key", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (key_str == NULL) return -1; diff --git a/src/expr/nat.c b/src/expr/nat.c index 1ebecda..da28ede 100644 --- a/src/expr/nat.c +++ b/src/expr/nat.c @@ -262,7 +262,8 @@ static int nft_rule_expr_nat_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre int32_t reg; int family, nat_type_value; - nat_type = nft_mxml_str_parse(tree, "type", MXML_DESCEND_FIRST); + nat_type = nft_mxml_str_parse(tree, "type", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (nat_type == NULL) return -1; @@ -273,7 +274,8 @@ static int nft_rule_expr_nat_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre nat->type = nat_type_value; e->flags |= (1 << NFT_EXPR_NAT_TYPE); - family = nft_mxml_family_parse(tree, "family", MXML_DESCEND_FIRST); + family = nft_mxml_family_parse(tree, "family", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (family < 0) { mxmlDelete(tree); return -1; diff --git a/src/expr/payload.c b/src/expr/payload.c index 38362c4..2b9f5e0 100644 --- a/src/expr/payload.c +++ b/src/expr/payload.c @@ -248,7 +248,8 @@ nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) payload->dreg = reg; e->flags |= (1 << NFT_EXPR_PAYLOAD_DREG); - base_str = nft_mxml_str_parse(tree, "base", MXML_DESCEND_FIRST); + base_str = nft_mxml_str_parse(tree, "base", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (base_str == NULL) return -1; @@ -260,13 +261,14 @@ nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 << NFT_EXPR_PAYLOAD_BASE); if (nft_mxml_num_parse(tree, "offset", MXML_DESCEND_FIRST, BASE_DEC, - &payload->offset, NFT_TYPE_U8) != 0) + &payload->offset, NFT_TYPE_U8, + NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_PAYLOAD_OFFSET); if (nft_mxml_num_parse(tree, "len", MXML_DESCEND_FIRST, BASE_DEC, - &payload->len, NFT_TYPE_U8) != 0) + &payload->len, NFT_TYPE_U8, NFT_XML_MAND) != 0) return -1; e->flags |= (1 << NFT_EXPR_PAYLOAD_LEN); diff --git a/src/expr/target.c b/src/expr/target.c index a6645ff..8dc752a 100644 --- a/src/expr/target.c +++ b/src/expr/target.c @@ -196,7 +196,8 @@ nft_rule_expr_target_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) struct nft_expr_target *tg = nft_expr_data(e); const char *name; - name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST); + name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST, + NFT_XML_MAND); if (name == NULL) return -1; -- cgit v1.2.3