All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.