]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: add datatype->describe()
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 24 Mar 2021 16:19:32 +0000 (17:19 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 25 Mar 2021 11:12:13 +0000 (12:12 +0100)
As an alternative to print the datatype values when no symbol table is
available. Use it to print protocols available via getprotobynumber()
which actually refers to /etc/protocols.

Not very efficient, getprotobynumber() causes a series of open()/close()
calls on /etc/protocols, but this is called from a non-critical path.

Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1503
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/datatype.h
src/datatype.c
src/expression.c

index 1061a389b0f03bce05b8b91ed6c4c0d9fa3ae1d8..a16f8f2bf5c461f5358d00154da0cbe9e2fc6828 100644 (file)
@@ -164,6 +164,7 @@ struct datatype {
        struct error_record             *(*parse)(struct parse_ctx *ctx,
                                                  const struct expr *sym,
                                                  struct expr **res);
+       void                            (*describe)(struct output_ctx *octx);
        const struct symbol_table       *sym_tbl;
        unsigned int                    refcnt;
 };
index 7382307e990947289c81285a20021a626e6e8825..fae1aa262599e306265c1814302d6211fe991473 100644 (file)
@@ -619,6 +619,20 @@ static void inet_protocol_type_print(const struct expr *expr,
        integer_type_print(expr, octx);
 }
 
+static void inet_protocol_type_describe(struct output_ctx *octx)
+{
+       struct protoent *p;
+       uint8_t protonum;
+
+       for (protonum = 0; protonum < UINT8_MAX; protonum++) {
+               p = getprotobynumber(protonum);
+               if (!p)
+                       continue;
+
+               nft_print(octx, "\t%-30s\t%u\n", p->p_name, protonum);
+       }
+}
+
 static struct error_record *inet_protocol_type_parse(struct parse_ctx *ctx,
                                                     const struct expr *sym,
                                                     struct expr **res)
@@ -658,6 +672,7 @@ const struct datatype inet_protocol_type = {
        .print          = inet_protocol_type_print,
        .json           = inet_protocol_type_json,
        .parse          = inet_protocol_type_parse,
+       .describe       = inet_protocol_type_describe,
 };
 
 static void inet_service_print(const struct expr *expr, struct output_ctx *octx)
index 0c5276d1118d4b4926ffb0605011ec0b5f397cb0..9fdf23d9844619a412ffdb5ed2f8d3836108ec95 100644 (file)
@@ -172,6 +172,8 @@ void expr_describe(const struct expr *expr, struct output_ctx *octx)
                        nft_print(octx, "(in hexadecimal):\n");
                symbol_table_print(edtype->sym_tbl, edtype,
                                   expr->byteorder, octx);
+       } else if (edtype->describe) {
+               edtype->describe(octx);
        }
 }