diff options
-rw-r--r-- | include/rule.h | 3 | ||||
-rw-r--r-- | src/rule.c | 60 |
2 files changed, 53 insertions, 10 deletions
diff --git a/include/rule.h b/include/rule.h index ecf801fb..072cff81 100644 --- a/include/rule.h +++ b/include/rule.h @@ -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 @@ -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: |