diff mbox series

[nft] table: rework flags printing

Message ID 20210222205323.22189-1-pablo@netfilter.org
State Accepted
Delegated to: Pablo Neira
Headers show
Series [nft] table: rework flags printing | expand

Commit Message

Pablo Neira Ayuso Feb. 22, 2021, 8:53 p.m. UTC
Simplify routine to print the table flags. Add table_flag_name() and use
it from json too.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 include/rule.h |  2 +-
 src/json.c     |  2 +-
 src/rule.c     | 37 ++++++++++++++++++++++++-------------
 3 files changed, 26 insertions(+), 15 deletions(-)
diff mbox series

Patch

diff --git a/include/rule.h b/include/rule.h
index 330a09aa77fa..87b6828edca4 100644
--- a/include/rule.h
+++ b/include/rule.h
@@ -134,7 +134,7 @@  enum table_flags {
 };
 #define TABLE_FLAGS_MAX 1
 
-extern const char *table_flags_name[TABLE_FLAGS_MAX];
+const char *table_flag_name(uint32_t flag);
 
 /**
  * struct table - nftables table
diff --git a/src/json.c b/src/json.c
index 0ccbbe8a75d2..defbc8fb44df 100644
--- a/src/json.c
+++ b/src/json.c
@@ -444,7 +444,7 @@  static json_t *table_flags_json(const struct table *table)
 
 	while (flags) {
 		if (flags & 0x1) {
-			tmp = json_string(table_flags_name[i]);
+			tmp = json_string(table_flag_name(i));
 			json_array_append_new(root, tmp);
 		}
 		flags >>= 1;
diff --git a/src/rule.c b/src/rule.c
index e4bb6bae276a..d22ab5009790 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -1405,29 +1405,40 @@  struct table *table_lookup_fuzzy(const struct handle *h,
 	return st.obj;
 }
 
-const char *table_flags_name[TABLE_FLAGS_MAX] = {
+static const char *table_flags_name[TABLE_FLAGS_MAX] = {
 	"dormant",
 };
 
-static void table_print_options(const struct table *table, const char **delim,
-				struct output_ctx *octx)
+const char *table_flag_name(uint32_t flag)
+{
+	if (flag >= TABLE_FLAGS_MAX)
+		return "unknown";
+
+	return table_flags_name[flag];
+}
+
+static void table_print_flags(const struct table *table, const char **delim,
+			      struct output_ctx *octx)
 {
 	uint32_t flags = table->flags;
+	bool comma = false;
 	int i;
 
-	if (flags) {
-		nft_print(octx, "\tflags ");
+	if (!table->flags)
+		return;
 
-		for (i = 0; i < TABLE_FLAGS_MAX; i++) {
-			if (flags & 0x1)
-				nft_print(octx, "%s", table_flags_name[i]);
-			flags >>= 1;
-			if (flags)
+	nft_print(octx, "\tflags ");
+	for (i = 0; i < TABLE_FLAGS_MAX; i++) {
+		if (flags & (1 << i)) {
+			if (comma)
 				nft_print(octx, ",");
+
+			nft_print(octx, "%s", table_flag_name(i));
+			comma = true;
 		}
-		nft_print(octx, "\n");
-		*delim = "\n";
 	}
+	nft_print(octx, "\n");
+	*delim = "\n";
 }
 
 static void table_print(const struct table *table, struct output_ctx *octx)
@@ -1443,7 +1454,7 @@  static void table_print(const struct table *table, struct output_ctx *octx)
 	if (nft_output_handle(octx))
 		nft_print(octx, " # handle %" PRIu64, table->handle.handle.id);
 	nft_print(octx, "\n");
-	table_print_options(table, &delim, octx);
+	table_print_flags(table, &delim, octx);
 
 	if (table->comment)
 		nft_print(octx, "\tcomment \"%s\"\n", table->comment);