diff options
Diffstat (limited to 'src/mxml.c')
-rw-r--r-- | src/mxml.c | 232 |
1 files changed, 0 insertions, 232 deletions
diff --git a/src/mxml.c b/src/mxml.c deleted file mode 100644 index 51dbf1b..0000000 --- a/src/mxml.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * (C) 2012-2013 by Pablo Neira Ayuso <pablo@netfilter.org> - * (C) 2013 by Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This code has been sponsored by Sophos Astaro <http://www.sophos.com> - */ -#include "internal.h" - -#include <stdint.h> -#include <limits.h> - -#include <linux/netfilter/nf_tables.h> -#include <libnftnl/table.h> -#include <libnftnl/chain.h> -#include <libnftnl/rule.h> -#include <libnftnl/expr.h> -#include <libnftnl/set.h> - -#ifdef XML_PARSING -mxml_node_t *nftnl_mxml_build_tree(const void *data, const char *treename, - struct nftnl_parse_err *err, enum nftnl_parse_input input) -{ - mxml_node_t *tree; - - switch (input) { - case NFTNL_PARSE_BUFFER: - tree = mxmlLoadString(NULL, data, MXML_OPAQUE_CALLBACK); - break; - case NFTNL_PARSE_FILE: - tree = mxmlLoadFile(NULL, (FILE *)data, MXML_OPAQUE_CALLBACK); - break; - default: - goto err; - } - - if (tree == NULL) { - err->error = NFTNL_PARSE_EBADINPUT; - goto err; - } - - if (tree->value.opaque != NULL && - strcmp(tree->value.opaque, treename) == 0) - return tree; - - err->error = NFTNL_PARSE_EMISSINGNODE; - err->node_name = treename; - - mxmlDelete(tree); -err: - err->line = 0; - err->column = 0; - errno = EINVAL; - return NULL; -} - -struct nftnl_expr *nftnl_mxml_expr_parse(mxml_node_t *node, - struct nftnl_parse_err *err, - struct nftnl_set_list *set_list) -{ - mxml_node_t *tree; - struct nftnl_expr *e; - const char *expr_name; - char *xml_text; - uint32_t set_id; - int ret; - - expr_name = mxmlElementGetAttr(node, "type"); - if (expr_name == NULL) { - err->node_name = "type"; - err->error = NFTNL_PARSE_EMISSINGNODE; - goto err; - } - - e = nftnl_expr_alloc(expr_name); - if (e == NULL) - goto err; - - xml_text = mxmlSaveAllocString(node, MXML_NO_CALLBACK); - if (xml_text == NULL) - goto err_expr; - - tree = mxmlLoadString(NULL, xml_text, MXML_OPAQUE_CALLBACK); - xfree(xml_text); - - if (tree == NULL) - goto err_expr; - - ret = e->ops->xml_parse(e, tree, err); - mxmlDelete(tree); - - if (set_list != NULL && - strcmp(expr_name, "lookup") == 0 && - nftnl_set_lookup_id(e, set_list, &set_id)) - nftnl_expr_set_u32(e, NFTNL_EXPR_LOOKUP_SET_ID, set_id); - - return ret < 0 ? NULL : e; -err_expr: - nftnl_expr_free(e); -err: - mxmlDelete(tree); - errno = EINVAL; - return NULL; -} - -int nftnl_mxml_reg_parse(mxml_node_t *tree, const char *reg_name, uint32_t *reg, - uint32_t mxmlflags, uint32_t flags, - struct nftnl_parse_err *err) -{ - mxml_node_t *node; - - node = mxmlFindElement(tree, tree, reg_name, NULL, NULL, mxmlflags); - if (node == NULL) { - if (!(flags & NFTNL_XML_OPT)) { - err->error = NFTNL_PARSE_EMISSINGNODE; - errno = EINVAL; - goto err; - } - return -1; - } - - if (nftnl_strtoi(node->child->value.opaque, BASE_DEC, reg, - NFTNL_TYPE_U32) != 0) { - err->error = NFTNL_PARSE_EBADTYPE; - goto err; - } - - if (*reg > NFT_REG_MAX) { - errno = ERANGE; - goto err; - } - - return 0; -err: - err->node_name = reg_name; - return -1; -} - -int nftnl_mxml_data_reg_parse(mxml_node_t *tree, const char *node_name, - union nftnl_data_reg *data_reg, uint16_t flags, - struct nftnl_parse_err *err) -{ - mxml_node_t *node; - - node = mxmlFindElement(tree, tree, node_name, NULL, NULL, - MXML_DESCEND_FIRST); - - /* It is necessary for the compatibility with cmpdata label. */ - if (node == NULL || node->child == NULL) - node = tree; - - return nftnl_data_reg_xml_parse(data_reg, node, err); -} - -int -nftnl_mxml_num_parse(mxml_node_t *tree, const char *node_name, - uint32_t mxml_flags, int base, void *number, - enum nftnl_type type, uint16_t flags, - struct nftnl_parse_err *err) -{ - mxml_node_t *node = NULL; - int ret; - - node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags); - if (node == NULL || node->child == NULL) { - if (!(flags & NFTNL_XML_OPT)) { - errno = EINVAL; - err->node_name = node_name; - err->error = NFTNL_PARSE_EMISSINGNODE; - } - return -1; - } - - ret = nftnl_strtoi(node->child->value.opaque, base, number, type); - - if (ret != 0) { - err->error = NFTNL_PARSE_EBADTYPE; - err->node_name = node_name; - } - return ret; -} - -const char *nftnl_mxml_str_parse(mxml_node_t *tree, const char *node_name, - uint32_t mxml_flags, uint16_t flags, - struct nftnl_parse_err *err) -{ - mxml_node_t *node; - const char *ret; - - node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags); - if (node == NULL || node->child == NULL) { - if (!(flags & NFTNL_XML_OPT)) { - errno = EINVAL; - err->node_name = node_name; - err->error = NFTNL_PARSE_EMISSINGNODE; - } - return NULL; - } - - ret = node->child->value.opaque; - if (ret == NULL) { - err->node_name = node_name; - err->error = NFTNL_PARSE_EBADTYPE; - } - return ret; -} - -int nftnl_mxml_family_parse(mxml_node_t *tree, const char *node_name, - uint32_t mxml_flags, uint16_t flags, - struct nftnl_parse_err *err) -{ - const char *family_str; - int family; - - family_str = nftnl_mxml_str_parse(tree, node_name, mxml_flags, - flags, err); - if (family_str == NULL) - return -1; - - family = nftnl_str2family(family_str); - if (family < 0) { - err->node_name = node_name; - errno = EAFNOSUPPORT; - } - - return family; -} -#endif |