* [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.