netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [libnftnl PATCH 0/6] src: chain: Do not print unset values in json and xml
@ 2014-06-26 16:38 Ana Rey
  2014-06-26 16:38 ` [libnftnl PATCH 1/6] src: chain: Free memory in the same function that is reserved Ana Rey
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Ana Rey @ 2014-06-26 16:38 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

This patchset does tasks about does not print unset value in xml and json file
and about refactoring code:

*  src: chain: Free memory in the same function that is reserved
*  src: chain: Use nft_rule_expr_set_* in the xml parsing code
*  src: chain: Rename variables in nft_jansson_parse_chain functions

Moreover, I add some implementation for use valee.

*** BLURB HERE ***

Ana Rey (6):
  src: chain: Free memory in the same function that is reserved
  src: chain: Use nft_rule_expr_set_* in the xml parsing code
  src: chain: add set, unset, get, parse and build payload
    implementation for use value
  src: chain: Do not print unset values in xml
  src: chain: Rename variables in nft_jansson_parse_chain functions
  src: chain: Do not print unser values in json

 src/chain.c | 364 +++++++++++++++++++++++++++++++++---------------------------
 1 file changed, 203 insertions(+), 161 deletions(-)

-- 
2.0.0


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [libnftnl PATCH 1/6] src: chain: Free memory in the same function that is reserved
  2014-06-26 16:38 [libnftnl PATCH 0/6] src: chain: Do not print unset values in json and xml Ana Rey
@ 2014-06-26 16:38 ` Ana Rey
  2014-06-30 10:42   ` Pablo Neira Ayuso
  2014-06-26 16:38 ` [libnftnl PATCH 2/6] src: chain: Use nft_rule_expr_set_* in the xml parsing code Ana Rey
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: Ana Rey @ 2014-06-26 16:38 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

Free memory in the same function that is reserved.

Signed-off-by: Ana Rey <anarey@gmail.com>
---
 src/chain.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index 5311af6..b7e1c5e 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -575,37 +575,37 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree,
 
 	valstr = nft_jansson_parse_str(root, "name", err);
 	if (valstr == NULL)
-		goto err;
+		return -1;
 
 	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, valstr);
 
 	if (nft_jansson_parse_val(root, "handle", NFT_TYPE_U64, &uval64,
 				  err) < 0)
-		goto err;
+		return -1;
 
 	nft_chain_attr_set_u64(c,NFT_CHAIN_ATTR_HANDLE, uval64);
 
 	if (nft_jansson_parse_val(root, "bytes", NFT_TYPE_U64, &uval64,
 				  err) < 0)
-		goto err;
+		return -1;
 
 	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_BYTES, uval64);
 
 	if (nft_jansson_parse_val(root, "packets", NFT_TYPE_U64, &uval64,
 				  err) < 0)
-		goto err;
+		return -1;
 
 	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, uval64);
 
 	if (nft_jansson_parse_family(root, &val32, err) != 0)
-		goto err;
+		return -1;
 
 	nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, val32);
 
 	valstr = nft_jansson_parse_str(root, "table", err);
 
 	if (valstr == NULL)
-		goto err;
+		return -1;
 
 	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, valstr);
 
@@ -613,46 +613,41 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree,
 		valstr = nft_jansson_parse_str(root, "type", err);
 
 		if (valstr == NULL)
-			goto err;
+			return -1;
 
 		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, valstr);
 
 		if (nft_jansson_parse_val(root, "prio", NFT_TYPE_S32,
 					  &val32, err) < 0)
-			goto err;
+			return -1;
 
 		nft_chain_attr_set_s32(c, NFT_CHAIN_ATTR_PRIO, val32);
 
 		valstr = nft_jansson_parse_str(root, "hooknum", err);
 		if (valstr == NULL)
-			goto err;
+			return -1;
 
 		val32 = nft_str2hooknum(c->family, valstr);
 		if (val32 == -1)
-			goto err;
+			return -1;
 
 		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_HOOKNUM, val32);
 
 		valstr = nft_jansson_parse_str(root, "policy", err);
 		if (valstr == NULL)
