From: Aki Tuomi Date: Thu, 11 Oct 2018 14:06:00 +0000 (+0300) Subject: lib-lua: Add events to scripts X-Git-Tag: 2.3.9~1171 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f99b185f7ca122db897c577ffa7bb7446d9cedd6;p=thirdparty%2Fdovecot%2Fcore.git lib-lua: Add events to scripts --- diff --git a/src/auth/passdb-lua.c b/src/auth/passdb-lua.c index 02dd15f029..1c38658c0e 100644 --- a/src/auth/passdb-lua.c +++ b/src/auth/passdb-lua.c @@ -153,7 +153,7 @@ static void passdb_lua_init(struct passdb_module *_module) (struct dlua_passdb_module *)_module; const char *error; - if (dlua_script_create_file(module->file, &module->script, &error) < 0 || + if (dlua_script_create_file(module->file, &module->script, auth_event, &error) < 0 || auth_lua_script_init(module->script, &error) < 0) i_fatal("passdb-lua: initialization failed: %s", error); module->has_password_verify = diff --git a/src/auth/test-lua.c b/src/auth/test-lua.c index 79ab9eb7ad..fce41b3516 100644 --- a/src/auth/test-lua.c +++ b/src/auth/test-lua.c @@ -31,7 +31,7 @@ static void test_db_lua_auth_verify(void) test_begin("auth db lua passdb_verify"); - test_assert(dlua_script_create_string(luascript, &script, &error) == 0); + test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0); test_assert(auth_lua_script_init(script, &error) == 0); if (script != NULL) { test_assert(auth_lua_call_password_verify(script, req, "password", &error) == 1); @@ -67,7 +67,7 @@ static void test_db_lua_auth_lookup(void) test_begin("auth db lua passdb_lookup"); - test_assert(dlua_script_create_string(luascript, &script, &error) == 0); + test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0); test_assert(auth_lua_script_init(script, &error) == 0); if (script != NULL) { test_assert(auth_lua_call_passdb_lookup(script, req, &scheme, &pass, &error) == 1); diff --git a/src/auth/userdb-lua.c b/src/auth/userdb-lua.c index d15451e3fc..04f098bf19 100644 --- a/src/auth/userdb-lua.c +++ b/src/auth/userdb-lua.c @@ -80,7 +80,7 @@ static void userdb_lua_init(struct userdb_module *_module) (struct dlua_userdb_module *)_module; const char *error; - if (dlua_script_create_file(module->file, &module->script, &error) < 0 || + if (dlua_script_create_file(module->file, &module->script, auth_event, &error) < 0 || auth_lua_script_init(module->script, &error) < 0) i_fatal("userdb-lua: initialization failed: %s", error); } diff --git a/src/lib-lua/dlua-script-private.h b/src/lib-lua/dlua-script-private.h index caa0f63621..7f521b5904 100644 --- a/src/lib-lua/dlua-script-private.h +++ b/src/lib-lua/dlua-script-private.h @@ -44,6 +44,7 @@ struct dlua_script { lua_State *L; + struct event *event; const char *filename; struct istream *in; ssize_t last_read; @@ -71,6 +72,8 @@ struct dlua_table_values { } v; }; +extern struct event_category event_category_lua; + /* Get dlua_script from lua_State */ struct dlua_script *dlua_script_from_state(lua_State *L); diff --git a/src/lib-lua/dlua-script.c b/src/lib-lua/dlua-script.c index 2a9b5c3e11..4b1c63e5c2 100644 --- a/src/lib-lua/dlua-script.c +++ b/src/lib-lua/dlua-script.c @@ -14,6 +14,10 @@ #define LUA_SCRIPT_INIT_FN "script_init" #define LUA_SCRIPT_DEINIT_FN "script_deinit" +struct event_category event_category_lua = { + .name = "lua", +}; + static struct dlua_script *dlua_scripts = NULL; static const char *dlua_errstr(int err) @@ -117,7 +121,8 @@ int dlua_script_init(struct dlua_script *script, const char **error_r) return ret; } -static struct dlua_script *dlua_create_script(const char *name) +static struct dlua_script *dlua_create_script(const char *name, + struct event *event_parent) { pool_t pool = pool_allocfree_create(t_strdup_printf("lua script %s", name)); struct dlua_script *script = p_new(pool, struct dlua_script, 1); @@ -130,6 +135,8 @@ static struct dlua_script *dlua_create_script(const char *name) i_assert(script->L != NULL); script->ref = 1; luaL_openlibs(script->L); + script->event = event_create(event_parent); + event_add_category(script->event, &event_category_lua); return script; } @@ -166,6 +173,7 @@ dlua_script_create_finish(struct dlua_script *script, struct dlua_script **scrip return -1; } + event_add_str(script->event, "script", script->filename); DLLIST_PREPEND(&dlua_scripts, script); *script_r = script; @@ -174,7 +182,7 @@ dlua_script_create_finish(struct dlua_script *script, struct dlua_script **scrip } int dlua_script_create_string(const char *str, struct dlua_script **script_r, - const char **error_r) + struct event *event_parent, const char **error_r) { struct dlua_script *script; int err; @@ -191,7 +199,7 @@ int dlua_script_create_string(const char *str, struct dlua_script **script_r, return 0; } - script = dlua_create_script(fn); + script = dlua_create_script(fn, event_parent); if ((err = luaL_loadstring(script->L, str)) != 0) { *error_r = t_strdup_printf("lua_load() failed: %s", dlua_errstr(err)); @@ -203,7 +211,7 @@ int dlua_script_create_string(const char *str, struct dlua_script **script_r, } int dlua_script_create_file(const char *file, struct dlua_script **script_r, - const char **error_r) + struct event *event_parent, const char **error_r) { struct dlua_script *script; int err; @@ -224,7 +232,7 @@ int dlua_script_create_file(const char *file, struct dlua_script **script_r, return -1; } - script = dlua_create_script(file); + script = dlua_create_script(file, event_parent); if ((err = luaL_loadfile(script->L, file)) != 0) { *error_r = t_strdup_printf("lua_load(%s) failed: %s", file, dlua_errstr(err)); @@ -236,7 +244,7 @@ int dlua_script_create_file(const char *file, struct dlua_script **script_r, } int dlua_script_create_stream(struct istream *is, struct dlua_script **script_r, - const char **error_r) + struct event *event_parent, const char **error_r) { struct dlua_script *script; const char *filename = i_stream_get_name(is); @@ -250,7 +258,7 @@ int dlua_script_create_stream(struct istream *is, struct dlua_script **script_r, return 0; } - script = dlua_create_script(filename); + script = dlua_create_script(filename, event_parent); script->in = is; script->filename = p_strdup(script->pool, filename); if ((err = lua_load(script->L, dlua_reader, script, filename, 0)) < 0) { @@ -283,6 +291,7 @@ static void dlua_script_destroy(struct dlua_script *script) /* remove from list */ DLLIST_REMOVE(&dlua_scripts, script); + event_unref(&script->event); /* then just release memory */ pool_unref(&script->pool); } diff --git a/src/lib-lua/dlua-script.h b/src/lib-lua/dlua-script.h index 8e53f2f5ca..e5cabece38 100644 --- a/src/lib-lua/dlua-script.h +++ b/src/lib-lua/dlua-script.h @@ -6,12 +6,12 @@ struct dlua_script; /* Parse and load a lua script. Will reuse an existing script if found. */ int dlua_script_create_string(const char *str, struct dlua_script **script_r, - const char **error_r); + struct event *event_parent, const char **error_r); int dlua_script_create_file(const char *file, struct dlua_script **script_r, - const char **error_r); + struct event *event_parent, const char **error_r); /* Remember to set script name using i_stream_set_name */ int dlua_script_create_stream(struct istream *is, struct dlua_script **script_r, - const char **error_r); + struct event *event_parent, const char **error_r); /* run dlua_script_init function */ int dlua_script_init(struct dlua_script *script, const char **error_r); diff --git a/src/lib-lua/test-lua.c b/src/lib-lua/test-lua.c index 504d50cf31..13be78a323 100644 --- a/src/lib-lua/test-lua.c +++ b/src/lib-lua/test-lua.c @@ -17,7 +17,7 @@ static void test_lua(void) test_begin("lua script"); - test_assert(dlua_script_create_string(luascript, &script, &error) == 0); + test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0); dlua_dovecot_register(script); test_assert(dlua_script_init(script, &error) == 0); test_assert(dlua_script_has_function(script, "lua_function")); diff --git a/src/plugins/mail-lua/mail-lua-plugin.c b/src/plugins/mail-lua/mail-lua-plugin.c index a555aa5966..d49adf7b58 100644 --- a/src/plugins/mail-lua/mail-lua-plugin.c +++ b/src/plugins/mail-lua/mail-lua-plugin.c @@ -106,7 +106,7 @@ static void mail_lua_user_created(struct mail_user *user) if (script_fn == NULL) return; - if (dlua_script_create_file(script_fn, &script, &error) < 0) { + if (dlua_script_create_file(script_fn, &script, user->event, &error) < 0) { user->error = p_strdup_printf(user->pool, "dlua_script_create_file(%s) failed: %s", script_fn, error); return; diff --git a/src/plugins/push-notification/push-notification-driver-lua.c b/src/plugins/push-notification/push-notification-driver-lua.c index 6f01bf419b..0d56487fd3 100644 --- a/src/plugins/push-notification/push-notification-driver-lua.c +++ b/src/plugins/push-notification/push-notification-driver-lua.c @@ -93,7 +93,7 @@ push_notification_driver_lua_init(struct push_notification_driver_config *config push_notification_driver_debug(DLUA_LOG_LABEL, user, "Loading %s", file); - if (dlua_script_create_file(file, &ctx->script, error_r) < 0) { + if (dlua_script_create_file(file, &ctx->script, NULL, error_r) < 0) { /* there is a T_POP after this, which will break errors */ *error_r = p_strdup(pool, *error_r); return -1;