diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-02-08 21:32:19 +0300 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-02-08 21:32:19 +0300 |
commit | 7e1e71a5459a0729326f15ee30e28ccb17e597f9 (patch) | |
tree | e61397c0f779292b480f79b8ceddcfa4292cd7fd /src/lua | |
parent | 93a1584882133dc81d46fa8e15943fcab6e8ce3f (diff) | |
download | rspamd-7e1e71a5459a0729326f15ee30e28ccb17e597f9.tar.gz rspamd-7e1e71a5459a0729326f15ee30e28ccb17e597f9.zip |
Call lua functions correctly as well.
Diffstat (limited to 'src/lua')
-rw-r--r-- | src/lua/lua_common.c | 34 | ||||
-rw-r--r-- | src/lua/lua_common.h | 2 |
2 files changed, 31 insertions, 5 deletions
diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index 9c4cef113..bc3748f4c 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -356,15 +356,40 @@ lua_call_chain_filter (const gchar *function, struct worker_task *task, gint *ma /* Call custom lua function in rspamd expression */ gboolean -lua_call_expression_func (const gchar *function, struct worker_task *task, GList *args, gboolean *res) +lua_call_expression_func (const gchar *module, const gchar *function, + struct worker_task *task, GList *args, gboolean *res) { lua_State *L = task->cfg->lua_state; struct worker_task **ptask; GList *cur; struct expression_argument *arg; - gint nargs = 0; - - lua_getglobal (L, function); + int nargs = 0; + + /* Call specified function and expect result of given expected_type */ + /* First check function in config table */ + lua_getglobal (L, "config"); + if (module != NULL && lua_istable (L, -1)) { + lua_pushstring (L, module); + lua_gettable (L, -2); + if (lua_isnil (L, -1)) { + /* Try to get global variable */ + lua_getglobal (L, function); + } + else { + /* Call local function in table */ + lua_pushstring (L, function); + lua_gettable (L, -2); + } + } + else { + /* Try to get global variable */ + lua_getglobal (L, function); + } + if (lua_isnil (L, -1)) { + msg_err ("function with name %s is not defined", function); + return FALSE; + } + /* Now we got function in top of stack */ ptask = lua_newuserdata (L, sizeof (struct worker_task *)); lua_setclass (L, "rspamd{task}", -1); *ptask = task; @@ -404,6 +429,7 @@ lua_call_expression_func (const gchar *function, struct worker_task *task, GList return TRUE; } + /* * LUA custom consolidation function */ diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h index d70501034..4851dc1a6 100644 --- a/src/lua/lua_common.h +++ b/src/lua/lua_common.h @@ -42,7 +42,7 @@ gboolean init_lua_filters (struct config_file *cfg); gint lua_call_filter (const gchar *function, struct worker_task *task); gint lua_call_chain_filter (const gchar *function, struct worker_task *task, gint *marks, guint number); double lua_consolidation_func (struct worker_task *task, const gchar *metric_name, const gchar *function_name); -gboolean lua_call_expression_func (const gchar *function, struct worker_task *task, GList *args, gboolean *res); +gboolean lua_call_expression_func (const gchar *module, const gchar *symbol, struct worker_task *task, GList *args, gboolean *res); void lua_call_post_filters (struct worker_task *task); void add_luabuf (const gchar *line); |