]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
rule: allow to print sets in plain format
authorArturo Borrero <arturo.borrero.glez@gmail.com>
Mon, 14 Apr 2014 10:17:08 +0000 (12:17 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 25 Apr 2014 15:45:32 +0000 (17:45 +0200)
Allow to print sets with or without format.

This is useful in situations where we want to print more or less the same
the user typed (IOW, in one single line, and with family/table info).

While at it, make family2str() function public, so it can be used in
other places.

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/rule.h
src/rule.c

index ecf801fb180dbf37dc8c5d0473f971fbf0ef79cd..072cff81baf9b70f1f07943391ca459d1b07c009 100644 (file)
@@ -127,6 +127,8 @@ extern void chain_add_hash(struct chain *chain, struct table *table);
 extern struct chain *chain_lookup(const struct table *table,
                                  const struct handle *h);
 
+extern const char *family2str(unsigned int family);
+
 /**
  * struct rule - nftables rule
  *
@@ -195,6 +197,7 @@ extern void set_free(struct set *set);
 extern void set_add_hash(struct set *set, struct table *table);
 extern struct set *set_lookup(const struct table *table, const char *name);
 extern void set_print(const struct set *set);
+extern void set_print_plain(const struct set *s);
 
 /**
  * enum cmd_ops - command operations
index 18ae6b13e778fbd0b351c8f2fafed9c57e9e86d4..accff0fa3a018315b716d2a46cf77d0c3bd7c312 100644 (file)
@@ -93,21 +93,37 @@ struct set *set_lookup(const struct table *table, const char *name)
        return NULL;
 }
 
-void set_print(const struct set *set)
+struct print_fmt_options {
+       const char      *tab;
+       const char      *nl;
+       const char      *table;
+       const char      *family;
+       const char      *stmt_separator;
+};
+
+static void do_set_print(const struct set *set, struct print_fmt_options *opts)
 {
        const char *delim = "";
        const char *type;
 
        type = set->flags & SET_F_MAP ? "map" : "set";
-       printf("\t%s %s {\n", type, set->handle.set);
+       printf("%s%s", opts->tab, type);
+
+       if (opts->family != NULL)
+               printf(" %s", opts->family);
+
+       if (opts->table != NULL)
+               printf(" %s", opts->table);
 
-       printf("\t\ttype %s", set->keytype->name);
+       printf(" %s { %s", set->handle.set, opts->nl);
+
+       printf("%s%stype %s", opts->tab, opts->tab, set->keytype->name);
        if (set->flags & SET_F_MAP)
                printf(" : %s", set->datatype->name);
-       printf("\n");
+       printf("%s", opts->stmt_separator);
 
        if (set->flags & (SET_F_CONSTANT | SET_F_INTERVAL)) {
-               printf("\t\tflags ");
+               printf("%s%sflags ", opts->tab, opts->tab);
                if (set->flags & SET_F_CONSTANT) {
                        printf("%sconstant", delim);
                        delim = ",";
@@ -116,15 +132,39 @@ void set_print(const struct set *set)
                        printf("%sinterval", delim);
                        delim = ",";
                }
-               printf("\n");
+               printf("%s", opts->nl);
        }
 
        if (set->init != NULL && set->init->size > 0) {
-               printf("\t\telements = ");
+               printf("%s%selements = ", opts->tab, opts->tab);
                expr_print(set->init);
-               printf("\n");
+               printf("%s", opts->nl);
        }
-       printf("\t}\n");
+       printf("%s}%s", opts->tab, opts->nl);
+}
+
+void set_print(const struct set *s)
+{
+       struct print_fmt_options opts = {
+               .tab            = "\t",
+               .nl             = "\n",
+               .stmt_separator = "\n",
+       };
+
+       do_set_print(s, &opts);
+}
+
+void set_print_plain(const struct set *s)
+{
+       struct print_fmt_options opts = {
+               .tab            = "",
+               .nl             = "",
+               .table          = s->handle.table,
+               .family         = family2str(s->handle.family),
+               .stmt_separator = ";",
+       };
+
+       do_set_print(s, &opts);
 }
 
 struct rule *rule_alloc(const struct location *loc, const struct handle *h)
@@ -281,7 +321,7 @@ struct chain *chain_lookup(const struct table *table, const struct handle *h)
        return NULL;
 }
 
-static const char *family2str(unsigned int family)
+const char *family2str(unsigned int family)
 {
        switch (family) {
                case NFPROTO_IPV4: