summaryrefslogtreecommitdiffstats
path: root/src/ct.c
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2016-07-27 14:34:53 +0200
committerFlorian Westphal <fw@strlen.de>2016-10-27 22:34:31 +0200
commitc992153402c78d91e8beba791171bced21c62d3f (patch)
tree75ce083cdc31b7ce03cc354561ff255a126d6acf /src/ct.c
parent2c6a3b7c4f662b7a94a8ba6870565a45df0cbe2c (diff)
ct: allow resolving ct keys at run time
... and remove those keywords we no longer need. Signed-off-by: Florian Westphal <fw@strlen.de> Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/ct.c')
-rw-r--r--src/ct.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/ct.c b/src/ct.c
index a6829389..81918764 100644
--- a/src/ct.c
+++ b/src/ct.c
@@ -306,6 +306,41 @@ struct error_record *ct_dir_parse(const struct location *loc, const char *str,
return error(loc, "Could not parse direction %s", str);
}
+struct error_record *ct_key_parse(const struct location *loc, const char *str,
+ unsigned int *key)
+{
+ int ret, len, offset = 0;
+ const char *sep = "";
+ unsigned int i;
+ char buf[1024];
+ size_t size;
+
+ for (i = 0; i < array_size(ct_templates); i++) {
+ if (!ct_templates[i].token || strcmp(ct_templates[i].token, str))
+ continue;
+
+ *key = i;
+ return NULL;
+ }
+
+ len = (int)sizeof(buf);
+ size = sizeof(buf);
+
+ for (i = 0; i < array_size(ct_templates); i++) {
+ if (!ct_templates[i].token)
+ continue;
+
+ if (offset)
+ sep = ", ";
+
+ ret = snprintf(buf+offset, len, "%s%s", sep, ct_templates[i].token);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ assert(offset < (int)sizeof(buf));
+ }
+
+ return error(loc, "syntax error, unexpected %s, known keys are %s", str, buf);
+}
+
struct expr *ct_expr_alloc(const struct location *loc, enum nft_ct_keys key,
int8_t direction)
{