diff options
author | Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com> | 2013-09-13 14:05:51 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-09-16 12:47:41 +0200 |
commit | f4befc129827632209779c71d804f6139ac03541 (patch) | |
tree | a6eee54267a676aed33de92089102cba694d2415 /src/mxml.c | |
parent | 8281648cab5a9189fdb0806c0f3801d6ffebef9a (diff) |
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 <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/mxml.c')
-rw-r--r-- | src/mxml.c | 38 |
1 files changed, 28 insertions, 10 deletions
@@ -83,7 +83,7 @@ err: } int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name, - union nft_data_reg *data_reg) + union nft_data_reg *data_reg, uint16_t flags) { mxml_node_t *node; const char *type; @@ -93,6 +93,9 @@ int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name, node = mxmlFindElement(tree, tree, node_name, NULL, NULL, MXML_DESCEND_FIRST); if (node == NULL || node->child == NULL) { + if (flags & NFT_XML_OPT) + return 0; + errno = EINVAL; goto err; } @@ -107,6 +110,9 @@ int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name, xfree(tmpstr); if (ret < 0) { + if (flags & NFT_XML_OPT) + return 0; + errno = EINVAL; goto err; } @@ -114,12 +120,18 @@ int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name, node = mxmlFindElement(node, node, "data_reg", NULL, NULL, MXML_DESCEND); if (node == NULL || node->child == NULL) { + if (flags & NFT_XML_OPT) + return 0; + errno = EINVAL; goto err; } type = mxmlElementGetAttr(node, "type"); if (type == NULL) { + if (flags & NFT_XML_OPT) + return DATA_NONE; + errno = EINVAL; goto err; } @@ -130,8 +142,10 @@ int nft_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name, return DATA_VERDICT; else if (strcmp(type, "chain") == 0) return DATA_CHAIN; - else - errno = EINVAL; + else if (flags & NFT_XML_OPT) + return DATA_NONE; + + errno = EINVAL; err: return -1; } @@ -139,27 +153,30 @@ err: 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) + enum nft_type type, uint16_t flags) { mxml_node_t *node = NULL; node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags); if (node == NULL || node->child == NULL) { - errno = EINVAL; + if (!(flags & NFT_XML_OPT)) + errno = EINVAL; + return -1; } - 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) + uint32_t mxml_flags, uint16_t flags) { mxml_node_t *node; node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags); if (node == NULL || node->child == NULL) { - errno = EINVAL; + if (!(flags & NFT_XML_OPT)) + errno = EINVAL; + return NULL; } @@ -167,12 +184,13 @@ const char *nft_mxml_str_parse(mxml_node_t *tree, const char *node_name, } int nft_mxml_family_parse(mxml_node_t *tree, const char *node_name, - uint32_t mxml_flags) + uint32_t mxml_flags, uint16_t flags) { const char *family_str; int family; - family_str = nft_mxml_str_parse(tree, node_name, mxml_flags); + family_str = nft_mxml_str_parse(tree, node_name, mxml_flags, + flags); if (family_str == NULL) return -1; |