All of lore.kernel.org
 help / color / mirror / Atom feed
* [libnftnl PATCH 00/10] Kill non-default output leftovers
@ 2021-03-09 15:45 Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 01/10] expr: Fix snprintf buffer length updates Phil Sutter
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

Any other (debug) output format types than the default have been removed
for a while now. Assuming no new ones will be introduced anymore,
eliminate some of the still existing infrastructure accommodating for
them and a few obvious leftovers.

While working on the above, I identified some real issues (albeit only
triggered with very small output buffers. They come in patches 1-4,
separated by fixing commit.

Instead of proper testing these changes, I went with 'make check' and
running nftables' tests/py testsuite which actually compares the
libnftnl output against records.

Phil Sutter (10):
  expr: Fix snprintf buffer length updates
  obj/ct_expect: Fix snprintf buffer length updates
  obj/ct_timeout: Fix snprintf buffer length updates
  object: Fix for wrong parameter passed to snprintf callback
  expr: Check output type once and for all
  expr/data_reg: Drop output_format parameter
  obj: Drop type parameter from snprintf callback
  Drop pointless local variable in snprintf callbacks
  Get rid of single option switch statements
  ruleset: Eliminate tag and separator helpers

 include/data_reg.h      |   3 +-
 include/expr_ops.h      |   2 +-
 include/obj.h           |   2 +-
 src/chain.c             |  20 ++--
 src/expr.c              |  10 +-
 src/expr/bitwise.c      |  32 ++-----
 src/expr/byteorder.c    |  22 +----
 src/expr/cmp.c          |  24 +----
 src/expr/connlimit.c    |  20 +---
 src/expr/counter.c      |  20 +---
 src/expr/ct.c           |  23 +----
 src/expr/data_reg.c     |  35 ++-----
 src/expr/dup.c          |  25 +----
 src/expr/dynset.c       |  21 +----
 src/expr/exthdr.c       |  20 +---
 src/expr/fib.c          |  21 +----
 src/expr/flow_offload.c |  20 +---
 src/expr/fwd.c          |  21 +----
 src/expr/hash.c         |  21 +----
 src/expr/immediate.c    |  28 ++----
 src/expr/limit.c        |  20 +---
 src/expr/log.c          |  22 +----
 src/expr/lookup.c       |  21 +----
 src/expr/masq.c         |  20 +---
 src/expr/match.c        |  13 +--
 src/expr/meta.c         |  19 +---
 src/expr/nat.c          |  21 +----
 src/expr/numgen.c       |  21 +----
 src/expr/objref.c       |  20 +---
 src/expr/osf.c          |  22 +----
 src/expr/payload.c      |  32 +++----
 src/expr/queue.c        |  34 ++-----
 src/expr/quota.c        |  20 +---
 src/expr/range.c        |  24 +----
 src/expr/redir.c        |  28 ++----
 src/expr/reject.c       |  20 +---
 src/expr/rt.c           |  19 +---
 src/expr/socket.c       |  19 +---
 src/expr/synproxy.c     |  22 +----
 src/expr/target.c       |  13 +--
 src/expr/tproxy.c       |  19 +---
 src/expr/tunnel.c       |  19 +---
 src/expr/xfrm.c         |  21 +----
 src/flowtable.c         |  21 ++---
 src/gen.c               |  14 +--
 src/obj/counter.c       |  22 +----
 src/obj/ct_expect.c     |  39 +++-----
 src/obj/ct_helper.c     |  22 +----
 src/obj/ct_timeout.c    |  35 ++-----
 src/obj/limit.c         |  23 +----
 src/obj/quota.c         |  23 +----
 src/obj/secmark.c       |  23 +----
 src/obj/synproxy.c      |  22 +----
 src/obj/tunnel.c        |  21 +----
 src/object.c            |  28 ++----
 src/rule.c              |  22 ++---
 src/ruleset.c           | 200 +++++++++++++++-------------------------
 src/set.c               |  26 ++----
 src/set_elem.c          |  27 ++----
 src/table.c             |  16 +---
 60 files changed, 337 insertions(+), 1126 deletions(-)

-- 
2.30.1


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

* [libnftnl PATCH 01/10] expr: Fix snprintf buffer length updates
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 02/10] obj/ct_expect: " Phil Sutter
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

Subsequent calls to snprintf() sometimes reuse 'len' variable although
they should refer to the updated value in 'remain' instead.

Fixes: 676ea569bbe5a ("src: Change parameters of SNPRINTF_BUFFER_SIZE macro.")
Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 src/expr/ct.c    |  2 +-
 src/expr/dup.c   |  4 ++--
 src/expr/queue.c | 12 ++++++------
 src/expr/redir.c |  6 +++---
 4 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/expr/ct.c b/src/expr/ct.c
