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;
}
/* 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;
return TRUE;
}
+
/*
* LUA custom consolidation function
*/
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);
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);
}
}