From 3f994836f6bb124a5c0185ab6659ef7f57ceac5f Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Thu, 25 Jul 2013 21:21:51 +0200 Subject: src: xml: consolidate common XML code via nft_mxml_str_parse This patch moves common XML string parsing code to nft_mxml_str_parse(). Signed-off-by: Pablo Neira Ayuso --- src/expr/byteorder.c | 12 ++++++------ src/expr/cmp.c | 43 +++++++++++++++++++++---------------------- src/expr/exthdr.c | 13 ++++++------- src/expr/log.c | 11 ++++------- src/expr/lookup.c | 10 ++++------ src/expr/match.c | 20 +++++++++----------- src/expr/meta.c | 9 ++++----- src/expr/nat.c | 29 ++++++++++++++--------------- src/expr/payload.c | 31 ++++++++++++++++--------------- src/expr/target.c | 20 +++++++++----------- src/internal.h | 1 + src/mxml.c | 15 +++++++++++++++ 12 files changed, 109 insertions(+), 105 deletions(-) (limited to 'src') diff --git a/src/expr/byteorder.c b/src/expr/byteorder.c index a931ffa..523bae1 100644 --- a/src/expr/byteorder.c +++ b/src/expr/byteorder.c @@ -186,7 +186,7 @@ nft_rule_expr_byteorder_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) { #ifdef XML_PARSING struct nft_expr_byteorder *byteorder = nft_expr_data(e); - mxml_node_t *node = NULL; + const char *op; int32_t reg; reg = nft_mxml_reg_parse(tree, "sreg", MXML_DESCEND_FIRST); @@ -203,13 +203,13 @@ 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); - node = mxmlFindElement(tree, tree, "op", NULL, NULL, MXML_DESCEND); - if (node == NULL) - goto err; + op = nft_mxml_str_parse(tree, "op", MXML_DESCEND_FIRST); + if (op == NULL) + return -1; - if (strcmp(node->child->value.opaque, "ntoh") == 0) + if (strcmp(op, "ntoh") == 0) byteorder->op = NFT_BYTEORDER_NTOH; - else if (strcmp(node->child->value.opaque, "hton") == 0) + else if (strcmp(op, "hton") == 0) byteorder->op = NFT_BYTEORDER_HTON; else goto err; diff --git a/src/expr/cmp.c b/src/expr/cmp.c index 0a7c9e2..291ebcd 100644 --- a/src/expr/cmp.c +++ b/src/expr/cmp.c @@ -158,7 +158,7 @@ static int nft_rule_expr_cmp_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre { #ifdef XML_PARSING struct nft_expr_cmp *cmp = nft_expr_data(e); - mxml_node_t *node = NULL; + const char *op; int32_t reg; reg = nft_mxml_reg_parse(tree, "sreg", MXML_DESCEND_FIRST); @@ -168,27 +168,26 @@ 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); - /* Get and set . Is not mandatory*/ - node = mxmlFindElement(tree, tree, "op", NULL, NULL, MXML_DESCEND); - if (node != NULL) { - if (strcmp(node->child->value.opaque, "eq") == 0) { - cmp->op = NFT_CMP_EQ; - } else if (strcmp(node->child->value.opaque, "neq") == 0) { - cmp->op = NFT_CMP_NEQ; - } else if (strcmp(node->child->value.opaque, "lt") == 0) { - cmp->op = NFT_CMP_LT; - } else if (strcmp(node->child->value.opaque, "lte") == 0) { - cmp->op = NFT_CMP_LTE; - } else if (strcmp(node->child->value.opaque, "gt") == 0) { - cmp->op = NFT_CMP_GT; - } else if (strcmp(node->child->value.opaque, "gte") == 0) { - cmp->op = NFT_CMP_GTE; - } else { - /* If is present, a valid value is mandatory */ - return -1; - } - e->flags |= (1 << NFT_EXPR_CMP_OP); - } + op = nft_mxml_str_parse(tree, "op", MXML_DESCEND_FIRST); + if (op == NULL) + return -1; + + if (strcmp(op, "eq") == 0) + cmp->op = NFT_CMP_EQ; + else if (strcmp(op, "neq") == 0) + cmp->op = NFT_CMP_NEQ; + else if (strcmp(op, "lt") == 0) + cmp->op = NFT_CMP_LT; + else if (strcmp(op, "lte") == 0) + cmp->op = NFT_CMP_LTE; + else if (strcmp(op, "gt") == 0) + cmp->op = NFT_CMP_GT; + else if (strcmp(op, "gte") == 0) + cmp->op = NFT_CMP_GTE; + else + return -1; + + e->flags |= (1 << NFT_EXPR_CMP_OP); if (nft_mxml_data_reg_parse(tree, "cmpdata", &cmp->data) != DATA_VALUE) { diff --git a/src/expr/exthdr.c b/src/expr/exthdr.c index 769b53c..9781232 100644 --- a/src/expr/exthdr.c +++ b/src/expr/exthdr.c @@ -176,7 +176,7 @@ static const char *exthdr_type2str(uint32_t type) } } -static inline int str2exthdr_type(char *str) +static inline int str2exthdr_type(const char *str) { if (strcmp(str, "hopopts") == 0) return IPPROTO_HOPOPTS; @@ -198,7 +198,7 @@ nft_rule_expr_exthdr_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) { #ifdef XML_PARSING struct nft_expr_exthdr *exthdr = nft_expr_data(e); - mxml_node_t *node = NULL; + const char *exthdr_type; int32_t reg; int type; @@ -209,13 +209,12 @@ nft_rule_expr_exthdr_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) exthdr->dreg = reg; e->flags |= (1 << NFT_EXPR_EXTHDR_DREG); - /* Get and set */ - node = mxmlFindElement(tree, tree, "exthdr_type", NULL, NULL, - MXML_DESCEND); - if (node == NULL) + exthdr_type = nft_mxml_str_parse(tree, "exthdr_type", + MXML_DESCEND_FIRST); + if (exthdr_type == NULL) return -1; - type = str2exthdr_type(node->child->value.opaque); + type = str2exthdr_type(exthdr_type); if (type < 0) return -1; diff --git a/src/expr/log.c b/src/expr/log.c index 9ff2d32..0872ee0 100644 --- a/src/expr/log.c +++ b/src/expr/log.c @@ -156,16 +156,13 @@ static int nft_rule_expr_log_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre { #ifdef XML_PARSING struct nft_expr_log *log = nft_expr_data(e); - mxml_node_t *node = NULL; + const char *prefix; - node = mxmlFindElement(tree, tree, "prefix", NULL, NULL, - MXML_DESCEND_FIRST); - if (node == NULL) { - errno = EINVAL; + prefix = nft_mxml_str_parse(tree, "prefix", MXML_DESCEND_FIRST); + if (prefix == NULL) return -1; - } - log->prefix = strdup(node->child->value.opaque); + log->prefix = strdup(prefix); e->flags |= (1 << NFT_EXPR_LOG_PREFIX); if (nft_mxml_num_parse(tree, "group", MXML_DESCEND_FIRST, BASE_DEC, diff --git a/src/expr/lookup.c b/src/expr/lookup.c index b9a803e..d66577b 100644 --- a/src/expr/lookup.c +++ b/src/expr/lookup.c @@ -147,16 +147,14 @@ nft_rule_expr_lookup_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) { #ifdef XML_PARSING struct nft_expr_lookup *lookup = nft_expr_data(e); - mxml_node_t *node = NULL; + const char *set_name; int32_t reg; - /* get and set . Is mandatory */ - node = mxmlFindElement(tree, tree, "set", NULL, NULL, - MXML_DESCEND_FIRST); - if (node == NULL) + set_name = nft_mxml_str_parse(tree, "set", MXML_DESCEND_FIRST); + if (set_name == NULL) return -1; - memcpy(lookup->set_name, node->child->value.opaque, IFNAMSIZ); + strncpy(lookup->set_name, set_name, IFNAMSIZ); lookup->set_name[IFNAMSIZ-1] = '\0'; e->flags |= (1 << NFT_EXPR_LOOKUP_SET); diff --git a/src/expr/match.c b/src/expr/match.c index d7d9c5b..9eb31c5 100644 --- a/src/expr/match.c +++ b/src/expr/match.c @@ -174,17 +174,15 @@ static int nft_rule_expr_match_xml_parse(struct nft_rule_expr *e, mxml_node_t *t { #ifdef XML_PARSING struct nft_expr_match *mt = nft_expr_data(e); - mxml_node_t *node = NULL; - - /* get and set . Not mandatory */ - node = mxmlFindElement(tree, tree, "name", NULL, NULL, - MXML_DESCEND_FIRST); - if (node != NULL) { - memcpy(mt->name, node->child->value.opaque, - XT_EXTENSION_MAXNAMELEN); - mt->name[XT_EXTENSION_MAXNAMELEN-1] = '\0'; - e->flags |= (1 << NFT_EXPR_MT_NAME); - } + const char *name; + + name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST); + if (name == NULL) + return -1; + + strncpy(mt->name, name, XT_EXTENSION_MAXNAMELEN); + mt->name[XT_EXTENSION_MAXNAMELEN-1] = '\0'; + e->flags |= (1 << NFT_EXPR_MT_NAME); /* mt->info is ignored until other solution is reached */ diff --git a/src/expr/meta.c b/src/expr/meta.c index 4a7a83a..ac01732 100644 --- a/src/expr/meta.c +++ b/src/expr/meta.c @@ -163,7 +163,7 @@ static int nft_rule_expr_meta_xml_parse(struct nft_rule_expr *e, mxml_node_t *tr { #ifdef XML_PARSING struct nft_expr_meta *meta = nft_expr_data(e); - mxml_node_t *node = NULL; + const char *key_str; int32_t reg; int key; @@ -174,12 +174,11 @@ 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); - /* Get and set . Is mandatory */ - node = mxmlFindElement(tree, tree, "key", NULL, NULL, MXML_DESCEND); - if (node == NULL) + key_str = nft_mxml_str_parse(tree, "key", MXML_DESCEND_FIRST); + if (key_str == NULL) return -1; - key = str2meta_key(node->child->value.opaque); + key = str2meta_key(key_str); if (key < 0) return -1; diff --git a/src/expr/nat.c b/src/expr/nat.c index ce8d5e2..7446258 100644 --- a/src/expr/nat.c +++ b/src/expr/nat.c @@ -188,32 +188,28 @@ static int nft_rule_expr_nat_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre { #ifdef XML_PARSING struct nft_expr_nat *nat = nft_expr_data(e); - mxml_node_t *node; + const char *nat_type, *family_str; int32_t reg; int family; - /* Get and set . Mandatory */ - node = mxmlFindElement(tree, tree, "nat_type", NULL, NULL, - MXML_DESCEND_FIRST); - if (node == NULL) + nat_type = nft_mxml_str_parse(tree, "nat_type", MXML_DESCEND_FIRST); + if (nat_type == NULL) return -1; - if (strcmp(node->child->value.opaque, "snat") == 0) { + if (strcmp(nat_type, "snat") == 0) { nat->type = NFT_NAT_SNAT; - } else if (strcmp(node->child->value.opaque, "dnat") == 0) { + } else if (strcmp(nat_type, "dnat") == 0) { nat->type = NFT_NAT_DNAT; - } else { - return -1; - } + } else + goto err; + e->flags |= (1 << NFT_EXPR_NAT_TYPE); - /* Get and set . Mandatory */ - node = mxmlFindElement(tree, tree, "family", NULL, NULL, - MXML_DESCEND); - if (node == NULL) + family_str = nft_mxml_str_parse(tree, "family", MXML_DESCEND_FIRST); + if (family_str == NULL) return -1; - family = nft_str2family(node->child->value.opaque); + family = nft_str2family(family_str); if (family < 0) return -1; @@ -249,6 +245,9 @@ static int nft_rule_expr_nat_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre e->flags |= (1 << NFT_EXPR_NAT_REG_PROTO_MAX); return 0; +err: + errno = EINVAL; + return -1; #else errno = EOPNOTSUPP; return -1; diff --git a/src/expr/payload.c b/src/expr/payload.c index 9853608..5bf47e1 100644 --- a/src/expr/payload.c +++ b/src/expr/payload.c @@ -184,6 +184,7 @@ nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) #ifdef XML_PARSING struct nft_expr_payload *payload = nft_expr_data(e); mxml_node_t *node = NULL; + const char *base_str; uint64_t tmp; int32_t reg; char *endptr; @@ -195,23 +196,20 @@ 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); - /* Get and set . Not mandatory */ - node = mxmlFindElement(tree, tree, "base", NULL, NULL, MXML_DESCEND); - if (node != NULL) { + base_str = nft_mxml_str_parse(tree, "base", MXML_DESCEND_FIRST); + if (base_str == NULL) + return -1; - if (strcmp(node->child->value.opaque, "link") == 0) { - payload->base = NFT_PAYLOAD_LL_HEADER; - } else if (strcmp(node->child->value.opaque, "network") == 0) { - payload->base = NFT_PAYLOAD_NETWORK_HEADER; - } else if (strcmp(node->child->value.opaque, - "transport") == 0) { - payload->base = NFT_PAYLOAD_TRANSPORT_HEADER; - } else { - return -1; - } + if (strcmp(base_str, "link") == 0) + payload->base = NFT_PAYLOAD_LL_HEADER; + else if (strcmp(base_str, "network") == 0) + payload->base = NFT_PAYLOAD_NETWORK_HEADER; + else if (strcmp(base_str, "transport") == 0) + payload->base = NFT_PAYLOAD_TRANSPORT_HEADER; + else + goto err; - e->flags |= (1 << NFT_EXPR_PAYLOAD_BASE); - } + e->flags |= (1 << NFT_EXPR_PAYLOAD_BASE); /* Get and set . Not mandatory */ node = mxmlFindElement(tree, tree, "offset", NULL, NULL, @@ -236,6 +234,9 @@ nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) e->flags |= (1 << NFT_EXPR_PAYLOAD_LEN); } return 0; +err: + errno = EINVAL; + return -1; #else errno = EOPNOTSUPP; return -1; diff --git a/src/expr/target.c b/src/expr/target.c index 6365a46..e59f86a 100644 --- a/src/expr/target.c +++ b/src/expr/target.c @@ -175,17 +175,15 @@ nft_rule_expr_target_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree) { #ifdef XML_PARSING struct nft_expr_target *tg = nft_expr_data(e); - mxml_node_t *node = NULL; - - /* Get and set . Optional */ - node = mxmlFindElement(tree, tree, "name", NULL, NULL, - MXML_DESCEND_FIRST); - if (node != NULL) { - memcpy(tg->name, node->child->value.opaque, - XT_EXTENSION_MAXNAMELEN); - tg->name[XT_EXTENSION_MAXNAMELEN-1] = '\0'; - e->flags |= (1 << NFT_EXPR_TG_NAME); - } + const char *name; + + name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST); + if (name == NULL) + return -1; + + strncpy(tg->name, name, XT_EXTENSION_MAXNAMELEN); + tg->name[XT_EXTENSION_MAXNAMELEN-1] = '\0'; + e->flags |= (1 << NFT_EXPR_TG_NAME); /* tg->info is ignored until other solution is reached */ diff --git a/src/internal.h b/src/internal.h index 3bf57b6..fc78233 100644 --- a/src/internal.h +++ b/src/internal.h @@ -34,6 +34,7 @@ int nft_mxml_reg_parse(mxml_node_t *tree, const char *reg_name, uint32_t flags); union nft_data_reg; int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name, union nft_data_reg *data_reg); 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); +const char *nft_mxml_str_parse(mxml_node_t *tree, const char *node_name, uint32_t mxml_flags); #endif #define NFT_TABLE_XML_VERSION 0 diff --git a/src/mxml.c b/src/mxml.c index 8cb1f6c..e8d4b86 100644 --- a/src/mxml.c +++ b/src/mxml.c @@ -150,4 +150,19 @@ nft_mxml_num_parse(mxml_node_t *tree, const char *node_name, return nft_strtoi(node->child->value.opaque, base, number, type); } + +const char *nft_mxml_str_parse(mxml_node_t *tree, const char *node_name, + uint32_t mxml_flags) +{ + mxml_node_t *node; + + node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags); + if (node == NULL || node->child == NULL) { + errno = EINVAL; + return NULL; + } + + return node->child->value.opaque; +} + #endif -- cgit v1.2.3