]> source.dussan.org Git - rspamd.git/commitdiff
Call lua functions correctly as well.
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Tue, 8 Feb 2011 18:32:19 +0000 (21:32 +0300)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Tue, 8 Feb 2011 18:32:19 +0000 (21:32 +0300)
src/expressions.c
src/lua/lua_common.c
src/lua/lua_common.h
src/plugins/regexp.c

index 24540b44c41c568c884076999f74f8e0cb1b0cdf..c3b45ef7cf5791bdbb6fd3c0a839c6980790aec9 100644 (file)
@@ -750,7 +750,7 @@ call_expression_function (struct expression_function * func, struct worker_task
        if (selected == NULL) {
                /* Try to check lua function */
 #ifdef RSPAMD_MAIN
-               if (! lua_call_expression_func (func->name, task, func->args, &res)) {
+               if (! lua_call_expression_func (NULL, func->name, task, func->args, &res)) {
                        msg_warn ("call to undefined function %s", key.name);
                        return FALSE;
                }
index 9c4cef1130fc2b3c897be2283298031e2a1bb0dd..bc3748f4c06ad6394250b4841a38e4dc8db51dfd 100644 (file)
@@ -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
  */
index d70501034b3b32104e003ab3fb37c778311bdfb0..4851dc1a6f842dbef5d22704b99b454d728533ec 100644 (file)
@@ -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);
 
index ce6599e86e202746aea587bb2ee3c92bb9d0f63e..4ae056beec6698bfc9c46e797a51f364442ca4f7 100644 (file)
@@ -1017,7 +1017,7 @@ process_regexp_item (struct worker_task *task, void *user_data)
        
        if (item->lua_function) {
                /* Just call function */
-               if (lua_call_expression_func (item->lua_function, task, NULL, &res) && res) {
+               if (lua_call_expression_func ("regexp", item->lua_function, task, NULL, &res) && res) {
                        insert_result (task, item->symbol, 1, NULL);
                }
        }