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