diff options
Diffstat (limited to 'src/set_elem.c')
-rw-r--r-- | src/set_elem.c | 70 |
1 files changed, 55 insertions, 15 deletions
diff --git a/src/set_elem.c b/src/set_elem.c index fce9c1d..79fc641 100644 --- a/src/set_elem.c +++ b/src/set_elem.c @@ -22,8 +22,8 @@ #include <linux/netfilter/nfnetlink.h> #include <linux/netfilter/nf_tables.h> -#include <libnftables/set.h> -#include <libnftables/rule.h> +#include <libnftnl/set.h> +#include <libnftnl/rule.h> #include "linux_list.h" #include "expr/data_reg.h" @@ -357,35 +357,36 @@ int nft_set_elems_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_set *s) EXPORT_SYMBOL(nft_set_elems_nlmsg_parse); #ifdef XML_PARSING -int nft_mxml_set_elem_parse(mxml_node_t *tree, struct nft_set_elem *e) +int nft_mxml_set_elem_parse(mxml_node_t *tree, struct nft_set_elem *e, + struct nft_parse_err *err) { int set_elem_data; if (nft_mxml_num_parse(tree, "flags", MXML_DESCEND_FIRST, BASE_DEC, &e->set_elem_flags, - NFT_TYPE_U32, NFT_XML_MAND) != 0) + NFT_TYPE_U32, NFT_XML_MAND, err) != 0) return -1; e->flags |= (1 << NFT_SET_ELEM_ATTR_FLAGS); if (nft_mxml_data_reg_parse(tree, "key", &e->key, - NFT_XML_MAND) != DATA_VALUE) + NFT_XML_MAND, err) != DATA_VALUE) return -1; e->flags |= (1 << NFT_SET_ELEM_ATTR_KEY); /* <set_elem_data> is not mandatory */ set_elem_data = nft_mxml_data_reg_parse(tree, "data", - &e->data, NFT_XML_OPT); + &e->data, NFT_XML_OPT, err); switch (set_elem_data) { case DATA_VALUE: e->flags |= (1 << NFT_SET_ELEM_ATTR_DATA); break; case DATA_VERDICT: e->flags |= (1 << NFT_SET_ELEM_ATTR_VERDICT); - break; - case DATA_CHAIN: - e->flags |= (1 << NFT_SET_ELEM_ATTR_CHAIN); + if (e->data.chain != NULL) + e->flags |= (1 << NFT_SET_ELEM_ATTR_CHAIN); + break; } @@ -393,17 +394,19 @@ int nft_mxml_set_elem_parse(mxml_node_t *tree, struct nft_set_elem *e) } #endif -static int nft_set_elem_xml_parse(struct nft_set_elem *e, const char *xml) +static int nft_set_elem_xml_parse(struct nft_set_elem *e, const void *xml, + struct nft_parse_err *err, + enum nft_parse_input input) { #ifdef XML_PARSING mxml_node_t *tree; int ret; - tree = nft_mxml_build_tree(xml, "set_elem"); + tree = nft_mxml_build_tree(xml, "set_elem", err, input); if (tree == NULL) return -1; - ret = nft_mxml_set_elem_parse(tree, e); + ret = nft_mxml_set_elem_parse(tree, e, err); mxmlDelete(tree); return ret; #else @@ -412,13 +415,38 @@ static int nft_set_elem_xml_parse(struct nft_set_elem *e, const char *xml) #endif } -int nft_set_elem_parse(struct nft_set_elem *e, - enum nft_parse_type type, const char *data) { +static int nft_set_elem_json_parse(struct nft_set_elem *e, const void *json, + struct nft_parse_err *err, + enum nft_parse_input input) +{ +#ifdef JSON_PARSING + json_t *tree; + json_error_t error; + + tree = nft_jansson_create_root(json, &error, err, input); + if (tree == NULL) + return -1; + + return nft_jansson_set_elem_parse(e, tree, err); +#else + errno = EOPNOTSUPP; + return -1; +#endif +} + +static int +nft_set_elem_do_parse(struct nft_set_elem *e, enum nft_parse_type type, + const void *data, struct nft_parse_err *err, + enum nft_parse_input input) +{ int ret; switch (type) { case NFT_PARSE_XML: - ret = nft_set_elem_xml_parse(e, data); + ret = nft_set_elem_xml_parse(e, data, err, input); + break; + case NFT_PARSE_JSON: + ret = nft_set_elem_json_parse(e, data, err, input); break; default: errno = EOPNOTSUPP; @@ -428,8 +456,20 @@ int nft_set_elem_parse(struct nft_set_elem *e, return ret; } +int nft_set_elem_parse(struct nft_set_elem *e, enum nft_parse_type type, + const char *data, struct nft_parse_err *err) +{ + return nft_set_elem_do_parse(e, type, data, err, NFT_PARSE_BUFFER); +} EXPORT_SYMBOL(nft_set_elem_parse); +int nft_set_elem_parse_file(struct nft_set_elem *e, enum nft_parse_type type, + FILE *fp, struct nft_parse_err *err) +{ + return nft_set_elem_do_parse(e, type, fp, err, NFT_PARSE_FILE); +} +EXPORT_SYMBOL(nft_set_elem_parse_file); + static int nft_set_elem_snprintf_json(char *buf, size_t size, struct nft_set_elem *e, uint32_t flags) { |