From 26e06d838d6471f5233c1da3fee012bf113564a5 Mon Sep 17 00:00:00 2001 From: Arturo Borrero Gonzalez Date: Fri, 8 Feb 2013 17:51:56 +0100 Subject: src: add XML output support Signed-off-by: Arturo Borrero Gonzalez Signed-off-by: Pablo Neira Ayuso --- src/rule.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) (limited to 'src/rule.c') 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, + " ", + 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\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"); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + } + ret = snprintf(buf+offset-1, len, "\n\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 { -- cgit v1.2.3