aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2011-02-08 21:32:19 +0300
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2011-02-08 21:32:19 +0300
commit7e1e71a5459a0729326f15ee30e28ccb17e597f9 (patch)
treee61397c0f779292b480f79b8ceddcfa4292cd7fd /src/lua
parent93a1584882133dc81d46fa8e15943fcab6e8ce3f (diff)
downloadrspamd-7e1e71a5459a0729326f15ee30e28ccb17e597f9.tar.gz
rspamd-7e1e71a5459a0729326f15ee30e28ccb17e597f9.zip
Call lua functions correctly as well.
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_common.c34
-rw-r--r--src/lua/lua_common.h2
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);