-			goto err;
+			return -1;
 
 		if (nft_str2verdict(valstr, &policy) != 0) {
 			errno = EINVAL;
 			err->node_name = "policy";
 			err->error = NFT_PARSE_EBADTYPE;
-			goto err;
+			return -1;
 		}
 
 		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY, policy);
 	}
 
-	nft_jansson_free_root(tree);
 	return 0;
-
-err:
-	nft_jansson_free_root(tree);
-	return -1;
 }
 #endif
 
@@ -663,12 +658,17 @@ static int nft_chain_json_parse(struct nft_chain *c, const void *json,
 #ifdef JSON_PARSING
 	json_t *tree;
 	json_error_t error;
+	int ret;
 
 	tree = nft_jansson_create_root(json, &error, err, input);
 	if (tree == NULL)
 		return -1;
 
-	return nft_jansson_parse_chain(c, tree, err);
+	ret = nft_jansson_parse_chain(c, tree, err);
+
+	nft_jansson_free_root(tree);
+
+	return ret;
 #else
 	errno = EOPNOTSUPP;
 	return -1;
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libnftnl PATCH 2/6] src: chain: Use nft_rule_expr_set_* in the xml parsing code
  2014-06-26 16:38 [libnftnl PATCH 0/6] src: chain: Do not print unset values in json and xml Ana Rey
  2014-06-26 16:38 ` [libnftnl PATCH 1/6] src: chain: Free memory in the same function that is reserved Ana Rey
@ 2014-06-26 16:38 ` Ana Rey
  2014-06-30 10:42   ` Pablo Neira Ayuso
  2014-06-26 16:38 ` [libnftnl PATCH 3/6] src: chain: add set, unset, get, parse and build payload implementation for use value Ana Rey
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: Ana Rey @ 2014-06-26 16:38 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

Code refactoring to use nft_rule_expr_set_* in parse functions.

Signed-off-by: Ana Rey <anarey@gmail.com>
---
 src/chain.c | 53 ++++++++++++++++-------------------------------------
 1 file changed, 16 insertions(+), 37 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index b7e1c5e..9e9f207 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -681,51 +681,41 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c,
 {
 	const char *table, *name, *hooknum_str, *policy_str, *type;
 	int family, hooknum, policy;
+	uint64_t handle, bytes, packets, prio;
 
 	name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST,
 				  NFT_XML_MAND, err);
 	if (name == NULL)
 		return -1;
-
-	strncpy(c->name, name, NFT_CHAIN_MAXNAMELEN);
-	c->flags |= (1 << NFT_CHAIN_ATTR_NAME);
+	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, name);
 
 	if (nft_mxml_num_parse(tree, "handle", MXML_DESCEND_FIRST, BASE_DEC,
-			       &c->handle, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
+			       &handle, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
 		return -1;
-
-	c->flags |= (1 << NFT_CHAIN_ATTR_HANDLE);
+	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_HANDLE, handle);
 
 	if (nft_mxml_num_parse(tree, "bytes", MXML_DESCEND_FIRST, BASE_DEC,
-			       &c->bytes, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
+			       &bytes, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
 		return -1;
+	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_BYTES, bytes);
 
-	c->flags |= (1 << NFT_CHAIN_ATTR_BYTES);
 
 	if (nft_mxml_num_parse(tree, "packets", MXML_DESCEND_FIRST, BASE_DEC,
-			       &c->packets, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
+			       &packets, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
 		return -1;
-
-	c->flags |= (1 << NFT_CHAIN_ATTR_PACKETS);
+	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, packets);
 
 	table = nft_mxml_str_parse(tree, "table", MXML_DESCEND_FIRST,
 				   NFT_XML_MAND, err);
 	if (table == NULL)
 		return -1;
-
-	if (c->table)
-		xfree(c->table);
-
-	c->table = strdup(table);
-	c->flags |= (1 << NFT_CHAIN_ATTR_TABLE);
+	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, table);
 
 	family = nft_mxml_family_parse(tree, "family", MXML_DESCEND_FIRST,
 				       NFT_XML_MAND, err);
 	if (family < 0)
 		return -1;
-
-	c->family = family;
-	c->flags |= (1 << NFT_CHAIN_ATTR_FAMILY);
+	nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, family);
 
 	hooknum_str = nft_mxml_str_parse(tree, "hooknum", MXML_DESCEND_FIRST,
 					 NFT_XML_OPT, err);
@@ -733,28 +723,19 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c,
 		hooknum = nft_str2hooknum(c->family, hooknum_str);
 		if (hooknum < 0)
 			return -1;
-
-		c->hooknum = hooknum;
-		c->flags |= (1 << NFT_CHAIN_ATTR_HOOKNUM);
+		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_HOOKNUM, hooknum);
 
 		type = nft_mxml_str_parse(tree, "type", MXML_DESCEND_FIRST,
 					  NFT_XML_MAND, err);
 		if (type == NULL)
 			return -1;
