diff options
author | Ana Rey <anarey@gmail.com> | 2014-06-26 19:08:41 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-06-30 12:46:53 +0200 |
commit | e7eb251a2843a786cbd9b9989fc271f7c927ae6c (patch) | |
tree | 858cf1a69ded6978ff35948d63cf9e2c6c1e4350 /src/table.c | |
parent | 1e27448037b1bbb6924d966a5fd79e5db19ba41d (diff) |
table: Do not print unset values in json file
It changes the parse and snprintf functions to omit unset values.
Signed-off-by: Ana Rey <anarey@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/table.c')
-rw-r--r-- | src/table.c | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/src/table.c b/src/table.c index 7874245..abbaa52 100644 --- a/src/table.c +++ b/src/table.c @@ -319,20 +319,15 @@ int nft_jansson_parse_table(struct nft_table *t, json_t *tree, return -1; str = nft_jansson_parse_str(root, "name", err); - if (str == NULL) - return -1; - - nft_table_attr_set_str(t, NFT_TABLE_ATTR_NAME, str); - - if (nft_jansson_parse_family(root, &family, err) != 0) - return -1; - - nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FAMILY, family); + if (str != NULL) + nft_table_attr_set_str(t, NFT_TABLE_ATTR_NAME, str); - if (nft_jansson_parse_val(root, "flags", NFT_TYPE_U32, &flags, err) < 0) - return -1; + if (nft_jansson_parse_family(root, &family, err) == 0) + nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FAMILY, family); - nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FLAGS, flags); + if (nft_jansson_parse_val(root, "flags", NFT_TYPE_U32, &flags, + err) == 0) + nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FLAGS, flags); if (nft_jansson_parse_val(root, "use", NFT_TYPE_U32, &use, err) == 0) nft_table_attr_set_u32(t, NFT_TABLE_ATTR_USE, use); @@ -407,16 +402,41 @@ EXPORT_SYMBOL(nft_table_parse_file); static int nft_table_snprintf_json(char *buf, size_t size, struct nft_table *t) { - return snprintf(buf, size, - "{\"table\":{" - "\"name\":\"%s\"," - "\"family\":\"%s\"," - "\"flags\":%d," - "\"use\":%d" - "}" - "}" , - t->name, nft_family2str(t->family), - t->table_flags, t->use); + int ret, len = size, offset = 0; + + ret = snprintf(buf, size, "{\"table\":{"); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + ret = 0; + + if (t->flags & (1 << NFT_TABLE_ATTR_NAME)) { + ret = snprintf(buf + offset, size, "\"name\":\"%s\",", t->name); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + if (t->flags & (1 << NFT_TABLE_ATTR_FAMILY)) { + ret = snprintf(buf + offset, size, "\"family\":\"%s\",", + nft_family2str(t->family)); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + if (t->flags & (1 << NFT_TABLE_ATTR_FLAGS)) { + ret = snprintf(buf + offset, size, "\"flags\":%u,", + t->table_flags); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + if (t->flags & (1 << NFT_TABLE_ATTR_USE)) { + ret = snprintf(buf + offset, size, "\"use\":%u,", t->use); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + + /* If some values is set, ret is not 0. So, It's needed to remove the + * last comma characther + */ + if (ret > 0) + offset--; + + ret = snprintf(buf + offset, size, "}}"); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + return offset; } static int nft_table_snprintf_xml(char *buf, size_t size, struct nft_table *t) |