]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-lua: Add dlua_script_create_auto()
authorMarkus Valentin <markus.valentin@open-xchange.com>
Thu, 14 Mar 2024 09:36:56 +0000 (10:36 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:39:58 +0000 (10:39 +0200)
Allow to initialize a lua script looking up lua_file path using the
event passed to this function.

src/lib-lua/dlua-script.c
src/lib-lua/dlua-script.h

index 63025d0b1b5e521f04baa08b6baf203b8e4bc413..7e88702939ed33de0a5aa8c64128757d082ee49f 100644 (file)
@@ -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 <fcntl.h>
 #include <unistd.h>
@@ -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);
index 015475bed43ff19fea238fdae983c29a30e1acde..d0a674e161514295051f7aa811f1835ed626ee4e 100644 (file)
@@ -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,