aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2012-07-26 21:50:13 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2012-07-26 21:50:13 +0400
commite1a8ed50131891516f5da6e22aae69a306147d38 (patch)
tree61002cf909d2d41553b94b8ed654d0f2f3567a67 /src/lua
parent2e615083e475c7390c667695b9e659fa5ba4da5f (diff)
downloadrspamd-e1a8ed50131891516f5da6e22aae69a306147d38.tar.gz
rspamd-e1a8ed50131891516f5da6e22aae69a306147d38.zip
* Add lua worker type and lua worker bindings.
* Add lua utility library for basic utils. * Fixes lua_buffer code. Fix lua loading error. Added some other lua utility functions.
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_buffer.c41
-rw-r--r--src/lua/lua_cdb.c2
-rw-r--r--src/lua/lua_classifier.c4
-rw-r--r--src/lua/lua_common.c183
-rw-r--r--src/lua/lua_common.h8
-rw-r--r--src/lua/lua_config.c8
-rw-r--r--src/lua/lua_mempool.c2
-rw-r--r--src/lua/lua_message.c2
-rw-r--r--src/lua/lua_session.c4
-rw-r--r--src/lua/lua_task.c117
-rw-r--r--src/lua/lua_upstream.c4
11 files changed, 338 insertions, 37 deletions
diff --git a/src/lua/lua_buffer.c b/src/lua/lua_buffer.c
index bb5b1ea8c..9c18ef5cf 100644
--- a/src/lua/lua_buffer.c
+++ b/src/lua/lua_buffer.c
@@ -34,14 +34,14 @@ LUA_FUNCTION_DEF (io_dispatcher, set_policy);
LUA_FUNCTION_DEF (io_dispatcher, write);
LUA_FUNCTION_DEF (io_dispatcher, pause);
LUA_FUNCTION_DEF (io_dispatcher, restore);
-LUA_FUNCTION_DEF (io_dispatcher, delete);
+LUA_FUNCTION_DEF (io_dispatcher, destroy);
static const struct luaL_reg io_dispatcherlib_m[] = {
LUA_INTERFACE_DEF (io_dispatcher, set_policy),
LUA_INTERFACE_DEF (io_dispatcher, write),
LUA_INTERFACE_DEF (io_dispatcher, pause),
LUA_INTERFACE_DEF (io_dispatcher, restore),
- {"__gc", lua_io_dispatcher_delete},
+ LUA_INTERFACE_DEF (io_dispatcher, destroy),
{"__tostring", lua_class_tostring},
{NULL, NULL}
};
@@ -90,12 +90,12 @@ lua_io_read_cb (f_str_t * in, void *arg)
need_unlock = TRUE;
}
/* callback (dispatcher, data) */
+ lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
pdispatcher = lua_newuserdata (cbdata->L, sizeof (struct rspamd_io_dispatcher_s *));
lua_setclass (cbdata->L, "rspamd{io_dispatcher}", -1);
*pdispatcher = cbdata->d;
lua_pushlstring (cbdata->L, in->begin, in->len);
- lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
if (lua_pcall (cbdata->L, 2, 1, 0) != 0) {
msg_info ("call to session finalizer failed: %s", lua_tostring (cbdata->L, -1));
}
@@ -107,16 +107,6 @@ lua_io_read_cb (f_str_t * in, void *arg)
g_mutex_unlock (lua_mtx);
}
- if (!res) {
- /* Unref callbacks */
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
- if (cbdata->cbref_write) {
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_write);
- }
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_err);
- g_slice_free1 (sizeof (struct lua_dispatcher_cbdata), cbdata);
- }
-
return res;
}
@@ -132,12 +122,13 @@ lua_io_write_cb (void *arg)
if (g_mutex_trylock (lua_mtx)) {
need_unlock = TRUE;
}
+ lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
/* callback (dispatcher) */
pdispatcher = lua_newuserdata (cbdata->L, sizeof (struct rspamd_io_dispatcher_s *));
lua_setclass (cbdata->L, "rspamd{io_dispatcher}", -1);
*pdispatcher = cbdata->d;
- lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
+
if (lua_pcall (cbdata->L, 1, 1, 0) != 0) {
msg_info ("call to session finalizer failed: %s", lua_tostring (cbdata->L, -1));
}
@@ -148,14 +139,6 @@ lua_io_write_cb (void *arg)
if (need_unlock) {
g_mutex_unlock (lua_mtx);
}
-
- if (!res) {
- /* Unref callbacks */
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_write);
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_err);
- g_slice_free1 (sizeof (struct lua_dispatcher_cbdata), cbdata);
- }
}
return res;
@@ -173,12 +156,12 @@ lua_io_err_cb (GError * err, void *arg)
need_unlock = TRUE;
}
/* callback (dispatcher, err) */
+ lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_err);
pdispatcher = lua_newuserdata (cbdata->L, sizeof (struct rspamd_io_dispatcher_s *));
lua_setclass (cbdata->L, "rspamd{io_dispatcher}", -1);
*pdispatcher = cbdata->d;
lua_pushstring (cbdata->L, err->message);
- lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
if (lua_pcall (cbdata->L, 2, 0, 0) != 0) {
msg_info ("call to session finalizer failed: %s", lua_tostring (cbdata->L, -1));
}
@@ -234,8 +217,12 @@ lua_io_dispatcher_create (lua_State *L)
tv_num = lua_tonumber (L, 6);
tv.tv_sec = trunc (tv_num);
tv.tv_usec = modf (tv_num, &tmp) * 1000.;
+ io_dispatcher = rspamd_create_dispatcher (cbdata->base, fd, BUFFER_LINE, lua_io_read_cb, lua_io_write_cb, lua_io_err_cb, &tv, cbdata);
+ }
+ else {
+ io_dispatcher = rspamd_create_dispatcher (cbdata->base, fd, BUFFER_LINE, lua_io_read_cb, lua_io_write_cb, lua_io_err_cb, NULL, cbdata);
}
- io_dispatcher = rspamd_create_dispatcher (cbdata->base, fd, BUFFER_LINE, lua_io_read_cb, lua_io_write_cb, lua_io_err_cb, &tv, cbdata);
+
cbdata->d = io_dispatcher;
/* Push result */
pdispatcher = lua_newuserdata (L, sizeof (struct rspamd_io_dispatcher_s *));
@@ -338,7 +325,7 @@ lua_io_dispatcher_restore (lua_State *L)
}
static int
-lua_io_dispatcher_delete (lua_State *L)
+lua_io_dispatcher_destroy (lua_State *L)
{
struct rspamd_io_dispatcher_s *io_dispatcher = lua_check_io_dispatcher (L);
@@ -369,10 +356,14 @@ luaopen_io_dispatcher (lua_State * L)
luaL_openlib (L, NULL, io_dispatcherlib_m, 0);
luaL_openlib(L, "rspamd_io_dispatcher", io_dispatcherlib_f, 0);
+ lua_pop(L, 1); /* remove metatable from stack */
+
/* Simple event class */
lua_newclass (L, "rspamd{ev_base}", null_reg);
luaL_openlib (L, "rspamd_ev_base", null_reg, 0);
+ lua_pop(L, 1); /* remove metatable from stack */
+
/* Set buffer types globals */
lua_pushnumber (L, BUFFER_LINE);
lua_setglobal (L, "IO_BUFFER_LINE");
diff --git a/src/lua/lua_cdb.c b/src/lua/lua_cdb.c
index 7adfeeac5..84fef66d9 100644
--- a/src/lua/lua_cdb.c
+++ b/src/lua/lua_cdb.c
@@ -161,5 +161,7 @@ luaopen_cdb (lua_State * L)
luaL_openlib (L, NULL, cdblib_m, 0);
luaL_openlib (L, "cdb", cdblib_f, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
diff --git a/src/lua/lua_classifier.c b/src/lua/lua_classifier.c
index edaf4e7a6..e929c6b50 100644
--- a/src/lua/lua_classifier.c
+++ b/src/lua/lua_classifier.c
@@ -371,6 +371,8 @@ luaopen_classifier (lua_State * L)
lua_newclass (L, "rspamd{classifier}", classifierlib_m);
luaL_openlib (L, "rspamd_classifier", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
@@ -380,6 +382,8 @@ luaopen_statfile (lua_State * L)
lua_newclass (L, "rspamd{statfile}", statfilelib_m);
luaL_openlib (L, "rspamd_statfile", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c
index 62fb5389b..6a671cf00 100644
--- a/src/lua/lua_common.c
+++ b/src/lua/lua_common.c
@@ -42,7 +42,7 @@ LUA_FUNCTION_DEF (logger, warn);
LUA_FUNCTION_DEF (logger, info);
LUA_FUNCTION_DEF (logger, debug);
-static const struct luaL_reg loggerlib_m[] = {
+static const struct luaL_reg loggerlib_f[] = {
LUA_INTERFACE_DEF (logger, err),
LUA_INTERFACE_DEF (logger, warn),
LUA_INTERFACE_DEF (logger, info),
@@ -51,9 +51,159 @@ static const struct luaL_reg loggerlib_m[] = {
{NULL, NULL}
};
+/* util module */
+LUA_FUNCTION_DEF (util, gethostbyname);
+LUA_FUNCTION_DEF (util, strsplit);
+LUA_FUNCTION_DEF (util, close);
+LUA_FUNCTION_DEF (util, ip_to_str);
+LUA_FUNCTION_DEF (util, str_to_ip);
+
+static const struct luaL_reg utillib_f[] = {
+ LUA_INTERFACE_DEF (util, gethostbyname),
+ LUA_INTERFACE_DEF (util, strsplit),
+ LUA_INTERFACE_DEF (util, close),
+ LUA_INTERFACE_DEF (util, ip_to_str),
+ LUA_INTERFACE_DEF (util, str_to_ip),
+ {"__tostring", lua_class_tostring},
+ {NULL, NULL}
+};
+
+/**
+ * Get numeric ip presentation of hostname
+ */
+static gint
+lua_util_gethostbyname (lua_State *L)
+{
+ const gchar *name;
+ struct hostent *hent;
+ struct in_addr ina;
+
+ name = luaL_checkstring (L, 1);
+ if (name) {
+ hent = gethostbyname (name);
+ if (hent) {
+ memcpy (&ina, hent->h_addr, sizeof (struct in_addr));
+ lua_pushinteger (L, ina.s_addr);
+ }
+ else {
+ lua_pushnil (L);
+ }
+ }
+ else {
+ lua_pushnil (L);
+ }
+ return 1;
+}
+
+/**
+ * Close file descriptor
+ */
+static gint
+lua_util_close (lua_State *L)
+{
+ gint fd;
+
+ fd = lua_tointeger (L, 1);
+
+ if (fd >= 0) {
+ close (fd);
+ }
+
+ return 0;
+}
+
+/**
+ * Convert numeric ip to string
+ */
+static gint
+lua_util_ip_to_str (lua_State *L)
+{
+ struct in_addr ina;
+
+ ina.s_addr = lua_tointeger (L, 1);
+ if (ina.s_addr) {
+ lua_pushstring (L, inet_ntoa (ina));
+ }
+ else {
+ lua_pushnil (L);
+ }
+
+ return 1;
+}
+
+/**
+ * Convert string ip to numeric
+ */
+static gint
+lua_util_str_to_ip (lua_State *L)
+{
+ struct in_addr ina;
+ const gchar *ip;
+
+ ip = luaL_checkstring (L, 1);
+ if (ip) {
+ if (inet_aton (ip, &ina) != 0) {
+ lua_pushinteger (L, ina.s_addr);
+ }
+ else {
+ lua_pushnil (L);
+ }
+ }
+ else {
+ lua_pushnil (L);
+ }
+
+ return 1;
+}
+
+/**
+ * Split string to the portions using separators as the second argument
+ */
+static gint
+lua_util_strsplit (lua_State *L)
+{
+ gchar **list, **cur;
+ const gchar *in, *separators = " ;,";
+ gint i;
+
+ in = luaL_checkstring (L, 1);
+
+ if (in) {
+ if (lua_gettop (L) > 1) {
+ separators = luaL_checkstring (L, 2);
+ }
+ list = g_strsplit_set (in, separators, -1);
+ if (list) {
+ cur = list;
+ lua_newtable (L);
+ i = 1;
+ while (*cur) {
+ lua_pushstring (L, *cur);
+ lua_rawseti (L, -2, i++);
+ cur ++;
+ }
+ g_strfreev (list);
+ }
+ else {
+ lua_pushnil (L);
+ }
+ }
+ else {
+ lua_pushnil (L);
+ }
+
+ return 1;
+}
+
/* Util functions */
+/**
+ * Create new class and store metatable on top of the stack
+ * @param L
+ * @param classname name of class
+ * @param func table of class methods
+ */
void
-lua_newclass (lua_State * L, const gchar *classname, const struct luaL_reg *func)
+lua_newclass (lua_State * L, const gchar *classname, const struct luaL_reg *methods)
{
luaL_newmetatable (L, classname); /* mt */
lua_pushstring (L, "__index");
@@ -64,7 +214,17 @@ lua_newclass (lua_State * L, const gchar *classname, const struct luaL_reg *func
lua_pushstring (L, classname); /* mt,"__index",it,"class",classname */
lua_rawset (L, -3); /* mt,"__index",it */
- luaL_openlib (L, NULL, func, 0);
+ luaL_openlib (L, NULL, methods, 0);
+}
+
+/**
+ * Create and register new class with static methods and store metatable on top of the stack
+ */
+void
+lua_newclass_full (lua_State *L, const gchar *classname, const gchar *static_name, const struct luaL_reg *methods, const struct luaL_reg *func)
+{
+ lua_newclass (L, classname, methods);
+ luaL_openlib(L, static_name, func, 0);
}
gint
@@ -210,11 +370,20 @@ luaopen_rspamd (lua_State * L)
return 1;
}
-gint
+static gint
luaopen_logger (lua_State * L)
{
- luaL_openlib (L, "rspamd_logger", loggerlib_m, 0);
+ luaL_openlib (L, "rspamd_logger", loggerlib_f, 0);
+
+ return 1;
+}
+
+
+static gint
+luaopen_util (lua_State *L)
+{
+ luaL_openlib (L, "rspamd_util", utillib_f, 0);
return 1;
}
@@ -252,9 +421,9 @@ init_lua (struct config_file *cfg)
(void)luaopen_rspamd (L);
(void)luaopen_logger (L);
+ (void)luaopen_util (L);
(void)luaopen_mempool (L);
(void)luaopen_config (L);
- (void)luaopen_session (L);
(void)luaopen_radix (L);
(void)luaopen_hash_table (L);
(void)luaopen_trie (L);
@@ -272,6 +441,8 @@ init_lua (struct config_file *cfg)
(void)luaopen_redis (L);
(void)luaopen_upstream (L);
(void)lua_add_actions_global (L);
+ (void)luaopen_session (L);
+ (void)luaopen_io_dispatcher (L);
cfg->lua_state = L;
memory_pool_add_destructor (cfg->cfg_pool, (pool_destruct_func)lua_close, L);
diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h
index daab695fc..dc417fa68 100644
--- a/src/lua/lua_common.h
+++ b/src/lua/lua_common.h
@@ -24,7 +24,12 @@ extern GMutex *lua_mtx;
/**
* Create and register new class
*/
-void lua_newclass (lua_State *L, const gchar *classname, const struct luaL_reg *func);
+void lua_newclass (lua_State *L, const gchar *classname, const struct luaL_reg *methods);
+
+/**
+ * Create and register new class with static methods
+ */
+void lua_newclass_full (lua_State *L, const gchar *classname, const gchar *static_name, const struct luaL_reg *methods, const struct luaL_reg *func);
/**
* Set class name for object at @param objidx position
@@ -64,6 +69,7 @@ gint luaopen_redis (lua_State * L);
gint luaopen_upstream (lua_State * L);
gint luaopen_mempool (lua_State * L);
gint luaopen_session (lua_State * L);
+gint luaopen_io_dispatcher (lua_State * L);
void init_lua (struct config_file *cfg);
gboolean init_lua_filters (struct config_file *cfg);
diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c
index 2258c03aa..217bfc761 100644
--- a/src/lua/lua_config.c
+++ b/src/lua/lua_config.c
@@ -967,6 +967,8 @@ luaopen_config (lua_State * L)
lua_newclass (L, "rspamd{config}", configlib_m);
luaL_openlib (L, "rspamd_config", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
@@ -976,6 +978,8 @@ luaopen_radix (lua_State * L)
lua_newclass (L, "rspamd{radix}", radixlib_m);
luaL_openlib (L, "rspamd_radix", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
@@ -985,6 +989,8 @@ luaopen_hash_table (lua_State * L)
lua_newclass (L, "rspamd{hash_table}", hashlib_m);
luaL_openlib (L, "rspamd_hash_table", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
@@ -1003,5 +1009,7 @@ luaopen_trie (lua_State * L)
luaL_openlib (L, NULL, trielib_m, 0);
luaL_openlib(L, "rspamd_trie", trielib_f, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
diff --git a/src/lua/lua_mempool.c b/src/lua/lua_mempool.c
index 44fb3fe85..40094abc4 100644
--- a/src/lua/lua_mempool.c
+++ b/src/lua/lua_mempool.c
@@ -239,5 +239,7 @@ luaopen_mempool (lua_State * L)
luaL_openlib (L, NULL, mempoollib_m, 0);
luaL_openlib(L, "rspamd_mempool", mempoollib_f, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
diff --git a/src/lua/lua_message.c b/src/lua/lua_message.c
index 0dedb9068..6c91938ab 100644
--- a/src/lua/lua_message.c
+++ b/src/lua/lua_message.c
@@ -206,5 +206,7 @@ luaopen_message (lua_State * L)
lua_newclass (L, "rspamd{message}", msglib_m);
luaL_openlib (L, "rspamd_message", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
diff --git a/src/lua/lua_session.c b/src/lua/lua_session.c
index 5ccfc76d3..9f4af2882 100644
--- a/src/lua/lua_session.c
+++ b/src/lua/lua_session.c
@@ -334,9 +334,13 @@ luaopen_session (lua_State * L)
luaL_openlib (L, NULL, sessionlib_m, 0);
luaL_openlib(L, "rspamd_session", sessionlib_f, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
/* Simple event class */
lua_newclass (L, "rspamd{event}", eventlib_m);
luaL_openlib (L, "rspamd_event", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 3aa204597..abb8cc15d 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -42,8 +42,14 @@
extern stat_file_t* get_statfile_by_symbol (statfile_pool_t *pool, struct classifier_config *ccf,
const gchar *symbol, struct statfile **st, gboolean try_create);
+/* Task creation */
+LUA_FUNCTION_DEF (task, create_empty);
+LUA_FUNCTION_DEF (task, create_from_buffer);
/* Task methods */
LUA_FUNCTION_DEF (task, get_message);
+LUA_FUNCTION_DEF (task, process_message);
+LUA_FUNCTION_DEF (task, set_cfg);
+LUA_FUNCTION_DEF (task, destroy);
LUA_FUNCTION_DEF (task, get_mempool);
LUA_FUNCTION_DEF (task, get_ev_base);
LUA_FUNCTION_DEF (task, insert_result);
@@ -77,8 +83,17 @@ LUA_FUNCTION_DEF (task, get_metric_score);
LUA_FUNCTION_DEF (task, get_metric_action);
LUA_FUNCTION_DEF (task, learn_statfile);
+static const struct luaL_reg tasklib_f[] = {
+ LUA_INTERFACE_DEF (task, create_empty),
+ LUA_INTERFACE_DEF (task, create_from_buffer),
+ {NULL, NULL}
+};
+
static const struct luaL_reg tasklib_m[] = {
LUA_INTERFACE_DEF (task, get_message),
+ LUA_INTERFACE_DEF (task, destroy),
+ LUA_INTERFACE_DEF (task, process_message),
+ LUA_INTERFACE_DEF (task, set_cfg),
LUA_INTERFACE_DEF (task, get_mempool),
LUA_INTERFACE_DEF (task, get_ev_base),
LUA_INTERFACE_DEF (task, insert_result),
@@ -204,17 +219,96 @@ lua_check_url (lua_State * L)
}
/*** Task interface ***/
+
+static int
+lua_task_create_empty (lua_State *L)
+{
+ struct worker_task **ptask, *task;
+
+ task = construct_task (NULL);
+ ptask = lua_newuserdata (L, sizeof (gpointer));
+ lua_setclass (L, "rspamd{task}", -1);
+ *ptask = task;
+ return 1;
+}
+
+static int
+lua_task_create_from_buffer (lua_State *L)
+{
+ struct worker_task **ptask, *task;
+ const gchar *data;
+ size_t len;
+
+ data = luaL_checklstring (L, 1, &len);
+ if (data) {
+ task = construct_task (NULL);
+ ptask = lua_newuserdata (L, sizeof (gpointer));
+ lua_setclass (L, "rspamd{task}", -1);
+ *ptask = task;
+ task->msg = memory_pool_alloc (task->task_pool, sizeof (f_str_t));
+ task->msg->begin = memory_pool_alloc (task->task_pool, len);
+ memcpy (task->msg->begin, data, len);
+ task->msg->len = len;
+ }
+ return 1;
+}
+
+static int
+lua_task_process_message (lua_State *L)
+{
+ struct worker_task *task = lua_check_task (L);
+
+ if (task != NULL && task->msg != NULL && task->msg->len > 0) {
+ if (process_message (task) == 0) {
+ lua_pushboolean (L, TRUE);
+ }
+ else {
+ lua_pushboolean (L, FALSE);
+ }
+ }
+ else {
+ lua_pushboolean (L, FALSE);
+ }
+
+ return 1;
+}
+static int
+lua_task_set_cfg (lua_State *L)
+{
+ struct worker_task *task = lua_check_task (L);
+ void *ud = luaL_checkudata (L, 2, "rspamd{config}");
+
+ luaL_argcheck (L, ud != NULL, 1, "'config' expected");
+ task->cfg = ud ? *((struct config_file **)ud) : NULL;
+ return 0;
+}
+
+static int
+lua_task_destroy (lua_State *L)
+{
+ struct worker_task *task = lua_check_task (L);
+
+ if (task != NULL) {
+ free_task (task, FALSE);
+ }
+
+ return 0;
+}
+
static int
lua_task_get_message (lua_State * L)
{
GMimeMessage **pmsg;
struct worker_task *task = lua_check_task (L);
- if (task != NULL) {
+ if (task != NULL && task->message != NULL) {
pmsg = lua_newuserdata (L, sizeof (GMimeMessage *));
lua_setclass (L, "rspamd{message}", -1);
*pmsg = task->message;
}
+ else {
+ lua_pushnil (L);
+ }
return 1;
}
@@ -229,6 +323,9 @@ lua_task_get_mempool (lua_State * L)
lua_setclass (L, "rspamd{mempool}", -1);
*ppool = task->task_pool;
}
+ else {
+ lua_pushnil (L);
+ }
return 1;
}
@@ -243,6 +340,9 @@ lua_task_get_ev_base (lua_State * L)
lua_setclass (L, "rspamd{ev_base}", -1);
*pbase = task->ev_base;
}
+ else {
+ lua_pushnil (L);
+ }
return 1;
}
@@ -267,7 +367,7 @@ lua_task_insert_result (lua_State * L)
insert_result (task, symbol_name, flag, params);
}
- return 1;
+ return 0;
}
static gint
@@ -290,7 +390,7 @@ lua_task_set_pre_result (lua_State * L)
}
}
}
- return 1;
+ return 0;
}
struct lua_tree_cb_data {
@@ -1740,8 +1840,9 @@ lua_url_get_phished (lua_State *L)
gint
luaopen_task (lua_State * L)
{
- lua_newclass (L, "rspamd{task}", tasklib_m);
- luaL_openlib (L, "rspamd_task", null_reg, 0);
+ lua_newclass_full (L, "rspamd{task}", "rspamd_task", tasklib_m, tasklib_f);
+
+ lua_pop (L, 1); /* remove metatable from stack */
return 1;
}
@@ -1752,6 +1853,8 @@ luaopen_textpart (lua_State * L)
lua_newclass (L, "rspamd{textpart}", textpartlib_m);
luaL_openlib (L, "rspamd_textpart", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
@@ -1761,6 +1864,8 @@ luaopen_image (lua_State * L)
lua_newclass (L, "rspamd{image}", imagelib_m);
luaL_openlib (L, "rspamd_image", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
@@ -1770,6 +1875,8 @@ luaopen_url (lua_State * L)
lua_newclass (L, "rspamd{url}", urllib_m);
luaL_openlib (L, "rspamd_url", null_reg, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}
diff --git a/src/lua/lua_upstream.c b/src/lua/lua_upstream.c
index f9e74e027..6780a756a 100644
--- a/src/lua/lua_upstream.c
+++ b/src/lua/lua_upstream.c
@@ -505,6 +505,8 @@ luaopen_upstream (lua_State * L)
luaL_openlib (L, NULL, upstream_list_m, 0);
luaL_openlib (L, "upstream_list", upstream_list_f, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
luaL_newmetatable (L, "rspamd{upstream}");
lua_pushstring (L, "__index");
lua_pushvalue (L, -2);
@@ -517,5 +519,7 @@ luaopen_upstream (lua_State * L)
luaL_openlib (L, NULL, upstream_m, 0);
luaL_openlib (L, "upstream", upstream_f, 0);
+ lua_pop (L, 1); /* remove metatable from stack */
+
return 1;
}