diff options
author | Florian Westphal <fw@strlen.de> | 2016-07-27 14:34:53 +0200 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2016-10-27 22:34:31 +0200 |
commit | c992153402c78d91e8beba791171bced21c62d3f (patch) | |
tree | 75ce083cdc31b7ce03cc354561ff255a126d6acf /src/ct.c | |
parent | 2c6a3b7c4f662b7a94a8ba6870565a45df0cbe2c (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.c | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -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) { |