17 #include <linux/netfilter/nf_tables.h>
18 #include <libnftnl/table.h>
19 #include <libnftnl/chain.h>
20 #include <libnftnl/rule.h>
21 #include <libnftnl/expr.h>
22 #include <libnftnl/set.h>
25 mxml_node_t *nft_mxml_build_tree(
const void *data,
const char *treename,
26 struct nft_parse_err *err,
enum nft_parse_input input)
31 case NFT_PARSE_BUFFER:
32 tree = mxmlLoadString(NULL, data, MXML_OPAQUE_CALLBACK);
35 tree = mxmlLoadFile(NULL, (FILE *)data, MXML_OPAQUE_CALLBACK);
42 err->error = NFT_PARSE_EBADINPUT;
46 if (strcmp(tree->value.opaque, treename) == 0)
49 err->error = NFT_PARSE_EMISSINGNODE;
50 err->node_name = treename;
60 struct nft_rule_expr *nft_mxml_expr_parse(mxml_node_t *node,
61 struct nft_parse_err *err)
64 struct nft_rule_expr *e;
65 const char *expr_name;
69 expr_name = mxmlElementGetAttr(node,
"type");
70 if (expr_name == NULL) {
71 err->node_name =
"type";
72 err->error = NFT_PARSE_EMISSINGNODE;
76 e = nft_rule_expr_alloc(expr_name);
80 xml_text = mxmlSaveAllocString(node, MXML_NO_CALLBACK);
84 tree = mxmlLoadString(NULL, xml_text, MXML_OPAQUE_CALLBACK);
90 ret = e->ops->xml_parse(e, tree, err);
93 return ret < 0 ? NULL : e;
95 nft_rule_expr_free(e);
102 int nft_mxml_reg_parse(mxml_node_t *tree,
const char *reg_name, uint32_t *reg,
103 uint32_t mxmlflags, uint32_t flags,
104 struct nft_parse_err *err)
108 node = mxmlFindElement(tree, tree, reg_name, NULL, NULL, mxmlflags);
110 if (!(flags & NFT_XML_OPT)) {
111 err->error = NFT_PARSE_EMISSINGNODE;
118 if (nft_strtoi(node->child->value.opaque, BASE_DEC, reg,
119 NFT_TYPE_U32) != 0) {
120 err->error = NFT_PARSE_EBADTYPE;
124 if (*reg > NFT_REG_MAX) {
131 err->node_name = reg_name;
135 int nft_mxml_data_reg_parse(mxml_node_t *tree,
const char *node_name,
136 union nft_data_reg *data_reg, uint16_t flags,
137 struct nft_parse_err *err)
141 node = mxmlFindElement(tree, tree, node_name, NULL, NULL,
145 if (node == NULL || node->child == NULL)
148 return nft_data_reg_xml_parse(data_reg, node, err);
152 nft_mxml_num_parse(mxml_node_t *tree,
const char *node_name,
153 uint32_t mxml_flags,
int base,
void *number,
154 enum nft_type type, uint16_t flags,
155 struct nft_parse_err *err)
157 mxml_node_t *node = NULL;
160 node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags);
161 if (node == NULL || node->child == NULL) {
162 if (!(flags & NFT_XML_OPT)) {
164 err->node_name = node_name;
165 err->error = NFT_PARSE_EMISSINGNODE;
170 ret = nft_strtoi(node->child->value.opaque, base, number, type);
173 err->error = NFT_PARSE_EBADTYPE;
174 err->node_name = node_name;
179 const char *nft_mxml_str_parse(mxml_node_t *tree,
const char *node_name,
180 uint32_t mxml_flags, uint16_t flags,
181 struct nft_parse_err *err)
186 node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags);
187 if (node == NULL || node->child == NULL) {
188 if (!(flags & NFT_XML_OPT)) {
190 err->node_name = node_name;
191 err->error = NFT_PARSE_EMISSINGNODE;
196 ret = node->child->value.opaque;
198 err->node_name = node_name;
199 err->error = NFT_PARSE_EBADTYPE;
204 int nft_mxml_family_parse(mxml_node_t *tree,
const char *node_name,
205 uint32_t mxml_flags, uint16_t flags,
206 struct nft_parse_err *err)
208 const char *family_str;
211 family_str = nft_mxml_str_parse(tree, node_name, mxml_flags,
213 if (family_str == NULL)
216 family = nft_str2family(family_str);
218 err->node_name = node_name;
219 errno = EAFNOSUPPORT;