index 124de9dd2b33a..1a21c953c9be2 100644
--- a/src/expr/ct.c
+++ b/src/expr/ct.c
@@ -230,7 +230,7 @@ nftnl_expr_ct_snprintf_default(char *buf, size_t size,
 	struct nftnl_expr_ct *ct = nftnl_expr_data(e);
 
 	if (e->flags & (1 << NFTNL_EXPR_CT_SREG)) {
-		ret = snprintf(buf, size, "set %s with reg %u ",
+		ret = snprintf(buf, remain, "set %s with reg %u ",
 				ctkey2str(ct->key), ct->sreg);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
diff --git a/src/expr/dup.c b/src/expr/dup.c
index ac398394aed06..7a3ee96361644 100644
--- a/src/expr/dup.c
+++ b/src/expr/dup.c
@@ -119,12 +119,12 @@ static int nftnl_expr_dup_snprintf_default(char *buf, size_t len,
 	struct nftnl_expr_dup *dup = nftnl_expr_data(e);
 
 	if (e->flags & (1 << NFTNL_EXPR_DUP_SREG_ADDR)) {
-		ret = snprintf(buf + offset, len, "sreg_addr %u ", dup->sreg_addr);
+		ret = snprintf(buf + offset, remain, "sreg_addr %u ", dup->sreg_addr);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 
 	if (e->flags & (1 << NFTNL_EXPR_DUP_SREG_DEV)) {
-		ret = snprintf(buf + offset, len, "sreg_dev %u ", dup->sreg_dev);
+		ret = snprintf(buf + offset, remain, "sreg_dev %u ", dup->sreg_dev);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 
diff --git a/src/expr/queue.c b/src/expr/queue.c
index 051ef71e72fdb..b892b57bc4897 100644
--- a/src/expr/queue.c
+++ b/src/expr/queue.c
@@ -153,31 +153,31 @@ static int nftnl_expr_queue_snprintf_default(char *buf, size_t len,
 	if (e->flags & (1 << NFTNL_EXPR_QUEUE_NUM)) {
 		total_queues = queue->queuenum + queue->queues_total - 1;
 
-		ret = snprintf(buf + offset, len, "num %u", queue->queuenum);
+		ret = snprintf(buf + offset, remain, "num %u", queue->queuenum);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		if (queue->queues_total && total_queues != queue->queuenum) {
-			ret = snprintf(buf + offset, len, "-%u", total_queues);
+			ret = snprintf(buf + offset, remain, "-%u", total_queues);
 			SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 		}
 
-		ret = snprintf(buf + offset, len, " ");
+		ret = snprintf(buf + offset, remain, " ");
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 
 	if (e->flags & (1 << NFTNL_EXPR_QUEUE_SREG_QNUM)) {
-		ret = snprintf(buf + offset, len, "sreg_qnum %u ",
+		ret = snprintf(buf + offset, remain, "sreg_qnum %u ",
 			       queue->sreg_qnum);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 
 	if (e->flags & (1 << NFTNL_EXPR_QUEUE_FLAGS)) {
 		if (queue->flags & (NFT_QUEUE_FLAG_BYPASS)) {
-			ret = snprintf(buf + offset, len, "bypass ");
+			ret = snprintf(buf + offset, remain, "bypass ");
 			SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 		}
 		if (queue->flags & (NFT_QUEUE_FLAG_CPU_FANOUT)) {
-			ret = snprintf(buf + offset, len, "fanout ");
+			ret = snprintf(buf + offset, remain, "fanout ");
 			SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 		}
 	}
diff --git a/src/expr/redir.c b/src/expr/redir.c
index 477659a320db1..c00c2a6ddf3cf 100644
--- a/src/expr/redir.c
+++ b/src/expr/redir.c
@@ -138,19 +138,19 @@ static int nftnl_expr_redir_snprintf_default(char *buf, size_t len,
 	struct nftnl_expr_redir *redir = nftnl_expr_data(e);
 
 	if (nftnl_expr_is_set(e, NFTNL_EXPR_REDIR_REG_PROTO_MIN)) {
-		ret = snprintf(buf + offset, len, "proto_min reg %u ",
+		ret = snprintf(buf + offset, remain, "proto_min reg %u ",
 			       redir->sreg_proto_min);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 
 	if (nftnl_expr_is_set(e, NFTNL_EXPR_REDIR_REG_PROTO_MAX)) {
-		ret = snprintf(buf + offset, len, "proto_max reg %u ",
+		ret = snprintf(buf + offset, remain, "proto_max reg %u ",
 			       redir->sreg_proto_max);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 
 	if (nftnl_expr_is_set(e, NFTNL_EXPR_REDIR_FLAGS)) {
-		ret = snprintf(buf + offset, len, "flags 0x%x ",
+		ret = snprintf(buf + offset, remain, "flags 0x%x ",
 			       redir->flags);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
-- 
2.30.1


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

* [libnftnl PATCH 02/10] obj/ct_expect: Fix snprintf buffer length updates
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 01/10] expr: Fix snprintf buffer length updates Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 03/10] obj/ct_timeout: " Phil Sutter
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

Have to pass shrinking 'remain' variable to consecutive snprintf calls
instead of the unchanged 'len' parameter.

Fixes: c4b6aa09b85d2 ("src: add ct expectation support")
Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 src/obj/ct_expect.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/obj/ct_expect.c b/src/obj/ct_expect.c
index c0bb5bad0246b..0b4eb8fe541d9 100644
--- a/src/obj/ct_expect.c
+++ b/src/obj/ct_expect.c
@@ -159,23 +159,27 @@ static int nftnl_obj_ct_expect_snprintf_default(char *buf, size_t len,
 	struct nftnl_obj_ct_expect *exp = nftnl_obj_data(e);
 
 	if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_L3PROTO)) {
-		ret = snprintf(buf + offset, len, "family %d ", exp->l3proto);
+		ret = snprintf(buf + offset, remain,
+			       "family %d ", exp->l3proto);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 	if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_L4PROTO)) {
-		ret = snprintf(buf + offset, len, "protocol %d ", exp->l4proto);
+		ret = snprintf(buf + offset, remain,
+			       "protocol %d ", exp->l4proto);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 	if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_DPORT)) {
-		ret = snprintf(buf + offset, len, "dport %d ", exp->dport);
+		ret = snprintf(buf + offset, remain,
+			       "dport %d ", exp->dport);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 	if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_TIMEOUT)) {
-		ret = snprintf(buf + offset, len, "timeout %d ", exp->timeout);
+		ret = snprintf(buf + offset, remain,
+			       "timeout %d ", exp->timeout);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 	if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_SIZE)) {
-		ret = snprintf(buf + offset, len, "size %d ", exp->size);
+		ret = snprintf(buf + offset, remain, "size %d ", exp->size);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 
-- 
2.30.1


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

* [libnftnl PATCH 03/10] obj/ct_timeout: Fix snprintf buffer length updates
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 01/10] expr: Fix snprintf buffer length updates Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 02/10] obj/ct_expect: " Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 04/10] object: Fix for wrong parameter passed to snprintf callback Phil Sutter
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

Have to pass shrinking 'remain' variable to consecutive snprintf calls
instead of the unchanged 'len' parameter.

Fixes: 0adceeab1597a ("src: add ct timeout support")
Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 src/obj/ct_timeout.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/obj/ct_timeout.c b/src/obj/ct_timeout.c
index 2662cac69438d..c3f577bdecd90 100644
--- a/src/obj/ct_timeout.c
+++ b/src/obj/ct_timeout.c
@@ -266,12 +266,12 @@ static int nftnl_obj_ct_timeout_snprintf_default(char *buf, size_t len,
 	struct nftnl_obj_ct_timeout *timeout = nftnl_obj_data(e);
 
 	if (e->flags & (1 << NFTNL_OBJ_CT_TIMEOUT_L3PROTO)) {
-		ret = snprintf(buf + offset, len, "family %d ",
+		ret = snprintf(buf + offset, remain, "family %d ",
 			       timeout->l3proto);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 	if (e->flags & (1 << NFTNL_OBJ_CT_TIMEOUT_L4PROTO)) {
-		ret = snprintf(buf + offset, len, "protocol %d ",
+		ret = snprintf(buf + offset, remain, "protocol %d ",
 				timeout->l4proto);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
@@ -283,7 +283,7 @@ static int nftnl_obj_ct_timeout_snprintf_default(char *buf, size_t len,
 		if (timeout_protocol[timeout->l4proto].attr_max == 0)
 			l4num = IPPROTO_RAW;
 
-		ret = snprintf(buf + offset, len, "policy = {");
+		ret = snprintf(buf + offset, remain, "policy = {");
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		for (i = 0; i < timeout_protocol[l4num].attr_max; i++) {
@@ -293,13 +293,13 @@ static int nftnl_obj_ct_timeout_snprintf_default(char *buf, size_t len,
 				"UNKNOWN";
 
 			if (timeout->timeout[i] != timeout_protocol[l4num].dflt_timeout[i]) {
-				ret = snprintf(buf + offset, len,
+				ret = snprintf(buf + offset, remain,
 					"%s = %u,", state_name, timeout->timeout[i]);
 				SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 			}
 		}
 
-		ret = snprintf(buf + offset, len, "}");
+		ret = snprintf(buf + offset, remain, "}");
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 	buf[offset] = '\0';
-- 
2.30.1


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

* [libnftnl PATCH 04/10] object: Fix for wrong parameter passed to snprintf callback
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
                   ` (2 preceding siblings ...)
  2021-03-09 15:45 ` [libnftnl PATCH 03/10] obj/ct_timeout: " Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 05/10] expr: Check output type once and for all Phil Sutter
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

Instead of the remaining buffer length, the used buffer length was
passed to object's snprintf callback (and the final snprintf call).

Fixes: 5573d0146c1ae ("src: support for stateful objects")
Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 src/object.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/object.c b/src/object.c
index 008badeea9b66..46e79168daa76 100644
--- a/src/object.c
+++ b/src/object.c
@@ -396,11 +396,11 @@ static int nftnl_obj_snprintf_dflt(char *buf, size_t size,
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	if (obj->ops) {
-		ret = obj->ops->snprintf(buf + offset, offset, type, flags,
+		ret = obj->ops->snprintf(buf + offset, remain, type, flags,
 					 obj);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
-	ret = snprintf(buf + offset, offset, "]");
+	ret = snprintf(buf + offset, remain, "]");
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	return offset;
-- 
2.30.1


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

* [libnftnl PATCH 05/10] expr: Check output type once and for all
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
                   ` (3 preceding siblings ...)
  2021-03-09 15:45 ` [libnftnl PATCH 04/10] object: Fix for wrong parameter passed to snprintf callback Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 06/10] expr/data_reg: Drop output_format parameter Phil Sutter
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

There is but a single supported output type left, so check it in expr.c
and drop all the single option switch statements in individual
expressions.

Since the parameter is now unused (and to ensure code correctness), drop
'type' parameter from struct expr_ops' snprintf callback.

Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 include/expr_ops.h      |  2 +-
 src/expr.c              |  4 ++--
 src/expr/bitwise.c      | 18 +++---------------
 src/expr/byteorder.c    | 20 +++-----------------
 src/expr/cmp.c          | 20 +++-----------------
 src/expr/connlimit.c    | 20 +++-----------------
 src/expr/counter.c      | 20 +++-----------------
 src/expr/ct.c           | 19 ++-----------------
 src/expr/dup.c          | 19 ++-----------------
 src/expr/dynset.c       | 19 ++-----------------
 src/expr/exthdr.c       | 20 +++-----------------
 src/expr/fib.c          | 19 ++-----------------
 src/expr/flow_offload.c | 18 ++----------------
 src/expr/fwd.c          | 19 ++-----------------
 src/expr/hash.c         | 19 ++-----------------
 src/expr/immediate.c    | 20 ++------------------
 src/expr/limit.c        | 20 +++-----------------
 src/expr/log.c          | 20 +++-----------------
 src/expr/lookup.c       | 19 ++-----------------
 src/expr/masq.c         | 18 ++----------------
 src/expr/match.c        | 13 ++-----------
 src/expr/meta.c         | 19 ++-----------------
 src/expr/nat.c          | 19 ++-----------------
 src/expr/numgen.c       | 19 ++-----------------
 src/expr/objref.c       | 20 +++-----------------
 src/expr/osf.c          | 20 +++-----------------
 src/expr/payload.c      | 32 ++++++++++++--------------------
 src/expr/queue.c        | 20 +++-----------------
 src/expr/quota.c        | 20 +++-----------------
 src/expr/range.c        | 18 ++----------------
 src/expr/redir.c        | 20 +++-----------------
 src/expr/reject.c       | 20 +++-----------------
 src/expr/rt.c           | 19 ++-----------------
 src/expr/socket.c       | 19 ++-----------------
 src/expr/synproxy.c     | 20 +++-----------------
 src/expr/target.c       | 13 ++-----------
 src/expr/tproxy.c       | 17 ++---------------
 src/expr/tunnel.c       | 19 ++-----------------
 src/expr/xfrm.c         | 19 ++-----------------
 39 files changed, 102 insertions(+), 617 deletions(-)

diff --git a/include/expr_ops.h b/include/expr_ops.h
index 5237ac791588b..7a6aa23f9bd1d 100644
--- a/include/expr_ops.h
+++ b/include/expr_ops.h
@@ -18,7 +18,7 @@ struct expr_ops {
 	const void *(*get)(const struct nftnl_expr *e, uint16_t type, uint32_t *data_len);
 	int 	(*parse)(struct nftnl_expr *e, struct nlattr *attr);
 	void	(*build)(struct nlmsghdr *nlh, const struct nftnl_expr *e);
-	int	(*snprintf)(char *buf, size_t len, uint32_t type, uint32_t flags, const struct nftnl_expr *e);
+	int	(*snprintf)(char *buf, size_t len, uint32_t flags, const struct nftnl_expr *e);
 };
 
 struct expr_ops *nftnl_expr_ops_lookup(const char *name);
diff --git a/src/expr.c b/src/expr.c
index 8e0bce2643b17..01c55cf2e880b 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -279,10 +279,10 @@ int nftnl_expr_snprintf(char *buf, size_t size, const struct nftnl_expr *expr,
 	if (size)
 		buf[0] = '\0';
 
-	if (!expr->ops->snprintf)
+	if (!expr->ops->snprintf || type != NFTNL_OUTPUT_DEFAULT)
 		return 0;
 
-	ret = expr->ops->snprintf(buf + offset, remain, type, flags, expr);
+	ret = expr->ops->snprintf(buf + offset, remain, flags, expr);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	return offset;
diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c
index ba379a84485e4..139f25f86b802 100644
--- a/src/expr/bitwise.c
+++ b/src/expr/bitwise.c
@@ -252,8 +252,9 @@ nftnl_expr_bitwise_snprintf_shift(char *buf, size_t size, const char *op,
 	return offset;
 }
 
-static int nftnl_expr_bitwise_snprintf_default(char *buf, size_t size,
-					       const struct nftnl_expr *e)
+static int
+nftnl_expr_bitwise_snprintf(char *buf, size_t size,
+			    uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_bitwise *bitwise = nftnl_expr_data(e);
 	int err = -1;
@@ -273,19 +274,6 @@ static int nftnl_expr_bitwise_snprintf_default(char *buf, size_t size,
 	return err;
 }
 
-static int
-nftnl_expr_bitwise_snprintf(char *buf, size_t size, uint32_t type,
-			    uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_bitwise_snprintf_default(buf, size, e);
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_bitwise = {
 	.name		= "bitwise",
 	.alloc_len	= sizeof(struct nftnl_expr_bitwise),
diff --git a/src/expr/byteorder.c b/src/expr/byteorder.c
index efdfa2b5eca4c..9718b8fe2506c 100644
--- a/src/expr/byteorder.c
+++ b/src/expr/byteorder.c
@@ -197,8 +197,9 @@ static inline int nftnl_str2ntoh(const char *op)
 	}
 }
 
-static int nftnl_expr_byteorder_snprintf_default(char *buf, size_t size,
-						 const struct nftnl_expr *e)
+static int
+nftnl_expr_byteorder_snprintf(char *buf, size_t size,
+			      uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_byteorder *byteorder = nftnl_expr_data(e);
 	int remain = size, offset = 0, ret;
@@ -211,21 +212,6 @@ static int nftnl_expr_byteorder_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_byteorder_snprintf(char *buf, size_t size, uint32_t type,
-			      uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_byteorder_snprintf_default(buf, size, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_byteorder = {
 	.name		= "byteorder",
 	.alloc_len	= sizeof(struct nftnl_expr_byteorder),
diff --git a/src/expr/cmp.c b/src/expr/cmp.c
index 86d7842d0813e..6b1c0fa3ac97f 100644
--- a/src/expr/cmp.c
+++ b/src/expr/cmp.c
@@ -176,8 +176,9 @@ static inline int nftnl_str2cmp(const char *op)
 	}
 }
 
-static int nftnl_expr_cmp_snprintf_default(char *buf, size_t size,
-					   const struct nftnl_expr *e)
+static int
+nftnl_expr_cmp_snprintf(char *buf, size_t size,
+			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_cmp *cmp = nftnl_expr_data(e);
 	int remain = size, offset = 0, ret;
@@ -193,21 +194,6 @@ static int nftnl_expr_cmp_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_cmp_snprintf(char *buf, size_t size, uint32_t type,
-			uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_cmp_snprintf_default(buf, size, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_cmp = {
 	.name		= "cmp",
 	.alloc_len	= sizeof(struct nftnl_expr_cmp),
diff --git a/src/expr/connlimit.c b/src/expr/connlimit.c
index 53af93bd8db94..3b37587e7e4ec 100644
--- a/src/expr/connlimit.c
+++ b/src/expr/connlimit.c
@@ -117,8 +117,9 @@ nftnl_expr_connlimit_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_connlimit_snprintf_default(char *buf, size_t len,
-					       const struct nftnl_expr *e)
+static int nftnl_expr_connlimit_snprintf(char *buf, size_t len,
+				       uint32_t flags,
+				       const struct nftnl_expr *e)
 {
 	struct nftnl_expr_connlimit *connlimit = nftnl_expr_data(e);
 
@@ -126,21 +127,6 @@ static int nftnl_expr_connlimit_snprintf_default(char *buf, size_t len,
 			connlimit->count, connlimit->flags);
 }
 
-static int nftnl_expr_connlimit_snprintf(char *buf, size_t len, uint32_t type,
-				       uint32_t flags,
-				       const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_connlimit_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_connlimit = {
 	.name		= "connlimit",
 	.alloc_len	= sizeof(struct nftnl_expr_connlimit),
diff --git a/src/expr/counter.c b/src/expr/counter.c
index 89a602e0dcb6e..1676d70a46bda 100644
--- a/src/expr/counter.c
+++ b/src/expr/counter.c
@@ -115,8 +115,9 @@ nftnl_expr_counter_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_counter_snprintf_default(char *buf, size_t len,
-					       const struct nftnl_expr *e)
+static int nftnl_expr_counter_snprintf(char *buf, size_t len,
+				       uint32_t flags,
+				       const struct nftnl_expr *e)
 {
 	struct nftnl_expr_counter *ctr = nftnl_expr_data(e);
 
@@ -124,21 +125,6 @@ static int nftnl_expr_counter_snprintf_default(char *buf, size_t len,
 			ctr->pkts, ctr->bytes);
 }
 
-static int nftnl_expr_counter_snprintf(char *buf, size_t len, uint32_t type,
-				       uint32_t flags,
-				       const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_counter_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_counter = {
 	.name		= "counter",
 	.alloc_len	= sizeof(struct nftnl_expr_counter),
diff --git a/src/expr/ct.c b/src/expr/ct.c
index 1a21c953c9be2..f4a7dc6932cb0 100644
--- a/src/expr/ct.c
+++ b/src/expr/ct.c
@@ -223,8 +223,8 @@ static inline int str2ctdir(const char *str, uint8_t *ctdir)
 }
 
 static int
-nftnl_expr_ct_snprintf_default(char *buf, size_t size,
-			       const struct nftnl_expr *e)
+nftnl_expr_ct_snprintf(char *buf, size_t size,
+		       uint32_t flags, const struct nftnl_expr *e)
 {
 	int ret, remain = size, offset = 0;
 	struct nftnl_expr_ct *ct = nftnl_expr_data(e);
@@ -250,21 +250,6 @@ nftnl_expr_ct_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_ct_snprintf(char *buf, size_t len, uint32_t type,
-		       uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_ct_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_ct = {
 	.name		= "ct",
 	.alloc_len	= sizeof(struct nftnl_expr_ct),
diff --git a/src/expr/dup.c b/src/expr/dup.c
index 7a3ee96361644..3eb560a21077f 100644
--- a/src/expr/dup.c
+++ b/src/expr/dup.c
@@ -111,9 +111,8 @@ static int nftnl_expr_dup_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return ret;
 }
 
-static int nftnl_expr_dup_snprintf_default(char *buf, size_t len,
-					   const struct nftnl_expr *e,
-					   uint32_t flags)
+static int nftnl_expr_dup_snprintf(char *buf, size_t len,
+				   uint32_t flags, const struct nftnl_expr *e)
 {
 	int remain = len, offset = 0, ret;
 	struct nftnl_expr_dup *dup = nftnl_expr_data(e);
@@ -131,20 +130,6 @@ static int nftnl_expr_dup_snprintf_default(char *buf, size_t len,
 	return offset;
 }
 
-static int nftnl_expr_dup_snprintf(char *buf, size_t len, uint32_t type,
-				   uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_dup_snprintf_default(buf, len, e, flags);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_dup = {
 	.name		= "dup",
 	.alloc_len	= sizeof(struct nftnl_expr_dup),
diff --git a/src/expr/dynset.c b/src/expr/dynset.c
index a9b11f27e819b..2ddf69a02b9de 100644
--- a/src/expr/dynset.c
+++ b/src/expr/dynset.c
@@ -308,8 +308,8 @@ static const char *op2str(enum nft_dynset_ops op)
 }
 
 static int
-nftnl_expr_dynset_snprintf_default(char *buf, size_t size,
-				   const struct nftnl_expr *e)
+nftnl_expr_dynset_snprintf(char *buf, size_t size,
+			   uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_dynset *dynset = nftnl_expr_data(e);
 	struct nftnl_expr *expr;
@@ -346,21 +346,6 @@ nftnl_expr_dynset_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_dynset_snprintf(char *buf, size_t size, uint32_t type,
-			   uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_dynset_snprintf_default(buf, size, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 static void nftnl_expr_dynset_init(const struct nftnl_expr *e)
 {
 	struct nftnl_expr_dynset *dynset = nftnl_expr_data(e);
diff --git a/src/expr/exthdr.c b/src/expr/exthdr.c
index e5f714b07366f..1b813b1e47c4d 100644
--- a/src/expr/exthdr.c
+++ b/src/expr/exthdr.c
@@ -235,8 +235,9 @@ static inline int str2exthdr_type(const char *str)
 	return -1;
 }
 
-static int nftnl_expr_exthdr_snprintf_default(char *buf, size_t len,
-					      const struct nftnl_expr *e)
+static int
+nftnl_expr_exthdr_snprintf(char *buf, size_t len,
+			   uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_exthdr *exthdr = nftnl_expr_data(e);
 
@@ -253,21 +254,6 @@ static int nftnl_expr_exthdr_snprintf_default(char *buf, size_t len,
 
 }
 
-static int
-nftnl_expr_exthdr_snprintf(char *buf, size_t len, uint32_t type,
-			   uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_exthdr_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_exthdr = {
 	.name		= "exthdr",
 	.alloc_len	= sizeof(struct nftnl_expr_exthdr),
diff --git a/src/expr/fib.c b/src/expr/fib.c
index 9475af4047381..b0cbb3b752153 100644
--- a/src/expr/fib.c
+++ b/src/expr/fib.c
@@ -143,8 +143,8 @@ static const char *fib_type_str(enum nft_fib_result r)
 }
 
 static int
-nftnl_expr_fib_snprintf_default(char *buf, size_t size,
-				const struct nftnl_expr *e)
+nftnl_expr_fib_snprintf(char *buf, size_t size,
+			 uint32_t printflags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_fib *fib = nftnl_expr_data(e);
 	int remain = size, offset = 0, ret, i;
@@ -190,21 +190,6 @@ nftnl_expr_fib_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_fib_snprintf(char *buf, size_t len, uint32_t type,
-			 uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_fib_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_fib = {
 	.name		= "fib",
 	.alloc_len	= sizeof(struct nftnl_expr_fib),
diff --git a/src/expr/flow_offload.c b/src/expr/flow_offload.c
index 6ccec9a133963..188269113ee8a 100644
--- a/src/expr/flow_offload.c
+++ b/src/expr/flow_offload.c
@@ -92,8 +92,8 @@ static int nftnl_expr_flow_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return ret;
 }
 
-static int nftnl_expr_flow_snprintf_default(char *buf, size_t size,
-					    const struct nftnl_expr *e)
+static int nftnl_expr_flow_snprintf(char *buf, size_t size,
+				    uint32_t flags, const struct nftnl_expr *e)
 {
 	int remain = size, offset = 0, ret;
 	struct nftnl_expr_flow *l = nftnl_expr_data(e);
@@ -104,20 +104,6 @@ static int nftnl_expr_flow_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int nftnl_expr_flow_snprintf(char *buf, size_t size, uint32_t type,
-				    uint32_t flags, const struct nftnl_expr *e)
-{
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_flow_snprintf_default(buf, size, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 static void nftnl_expr_flow_free(const struct nftnl_expr *e)
 {
 	struct nftnl_expr_flow *flow = nftnl_expr_data(e);
diff --git a/src/expr/fwd.c b/src/expr/fwd.c
index 2ec63c16dfe6e..0322be8f4aa4b 100644
--- a/src/expr/fwd.c
+++ b/src/expr/fwd.c
@@ -125,9 +125,8 @@ static int nftnl_expr_fwd_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return ret;
 }
 
-static int nftnl_expr_fwd_snprintf_default(char *buf, size_t len,
-					   const struct nftnl_expr *e,
-					   uint32_t flags)
+static int nftnl_expr_fwd_snprintf(char *buf, size_t len,
+				   uint32_t flags, const struct nftnl_expr *e)
 {
 	int remain = len, offset = 0, ret;
 	struct nftnl_expr_fwd *fwd = nftnl_expr_data(e);
@@ -151,20 +150,6 @@ static int nftnl_expr_fwd_snprintf_default(char *buf, size_t len,
 	return offset;
 }
 
-static int nftnl_expr_fwd_snprintf(char *buf, size_t len, uint32_t type,
-				   uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_fwd_snprintf_default(buf, len, e, flags);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_fwd = {
 	.name		= "fwd",
 	.alloc_len	= sizeof(struct nftnl_expr_fwd),
diff --git a/src/expr/hash.c b/src/expr/hash.c
index 2c801d28661f7..86b5ca6f0dfd0 100644
--- a/src/expr/hash.c
+++ b/src/expr/hash.c
@@ -184,8 +184,8 @@ nftnl_expr_hash_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_hash_snprintf_default(char *buf, size_t size,
-				 const struct nftnl_expr *e)
+nftnl_expr_hash_snprintf(char *buf, size_t size,
+			 uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_hash *hash = nftnl_expr_data(e);
 	int remain = size, offset = 0, ret;
@@ -218,21 +218,6 @@ nftnl_expr_hash_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_hash_snprintf(char *buf, size_t len, uint32_t type,
-			 uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_hash_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_hash = {
 	.name		= "hash",
 	.alloc_len	= sizeof(struct nftnl_expr_hash),
diff --git a/src/expr/immediate.c b/src/expr/immediate.c
index 7f34772bd0013..08ddd22a54c5f 100644
--- a/src/expr/immediate.c
+++ b/src/expr/immediate.c
@@ -184,9 +184,8 @@ nftnl_expr_immediate_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_immediate_snprintf_default(char *buf, size_t len,
-				      const struct nftnl_expr *e,
-				      uint32_t flags)
+nftnl_expr_immediate_snprintf(char *buf, size_t len,
+			      uint32_t flags, const struct nftnl_expr *e)
 {
 	int remain = len, offset = 0, ret;
 	struct nftnl_expr_immediate *imm = nftnl_expr_data(e);
@@ -213,21 +212,6 @@ nftnl_expr_immediate_snprintf_default(char *buf, size_t len,
 	return offset;
 }
 
-static int
-nftnl_expr_immediate_snprintf(char *buf, size_t len, uint32_t type,
-			      uint32_t flags, const struct nftnl_expr *e)
-{
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_immediate_snprintf_default(buf, len, e, flags);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 static void nftnl_expr_immediate_free(const struct nftnl_expr *e)
 {
 	struct nftnl_expr_immediate *imm = nftnl_expr_data(e);
diff --git a/src/expr/limit.c b/src/expr/limit.c
index 5872e276dbb80..3dfd54a8dd112 100644
--- a/src/expr/limit.c
+++ b/src/expr/limit.c
@@ -183,8 +183,9 @@ static const char *limit_to_type(enum nft_limit_type type)
 	}
 }
 
-static int nftnl_expr_limit_snprintf_default(char *buf, size_t len,
-					     const struct nftnl_expr *e)
+static int
+nftnl_expr_limit_snprintf(char *buf, size_t len,
+			  uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_limit *limit = nftnl_expr_data(e);
 
@@ -193,21 +194,6 @@ static int nftnl_expr_limit_snprintf_default(char *buf, size_t len,
 			limit_to_type(limit->type), limit->flags);
 }
 
-static int
-nftnl_expr_limit_snprintf(char *buf, size_t len, uint32_t type,
-			  uint32_t flags, const struct nftnl_expr *e)
-{
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_limit_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_limit = {
 	.name		= "limit",
 	.alloc_len	= sizeof(struct nftnl_expr_limit),
diff --git a/src/expr/log.c b/src/expr/log.c
index bbe43d2dc6bcc..d56fad56d27cd 100644
--- a/src/expr/log.c
+++ b/src/expr/log.c
@@ -186,8 +186,9 @@ nftnl_expr_log_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_log_snprintf_default(char *buf, size_t size,
-					   const struct nftnl_expr *e)
+static int
+nftnl_expr_log_snprintf(char *buf, size_t size,
+			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_log *log = nftnl_expr_data(e);
 	int ret, offset = 0, remain = size;
@@ -236,21 +237,6 @@ static int nftnl_expr_log_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_log_snprintf(char *buf, size_t len, uint32_t type,
-			uint32_t flags, const struct nftnl_expr *e)
-{
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_log_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 static void nftnl_expr_log_free(const struct nftnl_expr *e)
 {
 	struct nftnl_expr_log *log = nftnl_expr_data(e);
diff --git a/src/expr/lookup.c b/src/expr/lookup.c
index a495ac0fdcfc8..ec7f6fb99e066 100644
--- a/src/expr/lookup.c
+++ b/src/expr/lookup.c
@@ -168,8 +168,8 @@ nftnl_expr_lookup_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_lookup_snprintf_default(char *buf, size_t size,
-				   const struct nftnl_expr *e)
+nftnl_expr_lookup_snprintf(char *buf, size_t size,
+			   uint32_t flags, const struct nftnl_expr *e)
 {
 	int remain = size, offset = 0, ret;
 	struct nftnl_expr_lookup *l = nftnl_expr_data(e);
@@ -190,21 +190,6 @@ nftnl_expr_lookup_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_lookup_snprintf(char *buf, size_t size, uint32_t type,
-			   uint32_t flags, const struct nftnl_expr *e)
-{
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_lookup_snprintf_default(buf, size, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 static void nftnl_expr_lookup_free(const struct nftnl_expr *e)
 {
 	struct nftnl_expr_lookup *lookup = nftnl_expr_data(e);
diff --git a/src/expr/masq.c b/src/expr/masq.c
index ea66fecdf2a72..1f6dbdb9cc33d 100644
--- a/src/expr/masq.c
+++ b/src/expr/masq.c
@@ -131,8 +131,8 @@ nftnl_expr_masq_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_masq_snprintf_default(char *buf, size_t len,
-					    const struct nftnl_expr *e)
+static int nftnl_expr_masq_snprintf(char *buf, size_t len,
+				    uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_masq *masq = nftnl_expr_data(e);
 	int remain = len, offset = 0, ret = 0;
@@ -155,20 +155,6 @@ static int nftnl_expr_masq_snprintf_default(char *buf, size_t len,
 	return offset;
 }
 
-static int nftnl_expr_masq_snprintf(char *buf, size_t len, uint32_t type,
-				    uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_masq_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_masq = {
 	.name		= "masq",
 	.alloc_len	= sizeof(struct nftnl_expr_masq),
diff --git a/src/expr/match.c b/src/expr/match.c
index 4fa74b2da893c..533fdf5c7ac3b 100644
--- a/src/expr/match.c
+++ b/src/expr/match.c
@@ -165,21 +165,12 @@ static int nftnl_expr_match_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_match_snprintf(char *buf, size_t len, uint32_t type,
+nftnl_expr_match_snprintf(char *buf, size_t len,
 			  uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_match *match = nftnl_expr_data(e);
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return snprintf(buf, len, "name %s rev %u ",
-				match->name, match->rev);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
+	return snprintf(buf, len, "name %s rev %u ", match->name, match->rev);
 }
 
 static void nftnl_expr_match_free(const struct nftnl_expr *e)
diff --git a/src/expr/meta.c b/src/expr/meta.c
index 6ed8ee5645c4b..34fbb9bb63c03 100644
--- a/src/expr/meta.c
+++ b/src/expr/meta.c
@@ -192,8 +192,8 @@ static inline int str2meta_key(const char *str)
 }
 
 static int
-nftnl_expr_meta_snprintf_default(char *buf, size_t len,
-				 const struct nftnl_expr *e)
+nftnl_expr_meta_snprintf(char *buf, size_t len,
+			 uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_meta *meta = nftnl_expr_data(e);
 
@@ -208,21 +208,6 @@ nftnl_expr_meta_snprintf_default(char *buf, size_t len,
 	return 0;
 }
 
-static int
-nftnl_expr_meta_snprintf(char *buf, size_t len, uint32_t type,
-			 uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_meta_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_meta = {
 	.name		= "meta",
 	.alloc_len	= sizeof(struct nftnl_expr_meta),
diff --git a/src/expr/nat.c b/src/expr/nat.c
index 91a1ae6c99a43..25d4e9206da79 100644
--- a/src/expr/nat.c
+++ b/src/expr/nat.c
@@ -221,8 +221,8 @@ static inline int nftnl_str2nat(const char *nat)
 }
 
 static int
-nftnl_expr_nat_snprintf_default(char *buf, size_t size,
-				const struct nftnl_expr *e)
+nftnl_expr_nat_snprintf(char *buf, size_t size,
+			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_nat *nat = nftnl_expr_data(e);
 	int remain = size, offset = 0, ret = 0;
@@ -266,21 +266,6 @@ nftnl_expr_nat_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_nat_snprintf(char *buf, size_t size, uint32_t type,
-			uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_nat_snprintf_default(buf, size, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_nat = {
 	.name		= "nat",
 	.alloc_len	= sizeof(struct nftnl_expr_nat),
diff --git a/src/expr/numgen.c b/src/expr/numgen.c
index 4e0d54158646c..602e4c0f77426 100644
--- a/src/expr/numgen.c
+++ b/src/expr/numgen.c
@@ -143,8 +143,8 @@ nftnl_expr_ng_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_ng_snprintf_default(char *buf, size_t size,
-			       const struct nftnl_expr *e)
+nftnl_expr_ng_snprintf(char *buf, size_t size,
+		       uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_ng *ng = nftnl_expr_data(e);
 	int remain = size, offset = 0, ret;
@@ -172,21 +172,6 @@ nftnl_expr_ng_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_ng_snprintf(char *buf, size_t len, uint32_t type,
-		       uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_ng_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_ng = {
 	.name		= "numgen",
 	.alloc_len	= sizeof(struct nftnl_expr_ng),
diff --git a/src/expr/objref.c b/src/expr/objref.c
index 2eb5c47f8e562..a4b6470bc25e2 100644
--- a/src/expr/objref.c
+++ b/src/expr/objref.c
@@ -174,8 +174,9 @@ static int nftnl_expr_objref_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_objref_snprintf_default(char *buf, size_t len,
-					      const struct nftnl_expr *e)
+static int nftnl_expr_objref_snprintf(char *buf, size_t len,
+				      uint32_t flags,
+				      const struct nftnl_expr *e)
 {
 	struct nftnl_expr_objref *objref = nftnl_expr_data(e);
 
@@ -195,21 +196,6 @@ static void nftnl_expr_objref_free(const struct nftnl_expr *e)
 	xfree(objref->set.name);
 }
 
-static int nftnl_expr_objref_snprintf(char *buf, size_t len, uint32_t type,
-				      uint32_t flags,
-				      const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_objref_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_objref = {
 	.name		= "objref",
 	.alloc_len	= sizeof(struct nftnl_expr_objref),
diff --git a/src/expr/osf.c b/src/expr/osf.c
index 98d0df96aa06e..56fc4e053a7b7 100644
--- a/src/expr/osf.c
+++ b/src/expr/osf.c
@@ -124,8 +124,9 @@ nftnl_expr_osf_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_osf_snprintf_default(char *buf, size_t size,
-					   const struct nftnl_expr *e)
+static int
+nftnl_expr_osf_snprintf(char *buf, size_t size,
+			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_osf *osf = nftnl_expr_data(e);
 	int ret, offset = 0, len = size;
@@ -138,21 +139,6 @@ static int nftnl_expr_osf_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_osf_snprintf(char *buf, size_t len, uint32_t type,
-			uint32_t flags, const struct nftnl_expr *e)
-{
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_osf_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_osf = {
 	.name		= "osf",
 	.alloc_len	= sizeof(struct nftnl_expr_osf),
diff --git a/src/expr/payload.c b/src/expr/payload.c
index 2192dad5f15dd..9ccb78e6b5352 100644
--- a/src/expr/payload.c
+++ b/src/expr/payload.c
@@ -232,30 +232,22 @@ static inline int nftnl_str2base(const char *base)
 }
 
 static int
-nftnl_expr_payload_snprintf(char *buf, size_t len, uint32_t type,
+nftnl_expr_payload_snprintf(char *buf, size_t len,
 			    uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_payload *payload = nftnl_expr_data(e);
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		if (payload->sreg)
-			return snprintf(buf, len, "write reg %u => %ub @ %s header + %u csum_type %u csum_off %u csum_flags 0x%x ",
-					payload->sreg,
-					payload->len, base2str(payload->base),
-					payload->offset, payload->csum_type,
-					payload->csum_offset,
-					payload->csum_flags);
-		else
-			return snprintf(buf, len, "load %ub @ %s header + %u => reg %u ",
-					payload->len, base2str(payload->base),
-					payload->offset, payload->dreg);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
+	if (payload->sreg)
+		return snprintf(buf, len, "write reg %u => %ub @ %s header + %u csum_type %u csum_off %u csum_flags 0x%x ",
+				payload->sreg,
+				payload->len, base2str(payload->base),
+				payload->offset, payload->csum_type,
+				payload->csum_offset,
+				payload->csum_flags);
+	else
+		return snprintf(buf, len, "load %ub @ %s header + %u => reg %u ",
+				payload->len, base2str(payload->base),
+				payload->offset, payload->dreg);
 }
 
 struct expr_ops expr_ops_payload = {
diff --git a/src/expr/queue.c b/src/expr/queue.c
index b892b57bc4897..0bab2837ad584 100644
--- a/src/expr/queue.c
+++ b/src/expr/queue.c
@@ -143,8 +143,9 @@ nftnl_expr_queue_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_queue_snprintf_default(char *buf, size_t len,
-					     const struct nftnl_expr *e)
+static int
+nftnl_expr_queue_snprintf(char *buf, size_t len,
+			  uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_queue *queue = nftnl_expr_data(e);
 	int ret, remain = len, offset = 0;
@@ -184,21 +185,6 @@ static int nftnl_expr_queue_snprintf_default(char *buf, size_t len,
 	return offset;
 }
 
-static int
-nftnl_expr_queue_snprintf(char *buf, size_t len, uint32_t type,
-			  uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_queue_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_queue = {
 	.name		= "queue",
 	.alloc_len	= sizeof(struct nftnl_expr_queue),
diff --git a/src/expr/quota.c b/src/expr/quota.c
index 39a92e6ed6969..8c841d8006eb6 100644
--- a/src/expr/quota.c
+++ b/src/expr/quota.c
@@ -128,8 +128,9 @@ nftnl_expr_quota_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_quota_snprintf_default(char *buf, size_t len,
-					       const struct nftnl_expr *e)
+static int nftnl_expr_quota_snprintf(char *buf, size_t len,
+				       uint32_t flags,
+				       const struct nftnl_expr *e)
 {
 	struct nftnl_expr_quota *quota = nftnl_expr_data(e);
 
@@ -138,21 +139,6 @@ static int nftnl_expr_quota_snprintf_default(char *buf, size_t len,
 			quota->bytes, quota->consumed, quota->flags);
 }
 
-static int nftnl_expr_quota_snprintf(char *buf, size_t len, uint32_t type,
-				       uint32_t flags,
-				       const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_quota_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_quota = {
 	.name		= "quota",
 	.alloc_len	= sizeof(struct nftnl_expr_quota),
diff --git a/src/expr/range.c b/src/expr/range.c
index d1d50832a4503..a93b2ea74d6d4 100644
--- a/src/expr/range.c
+++ b/src/expr/range.c
@@ -184,8 +184,8 @@ static inline int nftnl_str2range(const char *op)
 	}
 }
 
-static int nftnl_expr_range_snprintf_default(char *buf, size_t size,
-					   const struct nftnl_expr *e)
+static int nftnl_expr_range_snprintf(char *buf, size_t size,
+				     uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_range *range = nftnl_expr_data(e);
 	int remain = size, offset = 0, ret;
@@ -205,20 +205,6 @@ static int nftnl_expr_range_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int nftnl_expr_range_snprintf(char *buf, size_t size, uint32_t type,
-				     uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_range_snprintf_default(buf, size, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_range = {
 	.name		= "range",
 	.alloc_len	= sizeof(struct nftnl_expr_range),
diff --git a/src/expr/redir.c b/src/expr/redir.c
index c00c2a6ddf3cf..8de4c60556dac 100644
--- a/src/expr/redir.c
+++ b/src/expr/redir.c
@@ -131,8 +131,9 @@ nftnl_expr_redir_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_redir_snprintf_default(char *buf, size_t len,
-					     const struct nftnl_expr *e)
+static int
+nftnl_expr_redir_snprintf(char *buf, size_t len,
+			  uint32_t flags, const struct nftnl_expr *e)
 {
 	int ret, remain = len, offset = 0;
 	struct nftnl_expr_redir *redir = nftnl_expr_data(e);
@@ -158,21 +159,6 @@ static int nftnl_expr_redir_snprintf_default(char *buf, size_t len,
 	return offset;
 }
 
-static int
-nftnl_expr_redir_snprintf(char *buf, size_t len, uint32_t type,
-			  uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_redir_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_redir = {
 	.name		= "redir",
 	.alloc_len	= sizeof(struct nftnl_expr_redir),
diff --git a/src/expr/reject.c b/src/expr/reject.c
index 141942e6941f3..716d25c77f7e5 100644
--- a/src/expr/reject.c
+++ b/src/expr/reject.c
@@ -116,8 +116,9 @@ nftnl_expr_reject_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_reject_snprintf_default(char *buf, size_t len,
-					      const struct nftnl_expr *e)
+static int
+nftnl_expr_reject_snprintf(char *buf, size_t len,
+			   uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_reject *reject = nftnl_expr_data(e);
 
@@ -125,21 +126,6 @@ static int nftnl_expr_reject_snprintf_default(char *buf, size_t len,
 			reject->type, reject->icmp_code);
 }
 
-static int
-nftnl_expr_reject_snprintf(char *buf, size_t len, uint32_t type,
-			   uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_reject_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_reject = {
 	.name		= "reject",
 	.alloc_len	= sizeof(struct nftnl_expr_reject),
diff --git a/src/expr/rt.c b/src/expr/rt.c
index 0fce72d9a845b..1ad9b2ad4043f 100644
--- a/src/expr/rt.c
+++ b/src/expr/rt.c
@@ -142,8 +142,8 @@ static inline int str2rt_key(const char *str)
 }
 
 static int
-nftnl_expr_rt_snprintf_default(char *buf, size_t len,
-			       const struct nftnl_expr *e)
+nftnl_expr_rt_snprintf(char *buf, size_t len,
+		       uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_rt *rt = nftnl_expr_data(e);
 
@@ -154,21 +154,6 @@ nftnl_expr_rt_snprintf_default(char *buf, size_t len,
 	return 0;
 }
 
-static int
-nftnl_expr_rt_snprintf(char *buf, size_t len, uint32_t type,
-		       uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_rt_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_rt = {
 	.name		= "rt",
 	.alloc_len	= sizeof(struct nftnl_expr_rt),
diff --git a/src/expr/socket.c b/src/expr/socket.c
index 76fc90346141e..c7337cf75378d 100644
--- a/src/expr/socket.c
+++ b/src/expr/socket.c
@@ -127,8 +127,8 @@ static const char *socket_key2str(uint8_t key)
 }
 
 static int
-nftnl_expr_socket_snprintf_default(char *buf, size_t len,
-			       const struct nftnl_expr *e)
+nftnl_expr_socket_snprintf(char *buf, size_t len,
+		       uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_socket *socket = nftnl_expr_data(e);
 
@@ -139,21 +139,6 @@ nftnl_expr_socket_snprintf_default(char *buf, size_t len,
 	return 0;
 }
 
-static int
-nftnl_expr_socket_snprintf(char *buf, size_t len, uint32_t type,
-		       uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_socket_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_socket = {
 	.name		= "socket",
 	.alloc_len	= sizeof(struct nftnl_expr_socket),
diff --git a/src/expr/synproxy.c b/src/expr/synproxy.c
index 245f4fb5a41be..dc68b9d14db3a 100644
--- a/src/expr/synproxy.c
+++ b/src/expr/synproxy.c
@@ -127,8 +127,9 @@ nftnl_expr_synproxy_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_synproxy_snprintf_default(char *buf, size_t size,
-						const struct nftnl_expr *e)
+static int
+nftnl_expr_synproxy_snprintf(char *buf, size_t size,
+			     uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_synproxy *synproxy = nftnl_expr_data(e);
 	int ret, offset = 0, len = size;
@@ -143,21 +144,6 @@ static int nftnl_expr_synproxy_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_synproxy_snprintf(char *buf, size_t len, uint32_t type,
-			     uint32_t flags, const struct nftnl_expr *e)
-{
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_synproxy_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_synproxy = {
 	.name		= "synproxy",
 	.alloc_len	= sizeof(struct nftnl_expr_synproxy),
diff --git a/src/expr/target.c b/src/expr/target.c
index 91000386704aa..b7c595a7de989 100644
--- a/src/expr/target.c
+++ b/src/expr/target.c
@@ -165,21 +165,12 @@ static int nftnl_expr_target_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_target_snprintf(char *buf, size_t len, uint32_t type,
+nftnl_expr_target_snprintf(char *buf, size_t len,
 			   uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_target *target = nftnl_expr_data(e);
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return snprintf(buf, len, "name %s rev %u ",
-				target->name, target->rev);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
+	return snprintf(buf, len, "name %s rev %u ", target->name, target->rev);
 }
 
 static void nftnl_expr_target_free(const struct nftnl_expr *e)
diff --git a/src/expr/tproxy.c b/src/expr/tproxy.c
index 3827b75ed2215..eeb1beee48ebe 100644
--- a/src/expr/tproxy.c
+++ b/src/expr/tproxy.c
@@ -135,8 +135,8 @@ nftnl_expr_tproxy_build(struct nlmsghdr *nlh, const struct nftnl_expr *e)
 }
 
 static int
-nftnl_expr_tproxy_snprintf_default(char *buf, size_t size,
-				const struct nftnl_expr *e)
+nftnl_expr_tproxy_snprintf(char *buf, size_t size,
+			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_tproxy *tproxy = nftnl_expr_data(e);
 	int remain = size, offset = 0, ret = 0;
@@ -162,19 +162,6 @@ nftnl_expr_tproxy_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_tproxy_snprintf(char *buf, size_t size, uint32_t type,
-			uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_tproxy_snprintf_default(buf, size, e);
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_tproxy = {
 	.name		= "tproxy",
 	.alloc_len	= sizeof(struct nftnl_expr_tproxy),
diff --git a/src/expr/tunnel.c b/src/expr/tunnel.c
index 62e164805fee6..1460fd26b0fbc 100644
--- a/src/expr/tunnel.c
+++ b/src/expr/tunnel.c
@@ -125,8 +125,8 @@ static const char *tunnel_key2str(uint8_t key)
 }
 
 static int
-nftnl_expr_tunnel_snprintf_default(char *buf, size_t len,
-				 const struct nftnl_expr *e)
+nftnl_expr_tunnel_snprintf(char *buf, size_t len,
+			 uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_tunnel *tunnel = nftnl_expr_data(e);
 
@@ -137,21 +137,6 @@ nftnl_expr_tunnel_snprintf_default(char *buf, size_t len,
 	return 0;
 }
 
-static int
-nftnl_expr_tunnel_snprintf(char *buf, size_t len, uint32_t type,
-			 uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_tunnel_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_tunnel = {
 	.name		= "tunnel",
 	.alloc_len	= sizeof(struct nftnl_expr_tunnel),
diff --git a/src/expr/xfrm.c b/src/expr/xfrm.c
index 0502b53bb7edc..d7586ce689c0d 100644
--- a/src/expr/xfrm.c
+++ b/src/expr/xfrm.c
@@ -172,8 +172,8 @@ static const char *xfrmdir2str(uint8_t dir)
 }
 
 static int
-nftnl_expr_xfrm_snprintf_default(char *buf, size_t size,
-			       const struct nftnl_expr *e)
+nftnl_expr_xfrm_snprintf(char *buf, size_t size,
+			 uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_xfrm *x = nftnl_expr_data(e);
 	int ret, remain = size, offset = 0;
@@ -188,21 +188,6 @@ nftnl_expr_xfrm_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int
-nftnl_expr_xfrm_snprintf(char *buf, size_t len, uint32_t type,
-			 uint32_t flags, const struct nftnl_expr *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_expr_xfrm_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct expr_ops expr_ops_xfrm = {
 	.name		= "xfrm",
 	.alloc_len	= sizeof(struct nftnl_expr_xfrm),
-- 
2.30.1


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

* [libnftnl PATCH 06/10] expr/data_reg: Drop output_format parameter
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
                   ` (4 preceding siblings ...)
  2021-03-09 15:45 ` [libnftnl PATCH 05/10] expr: Check output type once and for all Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 07/10] obj: Drop type parameter from snprintf callback Phil Sutter
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

The function nftnl_data_reg_snprintf is exclusively called with
NFTNL_OUTPUT_DEFAULT as parameter, others are not supported - just drop
it.

Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 include/data_reg.h   |  3 +--
 src/expr/bitwise.c   |  6 +++---
 src/expr/cmp.c       |  2 +-
 src/expr/data_reg.c  | 31 ++++++-------------------------
 src/expr/immediate.c |  6 +++---
 src/expr/range.c     |  4 ++--
 src/set_elem.c       |  3 ---
 7 files changed, 16 insertions(+), 39 deletions(-)

diff --git a/include/data_reg.h b/include/data_reg.h
index 0d6b77829cf89..6d2dc66858bf8 100644
--- a/include/data_reg.h
+++ b/include/data_reg.h
@@ -31,8 +31,7 @@ union nftnl_data_reg {
 
 int nftnl_data_reg_snprintf(char *buf, size_t size,
 			    const union nftnl_data_reg *reg,
-			    uint32_t output_format, uint32_t flags,
-			    int reg_type);
+			    uint32_t flags, int reg_type);
 struct nlattr;
 
 int nftnl_parse_data(union nftnl_data_reg *data, struct nlattr *attr, int *type);
diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c
index 139f25f86b802..1d46a97757dfd 100644
--- a/src/expr/bitwise.c
+++ b/src/expr/bitwise.c
@@ -220,14 +220,14 @@ nftnl_expr_bitwise_snprintf_bool(char *buf, size_t size,
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = nftnl_data_reg_snprintf(buf + offset, remain, &bitwise->mask,
-				      NFTNL_OUTPUT_DEFAULT, 0, DATA_VALUE);
+				      0, DATA_VALUE);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = snprintf(buf + offset, remain, ") ^ ");
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = nftnl_data_reg_snprintf(buf + offset, remain, &bitwise->xor,
-				      NFTNL_OUTPUT_DEFAULT, 0, DATA_VALUE);
+				      0, DATA_VALUE);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	return offset;
@@ -243,7 +243,7 @@ nftnl_expr_bitwise_snprintf_shift(char *buf, size_t size, const char *op,
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = nftnl_data_reg_snprintf(buf + offset, remain, &bitwise->data,
-				      NFTNL_OUTPUT_DEFAULT, 0, DATA_VALUE);
+				      0, DATA_VALUE);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = snprintf(buf + offset, remain, ") ");
diff --git a/src/expr/cmp.c b/src/expr/cmp.c
index 6b1c0fa3ac97f..04b9f25806725 100644
--- a/src/expr/cmp.c
+++ b/src/expr/cmp.c
@@ -188,7 +188,7 @@ nftnl_expr_cmp_snprintf(char *buf, size_t size,
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = nftnl_data_reg_snprintf(buf + offset, remain, &cmp->data,
-				    NFTNL_OUTPUT_DEFAULT, 0, DATA_VALUE);
+				      0, DATA_VALUE);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	return offset;
diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c
index d3ccc612ce812..bafdc6f3dadd3 100644
--- a/src/expr/data_reg.c
+++ b/src/expr/data_reg.c
@@ -63,38 +63,19 @@ nftnl_data_reg_verdict_snprintf_def(char *buf, size_t size,
 
 int nftnl_data_reg_snprintf(char *buf, size_t size,
 			    const union nftnl_data_reg *reg,
-			    uint32_t output_format, uint32_t flags,
-			    int reg_type)
+			    uint32_t flags, int reg_type)
 {
 	switch(reg_type) {
 	case DATA_VALUE:
-		switch(output_format) {
-		case NFTNL_OUTPUT_DEFAULT:
-			return nftnl_data_reg_value_snprintf_default(buf, size,
-								   reg, flags);
-		case NFTNL_OUTPUT_JSON:
-		case NFTNL_OUTPUT_XML:
-		default:
-			break;
-		}
-		break;
+		return nftnl_data_reg_value_snprintf_default(buf, size,
+							     reg, flags);
 	case DATA_VERDICT:
 	case DATA_CHAIN:
-		switch(output_format) {
-		case NFTNL_OUTPUT_DEFAULT:
-			return nftnl_data_reg_verdict_snprintf_def(buf, size,
-								 reg, flags);
-		case NFTNL_OUTPUT_JSON:
-		case NFTNL_OUTPUT_XML:
-		default:
-			break;
-		}
-		break;
+		return nftnl_data_reg_verdict_snprintf_def(buf, size,
+							   reg, flags);
 	default:
-		break;
+		return -1;
 	}
-
-	return -1;
 }
 
 static int nftnl_data_parse_cb(const struct nlattr *attr, void *data)
diff --git a/src/expr/immediate.c b/src/expr/immediate.c
index 08ddd22a54c5f..241aad3b5507c 100644
--- a/src/expr/immediate.c
+++ b/src/expr/immediate.c
@@ -195,17 +195,17 @@ nftnl_expr_immediate_snprintf(char *buf, size_t len,
 
 	if (e->flags & (1 << NFTNL_EXPR_IMM_DATA)) {
 		ret = nftnl_data_reg_snprintf(buf + offset, remain, &imm->data,
-					NFTNL_OUTPUT_DEFAULT, flags, DATA_VALUE);
+					      flags, DATA_VALUE);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	} else if (e->flags & (1 << NFTNL_EXPR_IMM_VERDICT)) {
 		ret = nftnl_data_reg_snprintf(buf + offset, remain, &imm->data,
-				NFTNL_OUTPUT_DEFAULT, flags, DATA_VERDICT);
+					      flags, DATA_VERDICT);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	} else if (e->flags & (1 << NFTNL_EXPR_IMM_CHAIN)) {
 		ret = nftnl_data_reg_snprintf(buf + offset, remain, &imm->data,
-					NFTNL_OUTPUT_DEFAULT, flags, DATA_CHAIN);
+					      flags, DATA_CHAIN);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 
diff --git a/src/expr/range.c b/src/expr/range.c
index a93b2ea74d6d4..eed48829a246d 100644
--- a/src/expr/range.c
+++ b/src/expr/range.c
@@ -195,11 +195,11 @@ static int nftnl_expr_range_snprintf(char *buf, size_t size,
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = nftnl_data_reg_snprintf(buf + offset, remain, &range->data_from,
-				      NFTNL_OUTPUT_DEFAULT, 0, DATA_VALUE);
+				      0, DATA_VALUE);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = nftnl_data_reg_snprintf(buf + offset, remain, &range->data_to,
-				      NFTNL_OUTPUT_DEFAULT, 0, DATA_VALUE);
+				      0, DATA_VALUE);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	return offset;
diff --git a/src/set_elem.c b/src/set_elem.c
index ad528e28475a7..061469a74789c 100644
--- a/src/set_elem.c
+++ b/src/set_elem.c
@@ -710,7 +710,6 @@ int nftnl_set_elem_snprintf_default(char *buf, size_t size,
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = nftnl_data_reg_snprintf(buf + offset, remain, &e->key,
-				      NFTNL_OUTPUT_DEFAULT,
 				      DATA_F_NOPFX, DATA_VALUE);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
@@ -719,7 +718,6 @@ int nftnl_set_elem_snprintf_default(char *buf, size_t size,
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		ret = nftnl_data_reg_snprintf(buf + offset, remain, &e->key_end,
-					      NFTNL_OUTPUT_DEFAULT,
 					      DATA_F_NOPFX, DATA_VALUE);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
@@ -728,7 +726,6 @@ int nftnl_set_elem_snprintf_default(char *buf, size_t size,
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	ret = nftnl_data_reg_snprintf(buf + offset, remain, &e->data,
-				      NFTNL_OUTPUT_DEFAULT,
 				      DATA_F_NOPFX, dregtype);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
-- 
2.30.1


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

* [libnftnl PATCH 07/10] obj: Drop type parameter from snprintf callback
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
                   ` (5 preceding siblings ...)
  2021-03-09 15:45 ` [libnftnl PATCH 06/10] expr/data_reg: Drop output_format parameter Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 08/10] Drop pointless local variable in snprintf callbacks Phil Sutter
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

Objects don't support any other output type than NFTNL_OUTPUT_DEFAULT,
so just drop the parameter.

Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 include/obj.h        |  2 +-
 src/obj/counter.c    | 22 ++--------------------
 src/obj/ct_expect.c  | 22 +++-------------------
 src/obj/ct_helper.c  | 22 +++-------------------
 src/obj/ct_timeout.c | 22 +++-------------------
 src/obj/limit.c      | 23 +++--------------------
 src/obj/quota.c      | 23 +++--------------------
 src/obj/secmark.c    | 23 +++--------------------
 src/obj/synproxy.c   | 20 +++-----------------
 src/obj/tunnel.c     | 21 ++-------------------
 src/object.c         |  3 +--
 11 files changed, 27 insertions(+), 176 deletions(-)

diff --git a/include/obj.h b/include/obj.h
index d9e856ab2bfbf..60dc8533b30f3 100644
--- a/include/obj.h
+++ b/include/obj.h
@@ -109,7 +109,7 @@ struct obj_ops {
 	const void *(*get)(const struct nftnl_obj *e, uint16_t type, uint32_t *data_len);
 	int	(*parse)(struct nftnl_obj *e, struct nlattr *attr);
 	void	(*build)(struct nlmsghdr *nlh, const struct nftnl_obj *e);
-	int	(*snprintf)(char *buf, size_t len, uint32_t type, uint32_t flags, const struct nftnl_obj *e);
+	int	(*snprintf)(char *buf, size_t len, uint32_t flags, const struct nftnl_obj *e);
 };
 
 extern struct obj_ops obj_ops_counter;
diff --git a/src/obj/counter.c b/src/obj/counter.c
index 1baba4e149414..ef0cd203e3a1b 100644
--- a/src/obj/counter.c
+++ b/src/obj/counter.c
@@ -109,8 +109,8 @@ nftnl_obj_counter_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_counter_snprintf_default(char *buf, size_t len,
-					       const struct nftnl_obj *e)
+static int nftnl_obj_counter_snprintf(char *buf, size_t len, uint32_t flags,
+				      const struct nftnl_obj *e)
 {
 	struct nftnl_obj_counter *ctr = nftnl_obj_data(e);
 
@@ -118,24 +118,6 @@ static int nftnl_obj_counter_snprintf_default(char *buf, size_t len,
 			ctr->pkts, ctr->bytes);
 }
 
-static int nftnl_obj_counter_snprintf(char *buf, size_t len, uint32_t type,
-				       uint32_t flags,
-				       const struct nftnl_obj *e)
-{
-	if (len)
-		buf[0] = '\0';
-
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_counter_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct obj_ops obj_ops_counter = {
 	.name		= "counter",
 	.type		= NFT_OBJECT_COUNTER,
diff --git a/src/obj/ct_expect.c b/src/obj/ct_expect.c
index 0b4eb8fe541d9..c29f99c419dcb 100644
--- a/src/obj/ct_expect.c
+++ b/src/obj/ct_expect.c
@@ -151,8 +151,9 @@ nftnl_obj_ct_expect_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_ct_expect_snprintf_default(char *buf, size_t len,
-						const struct nftnl_obj *e)
+static int nftnl_obj_ct_expect_snprintf(char *buf, size_t len,
+					uint32_t flags,
+					const struct nftnl_obj *e)
 {
 	int ret = 0;
 	int offset = 0, remain = len;
@@ -187,23 +188,6 @@ static int nftnl_obj_ct_expect_snprintf_default(char *buf, size_t len,
 	return offset;
 }
 
-static int nftnl_obj_ct_expect_snprintf(char *buf, size_t len, uint32_t type,
-					uint32_t flags,
-					const struct nftnl_obj *e)
-{
-	if (len)
-		buf[0] = '\0';
-
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_ct_expect_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct obj_ops obj_ops_ct_expect = {
 	.name		= "ct_expect",
 	.type		= NFT_OBJECT_CT_EXPECT,
diff --git a/src/obj/ct_helper.c b/src/obj/ct_helper.c
index d91f636d4c64c..c52032a9895c3 100644
--- a/src/obj/ct_helper.c
+++ b/src/obj/ct_helper.c
@@ -131,8 +131,9 @@ nftnl_obj_ct_helper_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_ct_helper_snprintf_default(char *buf, size_t len,
-					       const struct nftnl_obj *e)
+static int nftnl_obj_ct_helper_snprintf(char *buf, size_t len,
+				       uint32_t flags,
+				       const struct nftnl_obj *e)
 {
 	struct nftnl_obj_ct_helper *helper = nftnl_obj_data(e);
 
@@ -140,23 +141,6 @@ static int nftnl_obj_ct_helper_snprintf_default(char *buf, size_t len,
 			helper->name, helper->l3proto, helper->l4proto);
 }
 
-static int nftnl_obj_ct_helper_snprintf(char *buf, size_t len, uint32_t type,
-				       uint32_t flags,
-				       const struct nftnl_obj *e)
-{
-	if (len)
-		buf[0] = '\0';
-
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_ct_helper_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct obj_ops obj_ops_ct_helper = {
 	.name		= "ct_helper",
 	.type		= NFT_OBJECT_CT_HELPER,
diff --git a/src/obj/ct_timeout.c b/src/obj/ct_timeout.c
index c3f577bdecd90..a2e5b4fe6de99 100644
--- a/src/obj/ct_timeout.c
+++ b/src/obj/ct_timeout.c
@@ -257,8 +257,9 @@ nftnl_obj_ct_timeout_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_ct_timeout_snprintf_default(char *buf, size_t len,
-					       const struct nftnl_obj *e)
+static int nftnl_obj_ct_timeout_snprintf(char *buf, size_t len,
+				       uint32_t flags,
+				       const struct nftnl_obj *e)
 {
 	int ret = 0;
 	int offset = 0, remain = len;
@@ -307,23 +308,6 @@ static int nftnl_obj_ct_timeout_snprintf_default(char *buf, size_t len,
 	return offset;
 }
 
-static int nftnl_obj_ct_timeout_snprintf(char *buf, size_t len, uint32_t type,
-				       uint32_t flags,
-				       const struct nftnl_obj *e)
-{
-	if (len)
-		buf[0] = '\0';
-
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_ct_timeout_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct obj_ops obj_ops_ct_timeout = {
 	.name		= "ct_timeout",
 	.type		= NFT_OBJECT_CT_TIMEOUT,
diff --git a/src/obj/limit.c b/src/obj/limit.c
index 60b01592e4c50..8b40f9d0976ff 100644
--- a/src/obj/limit.c
+++ b/src/obj/limit.c
@@ -148,8 +148,9 @@ static int nftnl_obj_limit_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_limit_snprintf_default(char *buf, size_t len,
-					    const struct nftnl_obj *e)
+static int nftnl_obj_limit_snprintf(char *buf, size_t len,
+				    uint32_t flags,
+				    const struct nftnl_obj *e)
 {
 	struct nftnl_obj_limit *limit = nftnl_obj_data(e);
 
@@ -158,24 +159,6 @@ static int nftnl_obj_limit_snprintf_default(char *buf, size_t len,
 			limit->burst, limit->type, limit->flags);
 }
 
-static int nftnl_obj_limit_snprintf(char *buf, size_t len, uint32_t type,
-				    uint32_t flags,
-				    const struct nftnl_obj *e)
-{
-	if (len)
-		buf[0] = '\0';
-
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_limit_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct obj_ops obj_ops_limit = {
 	.name		= "limit",
 	.type		= NFT_OBJECT_LIMIT,
diff --git a/src/obj/quota.c b/src/obj/quota.c
index 1914037d3f70d..8ab33005daeea 100644
--- a/src/obj/quota.c
+++ b/src/obj/quota.c
@@ -125,8 +125,9 @@ nftnl_obj_quota_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_quota_snprintf_default(char *buf, size_t len,
-					       const struct nftnl_obj *e)
+static int nftnl_obj_quota_snprintf(char *buf, size_t len,
+				       uint32_t flags,
+				       const struct nftnl_obj *e)
 {
 	struct nftnl_obj_quota *quota = nftnl_obj_data(e);
 
@@ -134,24 +135,6 @@ static int nftnl_obj_quota_snprintf_default(char *buf, size_t len,
 			quota->bytes, quota->flags);
 }
 
-static int nftnl_obj_quota_snprintf(char *buf, size_t len, uint32_t type,
-				       uint32_t flags,
-				       const struct nftnl_obj *e)
-{
-	if (len)
-		buf[0] = '\0';
-
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_quota_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct obj_ops obj_ops_quota = {
 	.name		= "quota",
 	.type		= NFT_OBJECT_QUOTA,
diff --git a/src/obj/secmark.c b/src/obj/secmark.c
index e27b5faf2d39f..2ccc803bacf4e 100644
--- a/src/obj/secmark.c
+++ b/src/obj/secmark.c
@@ -98,30 +98,13 @@ nftnl_obj_secmark_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_secmark_snprintf_default(char *buf, size_t len,
-					       const struct nftnl_obj *e)
-{
-	struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
-
-	return snprintf(buf, len, "context %s ", secmark->ctx);
-}
-
-static int nftnl_obj_secmark_snprintf(char *buf, size_t len, uint32_t type,
+static int nftnl_obj_secmark_snprintf(char *buf, size_t len,
 				       uint32_t flags,
 				       const struct nftnl_obj *e)
 {
-	if (len)
-		buf[0] = '\0';
+	struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_secmark_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
+	return snprintf(buf, len, "context %s ", secmark->ctx);
 }
 
 struct obj_ops obj_ops_secmark = {
diff --git a/src/obj/synproxy.c b/src/obj/synproxy.c
index 56ebc85b02d63..e3a991bc6e023 100644
--- a/src/obj/synproxy.c
+++ b/src/obj/synproxy.c
@@ -117,8 +117,9 @@ static int nftnl_obj_synproxy_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_synproxy_snprintf_default(char *buf, size_t size,
-					       const struct nftnl_obj *e)
+static int nftnl_obj_synproxy_snprintf(char *buf, size_t size,
+				    uint32_t flags,
+				    const struct nftnl_obj *e)
 {
 	struct nftnl_obj_synproxy *synproxy = nftnl_obj_data(e);
         int ret, offset = 0, len = size;
@@ -133,21 +134,6 @@ static int nftnl_obj_synproxy_snprintf_default(char *buf, size_t size,
         return offset;
 }
 
-static int nftnl_obj_synproxy_snprintf(char *buf, size_t len, uint32_t type,
-				    uint32_t flags,
-				    const struct nftnl_obj *e)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_synproxy_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct obj_ops obj_ops_synproxy = {
 	.name		= "synproxy",
 	.type		= NFT_OBJECT_SYNPROXY,
diff --git a/src/obj/tunnel.c b/src/obj/tunnel.c
index 100aa099c6e97..5ede6bd545b38 100644
--- a/src/obj/tunnel.c
+++ b/src/obj/tunnel.c
@@ -530,31 +530,14 @@ nftnl_obj_tunnel_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_tunnel_snprintf_default(char *buf, size_t len,
-					     const struct nftnl_obj *e)
+static int nftnl_obj_tunnel_snprintf(char *buf, size_t len,
+				     uint32_t flags, const struct nftnl_obj *e)
 {
 	struct nftnl_obj_tunnel *tun = nftnl_obj_data(e);
 
 	return snprintf(buf, len, "id %u ", tun->id);
 }
 
-static int nftnl_obj_tunnel_snprintf(char *buf, size_t len, uint32_t type,
-				     uint32_t flags, const struct nftnl_obj *e)
-{
-	if (len)
-		buf[0] = '\0';
-
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		return nftnl_obj_tunnel_snprintf_default(buf, len, e);
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
-		break;
-	}
-	return -1;
-}
-
 struct obj_ops obj_ops_tunnel = {
 	.name		= "tunnel",
 	.type		= NFT_OBJECT_TUNNEL,
diff --git a/src/object.c b/src/object.c
index 46e79168daa76..2d15629eb0f95 100644
--- a/src/object.c
+++ b/src/object.c
@@ -396,8 +396,7 @@ static int nftnl_obj_snprintf_dflt(char *buf, size_t size,
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 	if (obj->ops) {
-		ret = obj->ops->snprintf(buf + offset, remain, type, flags,
-					 obj);
+		ret = obj->ops->snprintf(buf + offset, remain, flags, obj);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	}
 	ret = snprintf(buf + offset, remain, "]");
-- 
2.30.1


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

* [libnftnl PATCH 08/10] Drop pointless local variable in snprintf callbacks
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
                   ` (6 preceding siblings ...)
  2021-03-09 15:45 ` [libnftnl PATCH 07/10] obj: Drop type parameter from snprintf callback Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 09/10] Get rid of single option switch statements Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 10/10] ruleset: Eliminate tag and separator helpers Phil Sutter
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

A common idiom among snprintf callbacks was to copy the unsigned
parameter 'size' (or 'len') into a signed variable for further use.
Though since snprintf() itself casts it to unsigned and
SNPRINTF_BUFFER_SIZE() does not allow it to become negative, this is not
needed. Drop the local variable and rename the parameter accordingly.

Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 src/chain.c             |  8 ++++----
 src/expr.c              |  6 +++---
 src/expr/bitwise.c      |  8 ++++----
 src/expr/byteorder.c    |  4 ++--
 src/expr/cmp.c          |  4 ++--
 src/expr/ct.c           |  4 ++--
 src/expr/data_reg.c     |  4 ++--
 src/expr/dup.c          |  4 ++--
 src/expr/dynset.c       |  4 ++--
 src/expr/fib.c          |  4 ++--
 src/expr/flow_offload.c |  4 ++--
 src/expr/fwd.c          |  4 ++--
 src/expr/hash.c         |  4 ++--
 src/expr/immediate.c    |  4 ++--
 src/expr/log.c          |  4 ++--
 src/expr/lookup.c       |  4 ++--
 src/expr/masq.c         |  4 ++--
 src/expr/nat.c          |  4 ++--
 src/expr/numgen.c       |  4 ++--
 src/expr/osf.c          |  4 ++--
 src/expr/queue.c        |  4 ++--
 src/expr/range.c        |  4 ++--
 src/expr/redir.c        |  4 ++--
 src/expr/synproxy.c     |  4 ++--
 src/expr/tproxy.c       |  4 ++--
 src/expr/xfrm.c         |  4 ++--
 src/flowtable.c         |  8 ++++----
 src/gen.c               |  6 +++---
 src/obj/ct_expect.c     |  5 ++---
 src/obj/ct_timeout.c    |  5 ++---
 src/obj/synproxy.c      |  4 ++--
 src/object.c            | 10 +++++-----
 src/rule.c              |  8 ++++----
 src/ruleset.c           | 25 +++++++++++++------------
 src/set.c               |  9 ++++-----
 src/set_elem.c          |  9 ++++-----
 src/table.c             |  4 ++--
 37 files changed, 102 insertions(+), 105 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index aac9da6319556..7906bf44ff72d 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -826,10 +826,10 @@ static inline int nftnl_str2hooknum(int family, const char *hook)
 	return -1;
 }
 
-static int nftnl_chain_snprintf_default(char *buf, size_t size,
+static int nftnl_chain_snprintf_default(char *buf, size_t remain,
 					const struct nftnl_chain *c)
 {
-	int ret, remain = size, offset = 0, i;
+	int ret, offset = 0, i;
 
 	ret = snprintf(buf, remain, "%s %s %s use %u",
 		       nftnl_family2str(c->family), c->table, c->name, c->use);
@@ -884,11 +884,11 @@ static int nftnl_chain_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int nftnl_chain_cmd_snprintf(char *buf, size_t size,
+static int nftnl_chain_cmd_snprintf(char *buf, size_t remain,
 				    const struct nftnl_chain *c, uint32_t cmd,
 				    uint32_t type, uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	switch (type) {
 	case NFTNL_OUTPUT_DEFAULT:
diff --git a/src/expr.c b/src/expr.c
index 01c55cf2e880b..277bbdeeb5d02 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -270,13 +270,13 @@ err1:
 }
 
 EXPORT_SYMBOL(nftnl_expr_snprintf);
-int nftnl_expr_snprintf(char *buf, size_t size, const struct nftnl_expr *expr,
+int nftnl_expr_snprintf(char *buf, size_t remain, const struct nftnl_expr *expr,
 			uint32_t type, uint32_t flags)
 {
 	int ret;
-	unsigned int offset = 0, remain = size;
+	unsigned int offset = 0;
 
-	if (size)
+	if (remain)
 		buf[0] = '\0';
 
 	if (!expr->ops->snprintf || type != NFTNL_OUTPUT_DEFAULT)
diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c
index 1d46a97757dfd..d0c7827eacec9 100644
--- a/src/expr/bitwise.c
+++ b/src/expr/bitwise.c
@@ -210,10 +210,10 @@ nftnl_expr_bitwise_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_bitwise_snprintf_bool(char *buf, size_t size,
+nftnl_expr_bitwise_snprintf_bool(char *buf, size_t remain,
 				 const struct nftnl_expr_bitwise *bitwise)
 {
-	int remain = size, offset = 0, ret;
+	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "reg %u = ( reg %u & ",
 		       bitwise->dreg, bitwise->sreg);
@@ -234,9 +234,9 @@ nftnl_expr_bitwise_snprintf_bool(char *buf, size_t size,
 }
 
 static int
-nftnl_expr_bitwise_snprintf_shift(char *buf, size_t size, const char *op,
+nftnl_expr_bitwise_snprintf_shift(char *buf, size_t remain, const char *op,
 				  const struct nftnl_expr_bitwise *bitwise)
-{	int remain = size, offset = 0, ret;
+{	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "reg %u = ( reg %u %s ",
 		       bitwise->dreg, bitwise->sreg, op);
diff --git a/src/expr/byteorder.c b/src/expr/byteorder.c
index 9718b8fe2506c..d299745fc57b4 100644
--- a/src/expr/byteorder.c
+++ b/src/expr/byteorder.c
@@ -198,11 +198,11 @@ static inline int nftnl_str2ntoh(const char *op)
 }
 
 static int
-nftnl_expr_byteorder_snprintf(char *buf, size_t size,
+nftnl_expr_byteorder_snprintf(char *buf, size_t remain,
 			      uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_byteorder *byteorder = nftnl_expr_data(e);
-	int remain = size, offset = 0, ret;
+	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "reg %u = %s(reg %u, %u, %u) ",
 		       byteorder->dreg, bo2str(byteorder->op),
diff --git a/src/expr/cmp.c b/src/expr/cmp.c
index 04b9f25806725..6030693f15d86 100644
--- a/src/expr/cmp.c
+++ b/src/expr/cmp.c
@@ -177,11 +177,11 @@ static inline int nftnl_str2cmp(const char *op)
 }
 
 static int
-nftnl_expr_cmp_snprintf(char *buf, size_t size,
+nftnl_expr_cmp_snprintf(char *buf, size_t remain,
 			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_cmp *cmp = nftnl_expr_data(e);
-	int remain = size, offset = 0, ret;
+	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "%s reg %u ",
 		       cmp2str(cmp->op), cmp->sreg);
diff --git a/src/expr/ct.c b/src/expr/ct.c
index f4a7dc6932cb0..d5dfc81cfe0d1 100644
--- a/src/expr/ct.c
+++ b/src/expr/ct.c
@@ -223,11 +223,11 @@ static inline int str2ctdir(const char *str, uint8_t *ctdir)
 }
 
 static int
-nftnl_expr_ct_snprintf(char *buf, size_t size,
+nftnl_expr_ct_snprintf(char *buf, size_t remain,
 		       uint32_t flags, const struct nftnl_expr *e)
 {
-	int ret, remain = size, offset = 0;
 	struct nftnl_expr_ct *ct = nftnl_expr_data(e);
+	int ret, offset = 0;
 
 	if (e->flags & (1 << NFTNL_EXPR_CT_SREG)) {
 		ret = snprintf(buf, remain, "set %s with reg %u ",
diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c
index bafdc6f3dadd3..2633a775c90cc 100644
--- a/src/expr/data_reg.c
+++ b/src/expr/data_reg.c
@@ -25,12 +25,12 @@
 #include "internal.h"
 
 static int
-nftnl_data_reg_value_snprintf_default(char *buf, size_t size,
+nftnl_data_reg_value_snprintf_default(char *buf, size_t remain,
 				      const union nftnl_data_reg *reg,
 				      uint32_t flags)
 {
 	const char *pfx = flags & DATA_F_NOPFX ? "" : "0x";
-	int remain = size, offset = 0, ret, i;
+	int offset = 0, ret, i;
 
 
 
diff --git a/src/expr/dup.c b/src/expr/dup.c
index 3eb560a21077f..f041b551a7e78 100644
--- a/src/expr/dup.c
+++ b/src/expr/dup.c
@@ -111,11 +111,11 @@ static int nftnl_expr_dup_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return ret;
 }
 
-static int nftnl_expr_dup_snprintf(char *buf, size_t len,
+static int nftnl_expr_dup_snprintf(char *buf, size_t remain,
 				   uint32_t flags, const struct nftnl_expr *e)
 {
-	int remain = len, offset = 0, ret;
 	struct nftnl_expr_dup *dup = nftnl_expr_data(e);
+	int offset = 0, ret;
 
 	if (e->flags & (1 << NFTNL_EXPR_DUP_SREG_ADDR)) {
 		ret = snprintf(buf + offset, remain, "sreg_addr %u ", dup->sreg_addr);
diff --git a/src/expr/dynset.c b/src/expr/dynset.c
index 2ddf69a02b9de..85d64bb58d5af 100644
--- a/src/expr/dynset.c
+++ b/src/expr/dynset.c
@@ -308,12 +308,12 @@ static const char *op2str(enum nft_dynset_ops op)
 }
 
 static int
-nftnl_expr_dynset_snprintf(char *buf, size_t size,
+nftnl_expr_dynset_snprintf(char *buf, size_t remain,
 			   uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_dynset *dynset = nftnl_expr_data(e);
 	struct nftnl_expr *expr;
-	int remain = size, offset = 0, ret;
+	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "%s reg_key %u set %s ",
 		       op2str(dynset->op), dynset->sreg_key, dynset->set_name);
diff --git a/src/expr/fib.c b/src/expr/fib.c
index b0cbb3b752153..aaff52acabdbd 100644
--- a/src/expr/fib.c
+++ b/src/expr/fib.c
@@ -143,13 +143,13 @@ static const char *fib_type_str(enum nft_fib_result r)
 }
 
 static int
-nftnl_expr_fib_snprintf(char *buf, size_t size,
+nftnl_expr_fib_snprintf(char *buf, size_t remain,
 			 uint32_t printflags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_fib *fib = nftnl_expr_data(e);
-	int remain = size, offset = 0, ret, i;
 	uint32_t flags = fib->flags & ~NFTA_FIB_F_PRESENT;
 	uint32_t present_flag = fib->flags & NFTA_FIB_F_PRESENT;
+	int offset = 0, ret, i;
 	static const struct {
 		int bit;
 		const char *name;
diff --git a/src/expr/flow_offload.c b/src/expr/flow_offload.c
index 188269113ee8a..a826202eb69b9 100644
--- a/src/expr/flow_offload.c
+++ b/src/expr/flow_offload.c
@@ -92,11 +92,11 @@ static int nftnl_expr_flow_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return ret;
 }
 
-static int nftnl_expr_flow_snprintf(char *buf, size_t size,
+static int nftnl_expr_flow_snprintf(char *buf, size_t remain,
 				    uint32_t flags, const struct nftnl_expr *e)
 {
-	int remain = size, offset = 0, ret;
 	struct nftnl_expr_flow *l = nftnl_expr_data(e);
+	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "flowtable %s ", l->table_name);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
diff --git a/src/expr/fwd.c b/src/expr/fwd.c
index 0322be8f4aa4b..82e5a418bfae5 100644
--- a/src/expr/fwd.c
+++ b/src/expr/fwd.c
@@ -125,11 +125,11 @@ static int nftnl_expr_fwd_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return ret;
 }
 
-static int nftnl_expr_fwd_snprintf(char *buf, size_t len,
+static int nftnl_expr_fwd_snprintf(char *buf, size_t remain,
 				   uint32_t flags, const struct nftnl_expr *e)
 {
-	int remain = len, offset = 0, ret;
 	struct nftnl_expr_fwd *fwd = nftnl_expr_data(e);
+	int offset = 0, ret;
 
 	if (e->flags & (1 << NFTNL_EXPR_FWD_SREG_DEV)) {
 		ret = snprintf(buf + offset, remain, "sreg_dev %u ",
diff --git a/src/expr/hash.c b/src/expr/hash.c
index 86b5ca6f0dfd0..10b4a72d30b0d 100644
--- a/src/expr/hash.c
+++ b/src/expr/hash.c
@@ -184,11 +184,11 @@ nftnl_expr_hash_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_hash_snprintf(char *buf, size_t size,
+nftnl_expr_hash_snprintf(char *buf, size_t remain,
 			 uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_hash *hash = nftnl_expr_data(e);
-	int remain = size, offset = 0, ret;
+	int offset = 0, ret;
 
 	switch (hash->type) {
 	case NFT_HASH_SYM:
diff --git a/src/expr/immediate.c b/src/expr/immediate.c
index 241aad3b5507c..94b043c0fc8ab 100644
--- a/src/expr/immediate.c
+++ b/src/expr/immediate.c
@@ -184,11 +184,11 @@ nftnl_expr_immediate_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_immediate_snprintf(char *buf, size_t len,
+nftnl_expr_immediate_snprintf(char *buf, size_t remain,
 			      uint32_t flags, const struct nftnl_expr *e)
 {
-	int remain = len, offset = 0, ret;
 	struct nftnl_expr_immediate *imm = nftnl_expr_data(e);
+	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "reg %u ", imm->dreg);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
diff --git a/src/expr/log.c b/src/expr/log.c
index d56fad56d27cd..86db5484d2173 100644
--- a/src/expr/log.c
+++ b/src/expr/log.c
@@ -187,11 +187,11 @@ nftnl_expr_log_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_log_snprintf(char *buf, size_t size,
+nftnl_expr_log_snprintf(char *buf, size_t remain,
 			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_log *log = nftnl_expr_data(e);
-	int ret, offset = 0, remain = size;
+	int ret, offset = 0;
 
 	if (e->flags & (1 << NFTNL_EXPR_LOG_PREFIX)) {
 		ret = snprintf(buf, remain, "prefix %s ", log->prefix);
diff --git a/src/expr/lookup.c b/src/expr/lookup.c
index ec7f6fb99e066..83adce97c98b0 100644
--- a/src/expr/lookup.c
+++ b/src/expr/lookup.c
@@ -168,11 +168,11 @@ nftnl_expr_lookup_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_lookup_snprintf(char *buf, size_t size,
+nftnl_expr_lookup_snprintf(char *buf, size_t remain,
 			   uint32_t flags, const struct nftnl_expr *e)
 {
-	int remain = size, offset = 0, ret;
 	struct nftnl_expr_lookup *l = nftnl_expr_data(e);
+	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "reg %u set %s ", l->sreg, l->set_name);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
diff --git a/src/expr/masq.c b/src/expr/masq.c
index 1f6dbdb9cc33d..684708c758390 100644
--- a/src/expr/masq.c
+++ b/src/expr/masq.c
@@ -131,11 +131,11 @@ nftnl_expr_masq_parse(struct nftnl_expr *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_expr_masq_snprintf(char *buf, size_t len,
+static int nftnl_expr_masq_snprintf(char *buf, size_t remain,
 				    uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_masq *masq = nftnl_expr_data(e);
-	int remain = len, offset = 0, ret = 0;
+	int offset = 0, ret = 0;
 
 	if (e->flags & (1 << NFTNL_EXPR_MASQ_REG_PROTO_MIN)) {
 		ret = snprintf(buf + offset, remain, "proto_min reg %u ",
diff --git a/src/expr/nat.c b/src/expr/nat.c
index 25d4e9206da79..0a9cdd7f65f8f 100644
--- a/src/expr/nat.c
+++ b/src/expr/nat.c
@@ -221,11 +221,11 @@ static inline int nftnl_str2nat(const char *nat)
 }
 
 static int
-nftnl_expr_nat_snprintf(char *buf, size_t size,
+nftnl_expr_nat_snprintf(char *buf, size_t remain,
 			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_nat *nat = nftnl_expr_data(e);
-	int remain = size, offset = 0, ret = 0;
+	int offset = 0, ret = 0;
 
 	ret = snprintf(buf, remain, "%s ", nat2str(nat->type));
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
diff --git a/src/expr/numgen.c b/src/expr/numgen.c
index 602e4c0f77426..159dfeca3618b 100644
--- a/src/expr/numgen.c
+++ b/src/expr/numgen.c
@@ -143,11 +143,11 @@ nftnl_expr_ng_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_ng_snprintf(char *buf, size_t size,
+nftnl_expr_ng_snprintf(char *buf, size_t remain,
 		       uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_ng *ng = nftnl_expr_data(e);
-	int remain = size, offset = 0, ret;
+	int offset = 0, ret;
 
 	switch (ng->type) {
 	case NFT_NG_INCREMENTAL:
diff --git a/src/expr/osf.c b/src/expr/osf.c
index 56fc4e053a7b7..215a681a97aae 100644
--- a/src/expr/osf.c
+++ b/src/expr/osf.c
@@ -125,11 +125,11 @@ nftnl_expr_osf_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_osf_snprintf(char *buf, size_t size,
+nftnl_expr_osf_snprintf(char *buf, size_t len,
 			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_osf *osf = nftnl_expr_data(e);
-	int ret, offset = 0, len = size;
+	int ret, offset = 0;
 
 	if (e->flags & (1 << NFTNL_EXPR_OSF_DREG)) {
 		ret = snprintf(buf, len, "dreg %u ", osf->dreg);
diff --git a/src/expr/queue.c b/src/expr/queue.c
index 0bab2837ad584..8f70977f7de85 100644
--- a/src/expr/queue.c
+++ b/src/expr/queue.c
@@ -144,12 +144,12 @@ nftnl_expr_queue_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_queue_snprintf(char *buf, size_t len,
+nftnl_expr_queue_snprintf(char *buf, size_t remain,
 			  uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_queue *queue = nftnl_expr_data(e);
-	int ret, remain = len, offset = 0;
 	uint16_t total_queues;
+	int ret, offset = 0;
 
 	if (e->flags & (1 << NFTNL_EXPR_QUEUE_NUM)) {
 		total_queues = queue->queuenum + queue->queues_total - 1;
diff --git a/src/expr/range.c b/src/expr/range.c
index eed48829a246d..f76843a8afd0c 100644
--- a/src/expr/range.c
+++ b/src/expr/range.c
@@ -184,11 +184,11 @@ static inline int nftnl_str2range(const char *op)
 	}
 }
 
-static int nftnl_expr_range_snprintf(char *buf, size_t size,
+static int nftnl_expr_range_snprintf(char *buf, size_t remain,
 				     uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_range *range = nftnl_expr_data(e);
-	int remain = size, offset = 0, ret;
+	int offset = 0, ret;
 
 	ret = snprintf(buf, remain, "%s reg %u ",
 		       range2str(range->op), range->sreg);
diff --git a/src/expr/redir.c b/src/expr/redir.c
index 8de4c60556dac..4f56cb4302b30 100644
--- a/src/expr/redir.c
+++ b/src/expr/redir.c
@@ -132,10 +132,10 @@ nftnl_expr_redir_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_redir_snprintf(char *buf, size_t len,
+nftnl_expr_redir_snprintf(char *buf, size_t remain,
 			  uint32_t flags, const struct nftnl_expr *e)
 {
-	int ret, remain = len, offset = 0;
+	int ret, offset = 0;
 	struct nftnl_expr_redir *redir = nftnl_expr_data(e);
 
 	if (nftnl_expr_is_set(e, NFTNL_EXPR_REDIR_REG_PROTO_MIN)) {
diff --git a/src/expr/synproxy.c b/src/expr/synproxy.c
index dc68b9d14db3a..630f3f4c60927 100644
--- a/src/expr/synproxy.c
+++ b/src/expr/synproxy.c
@@ -128,11 +128,11 @@ nftnl_expr_synproxy_parse(struct nftnl_expr *e, struct nlattr *attr)
 }
 
 static int
-nftnl_expr_synproxy_snprintf(char *buf, size_t size,
+nftnl_expr_synproxy_snprintf(char *buf, size_t len,
 			     uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_synproxy *synproxy = nftnl_expr_data(e);
-	int ret, offset = 0, len = size;
+	int ret, offset = 0;
 
 	if (e->flags & (1 << NFTNL_EXPR_SYNPROXY_MSS) &&
 	    e->flags & (1 << NFTNL_EXPR_SYNPROXY_WSCALE)) {
diff --git a/src/expr/tproxy.c b/src/expr/tproxy.c
index eeb1beee48ebe..d3ee8f89b6db3 100644
--- a/src/expr/tproxy.c
+++ b/src/expr/tproxy.c
@@ -135,11 +135,11 @@ nftnl_expr_tproxy_build(struct nlmsghdr *nlh, const struct nftnl_expr *e)
 }
 
 static int
-nftnl_expr_tproxy_snprintf(char *buf, size_t size,
+nftnl_expr_tproxy_snprintf(char *buf, size_t remain,
 			uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_tproxy *tproxy = nftnl_expr_data(e);
-	int remain = size, offset = 0, ret = 0;
+	int offset = 0, ret = 0;
 
 	if (tproxy->family != NFTA_TPROXY_UNSPEC) {
 		ret = snprintf(buf + offset, remain, "%s ",
diff --git a/src/expr/xfrm.c b/src/expr/xfrm.c
index d7586ce689c0d..c81d14d638dcd 100644
--- a/src/expr/xfrm.c
+++ b/src/expr/xfrm.c
@@ -172,11 +172,11 @@ static const char *xfrmdir2str(uint8_t dir)
 }
 
 static int
-nftnl_expr_xfrm_snprintf(char *buf, size_t size,
+nftnl_expr_xfrm_snprintf(char *buf, size_t remain,
 			 uint32_t flags, const struct nftnl_expr *e)
 {
 	struct nftnl_expr_xfrm *x = nftnl_expr_data(e);
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	if (e->flags & (1 << NFTNL_EXPR_XFRM_DREG)) {
 		ret = snprintf(buf, remain, "load %s %u %s => reg %u ",
diff --git a/src/flowtable.c b/src/flowtable.c
index 658115dd24766..d651066273460 100644
--- a/src/flowtable.c
+++ b/src/flowtable.c
@@ -591,10 +591,10 @@ int nftnl_flowtable_parse_file(struct nftnl_flowtable *c,
 	return -1;
 }
 
-static int nftnl_flowtable_snprintf_default(char *buf, size_t size,
+static int nftnl_flowtable_snprintf_default(char *buf, size_t remain,
 					    const struct nftnl_flowtable *c)
 {
-	int ret, remain = size, offset = 0, i;
+	int ret, offset = 0, i;
 
 	ret = snprintf(buf, remain, "flow table %s %s use %u size %u flags %x",
 		       c->table, c->name, c->use, c->size, c->ft_flags);
@@ -623,12 +623,12 @@ static int nftnl_flowtable_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int nftnl_flowtable_cmd_snprintf(char *buf, size_t size,
+static int nftnl_flowtable_cmd_snprintf(char *buf, size_t remain,
 					const struct nftnl_flowtable *c,
 					uint32_t cmd, uint32_t type,
 					uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	switch (type) {
 	case NFTNL_OUTPUT_DEFAULT:
diff --git a/src/gen.c b/src/gen.c
index f2ac2ba03b9a4..362132eb2766f 100644
--- a/src/gen.c
+++ b/src/gen.c
@@ -156,15 +156,15 @@ int nftnl_gen_nlmsg_parse(const struct nlmsghdr *nlh, struct nftnl_gen *gen)
 	return 0;
 }
 
-static int nftnl_gen_cmd_snprintf(char *buf, size_t size,
+static int nftnl_gen_cmd_snprintf(char *buf, size_t remain,
 				  const struct nftnl_gen *gen, uint32_t cmd,
 				  uint32_t type, uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	switch(type) {
 	case NFTNL_OUTPUT_DEFAULT:
-		ret = snprintf(buf, size, "ruleset generation ID %u", gen->id);
+		ret = snprintf(buf, remain, "ruleset generation ID %u", gen->id);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 		break;
 	default:
diff --git a/src/obj/ct_expect.c b/src/obj/ct_expect.c
index c29f99c419dcb..8136ad9c21602 100644
--- a/src/obj/ct_expect.c
+++ b/src/obj/ct_expect.c
@@ -151,13 +151,12 @@ nftnl_obj_ct_expect_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_ct_expect_snprintf(char *buf, size_t len,
+static int nftnl_obj_ct_expect_snprintf(char *buf, size_t remain,
 					uint32_t flags,
 					const struct nftnl_obj *e)
 {
-	int ret = 0;
-	int offset = 0, remain = len;
 	struct nftnl_obj_ct_expect *exp = nftnl_obj_data(e);
+	int ret = 0, offset = 0;
 
 	if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_L3PROTO)) {
 		ret = snprintf(buf + offset, remain,
diff --git a/src/obj/ct_timeout.c b/src/obj/ct_timeout.c
index a2e5b4fe6de99..1d4f8fb75ea3a 100644
--- a/src/obj/ct_timeout.c
+++ b/src/obj/ct_timeout.c
@@ -257,12 +257,11 @@ nftnl_obj_ct_timeout_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_ct_timeout_snprintf(char *buf, size_t len,
+static int nftnl_obj_ct_timeout_snprintf(char *buf, size_t remain,
 				       uint32_t flags,
 				       const struct nftnl_obj *e)
 {
-	int ret = 0;
-	int offset = 0, remain = len;
+	int ret = 0, offset = 0;
 
 	struct nftnl_obj_ct_timeout *timeout = nftnl_obj_data(e);
 
diff --git a/src/obj/synproxy.c b/src/obj/synproxy.c
index e3a991bc6e023..d689fee3757c2 100644
--- a/src/obj/synproxy.c
+++ b/src/obj/synproxy.c
@@ -117,12 +117,12 @@ static int nftnl_obj_synproxy_parse(struct nftnl_obj *e, struct nlattr *attr)
 	return 0;
 }
 
-static int nftnl_obj_synproxy_snprintf(char *buf, size_t size,
+static int nftnl_obj_synproxy_snprintf(char *buf, size_t len,
 				    uint32_t flags,
 				    const struct nftnl_obj *e)
 {
 	struct nftnl_obj_synproxy *synproxy = nftnl_obj_data(e);
-        int ret, offset = 0, len = size;
+        int ret, offset = 0;
 
         if (e->flags & (1 << NFTNL_OBJ_SYNPROXY_MSS) &&
             e->flags & (1 << NFTNL_OBJ_SYNPROXY_WSCALE)) {
diff --git a/src/object.c b/src/object.c
index 2d15629eb0f95..4eb4d35d874c9 100644
--- a/src/object.c
+++ b/src/object.c
@@ -384,14 +384,14 @@ int nftnl_obj_parse_file(struct nftnl_obj *obj, enum nftnl_parse_type type,
 	return nftnl_obj_do_parse(obj, type, fp, err, NFTNL_PARSE_FILE);
 }
 
-static int nftnl_obj_snprintf_dflt(char *buf, size_t size,
+static int nftnl_obj_snprintf_dflt(char *buf, size_t remain,
 				   const struct nftnl_obj *obj,
 				   uint32_t type, uint32_t flags)
 {
 	const char *name = obj->ops ? obj->ops->name : "(unknown)";
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
-	ret = snprintf(buf, size, "table %s name %s use %u [ %s ",
+	ret = snprintf(buf, remain, "table %s name %s use %u [ %s ",
 		       obj->table, obj->name, obj->use, name);
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
@@ -405,11 +405,11 @@ static int nftnl_obj_snprintf_dflt(char *buf, size_t size,
 	return offset;
 }
 
-static int nftnl_obj_cmd_snprintf(char *buf, size_t size,
+static int nftnl_obj_cmd_snprintf(char *buf, size_t remain,
 				    const struct nftnl_obj *obj, uint32_t cmd,
 				    uint32_t type, uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	switch (type) {
 	case NFTNL_OUTPUT_DEFAULT:
diff --git a/src/rule.c b/src/rule.c
index e82cf73e9bbe5..439e451330233 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -545,12 +545,12 @@ int nftnl_rule_parse_file(struct nftnl_rule *r, enum nftnl_parse_type type,
 	return nftnl_rule_do_parse(r, type, fp, err, NFTNL_PARSE_FILE);
 }
 
-static int nftnl_rule_snprintf_default(char *buf, size_t size,
+static int nftnl_rule_snprintf_default(char *buf, size_t remain,
 				       const struct nftnl_rule *r,
 				       uint32_t type, uint32_t flags)
 {
 	struct nftnl_expr *expr;
-	int ret, remain = size, offset = 0, i;
+	int ret, offset = 0, i;
 	const char *sep = "";
 
 	if (r->flags & (1 << NFTNL_RULE_FAMILY)) {
@@ -635,12 +635,12 @@ static int nftnl_rule_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int nftnl_rule_cmd_snprintf(char *buf, size_t size,
+static int nftnl_rule_cmd_snprintf(char *buf, size_t remain,
 				   const struct nftnl_rule *r, uint32_t cmd,
 				   uint32_t type, uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
 	uint32_t inner_flags = flags;
+	int ret, offset = 0;
 
 	inner_flags &= ~NFTNL_OF_EVENT_ANY;
 
diff --git a/src/ruleset.c b/src/ruleset.c
index 2468bd46cd5d0..f904aa4ca94a7 100644
--- a/src/ruleset.c
+++ b/src/ruleset.c
@@ -343,13 +343,13 @@ static const char *nftnl_ruleset_o_closetag(uint32_t type)
 }
 
 static int
-nftnl_ruleset_snprintf_table(char *buf, size_t size,
+nftnl_ruleset_snprintf_table(char *buf, size_t remain,
 			   const struct nftnl_ruleset *rs, uint32_t type,
 			   uint32_t flags)
 {
 	struct nftnl_table *t;
 	struct nftnl_table_list_iter *ti;
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	ti = nftnl_table_list_iter_create(rs->table_list);
 	if (ti == NULL)
@@ -372,13 +372,13 @@ nftnl_ruleset_snprintf_table(char *buf, size_t size,
 }
 
 static int
-nftnl_ruleset_snprintf_chain(char *buf, size_t size,
+nftnl_ruleset_snprintf_chain(char *buf, size_t remain,
 			   const struct nftnl_ruleset *rs, uint32_t type,
 			   uint32_t flags)
 {
 	struct nftnl_chain *c;
 	struct nftnl_chain_list_iter *ci;
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	ci = nftnl_chain_list_iter_create(rs->chain_list);
 	if (ci == NULL)
@@ -401,13 +401,13 @@ nftnl_ruleset_snprintf_chain(char *buf, size_t size,
 }
 
 static int
-nftnl_ruleset_snprintf_set(char *buf, size_t size,
+nftnl_ruleset_snprintf_set(char *buf, size_t remain,
 			 const struct nftnl_ruleset *rs, uint32_t type,
 			 uint32_t flags)
 {
 	struct nftnl_set *s;
 	struct nftnl_set_list_iter *si;
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	si = nftnl_set_list_iter_create(rs->set_list);
 	if (si == NULL)
@@ -430,13 +430,13 @@ nftnl_ruleset_snprintf_set(char *buf, size_t size,
 }
 
 static int
-nftnl_ruleset_snprintf_rule(char *buf, size_t size,
+nftnl_ruleset_snprintf_rule(char *buf, size_t remain,
 			  const struct nftnl_ruleset *rs, uint32_t type,
 			  uint32_t flags)
 {
 	struct nftnl_rule *r;
 	struct nftnl_rule_list_iter *ri;
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	ri = nftnl_rule_list_iter_create(rs->rule_list);
 	if (ri == NULL)
@@ -459,12 +459,13 @@ nftnl_ruleset_snprintf_rule(char *buf, size_t size,
 }
 
 static int
-nftnl_ruleset_do_snprintf(char *buf, size_t size, const struct nftnl_ruleset *rs,
-			uint32_t cmd, uint32_t type, uint32_t flags)
+nftnl_ruleset_do_snprintf(char *buf, size_t remain,
+			  const struct nftnl_ruleset *rs,
+			  uint32_t cmd, uint32_t type, uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
-	void *prev = NULL;
 	uint32_t inner_flags = flags;
+	int ret, offset = 0;
+	void *prev = NULL;
 
 	/* dont pass events flags to child calls of _snprintf() */
 	inner_flags &= ~NFTNL_OF_EVENT_ANY;
diff --git a/src/set.c b/src/set.c
index a21df1fa50f41..021543e8b7752 100644
--- a/src/set.c
+++ b/src/set.c
@@ -784,13 +784,12 @@ int nftnl_set_parse_file(struct nftnl_set *s, enum nftnl_parse_type type,
 	return nftnl_set_do_parse(s, type, fp, err, NFTNL_PARSE_FILE);
 }
 
-static int nftnl_set_snprintf_default(char *buf, size_t size,
+static int nftnl_set_snprintf_default(char *buf, size_t remain,
 				      const struct nftnl_set *s,
 				      uint32_t type, uint32_t flags)
 {
-	int ret;
-	int remain = size, offset = 0;
 	struct nftnl_set_elem *elem;
+	int ret, offset = 0;
 
 	ret = snprintf(buf, remain, "%s %s %x",
 			s->name, s->table, s->set_flags);
@@ -837,12 +836,12 @@ static int nftnl_set_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int nftnl_set_cmd_snprintf(char *buf, size_t size,
+static int nftnl_set_cmd_snprintf(char *buf, size_t remain,
 				  const struct nftnl_set *s, uint32_t cmd,
 				  uint32_t type, uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
 	uint32_t inner_flags = flags;
+	int ret, offset = 0;
 
 	if (type == NFTNL_OUTPUT_XML)
 		return 0;
diff --git a/src/set_elem.c b/src/set_elem.c
index 061469a74789c..a1764e232d335 100644
--- a/src/set_elem.c
+++ b/src/set_elem.c
@@ -698,13 +698,12 @@ int nftnl_set_elem_parse_file(struct nftnl_set_elem *e, enum nftnl_parse_type ty
 	return -1;
 }
 
-int nftnl_set_elem_snprintf_default(char *buf, size_t size,
+int nftnl_set_elem_snprintf_default(char *buf, size_t remain,
 				    const struct nftnl_set_elem *e,
 				    enum nft_data_types dtype)
 {
 	int dregtype = (dtype == NFT_DATA_VERDICT) ? DATA_VERDICT : DATA_VALUE;
-
-	int ret, remain = size, offset = 0, i;
+	int ret, offset = 0, i;
 
 	ret = snprintf(buf, remain, "element ");
 	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
@@ -751,12 +750,12 @@ int nftnl_set_elem_snprintf_default(char *buf, size_t size,
 	return offset;
 }
 
-static int nftnl_set_elem_cmd_snprintf(char *buf, size_t size,
+static int nftnl_set_elem_cmd_snprintf(char *buf, size_t remain,
 				       const struct nftnl_set_elem *e,
 				       uint32_t cmd, uint32_t type,
 				       uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	switch(type) {
 	case NFTNL_OUTPUT_DEFAULT:
diff --git a/src/table.c b/src/table.c
index 32f1bf705f9ff..5835788dce2e2 100644
--- a/src/table.c
+++ b/src/table.c
@@ -367,11 +367,11 @@ static int nftnl_table_snprintf_default(char *buf, size_t size,
 			t->table_flags, t->use, (unsigned long long)t->handle);
 }
 
-static int nftnl_table_cmd_snprintf(char *buf, size_t size,
+static int nftnl_table_cmd_snprintf(char *buf, size_t remain,
 				    const struct nftnl_table *t, uint32_t cmd,
 				    uint32_t type, uint32_t flags)
 {
-	int ret, remain = size, offset = 0;
+	int ret, offset = 0;
 
 	switch (type) {
 	case NFTNL_OUTPUT_DEFAULT:
-- 
2.30.1


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

* [libnftnl PATCH 09/10] Get rid of single option switch statements
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
                   ` (7 preceding siblings ...)
  2021-03-09 15:45 ` [libnftnl PATCH 08/10] Drop pointless local variable in snprintf callbacks Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  2021-03-09 15:45 ` [libnftnl PATCH 10/10] ruleset: Eliminate tag and separator helpers Phil Sutter
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel, Arturo Borrero

Replace each by a conditional testing the only valid case.

There is one odd example, namely src/set.c: When printing a set with
type NFTNL_OUTPUT_XML, the relevant function would return 0 instead of
-1 like all others. Just drop it assuming nothing depends on that
(faulty) behaviour.

Cc: Arturo Borrero <arturo.borrero.glez@gmail.com>
Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 src/chain.c     | 12 +++---------
 src/flowtable.c | 13 +++----------
 src/gen.c       | 10 +++-------
 src/object.c    | 13 +++----------
 src/rule.c      | 14 ++++----------
 src/ruleset.c   | 26 +++-----------------------
 src/set.c       | 17 +++++------------
 src/set_elem.c  | 15 ++++-----------
 src/table.c     | 12 +++---------
 9 files changed, 31 insertions(+), 101 deletions(-)

diff --git a/src/chain.c b/src/chain.c
index 7906bf44ff72d..cb5ec6b462197 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -890,17 +890,11 @@ static int nftnl_chain_cmd_snprintf(char *buf, size_t remain,
 {
 	int ret, offset = 0;
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		ret = nftnl_chain_snprintf_default(buf + offset, remain, c);
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
-		break;
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
+	if (type != NFTNL_OUTPUT_DEFAULT)
 		return -1;
-	}
 
+	ret = nftnl_chain_snprintf_default(buf + offset, remain, c);
+	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	return offset;
 }
 
diff --git a/src/flowtable.c b/src/flowtable.c
index d651066273460..e6c24753525c8 100644
--- a/src/flowtable.c
+++ b/src/flowtable.c
@@ -630,18 +630,11 @@ static int nftnl_flowtable_cmd_snprintf(char *buf, size_t remain,
 {
 	int ret, offset = 0;
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		ret = nftnl_flowtable_snprintf_default(buf + offset, remain, c);
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
-		break;
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-		break;
-	default:
+	if (type != NFTNL_OUTPUT_DEFAULT)
 		return -1;
-	}
 
+	ret = nftnl_flowtable_snprintf_default(buf + offset, remain, c);
+	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	return offset;
 }
 
diff --git a/src/gen.c b/src/gen.c
index 362132eb2766f..88efbaaba9acc 100644
--- a/src/gen.c
+++ b/src/gen.c
@@ -162,15 +162,11 @@ static int nftnl_gen_cmd_snprintf(char *buf, size_t remain,
 {
 	int ret, offset = 0;
 
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		ret = snprintf(buf, remain, "ruleset generation ID %u", gen->id);
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
-		break;
-	default:
+	if (type != NFTNL_OUTPUT_DEFAULT)
 		return -1;
-	}
 
+	ret = snprintf(buf, remain, "ruleset generation ID %u", gen->id);
+	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	return offset;
 }
 
diff --git a/src/object.c b/src/object.c
index 4eb4d35d874c9..46e208b666cae 100644
--- a/src/object.c
+++ b/src/object.c
@@ -411,18 +411,11 @@ static int nftnl_obj_cmd_snprintf(char *buf, size_t remain,
 {
 	int ret, offset = 0;
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		ret = nftnl_obj_snprintf_dflt(buf + offset, remain, obj, type,
-					      flags);
-		break;
-	case NFTNL_OUTPUT_JSON:
-	case NFTNL_OUTPUT_XML:
-	default:
+	if (type != NFTNL_OUTPUT_DEFAULT)
 		return -1;
-	}
-	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
+	ret = nftnl_obj_snprintf_dflt(buf + offset, remain, obj, type, flags);
+	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	return offset;
 }
 
diff --git a/src/rule.c b/src/rule.c
index 439e451330233..0bb1c2a0583c1 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -644,18 +644,12 @@ static int nftnl_rule_cmd_snprintf(char *buf, size_t remain,
 
 	inner_flags &= ~NFTNL_OF_EVENT_ANY;
 
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		ret = nftnl_rule_snprintf_default(buf + offset, remain, r, type,
-						inner_flags);
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
-		break;
-	case NFTNL_OUTPUT_JSON:
-	case NFTNL_OUTPUT_XML:
-	default:
+	if (type != NFTNL_OUTPUT_DEFAULT)
 		return -1;
-	}
 
+	ret = nftnl_rule_snprintf_default(buf + offset, remain, r, type,
+					inner_flags);
+	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	return offset;
 }
 
diff --git a/src/ruleset.c b/src/ruleset.c
index f904aa4ca94a7..4788cc09b8fca 100644
--- a/src/ruleset.c
+++ b/src/ruleset.c
@@ -522,21 +522,6 @@ nftnl_ruleset_do_snprintf(char *buf, size_t remain,
 	return offset;
 }
 
-static int nftnl_ruleset_cmd_snprintf(char *buf, size_t size,
-				    const struct nftnl_ruleset *r, uint32_t cmd,
-				    uint32_t type, uint32_t flags)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-	case NFTNL_OUTPUT_JSON:
-		return nftnl_ruleset_do_snprintf(buf, size, r, cmd, type, flags);
-	case NFTNL_OUTPUT_XML:
-	default:
-		errno = EOPNOTSUPP;
-		return -1;
-	}
-}
-
 EXPORT_SYMBOL(nftnl_ruleset_snprintf);
 int nftnl_ruleset_snprintf(char *buf, size_t size, const struct nftnl_ruleset *r,
 			 uint32_t type, uint32_t flags)
@@ -544,17 +529,12 @@ int nftnl_ruleset_snprintf(char *buf, size_t size, const struct nftnl_ruleset *r
 	if (size)
 		buf[0] = '\0';
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-	case NFTNL_OUTPUT_JSON:
-		return nftnl_ruleset_cmd_snprintf(buf, size, r,
-						nftnl_flag2cmd(flags), type,
-						flags);
-	case NFTNL_OUTPUT_XML:
-	default:
+	if (type != NFTNL_OUTPUT_DEFAULT) {
 		errno = EOPNOTSUPP;
 		return -1;
 	}
+	return nftnl_ruleset_do_snprintf(buf, size, r, nftnl_flag2cmd(flags),
+					 type, flags);
 }
 
 static int nftnl_ruleset_fprintf_tables(FILE *fp, const struct nftnl_ruleset *rs,
diff --git a/src/set.c b/src/set.c
index 021543e8b7752..1c29dd26e88dc 100644
--- a/src/set.c
+++ b/src/set.c
@@ -843,22 +843,15 @@ static int nftnl_set_cmd_snprintf(char *buf, size_t remain,
 	uint32_t inner_flags = flags;
 	int ret, offset = 0;
 
-	if (type == NFTNL_OUTPUT_XML)
-		return 0;
+	if (type != NFTNL_OUTPUT_DEFAULT)
+		return -1;
 
 	/* prevent set_elems to print as events */
 	inner_flags &= ~NFTNL_OF_EVENT_ANY;
 
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		ret = nftnl_set_snprintf_default(buf + offset, remain, s, type,
-					       inner_flags);
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
-		break;
-	default:
-		return -1;
-	}
-
+	ret = nftnl_set_snprintf_default(buf + offset, remain, s, type,
+					 inner_flags);
+	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	return offset;
 }
 
diff --git a/src/set_elem.c b/src/set_elem.c
index a1764e232d335..90632a2983126 100644
--- a/src/set_elem.c
+++ b/src/set_elem.c
@@ -757,19 +757,12 @@ static int nftnl_set_elem_cmd_snprintf(char *buf, size_t remain,
 {
 	int ret, offset = 0;
 
-	switch(type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		ret = nftnl_set_elem_snprintf_default(buf + offset, remain, e,
-						      NFT_DATA_VALUE);
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
-		break;
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-		break;
-	default:
+	if (type != NFTNL_OUTPUT_DEFAULT)
 		return -1;
-	}
 
+	ret = nftnl_set_elem_snprintf_default(buf + offset, remain, e,
+					      NFT_DATA_VALUE);
+	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	return offset;
 }
 
diff --git a/src/table.c b/src/table.c
index 5835788dce2e2..59e7053ac3c0d 100644
--- a/src/table.c
+++ b/src/table.c
@@ -373,17 +373,11 @@ static int nftnl_table_cmd_snprintf(char *buf, size_t remain,
 {
 	int ret, offset = 0;
 
-	switch (type) {
-	case NFTNL_OUTPUT_DEFAULT:
-		ret = nftnl_table_snprintf_default(buf + offset, remain, t);
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
-		break;
-	case NFTNL_OUTPUT_XML:
-	case NFTNL_OUTPUT_JSON:
-	default:
+	if (type != NFTNL_OUTPUT_DEFAULT)
 		return -1;
-	}
 
+	ret = nftnl_table_snprintf_default(buf + offset, remain, t);
+	SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 	return offset;
 }
 
-- 
2.30.1


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

* [libnftnl PATCH 10/10] ruleset: Eliminate tag and separator helpers
  2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
                   ` (8 preceding siblings ...)
  2021-03-09 15:45 ` [libnftnl PATCH 09/10] Get rid of single option switch statements Phil Sutter
@ 2021-03-09 15:45 ` Phil Sutter
  9 siblings, 0 replies; 11+ messages in thread
From: Phil Sutter @ 2021-03-09 15:45 UTC (permalink / raw)
  To: Pablo Neira Ayuso; +Cc: netfilter-devel

Those were used for JSON and XML output only with the exception of
separator helper which at the same time served as conditional nop if no
"previous" object as passed. Replace it by a string variable updated at
the end of each loop iteration and just drop the other helpers.

Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 src/ruleset.c | 151 ++++++++++++++++++++------------------------------
 1 file changed, 59 insertions(+), 92 deletions(-)

diff --git a/src/ruleset.c b/src/ruleset.c
index 4788cc09b8fca..185aa48737e50 100644
--- a/src/ruleset.c
+++ b/src/ruleset.c
@@ -305,43 +305,6 @@ int nftnl_ruleset_parse_file(struct nftnl_ruleset *rs, enum nftnl_parse_type typ
 	return nftnl_ruleset_parse_file_cb(type, fp, err, rs, nftnl_ruleset_cb);
 }
 
-static const char *nftnl_ruleset_o_opentag(uint32_t type)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_JSON:
-		return "{\"nftables\":[";
-	case NFTNL_OUTPUT_XML:
-	default:
-		return "";
-	}
-}
-
-static const char *nftnl_ruleset_o_separator(void *obj, uint32_t type)
-{
-	if (obj == NULL)
-		return "";
-
-	switch (type) {
-	case NFTNL_OUTPUT_JSON:
-		return ",";
-	case NFTNL_OUTPUT_DEFAULT:
-		return "\n";
-	default:
-		return "";
-	}
-}
-
-static const char *nftnl_ruleset_o_closetag(uint32_t type)
-{
-	switch (type) {
-	case NFTNL_OUTPUT_JSON:
-		return "]}";
-	case NFTNL_OUTPUT_XML:
-	default:
-		return "";
-	}
-}
-
 static int
 nftnl_ruleset_snprintf_table(char *buf, size_t remain,
 			   const struct nftnl_ruleset *rs, uint32_t type,
@@ -349,6 +312,7 @@ nftnl_ruleset_snprintf_table(char *buf, size_t remain,
 {
 	struct nftnl_table *t;
 	struct nftnl_table_list_iter *ti;
+	const char *sep = "";
 	int ret, offset = 0;
 
 	ti = nftnl_table_list_iter_create(rs->table_list);
@@ -357,14 +321,14 @@ nftnl_ruleset_snprintf_table(char *buf, size_t remain,
 
 	t = nftnl_table_list_iter_next(ti);
 	while (t != NULL) {
+		ret = snprintf(buf + offset, remain, "%s", sep);
+		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+
 		ret = nftnl_table_snprintf(buf + offset, remain, t, type, flags);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		t = nftnl_table_list_iter_next(ti);
-
-		ret = snprintf(buf + offset, remain, "%s",
-			       nftnl_ruleset_o_separator(t, type));
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+		sep = "\n";
 	}
 	nftnl_table_list_iter_destroy(ti);
 
@@ -378,6 +342,7 @@ nftnl_ruleset_snprintf_chain(char *buf, size_t remain,
 {
 	struct nftnl_chain *c;
 	struct nftnl_chain_list_iter *ci;
+	const char *sep = "";
 	int ret, offset = 0;
 
 	ci = nftnl_chain_list_iter_create(rs->chain_list);
@@ -386,14 +351,14 @@ nftnl_ruleset_snprintf_chain(char *buf, size_t remain,
 
 	c = nftnl_chain_list_iter_next(ci);
 	while (c != NULL) {
+		ret = snprintf(buf + offset, remain, "%s", sep);
+		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+
 		ret = nftnl_chain_snprintf(buf + offset, remain, c, type, flags);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		c = nftnl_chain_list_iter_next(ci);
-
-		ret = snprintf(buf + offset, remain, "%s",
-			       nftnl_ruleset_o_separator(c, type));
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+		sep = "\n";
 	}
 	nftnl_chain_list_iter_destroy(ci);
 
@@ -407,6 +372,7 @@ nftnl_ruleset_snprintf_set(char *buf, size_t remain,
 {
 	struct nftnl_set *s;
 	struct nftnl_set_list_iter *si;
+	const char *sep = "";
 	int ret, offset = 0;
 
 	si = nftnl_set_list_iter_create(rs->set_list);
@@ -415,14 +381,14 @@ nftnl_ruleset_snprintf_set(char *buf, size_t remain,
 
 	s = nftnl_set_list_iter_next(si);
 	while (s != NULL) {
+		ret = snprintf(buf + offset, remain, "%s", sep);
+		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+
 		ret = nftnl_set_snprintf(buf + offset, remain, s, type, flags);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		s = nftnl_set_list_iter_next(si);
-
-		ret = snprintf(buf + offset, remain, "%s",
-			       nftnl_ruleset_o_separator(s, type));
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+		sep = "\n";
 	}
 	nftnl_set_list_iter_destroy(si);
 
@@ -436,6 +402,7 @@ nftnl_ruleset_snprintf_rule(char *buf, size_t remain,
 {
 	struct nftnl_rule *r;
 	struct nftnl_rule_list_iter *ri;
+	const char *sep = "";
 	int ret, offset = 0;
 
 	ri = nftnl_rule_list_iter_create(rs->rule_list);
@@ -444,14 +411,14 @@ nftnl_ruleset_snprintf_rule(char *buf, size_t remain,
 
 	r = nftnl_rule_list_iter_next(ri);
 	while (r != NULL) {
+		ret = snprintf(buf + offset, remain, "%s", sep);
+		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+
 		ret = nftnl_rule_snprintf(buf + offset, remain, r, type, flags);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		r = nftnl_rule_list_iter_next(ri);
-
-		ret = snprintf(buf + offset, remain, "%s",
-			       nftnl_ruleset_o_separator(r, type));
-		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+		sep = "\n";
 	}
 	nftnl_rule_list_iter_destroy(ri);
 
@@ -464,8 +431,8 @@ nftnl_ruleset_do_snprintf(char *buf, size_t remain,
 			  uint32_t cmd, uint32_t type, uint32_t flags)
 {
 	uint32_t inner_flags = flags;
+	const char *sep = "";
 	int ret, offset = 0;
-	void *prev = NULL;
 
 	/* dont pass events flags to child calls of _snprintf() */
 	inner_flags &= ~NFTNL_OF_EVENT_ANY;
@@ -477,13 +444,12 @@ nftnl_ruleset_do_snprintf(char *buf, size_t remain,
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		if (ret > 0)
-			prev = rs->table_list;
+			sep = "\n";
 	}
 
 	if (nftnl_ruleset_is_set(rs, NFTNL_RULESET_CHAINLIST) &&
 	    (!nftnl_chain_list_is_empty(rs->chain_list))) {
-		ret = snprintf(buf + offset, remain, "%s",
-			       nftnl_ruleset_o_separator(prev, type));
+		ret = snprintf(buf + offset, remain, "%s", sep);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		ret = nftnl_ruleset_snprintf_chain(buf + offset, remain, rs,
@@ -491,13 +457,12 @@ nftnl_ruleset_do_snprintf(char *buf, size_t remain,
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		if (ret > 0)
-			prev = rs->chain_list;
+			sep = "\n";
 	}
 
 	if (nftnl_ruleset_is_set(rs, NFTNL_RULESET_SETLIST) &&
 	    (!nftnl_set_list_is_empty(rs->set_list))) {
-		ret = snprintf(buf + offset, remain, "%s",
-			       nftnl_ruleset_o_separator(prev, type));
+		ret = snprintf(buf + offset, remain, "%s", sep);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		ret = nftnl_ruleset_snprintf_set(buf + offset, remain, rs,
@@ -505,13 +470,12 @@ nftnl_ruleset_do_snprintf(char *buf, size_t remain,
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		if (ret > 0)
-			prev = rs->set_list;
+			sep = "\n";
 	}
 
 	if (nftnl_ruleset_is_set(rs, NFTNL_RULESET_RULELIST) &&
 	    (!nftnl_rule_list_is_empty(rs->rule_list))) {
-		ret = snprintf(buf + offset, remain, "%s",
-			       nftnl_ruleset_o_separator(prev, type));
+		ret = snprintf(buf + offset, remain, "%s", sep);
 		SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
 		ret = nftnl_ruleset_snprintf_rule(buf + offset, remain, rs,
@@ -543,6 +507,7 @@ static int nftnl_ruleset_fprintf_tables(FILE *fp, const struct nftnl_ruleset *rs
 	int len = 0, ret = 0;
 	struct nftnl_table *t;
 	struct nftnl_table_list_iter *ti;
+	const char *sep = "";
 
 	ti = nftnl_table_list_iter_create(rs->table_list);
 	if (ti == NULL)
@@ -550,19 +515,21 @@ static int nftnl_ruleset_fprintf_tables(FILE *fp, const struct nftnl_ruleset *rs
 
 	t = nftnl_table_list_iter_next(ti);
 	while (t != NULL) {
-		ret = nftnl_table_fprintf(fp, t, type, flags);
+		ret = fprintf(fp, "%s", sep);
 		if (ret < 0)
 			goto err;
 
 		len += ret;
 
-		t = nftnl_table_list_iter_next(ti);
-
-		ret = fprintf(fp, "%s", nftnl_ruleset_o_separator(t, type));
+		ret = nftnl_table_fprintf(fp, t, type, flags);
 		if (ret < 0)
 			goto err;
 
 		len += ret;
+
+		t = nftnl_table_list_iter_next(ti);
+		sep = "\n";
+
 	}
 	nftnl_table_list_iter_destroy(ti);
 
@@ -578,6 +545,7 @@ static int nftnl_ruleset_fprintf_chains(FILE *fp, const struct nftnl_ruleset *rs
 	int len = 0, ret = 0;
 	struct nftnl_chain *o;
 	struct nftnl_chain_list_iter *i;
+	const char *sep = "";
 
 	i = nftnl_chain_list_iter_create(rs->chain_list);
 	if (i == NULL)
@@ -585,19 +553,20 @@ static int nftnl_ruleset_fprintf_chains(FILE *fp, const struct nftnl_ruleset *rs
 
 	o = nftnl_chain_list_iter_next(i);
 	while (o != NULL) {
-		ret = nftnl_chain_fprintf(fp, o, type, flags);
+		ret = fprintf(fp, "%s", sep);
 		if (ret < 0)
 			goto err;
 
 		len += ret;
 
-		o = nftnl_chain_list_iter_next(i);
-
-		ret = fprintf(fp, "%s", nftnl_ruleset_o_separator(o, type));
+		ret = nftnl_chain_fprintf(fp, o, type, flags);
 		if (ret < 0)
 			goto err;
 
 		len += ret;
+
+		o = nftnl_chain_list_iter_next(i);
+		sep = "\n";
 	}
 	nftnl_chain_list_iter_destroy(i);
 
@@ -613,6 +582,7 @@ static int nftnl_ruleset_fprintf_sets(FILE *fp, const struct nftnl_ruleset *rs,
 	int len = 0, ret = 0;
 	struct nftnl_set *o;
 	struct nftnl_set_list_iter *i;
+	const char *sep = "";
 
 	i = nftnl_set_list_iter_create(rs->set_list);
 	if (i == NULL)
@@ -620,19 +590,20 @@ static int nftnl_ruleset_fprintf_sets(FILE *fp, const struct nftnl_ruleset *rs,
 
 	o = nftnl_set_list_iter_next(i);
 	while (o != NULL) {
-		ret = nftnl_set_fprintf(fp, o, type, flags);
+		ret = fprintf(fp, "%s", sep);
 		if (ret < 0)
 			goto err;
 
 		len += ret;
 
-		o = nftnl_set_list_iter_next(i);
-
-		ret = fprintf(fp, "%s", nftnl_ruleset_o_separator(o, type));
+		ret = nftnl_set_fprintf(fp, o, type, flags);
 		if (ret < 0)
 			goto err;
 
 		len += ret;
+
+		o = nftnl_set_list_iter_next(i);
+		sep = "\n";
 	}
 	nftnl_set_list_iter_destroy(i);
 
@@ -648,6 +619,7 @@ static int nftnl_ruleset_fprintf_rules(FILE *fp, const struct nftnl_ruleset *rs,
 	int len = 0, ret = 0;
 	struct nftnl_rule *o;
 	struct nftnl_rule_list_iter *i;
+	const char *sep = "";
 
 	i = nftnl_rule_list_iter_create(rs->rule_list);
 	if (i == NULL)
@@ -655,19 +627,20 @@ static int nftnl_ruleset_fprintf_rules(FILE *fp, const struct nftnl_ruleset *rs,
 
 	o = nftnl_rule_list_iter_next(i);
 	while (o != NULL) {
-		ret = nftnl_rule_fprintf(fp, o, type, flags);
+		ret = fprintf(fp, "%s", sep);
 		if (ret < 0)
 			goto err;
 
 		len += ret;
 
-		o = nftnl_rule_list_iter_next(i);
-
-		ret = fprintf(fp, "%s", nftnl_ruleset_o_separator(o, type));
+		ret = nftnl_rule_fprintf(fp, o, type, flags);
 		if (ret < 0)
 			goto err;
 
 		len += ret;
+
+		o = nftnl_rule_list_iter_next(i);
+		sep = "\n";
 	}
 	nftnl_rule_list_iter_destroy(i);
 
@@ -686,60 +659,54 @@ static int nftnl_ruleset_cmd_fprintf(FILE *fp, const struct nftnl_ruleset *rs,
 				   uint32_t cmd, uint32_t type, uint32_t flags)
 {
 	int len = 0, ret = 0;
-	void *prev = NULL;
 	uint32_t inner_flags = flags;
+	const char *sep = "";
 
 	/* dont pass events flags to child calls of _snprintf() */
 	inner_flags &= ~NFTNL_OF_EVENT_ANY;
 
-	ret = fprintf(fp, "%s", nftnl_ruleset_o_opentag(type));
-	NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
-
 	if ((nftnl_ruleset_is_set(rs, NFTNL_RULESET_TABLELIST)) &&
 	    (!nftnl_table_list_is_empty(rs->table_list))) {
 		ret = nftnl_ruleset_fprintf_tables(fp, rs, type, inner_flags);
 		NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
 
 		if (ret > 0)
-			prev = rs->table_list;
+			sep = "\n";
 	}
 
 	if ((nftnl_ruleset_is_set(rs, NFTNL_RULESET_CHAINLIST)) &&
 	    (!nftnl_chain_list_is_empty(rs->chain_list))) {
-		ret = fprintf(fp, "%s", nftnl_ruleset_o_separator(prev, type));
+		ret = fprintf(fp, "%s", sep);
 		NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
 
 		ret = nftnl_ruleset_fprintf_chains(fp, rs, type, inner_flags);
 		NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
 
 		if (ret > 0)
-			prev = rs->chain_list;
+			sep = "\n";
 	}
 
 	if ((nftnl_ruleset_is_set(rs, NFTNL_RULESET_SETLIST)) &&
 	    (!nftnl_set_list_is_empty(rs->set_list))) {
-		ret = fprintf(fp, "%s", nftnl_ruleset_o_separator(prev, type));
+		ret = fprintf(fp, "%s", sep);
 		NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
 
 		ret = nftnl_ruleset_fprintf_sets(fp, rs, type, inner_flags);
 		NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
 
 		if (ret > 0)
-			prev = rs->set_list;
+			sep = "\n";
 	}
 
 	if ((nftnl_ruleset_is_set(rs, NFTNL_RULESET_RULELIST)) &&
 	    (!nftnl_rule_list_is_empty(rs->rule_list))) {
-		ret = fprintf(fp, "%s", nftnl_ruleset_o_separator(prev, type));
+		ret = fprintf(fp, "%s", sep);
 		NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
 
 		ret = nftnl_ruleset_fprintf_rules(fp, rs, type, inner_flags);
 		NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
 	}
 
-	ret = fprintf(fp, "%s", nftnl_ruleset_o_closetag(type));
-	NFTNL_FPRINTF_RETURN_OR_FIXLEN(ret, len);
-
 	return len;
 }
 
-- 
2.30.1


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

end of thread, other threads:[~2021-03-09 15:47 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-09 15:45 [libnftnl PATCH 00/10] Kill non-default output leftovers Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 01/10] expr: Fix snprintf buffer length updates Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 02/10] obj/ct_expect: " Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 03/10] obj/ct_timeout: " Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 04/10] object: Fix for wrong parameter passed to snprintf callback Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 05/10] expr: Check output type once and for all Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 06/10] expr/data_reg: Drop output_format parameter Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 07/10] obj: Drop type parameter from snprintf callback Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 08/10] Drop pointless local variable in snprintf callbacks Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 09/10] Get rid of single option switch statements Phil Sutter
2021-03-09 15:45 ` [libnftnl PATCH 10/10] ruleset: Eliminate tag and separator helpers Phil Sutter

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.