All of lore.kernel.org
 help / color / mirror / Atom feed
* [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml
@ 2014-06-30 11:50 Ana Rey
  2014-06-30 11:50 ` [libnftnl PATCH v2 1/4] src: chain: Add all support of use attribute Ana Rey
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Ana Rey @ 2014-06-30 11:50 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

In v1, this patchset contains the following patchs:

"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
"

I resend a v2 version of four of these six patches. The main change is in
"src: chain: Add all support of use attribute" patch
[ in v1 was "src: chain: add set, unset, get, parse and build payload implementation for use value"]

In this patch, I add a xml support for 'use' attribute that I did not
add in v1.


[in v1:]
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.


Ana Rey (4):
  src: chain: Add all support of use attribute
  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 | 335 ++++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 201 insertions(+), 134 deletions(-)

-- 
2.0.0


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

* [libnftnl PATCH v2 1/4] src: chain: Add all support of use attribute
  2014-06-30 11:50 [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Ana Rey
@ 2014-06-30 11:50 ` Ana Rey
  2014-06-30 11:50 ` [libnftnl PATCH v2 2/4] src: chain: Do not print unset values in xml Ana Rey
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Ana Rey @ 2014-06-30 11:50 UTC (permalink / raw)
  To: netfilter-devel; +Cc: Ana Rey

Add set, unset, get, parse and build payload implementation for use value.

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

Signed-off-by: Ana Rey <anarey@gmail.com>
---
[Changes in v2:]

I add a xml support for 'use' attribute that I did not add in v1

Moreover, I improve the subject and description of this patch

 src/chain.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index 9e9f207..ea7bc56 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);
 
@@ -681,7 +685,7 @@ 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;
+	uint64_t handle, bytes, packets, prio, use;
 
 	name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST,
 				  NFT_XML_MAND, err);
@@ -711,6 +715,10 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c,
 		return -1;
 	nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, table);
 
+	if (nft_mxml_num_parse(tree, "use", MXML_DESCEND_FIRST, BASE_DEC,
+			       &use, NFT_TYPE_U64, NFT_XML_MAND, err) == 0)
+		nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, use);
+
 	family = nft_mxml_family_parse(tree, "family", MXML_DESCEND_FIRST,
 				       NFT_XML_MAND, err);
 	if (family < 0)
@@ -860,6 +868,10 @@ static int nft_chain_snprintf_xml(char *buf, size_t size, struct nft_chain *c)
 		       c->name, c->handle, c->bytes, c->packets, 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>"
-- 
2.0.0


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

* [libnftnl PATCH v2 2/4] src: chain: Do not print unset values in xml
  2014-06-30 11:50 [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Ana Rey
  2014-06-30 11:50 ` [libnftnl PATCH v2 1/4] src: chain: Add all support of use attribute Ana Rey
@ 2014-06-30 11:50 ` Ana Rey
  2014-06-30 11:50 ` [libnftnl PATCH v2 3/4] src: chain: Rename variables in nft_jansson_parse_chain functions Ana Rey
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Ana Rey @ 2014-06-30 11:50 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 | 123 +++++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 77 insertions(+), 46 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index ea7bc56..983c91e 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -689,31 +689,27 @@ 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);
 
 	if (nft_mxml_num_parse(tree, "use", MXML_DESCEND_FIRST, BASE_DEC,
 			       &use, NFT_TYPE_U64, NFT_XML_MAND, err) == 0)
@@ -721,9 +717,8 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c,
 
 	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);
@@ -735,29 +730,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;
@@ -862,29 +856,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] 6+ messages in thread

* [libnftnl PATCH v2 3/4] src: chain: Rename variables in nft_jansson_parse_chain functions
  2014-06-30 11:50 [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Ana Rey
  2014-06-30 11:50 ` [libnftnl PATCH v2 1/4] src: chain: Add all support of use attribute Ana Rey
  2014-06-30 11:50 ` [libnftnl PATCH v2 2/4] src: chain: Do not print unset values in xml Ana Rey
@ 2014-06-30 11:50 ` Ana Rey
  2014-06-30 11:50 ` [libnftnl PATCH v2 4/4] src: chain: Do not print unser values in json Ana Rey
  2014-06-30 12:38 ` [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Pablo Neira Ayuso
  4 siblings, 0 replies; 6+ messages in thread
From: Ana Rey @ 2014-06-30 11:50 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 983c91e..a3872a0 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] 6+ messages in thread

* [libnftnl PATCH v2 4/4] src: chain: Do not print unser values in json
  2014-06-30 11:50 [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Ana Rey
                   ` (2 preceding siblings ...)
  2014-06-30 11:50 ` [libnftnl PATCH v2 3/4] src: chain: Rename variables in nft_jansson_parse_chain functions Ana Rey
@ 2014-06-30 11:50 ` Ana Rey
  2014-06-30 12:38 ` [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Pablo Neira Ayuso
  4 siblings, 0 replies; 6+ messages in thread
From: Ana Rey @ 2014-06-30 11:50 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 a3872a0..ad9da51 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;
@@ -821,32 +803,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] 6+ messages in thread

* Re: [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml
  2014-06-30 11:50 [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Ana Rey
                   ` (3 preceding siblings ...)
  2014-06-30 11:50 ` [libnftnl PATCH v2 4/4] src: chain: Do not print unser values in json Ana Rey
@ 2014-06-30 12:38 ` Pablo Neira Ayuso
  4 siblings, 0 replies; 6+ messages in thread
From: Pablo Neira Ayuso @ 2014-06-30 12:38 UTC (permalink / raw)
  To: Ana Rey; +Cc: netfilter-devel

On Mon, Jun 30, 2014 at 01:50:04PM +0200, Ana Rey wrote:
> In v1, this patchset contains the following patchs:
> 
> "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
> "
> 
> I resend a v2 version of four of these six patches. The main change is in
> "src: chain: Add all support of use attribute" patch
> [ in v1 was "src: chain: add set, unset, get, parse and build payload implementation for use value"]

Series applied, thanks Ana.

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

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

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-30 11:50 [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Ana Rey
2014-06-30 11:50 ` [libnftnl PATCH v2 1/4] src: chain: Add all support of use attribute Ana Rey
2014-06-30 11:50 ` [libnftnl PATCH v2 2/4] src: chain: Do not print unset values in xml Ana Rey
2014-06-30 11:50 ` [libnftnl PATCH v2 3/4] src: chain: Rename variables in nft_jansson_parse_chain functions Ana Rey
2014-06-30 11:50 ` [libnftnl PATCH v2 4/4] src: chain: Do not print unser values in json Ana Rey
2014-06-30 12:38 ` [libnftnl PATCH v2 0/4] src: chain: Do not print unset values in json and xml Pablo Neira Ayuso

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.