From aa78a088dde9875ae3e31468ea5e4ca3bd349d2c Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 7 Aug 2013 22:31:52 +0200 Subject: src: xml: cleanup set element parsing Move nft_mxml_set_elem_parse to set_elem.c to improve readability, thus, we don't need to jump from set_elem.c to mxml.c to see how the parsing is done. I have also refactored some common parsing code in the new helper function nft_mxml_set_elem_parse, that avoids conversions from XML tree to text and then again back to tree. Signed-off-by: Pablo Neira Ayuso --- src/internal.h | 4 +++- src/mxml.c | 46 ---------------------------------------------- src/set.c | 7 ++++--- src/set_elem.c | 49 ++++++++++++++++++++++++++++--------------------- 4 files changed, 35 insertions(+), 71 deletions(-) diff --git a/src/internal.h b/src/internal.h index 1ebdb1a..17d1286 100644 --- a/src/internal.h +++ b/src/internal.h @@ -37,7 +37,9 @@ int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name, union nft_ 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); int nft_mxml_family_parse(mxml_node_t *tree, const char *node_name, uint32_t mxml_flags); -struct nft_set_elem *nft_mxml_set_elem_parse(mxml_node_t *node); + +struct nft_set_elem; +int nft_mxml_set_elem_parse(mxml_node_t *node, struct nft_set_elem *e); #endif #ifdef JSON_PARSING diff --git a/src/mxml.c b/src/mxml.c index 1f0a2df..b5de153 100644 --- a/src/mxml.c +++ b/src/mxml.c @@ -184,50 +184,4 @@ int nft_mxml_family_parse(mxml_node_t *tree, const char *node_name, return family; } - -struct nft_set_elem *nft_mxml_set_elem_parse(mxml_node_t *node) -{ - mxml_node_t *save; - char *set_elem_str; - struct nft_set_elem *elem; - - if (node == NULL) - goto einval; - - if (strcmp(node->value.opaque, "set_elem") != 0) - goto einval; - - elem = nft_set_elem_alloc(); - if (elem == NULL) - goto enomem; - - /* This is a hack for mxml to print just the current node */ - save = node->next; - node->next = NULL; - - set_elem_str = mxmlSaveAllocString(node, MXML_NO_CALLBACK); - node->next = save; - - if (set_elem_str == NULL) { - xfree(elem); - goto enomem; - } - - if (nft_set_elem_parse(elem, NFT_SET_PARSE_XML, - set_elem_str) != 0) { - xfree(set_elem_str); - xfree(elem); - return NULL; - } - - xfree(set_elem_str); - - return elem; -einval: - errno = EINVAL; - return NULL; -enomem: - errno = ENOMEM; - return NULL; -} #endif diff --git a/src/set.c b/src/set.c index eb90426..97856b3 100644 --- a/src/set.c +++ b/src/set.c @@ -355,7 +355,6 @@ static int nft_set_xml_parse(struct nft_set *s, char *xml) s->flags |= (1 << NFT_SET_ATTR_FLAGS); - if (nft_mxml_num_parse(tree, "key_type", MXML_DESCEND_FIRST, BASE_DEC, &s->key_type, NFT_TYPE_U32) != 0) goto err; @@ -380,17 +379,19 @@ static int nft_set_xml_parse(struct nft_set *s, char *xml) s->flags |= (1 << NFT_SET_ATTR_DATA_LEN); - /* Iterate over each */ for (node = mxmlFindElement(tree, tree, "set_elem", NULL, NULL, MXML_DESCEND); node != NULL; node = mxmlFindElement(node, tree, "set_elem", NULL, NULL, MXML_DESCEND)) { - elem = nft_mxml_set_elem_parse(node); + elem = nft_set_elem_alloc(); if (elem == NULL) goto err; + if (nft_mxml_set_elem_parse(node, elem) < 0) + goto err; + list_add_tail(&elem->head, &s->element_list); } diff --git a/src/set_elem.c b/src/set_elem.c index d99b65e..73c100f 100644 --- a/src/set_elem.c +++ b/src/set_elem.c @@ -375,34 +375,21 @@ int nft_set_elems_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_set *s) } EXPORT_SYMBOL(nft_set_elems_nlmsg_parse); -static int nft_set_elem_xml_parse(struct nft_set_elem *e, char *xml) -{ #ifdef XML_PARSING - mxml_node_t *tree; +int nft_mxml_set_elem_parse(mxml_node_t *tree, struct nft_set_elem *e) +{ mxml_node_t *node; int set_elem_data; - tree = mxmlLoadString(NULL, xml, MXML_OPAQUE_CALLBACK); - if (tree == NULL) { - errno = EINVAL; - return -1; - } - - if (strcmp(tree->value.opaque, "set_elem") != 0) { - errno = EINVAL; - goto err; - } - if (nft_mxml_num_parse(tree, "flags", MXML_DESCEND_FIRST, BASE_DEC, &e->set_elem_flags, NFT_TYPE_U32) != 0) - goto err; + return -1; e->flags |= (1 << NFT_SET_ELEM_ATTR_FLAGS); - if (nft_mxml_data_reg_parse(tree, "key", - &e->key) != DATA_VALUE) - goto err; + if (nft_mxml_data_reg_parse(tree, "key", &e->key) != DATA_VALUE) + return -1; e->flags |= (1 << NFT_SET_ELEM_ATTR_KEY); @@ -423,13 +410,33 @@ static int nft_set_elem_xml_parse(struct nft_set_elem *e, char *xml) e->flags |= (1 << NFT_SET_ELEM_ATTR_CHAIN); break; default: - goto err; + return -1; } } - - mxmlDelete(tree); return 0; +} +#endif +static int nft_set_elem_xml_parse(struct nft_set_elem *e, char *xml) +{ +#ifdef XML_PARSING + mxml_node_t *tree; + int ret; + + tree = mxmlLoadString(NULL, xml, MXML_OPAQUE_CALLBACK); + if (tree == NULL) { + errno = EINVAL; + return -1; + } + + if (strcmp(tree->value.opaque, "set_elem") != 0) { + errno = EINVAL; + goto err; + } + + ret = nft_mxml_set_elem_parse(tree, e); + mxmlDelete(tree); + return ret; err: mxmlDelete(tree); return -1; -- cgit v1.2.3