summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAna Rey <anarey@gmail.com>2014-06-26 19:08:40 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2014-06-30 12:46:50 +0200
commit1e27448037b1bbb6924d966a5fd79e5db19ba41d (patch)
tree318c82a390af2e5bd9fbb0412084fd5782f18725 /src
parent6883b28c1a2d26625b712710e3e4c4d46d17bc70 (diff)
table: Do not print unset values in xml 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')
-rw-r--r--src/table.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/src/table.c b/src/table.c
index 5a0135f..7874245 100644
--- a/src/table.c
+++ b/src/table.c
@@ -266,20 +266,17 @@ int nft_mxml_table_parse(mxml_node_t *tree, struct nft_table *t,
name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST,
NFT_XML_MAND, err);
- if (name == NULL)
- return -1;
- nft_table_attr_set_str(t, NFT_TABLE_ATTR_NAME, name);
+ if (name != NULL)
+ nft_table_attr_set_str(t, NFT_TABLE_ATTR_NAME, name);
family = nft_mxml_family_parse(tree, "family", MXML_DESCEND_FIRST,
NFT_XML_MAND, err);
- if (family < 0)
- return -1;
- nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FAMILY, family);
+ if (family >= 0)
+ nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FAMILY, family);
if (nft_mxml_num_parse(tree, "flags", MXML_DESCEND, BASE_DEC,
- &flags, NFT_TYPE_U32, NFT_XML_MAND, err) != 0)
- return -1;
- nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FLAGS, flags);
+ &flags, NFT_TYPE_U32, NFT_XML_MAND, err) == 0)
+ nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FLAGS, flags);
if (nft_mxml_num_parse(tree, "use", MXML_DESCEND, BASE_DEC,
&use, NFT_TYPE_U32, NFT_XML_MAND, err) == 0)
@@ -424,10 +421,34 @@ static int nft_table_snprintf_json(char *buf, size_t size, struct nft_table *t)
static int nft_table_snprintf_xml(char *buf, size_t size, struct nft_table *t)
{
- return snprintf(buf, size, "<table><name>%s</name><family>%s</family>"
- "<flags>%d</flags><use>%d</use></table>",
- 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);
+
+ if (t->flags & (1 << NFT_TABLE_ATTR_NAME)) {
+ ret = snprintf(buf + offset, size, "<name>%s</name>", t->name);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
+ if (t->flags & (1 << NFT_TABLE_ATTR_FAMILY)) {
+ ret = snprintf(buf + offset, size, "<family>%s</family>",
+ 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</flags>",
+ 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</use>", t->use);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
+
+ ret = snprintf(buf + offset, size, "</table>");
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+
+ return offset;
}
static int nft_table_snprintf_default(char *buf, size_t size, struct nft_table *t)