From: Markus Valentin Date: Thu, 14 Mar 2024 09:36:56 +0000 (+0100) Subject: lib-lua: Add dlua_script_create_auto() X-Git-Tag: 2.4.1~923 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5d0a21fdb30664d9618316cfba152aa61881231f;p=thirdparty%2Fdovecot%2Fcore.git lib-lua: Add dlua_script_create_auto() Allow to initialize a lua script looking up lua_file path using the event passed to this function. --- diff --git a/src/lib-lua/dlua-script.c b/src/lib-lua/dlua-script.c index 63025d0b1b..7e88702939 100644 --- a/src/lib-lua/dlua-script.c +++ b/src/lib-lua/dlua-script.c @@ -8,7 +8,9 @@ #include "hex-binary.h" #include "eacces-error.h" #include "ioloop.h" +#include "settings.h" #include "dlua-script-private.h" +#include "settings.h" #include #include @@ -25,6 +27,30 @@ struct event_category event_category_lua = { static struct dlua_script *dlua_scripts = NULL; +#undef DEF +#define DEF(type, name) \ + SETTING_DEFINE_STRUCT_##type("lua_"#name, name, struct dlua_settings) + +static const struct setting_define dlua_setting_defines[] = { + DEF(FILE, file), + + SETTING_DEFINE_LIST_END +}; + +static const struct dlua_settings dlua_default_settings = { + .file = "", +}; + +const struct setting_parser_info dlua_setting_parser_info = { + .name = "dlua", + + .defines = dlua_setting_defines, + .defaults = &dlua_default_settings, + + .struct_size = sizeof(struct dlua_settings), + .pool_offset1 = 1 + offsetof(struct dlua_settings, pool), +}; + static int dlua_script_create_finish(struct dlua_script *script, const char **error_r); @@ -327,6 +353,43 @@ int dlua_script_create_stream(struct istream *is, struct dlua_script **script_r, return 0; } +int dlua_script_create_auto(struct event *event_parent, + struct dlua_script **script_r, + const char **error_r) +{ + const struct dlua_settings *set; + struct settings_file file; + int ret = 1; + + if (settings_get(event_parent, &dlua_setting_parser_info, 0, &set, + error_r) < 0) + return -1; + + settings_file_get(set->file, set->pool, &file); + if (set->file[0] == '\0') { + *error_r = "lua_file setting is empty"; + ret = 0; + } else if (file.path[0] == '\0') { + *error_r = "Lua doesn't support inline content for lua_file"; + ret = -1; + } + if (ret < 1) { + settings_free(set); + return ret; + } + + ret = dlua_script_create_file(file.path, script_r, event_parent, + error_r); + if (ret < 0) { + i_assert(*error_r != NULL); + *error_r = t_strdup_printf("Lua script '%s': %s", file.path, + *error_r); + } else + ret = 1; + settings_free(set); + return ret; +} + static void dlua_script_destroy(struct dlua_script *script) { dlua_call_deinit_function(script); diff --git a/src/lib-lua/dlua-script.h b/src/lib-lua/dlua-script.h index 015475bed4..d0a674e161 100644 --- a/src/lib-lua/dlua-script.h +++ b/src/lib-lua/dlua-script.h @@ -3,7 +3,18 @@ struct dlua_script; +extern const struct setting_parser_info dlua_setting_parser_info; + +struct dlua_settings { + pool_t pool; + + const char *file; +}; + /* Parse and load a lua script, without actually running it. */ +int dlua_script_create_auto(struct event *event_parent, + struct dlua_script **script_r, + const char **error_r); int dlua_script_create_string(const char *str, struct dlua_script **script_r, struct event *event_parent, const char **error_r); int dlua_script_create_file(const char *file, struct dlua_script **script_r,