diff options
author | Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com> | 2013-02-08 17:51:56 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-02-08 19:12:55 +0100 |
commit | 26e06d838d6471f5233c1da3fee012bf113564a5 (patch) | |
tree | 0482737475d6dd151cd74a4e94bd82cff9278232 /src/rule.c | |
parent | 1cef3296c64244736a000ab0d146d05ca1ac4b8b (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.c | 52 |
1 files changed, 48 insertions, 4 deletions
@@ -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 { |