]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: print a hint about 'typeof' syntax on 0 keylen
authorFlorian Westphal <fw@strlen.de>
Tue, 10 Dec 2019 14:23:35 +0000 (15:23 +0100)
committerFlorian Westphal <fw@strlen.de>
Tue, 17 Dec 2019 22:10:46 +0000 (23:10 +0100)
If user says

'type integer; ...' in a set definition, don't just throw an error --
provide a hint that the typeof keyword can be used to provide
the needed size information.

Signed-off-by: Florian Westphal <fw@strlen.de>
src/evaluate.c

index 91d6b254c6590021256e9895c24121f5e6848335..817b23220bb9f23cfa9c6276987a1d42b5ccfb98 100644 (file)
@@ -3307,6 +3307,20 @@ static int setelem_evaluate(struct eval_ctx *ctx, struct expr **expr)
        return 0;
 }
 
+static int set_key_data_error(struct eval_ctx *ctx, const struct set *set,
+                             const struct datatype *dtype,
+                             const char *name)
+{
+       const char *hint = "";
+
+       if (dtype->size == 0)
+               hint = ". Try \"typeof expression\" instead of \"type datatype\".";
+
+       return set_error(ctx, set, "unqualified type %s "
+                        "specified in %s definition%s",
+                        dtype->name, name, hint);
+}
+
 static int set_evaluate(struct eval_ctx *ctx, struct set *set)
 {
        struct table *table;
@@ -3331,9 +3345,8 @@ static int set_evaluate(struct eval_ctx *ctx, struct set *set)
                        return -1;
 
                if (set->key->len == 0)
-                       return set_error(ctx, set, "unqualified key type %s "
-                                        "specified in %s definition",
-                                        set->key->dtype->name, type);
+                       return set_key_data_error(ctx, set,
+                                                 set->key->dtype, type);
        }
        if (set->flags & NFT_SET_INTERVAL &&
            set->key->etype == EXPR_CONCAT)
@@ -3345,8 +3358,8 @@ static int set_evaluate(struct eval_ctx *ctx, struct set *set)
                                         "specify mapping data type");
 
                if (set->data->len == 0 && set->data->dtype->type != TYPE_VERDICT)
-                       return set_error(ctx, set, "unqualified mapping data "
-                                        "type specified in map definition");
+                       return set_key_data_error(ctx, set,
+                                                 set->data->dtype, type);
        } else if (set_is_objmap(set->flags)) {
                if (set->data) {
                        assert(set->data->etype == EXPR_VALUE);