-
-		if (c->type)
-			xfree(c->type);
-
-		c->type = strdup(type);
-		c->flags |= (1 << NFT_CHAIN_ATTR_TYPE);
-
+		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, type);
 
 		if (nft_mxml_num_parse(tree, "prio", MXML_DESCEND, BASE_DEC,
-				       &c->prio, NFT_TYPE_S32,
-				       NFT_XML_MAND, err) != 0)
+				       &prio, NFT_TYPE_S32, NFT_XML_MAND,
+				       err) != 0)
 			return -1;
-
-		c->flags |= (1 << NFT_CHAIN_ATTR_PRIO);
+		nft_chain_attr_set_s32(c, NFT_CHAIN_ATTR_PRIO, prio);
 
 		policy_str = nft_mxml_str_parse(tree, "policy",
 						MXML_DESCEND_FIRST,
@@ -768,9 +749,7 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c,
 			err->error = NFT_PARSE_EBADTYPE;
 			return -1;
 		}
-
-		c->policy = policy;
-		c->flags |= (1 << NFT_CHAIN_ATTR_POLICY);
+		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY, policy);
 	}
 
 	return 0;
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libnftnl PATCH 3/6] src: chain: add set, unset, get, parse and build payload implementation for use value
  2014-06-26 16:38 [libnftnl PATCH 0/6] src: chain: Do not print unset values in json and xml Ana Rey
  2014-06-26 16:38 ` [libnftnl PATCH 1/6] src: chain: Free memory in the same function that is reserved Ana Rey
  2014-06-26 16:38 ` [libnftnl PATCH 2/6] src: chain: Use nft_rule_expr_set_* in the xml parsing code Ana Rey
@ 2014-06-26 16:38 ` Ana Rey
  2014-06-30 10:42   ` Pablo Neira Ayuso
  2014-06-26 16:38 ` [libnftnl PATCH 4/6] src: chain: Do not print unset values in xml Ana Rey
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: Ana Rey @ 2014-06-26 16:38 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

Add some parts of the implemention of 'use' vualue in chain that miss it.

These changes are neeeded for a correct import/export of xml/json file

Signed-off-by: Ana Rey <anarey@gmail.com>
---
 src/chain.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index 9e9f207..f01abb9 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -115,8 +115,7 @@ void nft_chain_attr_unset(struct nft_chain *c, uint16_t attr)
 		}
 		break;
 	case NFT_CHAIN_ATTR_USE:
-		/* cannot be unset?, ignore it */
-		return;
+		break;
 	case NFT_CHAIN_ATTR_TYPE:
 		if (c->type) {
 			xfree(c->type);
@@ -178,8 +177,8 @@ void nft_chain_attr_set_data(struct nft_chain *c, uint16_t attr,
 		c->policy = *((uint32_t *)data);
 		break;
 	case NFT_CHAIN_ATTR_USE:
-		/* cannot be set, ignore it */
-		return;
+		c->use = *((uint32_t *)data);
+		break;
 	case NFT_CHAIN_ATTR_BYTES:
 		c->bytes = *((uint64_t *)data);
 		break;
@@ -356,6 +355,8 @@ void nft_chain_nlmsg_build_payload(struct nlmsghdr *nlh, const struct nft_chain
 	}
 	if (c->flags & (1 << NFT_CHAIN_ATTR_POLICY))
 		mnl_attr_put_u32(nlh, NFTA_CHAIN_POLICY, htonl(c->policy));
+	if (c->flags & (1 << NFT_CHAIN_ATTR_USE))
+		mnl_attr_put_u32(nlh, NFTA_CHAIN_USE, htonl(c->use));
 	if ((c->flags & (1 << NFT_CHAIN_ATTR_PACKETS)) &&
 	    (c->flags & (1 << NFT_CHAIN_ATTR_BYTES))) {
 		struct nlattr *nest;
@@ -566,7 +567,7 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree,
 	json_t *root;
 	uint64_t uval64;
 	int policy;
-	int32_t val32;
+	int32_t val32, use;
 	const char *valstr;
 
 	root = nft_jansson_get_node(tree, "chain", err);
@@ -609,6 +610,9 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree,
 
 	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, valstr);
 
+	if (nft_jansson_parse_val(root, "use", NFT_TYPE_U32, &use, err) == 0)
+		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_USE, use);
+
 	if (nft_jansson_node_exist(root, "hooknum")) {
 		valstr = nft_jansson_parse_str(root, "type", err);
 
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libnftnl PATCH 4/6] src: chain: Do not print unset values in xml
  2014-06-26 16:38 [libnftnl PATCH 0/6] src: chain: Do not print unset values in json and xml Ana Rey
                   ` (2 preceding siblings ...)
  2014-06-26 16:38 ` [libnftnl PATCH 3/6] src: chain: add set, unset, get, parse and build payload implementation for use value Ana Rey
@ 2014-06-26 16:38 ` Ana Rey
  2014-06-26 16:38 ` [libnftnl PATCH 5/6] src: chain: Rename variables in nft_jansson_parse_chain functions Ana Rey
  2014-06-26 16:39 ` [libnftnl PATCH 6/6] src: chain: Do not print unser values in json Ana Rey
  5 siblings, 0 replies; 10+ messages in thread
