diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2012-07-26 21:50:13 +0400 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2012-07-26 21:50:13 +0400 |
commit | e1a8ed50131891516f5da6e22aae69a306147d38 (patch) | |
tree | 61002cf909d2d41553b94b8ed654d0f2f3567a67 /src/lua | |
parent | 2e615083e475c7390c667695b9e659fa5ba4da5f (diff) | |
download | rspamd-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.c | 41 | ||||
-rw-r--r-- | src/lua/lua_cdb.c | 2 | ||||
-rw-r--r-- | src/lua/lua_classifier.c | 4 | ||||
-rw-r--r-- | src/lua/lua_common.c | 183 | ||||
-rw-r--r-- | src/lua/lua_common.h | 8 | ||||
-rw-r--r-- | src/lua/lua_config.c | 8 | ||||
-rw-r--r-- | src/lua/lua_mempool.c | 2 | ||||
-rw-r--r-- | src/lua/lua_message.c | 2 | ||||
-rw-r--r-- | src/lua/lua_session.c | 4 | ||||
-rw-r--r-- | src/lua/lua_task.c | 117 | ||||
-rw-r--r-- | src/lua/lua_upstream.c | 4 |
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; } |