summaryrefslogtreecommitdiffstats
path: root/src/rule.c
diff options
context:
space:
mode:
authorArturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>2013-02-08 17:51:56 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2013-02-08 19:12:55 +0100
commit26e06d838d6471f5233c1da3fee012bf113564a5 (patch)
tree0482737475d6dd151cd74a4e94bd82cff9278232 /src/rule.c
parent1cef3296c64244736a000ab0d146d05ca1ac4b8b (diff)
src: add XML output support
Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/rule.c')
-rw-r--r--src/rule.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/src/rule.c b/src/rule.c
index 6c4aa4c..501b4f6 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -434,12 +434,42 @@ int nft_rule_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_rule *r)
}
EXPORT_SYMBOL(nft_rule_nlmsg_parse);
-int nft_rule_snprintf(char *buf, size_t size, struct nft_rule *r,
- uint32_t type, uint32_t flags)
+static int nft_rule_snprintf_xml(char *buf, size_t size, struct nft_rule *r,
+ uint32_t type, uint32_t flags)
+{
+ int ret, len = size, offset = 0;
+ struct nft_rule_expr *expr;
+
+ ret = snprintf(buf, size,
+ "<rule family=\"%u\" table=\"%s\" "
+ "chain=\"%s\" handle=\"%llu\"> ",
+ r->family, r->table, r->chain,
+ (unsigned long long)r->handle);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+
+ list_for_each_entry(expr, &r->expr_list, head) {
+ ret = snprintf(buf+offset, len,
+ "\n\t<expr type=\"%s\">\n", expr->ops->name);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+
+ ret = expr->ops->snprintf(buf+offset, len, type, flags, expr);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+
+ ret = snprintf(buf+offset, len, "\n\t</expr>");
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+
+ }
+ ret = snprintf(buf+offset-1, len, "\n</rule>\n ");
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+
+ return ret;
+}
+
+static int nft_rule_snprintf_default(char *buf, size_t size, struct nft_rule *r,
+ uint32_t type, uint32_t flags)
{
- int ret;
struct nft_rule_expr *expr;
- int len = size, offset = 0;
+ int ret, len = size, offset = 0;
ret = snprintf(buf, size, "family=%u table=%s chain=%s handle=%llu "
"flags=%x ",
@@ -459,6 +489,20 @@ int nft_rule_snprintf(char *buf, size_t size, struct nft_rule *r,
return ret;
}
+
+int nft_rule_snprintf(char *buf, size_t size, struct nft_rule *r,
+ uint32_t type, uint32_t flags)
+{
+ switch(type) {
+ case NFT_RULE_O_XML:
+ return nft_rule_snprintf_xml(buf, size, r, type, flags);
+ case NFT_RULE_O_DEFAULT:
+ return nft_rule_snprintf_default(buf, size, r, type, flags);
+ default:
+ break;
+ }
+ return -1;
+}
EXPORT_SYMBOL(nft_rule_snprintf);
struct nft_rule_expr_iter {