From: Ana Rey @ 2014-06-26 16:38 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

It changes the parse and snprintf functions to omit unset values.

Signed-off-by: Ana Rey <anarey@gmail.com>
---
 src/chain.c | 127 ++++++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 81 insertions(+), 46 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index f01abb9..2a39985 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -689,37 +689,32 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c,
 
 	name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST,
 				  NFT_XML_MAND, err);
-	if (name == NULL)
-		return -1;
-	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, name);
+	if (name != NULL)
+		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, name);
 
 	if (nft_mxml_num_parse(tree, "handle", MXML_DESCEND_FIRST, BASE_DEC,
-			       &handle, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
-		return -1;
-	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_HANDLE, handle);
+			       &handle, NFT_TYPE_U64, NFT_XML_MAND, err) == 0)
+		nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_HANDLE, handle);
 
 	if (nft_mxml_num_parse(tree, "bytes", MXML_DESCEND_FIRST, BASE_DEC,
-			       &bytes, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
-		return -1;
-	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_BYTES, bytes);
+			       &bytes, NFT_TYPE_U64, NFT_XML_MAND, err) == 0)
+		nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_BYTES, bytes);
 
 
 	if (nft_mxml_num_parse(tree, "packets", MXML_DESCEND_FIRST, BASE_DEC,
-			       &packets, NFT_TYPE_U64, NFT_XML_MAND, err) != 0)
-		return -1;
-	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, packets);
+			       &packets, NFT_TYPE_U64, NFT_XML_MAND, err) == 0)
+		nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, packets);
 
 	table = nft_mxml_str_parse(tree, "table", MXML_DESCEND_FIRST,
 				   NFT_XML_MAND, err);
-	if (table == NULL)
-		return -1;
-	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, table);
+
+	if (table != NULL)
+		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, table);
 
 	family = nft_mxml_family_parse(tree, "family", MXML_DESCEND_FIRST,
 				       NFT_XML_MAND, err);
-	if (family < 0)
-		return -1;
-	nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, family);
+	if (family >= 0)
+		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, family);
 
 	hooknum_str = nft_mxml_str_parse(tree, "hooknum", MXML_DESCEND_FIRST,
 					 NFT_XML_OPT, err);
@@ -731,29 +726,28 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c,
 
 		type = nft_mxml_str_parse(tree, "type", MXML_DESCEND_FIRST,
 					  NFT_XML_MAND, err);
