summaryrefslogtreecommitdiffstats
path: root/src/rule.c
diff options
context:
space:
mode:
authorArturo Borrero <arturo.borrero.glez@gmail.com>2014-04-14 12:17:08 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2014-04-25 17:45:32 +0200
commit2c666689c1b29d8c3353698224eddea5f09186a8 (patch)
tree4aba634f03b80b4608fd86e6ecdc3491766b0bc4 /src/rule.c
parent275e3f55e20c82a944e3edadb26dba0fcc1f5d97 (diff)
rule: allow to print sets in plain format
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>
Diffstat (limited to 'src/rule.c')
-rw-r--r--src/rule.c60
1 files changed, 50 insertions, 10 deletions
diff --git a/src/rule.c b/src/rule.c
index 18ae6b13..accff0fa 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -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: