diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-11-09 19:26:48 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-11-10 18:42:37 +0100 |
commit | 5a2a1e0447bc9dc3defe6dca75e6a54312bbb045 (patch) | |
tree | 0b6d6fc52096aef745f8598588fd64826d584315 /src/chain.c | |
parent | 88e823f8dcb24b5201f2fe4f4d5ec5d277bd24b2 (diff) |
src: consolidate XML/JSON exportation
Add new buffer class to consolidate the existing code to export objects
in XML/JSON and use it. We save ~700 LOC with this change.
The rule and set objects are not yet consolidated. It seems this would
require some specific glue code per representation type since lists are
arranged differently.
This also consolidates the tag names, so we make sure the same are used
from XML and JSON by placing them in include/buffer.h.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/chain.c')
-rw-r--r-- | src/chain.c | 174 |
1 files changed, 32 insertions, 142 deletions
diff --git a/src/chain.c b/src/chain.c index a056bab..b67385e 100644 --- a/src/chain.c +++ b/src/chain.c @@ -27,6 +27,7 @@ #include <linux/netfilter_arp.h> #include <libnftnl/chain.h> +#include <buffer.h> struct nft_chain { struct list_head head; @@ -787,150 +788,41 @@ int nft_chain_parse_file(struct nft_chain *c, enum nft_parse_type type, } EXPORT_SYMBOL(nft_chain_parse_file); -static int nft_chain_snprintf_json(char *buf, size_t size, struct nft_chain *c) +static int nft_chain_export(char *buf, size_t size, struct nft_chain *c, + int type) { - int ret, len = size, offset = 0; - - ret = snprintf(buf, len, "{\"chain\":{"); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - - ret = 0; - - if (c->flags & (1 << NFT_CHAIN_ATTR_NAME)) { - ret = snprintf(buf + offset, len, "\"name\":\"%s\",", c->name); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_HANDLE)) { - ret = snprintf(buf + offset, len, "\"handle\":%"PRIu64",", - c->handle); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_BYTES)) { - ret = snprintf(buf + offset, len, "\"bytes\":%"PRIu64",", - c->bytes); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_PACKETS)) { - ret = snprintf(buf + offset, len, "\"packets\":%"PRIu64",", - c->packets); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_FAMILY)) { - ret = snprintf(buf + offset, len, "\"family\":\"%s\",", - nft_family2str(c->family)); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_FAMILY)) { - ret = snprintf(buf + offset, len, "\"table\":\"%s\",", - c->table); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_USE)) { - ret = snprintf(buf + offset, len, "\"use\":%d,", c->use); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_HOOKNUM)) { - if (c->flags & (1 << NFT_CHAIN_ATTR_TYPE)) { - ret = snprintf(buf + offset, len, "\"type\":\"%s\",", - c->type); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } + NFT_BUF_INIT(b, buf, size); - ret = snprintf(buf + offset, len, "\"hooknum\":\"%s\",", - nft_hooknum2str(c->family, c->hooknum)); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - - if (c->flags & (1 << NFT_CHAIN_ATTR_PRIO)) { - ret = snprintf(buf + offset, len, "\"prio\":%d,", - c->prio); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_POLICY)) { - ret = snprintf(buf + offset, len, "\"policy\":\"%s\",", - nft_verdict2str(c->policy)); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - } - - /* If ret is not 0, some values are printed. So, It's necessary to - * delete the last comma character - */ - if (ret > 0) - offset--; - - ret = snprintf(buf + offset, len, "}}"); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - - return offset; -} - -static int nft_chain_snprintf_xml(char *buf, size_t size, struct nft_chain *c) -{ - int ret, len = size, offset = 0; - - ret = snprintf(buf, len, "<chain>"); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - - if (c->flags & (1 << NFT_CHAIN_ATTR_NAME)) { - ret = snprintf(buf + offset, len, "<name>%s</name>", c->name); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_HANDLE)) { - ret = snprintf(buf + offset, len, "<handle>%"PRIu64"</handle>", - c->handle); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_BYTES)) { - ret = snprintf(buf + offset, len, "<bytes>%"PRIu64"</bytes>", - c->bytes); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_PACKETS)) { - ret = snprintf(buf + offset, len, "<packets>%"PRIu64"</packets>", - c->packets); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_TABLE)) { - ret = snprintf(buf + offset, len, "<table>%s</table>", - c->table); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_USE)) { - ret = snprintf(buf + offset, len, "<use>%u</use>", c->use); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } + nft_buf_open(&b, type, CHAIN); + if (c->flags & (1 << NFT_CHAIN_ATTR_NAME)) + nft_buf_str(&b, type, c->name, NAME); + if (c->flags & (1 << NFT_CHAIN_ATTR_HANDLE)) + nft_buf_u64(&b, type, c->handle, HANDLE); + if (c->flags & (1 << NFT_CHAIN_ATTR_BYTES)) + nft_buf_u64(&b, type, c->bytes, BYTES); + if (c->flags & (1 << NFT_CHAIN_ATTR_PACKETS)) + nft_buf_u64(&b, type, c->packets, PACKETS); + if (c->flags & (1 << NFT_CHAIN_ATTR_TABLE)) + nft_buf_str(&b, type, c->table, TABLE); + if (c->flags & (1 << NFT_CHAIN_ATTR_FAMILY)) + nft_buf_str(&b, type, nft_family2str(c->family), FAMILY); + if (c->flags & (1 << NFT_CHAIN_ATTR_USE)) + nft_buf_u32(&b, type, c->use, USE); if (c->flags & (1 << NFT_CHAIN_ATTR_HOOKNUM)) { - if (c->flags & (1 << NFT_CHAIN_ATTR_TYPE)) { - ret = snprintf(buf + offset, len, "<type>%s</type>", - c->type); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - - ret = snprintf(buf + offset, len, "<hooknum>%s</hooknum>", - nft_hooknum2str(c->family, c->hooknum)); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - - if (c->flags & (1 << NFT_CHAIN_ATTR_PRIO)) { - ret = snprintf(buf + offset, len, "<prio>%d</prio>", - c->prio); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - if (c->flags & (1 << NFT_CHAIN_ATTR_POLICY)) { - ret = snprintf(buf + offset, len, "<policy>%s</policy>", - nft_verdict2str(c->policy)); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - } - } - if (c->flags & (1 << NFT_CHAIN_ATTR_FAMILY)) { - ret = snprintf(buf + offset, len, "<family>%s</family>", - nft_family2str(c->family)); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + if (c->flags & (1 << NFT_CHAIN_ATTR_TYPE)) + nft_buf_str(&b, type, c->type, TYPE); + if (c->flags & (1 << NFT_CHAIN_ATTR_HOOKNUM)) + nft_buf_str(&b, type, nft_hooknum2str(c->family, + c->hooknum), HOOKNUM); + if (c->flags & (1 << NFT_CHAIN_ATTR_PRIO)) + nft_buf_s32(&b, type, c->prio, PRIO); + if (c->flags & (1 << NFT_CHAIN_ATTR_POLICY)) + nft_buf_str(&b, type, nft_verdict2str(c->policy), POLICY); } - ret = snprintf(buf + offset, len, "</chain>"); - SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + nft_buf_close(&b, type, CHAIN); - return offset; + return nft_buf_done(&b); } static int nft_chain_snprintf_default(char *buf, size_t size, @@ -963,15 +855,13 @@ int nft_chain_snprintf(char *buf, size_t size, struct nft_chain *c, ret = nft_event_header_snprintf(buf+offset, len, type, flags); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); - switch(type) { + switch (type) { case NFT_OUTPUT_DEFAULT: ret = nft_chain_snprintf_default(buf+offset, len, c); break; case NFT_OUTPUT_XML: - ret = nft_chain_snprintf_xml(buf+offset, len, c); - break; case NFT_OUTPUT_JSON: - ret = nft_chain_snprintf_json(buf+offset, len, c); + ret = nft_chain_export(buf+offset, len, c, type); break; default: return -1; |