-		if (type == NULL)
-			return -1;
-		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, type);
+
+		if (type != NULL)
+			nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, type);
 
 		if (nft_mxml_num_parse(tree, "prio", MXML_DESCEND, BASE_DEC,
 				       &prio, NFT_TYPE_S32, NFT_XML_MAND,
-				       err) != 0)
-			return -1;
-		nft_chain_attr_set_s32(c, NFT_CHAIN_ATTR_PRIO, prio);
+				       err) == 0)
+			nft_chain_attr_set_s32(c, NFT_CHAIN_ATTR_PRIO, prio);
 
 		policy_str = nft_mxml_str_parse(tree, "policy",
 						MXML_DESCEND_FIRST,
 						NFT_XML_MAND, err);
-		if (policy_str == NULL)
-			return -1;
-
-		if (nft_str2verdict(policy_str, &policy) != 0) {
-			errno = EINVAL;
-			err->node_name = "policy";
-			err->error = NFT_PARSE_EBADTYPE;
-			return -1;
+		if (policy_str != NULL) {
+			if (nft_str2verdict(policy_str, &policy) != 0) {
+				errno = EINVAL;
+				err->node_name = "policy";
+				err->error = NFT_PARSE_EBADTYPE;
+				return -1;
+			}
+			nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY,
+					       policy);
 		}
-		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY, policy);
 	}
 
 	return 0;
@@ -858,25 +852,66 @@ 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><name>%s</name>"
-		       "<handle>%"PRIu64"</handle><bytes>%"PRIu64"</bytes>"
-		       "<packets>%"PRIu64"</packets><table>%s</table>",
-		       c->name, c->handle, c->bytes, c->packets, c->table);
+	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);
+	}
 	if (c->flags & (1 << NFT_CHAIN_ATTR_HOOKNUM)) {
-		ret =  snprintf(buf+offset, len,
-				"<type>%s</type>"
-				"<hooknum>%s</hooknum>"
-				"<prio>%d</prio>"
-				"<policy>%s</policy>",
-			c->type, nft_hooknum2str(c->family, c->hooknum),
-			c->prio, nft_verdict2str(c->policy));
+		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);
 	}
 
-	ret = snprintf(buf+offset, len, "<family>%s</family></chain>",
-		       nft_family2str(c->family));
+	ret = snprintf(buf + offset, len, "</chain>");
 	SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
 
 	return offset;
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libnftnl PATCH 5/6] src: chain: Rename variables in nft_jansson_parse_chain functions
  2014-06-26 16:38 [libnftnl PATCH 0/6] src: chain: Do not print unset values in json and xml Ana Rey
                   ` (3 preceding siblings ...)
  2014-06-26 16:38 ` [libnftnl PATCH 4/6] src: chain: Do not print unset values in xml Ana Rey
@ 2014-06-26 16:38 ` Ana Rey
  2014-06-26 16:39 ` [libnftnl PATCH 6/6] src: chain: Do not print unser values in json Ana Rey
  5 siblings, 0 replies; 10+ messages in thread
From: Ana Rey @ 2014-06-26 16:38 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

Renames some variables for code readability reasons.

Signed-off-by: Ana Rey <anarey@gmail.com>
---
 src/chain.c | 64 ++++++++++++++++++++++++++++++-------------------------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index 2a39985..042ff13 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -565,90 +565,90 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree,
 			    struct nft_parse_err *err)
 {
 	json_t *root;
-	uint64_t uval64;
-	int policy;
-	int32_t val32, use;
-	const char *valstr;
+	uint64_t handle, bytes, packets;
+	int policy_num;
+	int32_t family, prio, hooknum, use;
+	const char *name, *table, *type, *hooknum_str, *policy;
 
 	root = nft_jansson_get_node(tree, "chain", err);
 	if (root == NULL)
 		return -1;
 
-	valstr = nft_jansson_parse_str(root, "name", err);
-	if (valstr == NULL)
+	name = nft_jansson_parse_str(root, "name", err);
+	if (name == NULL)
 		return -1;
 
-	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, valstr);
+	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, name);
 
