commit f15043e: [Minor] Push all symbol flags
Vsevolod Stakhov
vsevolod at highsecure.ru
Tue Jul 2 15:56:07 UTC 2019
Author: Vsevolod Stakhov
Date: 2019-07-02 15:47:47 +0100
URL: https://github.com/rspamd/rspamd/commit/f15043eefca27b6fe945f2bc4a20957d85b4a135
[Minor] Push all symbol flags
---
src/lua/lua_config.c | 84 ++++++++++++++++++++++++++++++++++++----------------
1 file changed, 58 insertions(+), 26 deletions(-)
diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c
index 8e8ba90e6..5a4d3efdc 100644
--- a/src/lua/lua_config.c
+++ b/src/lua/lua_config.c
@@ -1761,61 +1761,73 @@ lua_parse_symbol_type (const gchar *str)
return ret;
}
+enum lua_push_symbol_flags_opts {
+ LUA_SYMOPT_FLAG_CREATE_ARRAY = 1u << 0u,
+ LUA_SYMOPT_FLAG_CREATE_MAP = 1u << 1u,
+ LUA_SYMOPT_FLAG_USE_MAP = 1u << 2u,
+ LUA_SYMOPT_FLAG_USE_ARRAY = 1u << 3u,
+};
+
+#define LUA_SYMOPT_IS_ARRAY(f) ((f) & (LUA_SYMOPT_FLAG_CREATE_ARRAY|LUA_SYMOPT_FLAG_USE_ARRAY))
+#define LUA_SYMOPT_IS_CREATE(f) ((f) & (LUA_SYMOPT_FLAG_CREATE_ARRAY|LUA_SYMOPT_FLAG_CREATE_MAP))
+#define LUA_OPTION_PUSH(nm) do { \
+ if (LUA_SYMOPT_IS_ARRAY(fl)) { \
+ lua_pushstring (L, #nm); \
+ lua_rawseti (L, -2, i++); \
+ } \
+ else { \
+ lua_pushboolean (L, true); \
+ lua_setfield (L, -2, #nm); \
+ } \
+} while(0)
+
static void
-lua_push_symbol_flags (lua_State *L, guint flags)
+lua_push_symbol_flags (lua_State *L, guint flags, enum lua_push_symbol_flags_opts fl)
{
guint i = 1;
- lua_newtable (L);
+ if (LUA_SYMOPT_IS_CREATE (fl)) {
+ lua_newtable (L);
+ }
if (flags & SYMBOL_TYPE_FINE) {
- lua_pushstring (L, "fine");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (fine);
}
if (flags & SYMBOL_TYPE_EMPTY) {
- lua_pushstring (L, "empty");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (empty);
}
if (flags & SYMBOL_TYPE_EXPLICIT_DISABLE) {
- lua_pushstring (L, "explicit_disable");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (explicit_disable);
}
if (flags & SYMBOL_TYPE_EXPLICIT_ENABLE) {
- lua_pushstring (L, "explicit_enable");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (explicit_enable);
}
if (flags & SYMBOL_TYPE_IGNORE_PASSTHROUGH) {
- lua_pushstring (L, "ignore_passthrough");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (ignore_passthrough);
}
if (flags & SYMBOL_TYPE_NOSTAT) {
- lua_pushstring (L, "nostat");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (nostat);
}
if (flags & SYMBOL_TYPE_IDEMPOTENT) {
- lua_pushstring (L, "idempotent");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (idempotent);
}
if (flags & SYMBOL_TYPE_MIME_ONLY) {
- lua_pushstring (L, "mime");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (mime);
}
if (flags & SYMBOL_TYPE_TRIVIAL) {
- lua_pushstring (L, "trivial");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (trivial);
}
if (flags & SYMBOL_TYPE_SKIPPED) {
- lua_pushstring (L, "skip");
- lua_rawseti (L, -2, i++);
+ LUA_OPTION_PUSH (skip);
}
}
@@ -1831,7 +1843,7 @@ lua_config_get_symbol_flags (lua_State *L)
name);
if (flags != 0) {
- lua_push_symbol_flags (L, flags);
+ lua_push_symbol_flags (L, flags, LUA_SYMOPT_FLAG_CREATE_ARRAY);
}
else {
lua_pushnil (L);
@@ -1863,7 +1875,7 @@ lua_config_add_symbol_flags (lua_State *L)
if (flags != 0) {
rspamd_symcache_add_symbol_flags (cfg->cache, name, new_flags);
/* Push old flags */
- lua_push_symbol_flags (L, flags);
+ lua_push_symbol_flags (L, flags, LUA_SYMOPT_FLAG_CREATE_ARRAY);
}
else {
lua_pushnil (L);
@@ -3275,15 +3287,24 @@ lua_config_get_symbols_counters (lua_State *L)
return 1;
}
+
+struct lua_metric_symbols_cbdata {
+ lua_State *L;
+ struct rspamd_config *cfg;
+};
+
static void
lua_metric_symbol_inserter (gpointer k, gpointer v, gpointer ud)
{
- lua_State *L = (lua_State *) ud;
+ struct lua_metric_symbols_cbdata *cbd = (struct lua_metric_symbols_cbdata *)ud;
+ lua_State *L;
const gchar *sym = k;
struct rspamd_symbol *s = (struct rspamd_symbol *) v;
struct rspamd_symbols_group *gr;
gint i;
+ L = cbd->L;
+
lua_pushstring (L, sym); /* Symbol name */
lua_createtable (L, 0, 6);
@@ -3313,6 +3334,12 @@ lua_metric_symbol_inserter (gpointer k, gpointer v, gpointer ud)
lua_settable (L, -3);
}
+ if (s->cache_item) {
+ guint sflags = rspamd_symcache_get_symbol_flags (cbd->cfg->cache, sym);
+
+ lua_push_symbol_flags (L, sflags, LUA_SYMOPT_FLAG_USE_MAP);
+ }
+
lua_settable (L, -3); /* Flags -> flags_table */
lua_pushstring (L, "nshots");
@@ -3345,10 +3372,15 @@ lua_config_get_symbols (lua_State *L)
struct rspamd_config *cfg = lua_check_config (L, 1);
if (cfg != NULL) {
+ struct lua_metric_symbols_cbdata cbd;
+
+ cbd.L = L;
+ cbd.cfg = cfg;
+
lua_createtable (L, 0, g_hash_table_size (cfg->symbols));
g_hash_table_foreach (cfg->symbols,
lua_metric_symbol_inserter,
- L);
+ &cfg);
}
else {
return luaL_error (L, "invalid arguments");
More information about the Commits
mailing list