]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
set: make set flags output parsable
authorPatrick McHardy <kaber@trash.net>
Thu, 16 Jan 2014 20:01:56 +0000 (20:01 +0000)
committerPatrick McHardy <kaber@trash.net>
Thu, 16 Jan 2014 20:01:56 +0000 (20:01 +0000)
This patch fixes two problems:

- the output of "nft list table ..." is not parsable if sets are included
  because the parser can't parse the flags.

- set flags can't be specified during set creation.

To fix this, the set output is changed to:

- not print each flag on a single line
- prefix the flags with "flags "
- only show the interval flag since all others are for internal use only

The parser is changed to parse the flags specified in a set declaration.
This allows to parse empty sets. The following patch will take care of
parsing sets that are already populated.

Signed-off-by: Patrick McHardy <kaber@trash.net>
src/parser.y
src/rule.c
src/scanner.l

index 5cd8ef678fd66167993636da074653d4ad0ad7f5..1b09e616aef5935e5996cd6d32ee6c51f6f70149 100644 (file)
@@ -182,6 +182,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
 %token RETURN                  "return"
 %token QUEUE                   "queue"
 
+%token INTERVAL                        "interval"
+
 %token <val> NUM               "number"
 %token <string> STRING         "string"
 %token <string> QUOTED_STRING
@@ -353,6 +355,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
 %type <rule>                   rule
 %destructor { rule_free($$); } rule
 
+%type <val>                    set_flag_list   set_flag
+
 %type <set>                    set_block_alloc set_block
 %destructor { set_free($$); }  set_block_alloc
 
@@ -737,6 +741,21 @@ set_block          :       /* empty */     { $$ = $<set>-1; }
                                }
                                $$ = $1;
                        }
+                       |       set_block       FLAGS           set_flag_list   stmt_seperator
+                       {
+                               $1->flags = $3;
+                               $$ = $1;
+                       }
+                       ;
+
+set_flag_list          :       set_flag_list   COMMA           set_flag
+                       {
+                               $$ = $1 | $3;
+                       }
+                       |       set_flag
+                       ;
+
+set_flag               :       INTERVAL        { $$ = SET_F_INTERVAL; }
                        ;
 
 map_block_alloc                :       /* empty */
@@ -769,6 +788,11 @@ map_block          :       /* empty */     { $$ = $<set>-1; }
 
                                $$ = $1;
                        }
+                       |       map_block       FLAGS           set_flag_list   stmt_seperator
+                       {
+                               $1->flags = $3;
+                               $$ = $1;
+                       }
                        ;
 
 hook_spec              :       TYPE            STRING          HOOK            STRING          PRIORITY        NUM
index 04dd6c77de89307292367172d2ab316e42e509e8..0f7f4b51af1f423b5b370a85c6d896b5f17230f5 100644 (file)
@@ -89,6 +89,7 @@ struct set *set_lookup(const struct table *table, const char *name)
 
 void set_print(const struct set *set)
 {
+       const char *delim = "";
        const char *type;
 
        type = set->flags & SET_F_MAP ? "map" : "set";
@@ -99,12 +100,14 @@ void set_print(const struct set *set)
                printf(" : %s", set->datatype->name);
        printf("\n");
 
-       if (set->flags & SET_F_ANONYMOUS)
-               printf("\t\tanonymous\n");
-       if (set->flags & SET_F_CONSTANT)
-               printf("\t\tconstant\n");
-       if (set->flags & SET_F_INTERVAL)
-               printf("\t\tinterval\n");
+       if (set->flags & (SET_F_INTERVAL)) {
+               printf("\t\tflags ");
+               if (set->flags & SET_F_INTERVAL) {
+                       printf("%sinterval", delim);
+                       delim = ",";
+               }
+               printf("\n");
+       }
 
        if (set->init != NULL && set->init->size > 0) {
                printf("\t\telements = ");
index 25fbc610e46d58a5597bedcd043b97cbb24e2aaf..904d6fbc0dcc38ce61424cc703eabc987cd12d5e 100644 (file)
@@ -256,6 +256,8 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 
 "position"             { return POSITION; }
 
+"interval"             { return INTERVAL; }
+
 "counter"              { return COUNTER; }
 "packets"              { return PACKETS; }
 "bytes"                        { return BYTES; }