-	if (nft_jansson_parse_val(root, "handle", NFT_TYPE_U64, &uval64,
+	if (nft_jansson_parse_val(root, "handle", NFT_TYPE_U64, &handle,
 				  err) < 0)
 		return -1;
 
-	nft_chain_attr_set_u64(c,NFT_CHAIN_ATTR_HANDLE, uval64);
+	nft_chain_attr_set_u64(c,NFT_CHAIN_ATTR_HANDLE, handle);
 
-	if (nft_jansson_parse_val(root, "bytes", NFT_TYPE_U64, &uval64,
+	if (nft_jansson_parse_val(root, "bytes", NFT_TYPE_U64, &bytes,
 				  err) < 0)
 		return -1;
 
-	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_BYTES, uval64);
+	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_BYTES, bytes);
 
-	if (nft_jansson_parse_val(root, "packets", NFT_TYPE_U64, &uval64,
+	if (nft_jansson_parse_val(root, "packets", NFT_TYPE_U64, &packets,
 				  err) < 0)
 		return -1;
 
-	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, uval64);
+	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, packets);
 
-	if (nft_jansson_parse_family(root, &val32, err) != 0)
+	if (nft_jansson_parse_family(root, &family, err) != 0)
 		return -1;
 
-	nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, val32);
+	nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, family);
 
-	valstr = nft_jansson_parse_str(root, "table", err);
+	table = nft_jansson_parse_str(root, "table", err);
 
-	if (valstr == NULL)
+	if (table == NULL)
 		return -1;
 
-	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, valstr);
+	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, table);
 
 	if (nft_jansson_parse_val(root, "use", NFT_TYPE_U32, &use, err) == 0)
 		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_USE, use);
 
 	if (nft_jansson_node_exist(root, "hooknum")) {
-		valstr = nft_jansson_parse_str(root, "type", err);
+		type = nft_jansson_parse_str(root, "type", err);
 
-		if (valstr == NULL)
+		if (type == NULL)
 			return -1;
 
-		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, valstr);
+		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, type);
 
 		if (nft_jansson_parse_val(root, "prio", NFT_TYPE_S32,
-					  &val32, err) < 0)
+					  &prio, err) < 0)
 			return -1;
 
-		nft_chain_attr_set_s32(c, NFT_CHAIN_ATTR_PRIO, val32);
+		nft_chain_attr_set_s32(c, NFT_CHAIN_ATTR_PRIO, prio);
 
-		valstr = nft_jansson_parse_str(root, "hooknum", err);
-		if (valstr == NULL)
+		hooknum_str = nft_jansson_parse_str(root, "hooknum", err);
+		if (hooknum_str == NULL)
 			return -1;
 
-		val32 = nft_str2hooknum(c->family, valstr);
-		if (val32 == -1)
+		hooknum = nft_str2hooknum(c->family, hooknum_str);
+		if (hooknum == -1)
 			return -1;
 
-		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_HOOKNUM, val32);
+		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_HOOKNUM, hooknum);
 
-		valstr = nft_jansson_parse_str(root, "policy", err);
-		if (valstr == NULL)
+		policy = nft_jansson_parse_str(root, "policy", err);
+		if (policy == NULL)
 			return -1;
 
-		if (nft_str2verdict(valstr, &policy) != 0) {
+		if (nft_str2verdict(policy, &policy_num) != 0) {
 			errno = EINVAL;
 			err->node_name = "policy";
 			err->error = NFT_PARSE_EBADTYPE;
 			return -1;
 		}
 
-		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY, policy);
+		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY, policy_num);
 	}
 
 	return 0;
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libnftnl PATCH 6/6] src: chain: Do not print unser values in json
  2014-06-26 16:38 [libnftnl PATCH 0/6] src: chain: Do not print unset values in json and xml Ana Rey
                   ` (4 preceding siblings ...)
  2014-06-26 16:38 ` [libnftnl PATCH 5/6] src: chain: Rename variables in nft_jansson_parse_chain functions Ana Rey
@ 2014-06-26 16:39 ` Ana Rey
  5 siblings, 0 replies; 10+ messages in thread
From: Ana Rey @ 2014-06-26 16:39 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

It changes the parse and snprintf functions to omit unset values.

Signed-off-by: Ana Rey <anarey@gmail.com>
---
 src/chain.c | 166 ++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 95 insertions(+), 71 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index 042ff13..1a3f052 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -575,40 +575,28 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree,
 		return -1;
 
 	name = nft_jansson_parse_str(root, "name", err);
-	if (name == NULL)
-		return -1;
-
-	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, name);
+	if (name != NULL)
+		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, name);
 
 	if (nft_jansson_parse_val(root, "handle", NFT_TYPE_U64, &handle,
-				  err) < 0)
-		return -1;
-
-	nft_chain_attr_set_u64(c,NFT_CHAIN_ATTR_HANDLE, handle);
+				  err) == 0)
+		nft_chain_attr_set_u64(c,NFT_CHAIN_ATTR_HANDLE, handle);
 
 	if (nft_jansson_parse_val(root, "bytes", NFT_TYPE_U64, &bytes,
-				  err) < 0)
-		return -1;
-
-	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_BYTES, bytes);
+				  err) == 0)
+		nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_BYTES, bytes);
 
 	if (nft_jansson_parse_val(root, "packets", NFT_TYPE_U64, &packets,
-				  err) < 0)
-		return -1;
-
-	nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, packets);
-
-	if (nft_jansson_parse_family(root, &family, err) != 0)
-		return -1;
+				  err) == 0)
+		nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, packets);
 
-	nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, family);
+	if (nft_jansson_parse_family(root, &family, err) == 0)
+		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, family);
 
 	table = nft_jansson_parse_str(root, "table", err);
 
-	if (table == NULL)
-		return -1;
-
-	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, table);
+	if (table != NULL)
+		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, table);
 
 	if (nft_jansson_parse_val(root, "use", NFT_TYPE_U32, &use, err) == 0)
 		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_USE, use);
@@ -616,39 +604,33 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree,
 	if (nft_jansson_node_exist(root, "hooknum")) {
 		type = nft_jansson_parse_str(root, "type", err);
 
-		if (type == NULL)
-			return -1;
-
-		nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, type);
+		if (type != NULL)
+			nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, type);
 
 		if (nft_jansson_parse_val(root, "prio", NFT_TYPE_S32,
-					  &prio, err) < 0)
-			return -1;
-
-		nft_chain_attr_set_s32(c, NFT_CHAIN_ATTR_PRIO, prio);
+					  &prio, err) == 0)
+			nft_chain_attr_set_s32(c, NFT_CHAIN_ATTR_PRIO, prio);
 
 		hooknum_str = nft_jansson_parse_str(root, "hooknum", err);
-		if (hooknum_str == NULL)
-			return -1;
-
-		hooknum = nft_str2hooknum(c->family, hooknum_str);
-		if (hooknum == -1)
-			return -1;
-
-		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_HOOKNUM, hooknum);
+		if (hooknum_str != NULL) {
+			hooknum = nft_str2hooknum(c->family, hooknum_str);
+			if (hooknum == -1)
+				return -1;
+			nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_HOOKNUM,
+					       hooknum);
+		}
 
 		policy = nft_jansson_parse_str(root, "policy", err);
-		if (policy == NULL)
-			return -1;
-
-		if (nft_str2verdict(policy, &policy_num) != 0) {
-			errno = EINVAL;
-			err->node_name = "policy";
-			err->error = NFT_PARSE_EBADTYPE;
-			return -1;
+		if (policy != NULL) {
+			if (nft_str2verdict(policy, &policy_num) != 0) {
+				errno = EINVAL;
+				err->node_name = "policy";
+				err->error = NFT_PARSE_EBADTYPE;
+				return -1;
+			}
+			nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY,
+					       policy_num);
 		}
-
-		nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY, policy_num);
 	}
 
 	return 0;
@@ -817,32 +799,74 @@ static int nft_chain_snprintf_json(char *buf, size_t size, struct nft_chain *c)
 {
 	int ret, len = size, offset = 0;
 
-	ret = snprintf(buf, len,
-			"{\"chain\":{"
-			"\"name\":\"%s\","
-			"\"handle\":%"PRIu64","
-			"\"bytes\":%"PRIu64","
-			"\"packets\":%"PRIu64","
-			"\"family\":\"%s\","
-			"\"table\":\"%s\","
-			"\"use\":%d",
-			c->name, c->handle, c->bytes, c->packets,
-			nft_family2str(c->family),
-			c->table, c->use);
-		SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+	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)) {
-		ret =  snprintf(buf+offset, len,
-				",\"type\":\"%s\","
-				"\"hooknum\":\"%s\","
-				"\"prio\":%d,"
-				"\"policy\":\"%s\"",
-			c->type, nft_hooknum2str(c->family, c->hooknum),
-			c->prio, nft_verdict2str(c->policy));
+		if (c->flags & (1 << NFT_CHAIN_ATTR_TYPE)) {
+			ret = snprintf(buf + offset, len, "\"type\":\"%s\",",
+				       c->type);
+			SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+		}
+
+		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);
+		}
 	}
 
-	ret = snprintf(buf+offset, len, "}}");
+	/* 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;
-- 
2.0.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [libnftnl PATCH 1/6] src: chain: Free memory in the same function that is reserved
  2014-06-26 16:38 ` [libnftnl PATCH 1/6] src: chain: Free memory in the same function that is reserved Ana Rey
@ 2014-06-30 10:42   ` Pablo Neira Ayuso
  0 siblings, 0 replies; 10+ messages in thread
From: Pablo Neira Ayuso @ 2014-06-30 10:42 UTC (permalink / raw)
  To: Ana Rey; +Cc: netfilter-devel

On Thu, Jun 26, 2014 at 06:38:55PM +0200, Ana Rey wrote:
> Free memory in the same function that is reserved.

Applied, thanks.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [libnftnl PATCH 2/6] src: chain: Use nft_rule_expr_set_* in the xml parsing code
  2014-06-26 16:38 ` [libnftnl PATCH 2/6] src: chain: Use nft_rule_expr_set_* in the xml parsing code Ana Rey
@ 2014-06-30 10:42   ` Pablo Neira Ayuso
  0 siblings, 0 replies; 10+ messages in thread
From: Pablo Neira Ayuso @ 2014-06-30 10:42 UTC (permalink / raw)
  To: Ana Rey; +Cc: netfilter-devel

On Thu, Jun 26, 2014 at 06:38:56PM +0200, Ana Rey wrote:
> Code refactoring to use nft_rule_expr_set_* in parse functions.

Applied, thanks.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [libnftnl PATCH 3/6] src: chain: add set, unset, get, parse and build payload implementation for use value
  2014-06-26 16:38 ` [libnftnl PATCH 3/6] src: chain: add set, unset, get, parse and build payload implementation for use value Ana Rey
@ 2014-06-30 10:42   ` Pablo Neira Ayuso
  0 siblings, 0 replies; 10+ messages in thread
From: Pablo Neira Ayuso @ 2014-06-30 10:42 UTC (permalink / raw)
  To: Ana Rey; +Cc: netfilter-devel

On Thu, Jun 26, 2014 at 06:38:57PM +0200, Ana Rey wrote:
> Add some parts of the implemention of 'use' vualue in chain that miss it.

Missing XML parsing part.

Please, resend a new version starting 3/6, thanks.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-06-30 10:42 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-26 16:38 [libnftnl PATCH 0/6] src: chain: Do not print unset values in json and xml Ana Rey
2014-06-26 16:38 ` [libnftnl PATCH 1/6] src: chain: Free memory in the same function that is reserved Ana Rey
2014-06-30 10:42   ` Pablo Neira Ayuso
2014-06-26 16:38 ` [libnftnl PATCH 2/6] src: chain: Use nft_rule_expr_set_* in the xml parsing code Ana Rey
2014-06-30 10:42   ` Pablo Neira Ayuso
2014-06-26 16:38 ` [libnftnl PATCH 3/6] src: chain: add set, unset, get, parse and build payload implementation for use value Ana Rey
2014-06-30 10:42   ` Pablo Neira Ayuso
2014-06-26 16:38 ` [libnftnl PATCH 4/6] src: chain: Do not print unset values in xml Ana Rey
2014-06-26 16:38 ` [libnftnl PATCH 5/6] src: chain: Rename variables in nft_jansson_parse_chain functions Ana Rey
2014-06-26 16:39 ` [libnftnl PATCH 6/6] src: chain: Do not print unser values in json Ana Rey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).