diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c index 390f5107c97b0fe351ee82782a4896b1bb677fd0..61d95f0e25ffca12527b71923d50a4092189bf01 100644 --- a/src/lib-sieve-tool/sieve-tool.c +++ b/src/lib-sieve-tool/sieve-tool.c @@ -27,8 +27,18 @@ static struct ioloop *ioloop; struct sieve_instance *sieve_instance; -static const struct sieve_callbacks sieve_callbacks = { - NULL +/* + * Settings management + */ + +static const char *sieve_tool_get_setting +(void *context ATTR_UNUSED, const char *identifier) +{ + return getenv(t_str_ucase(identifier)); +} + +static const struct sieve_callbacks sieve_tool_callbacks = { + sieve_tool_get_setting }; /* @@ -57,7 +67,7 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED) /* HACK */ static bool _init_lib = FALSE; -void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib) +void sieve_tool_init(const struct sieve_callbacks *callbacks, bool init_lib) { _init_lib = init_lib; @@ -73,13 +83,14 @@ void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib) lib_signals_ignore(SIGALRM, FALSE); } - if ( (sieve_instance=sieve_init(&sieve_callbacks, NULL)) == NULL ) + if ( callbacks == NULL ) callbacks = &sieve_tool_callbacks; + + if ( (sieve_instance=sieve_init(callbacks, NULL)) == NULL ) i_fatal("failed to initialize sieve implementation\n"); } void sieve_tool_deinit(void) { - sieve_deinit(); sieve_deinit(&sieve_instance); if ( _init_lib ) { diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h index 80f12ef606cb51eff9087724dc1b915bba6d20ad..dacda5e51502f7ebd7db4f71f169205238ea0157 100644 --- a/src/lib-sieve-tool/sieve-tool.h +++ b/src/lib-sieve-tool/sieve-tool.h @@ -18,7 +18,7 @@ struct sieve_instance *sieve_instance; * Initialization */ -void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib); +void sieve_tool_init(const struct sieve_callbacks *callbacks, bool init_lib); void sieve_tool_deinit(void); /* diff --git a/src/lib-sieve/Makefile.am b/src/lib-sieve/Makefile.am index fed7eb2f6c0f8c9e34d71fc75d41d8b27b10157c..fcf02ea48058feea8eddec351914083c5552da7e 100644 --- a/src/lib-sieve/Makefile.am +++ b/src/lib-sieve/Makefile.am @@ -72,7 +72,6 @@ libsieve_la_LIBADD = $(plugins) libsieve_la_SOURCES = \ rfc2822.c \ sieve-limits.c \ - sieve-settings.c \ sieve-message.c \ sieve-smtp.c \ sieve-lexer.c \ @@ -110,7 +109,6 @@ noinst_HEADERS = \ sieve-types.h \ sieve-common.h \ sieve-limits.h \ - sieve-settings.h \ sieve-message.h \ sieve-smtp.h \ sieve-lexer.h \ diff --git a/src/lib-sieve/plugins/include/cmd-include.c b/src/lib-sieve/plugins/include/cmd-include.c index 8e681652916b006f50b2bf9ece0ce069832e3e88..473c9e6c01689ef73e3cb127b359a457c4589ae7 100644 --- a/src/lib-sieve/plugins/include/cmd-include.c +++ b/src/lib-sieve/plugins/include/cmd-include.c @@ -234,7 +234,7 @@ static bool cmd_include_validate } script_path = ext_include_get_script_directory - (ctx_data->location, script_name); + (this_ext, ctx_data->location, script_name); if ( script_path == NULL ) { sieve_argument_validate_error(valdtr, arg, "include: %s location for included script '%s' is unavailable " diff --git a/src/lib-sieve/plugins/include/ext-include-binary.c b/src/lib-sieve/plugins/include/ext-include-binary.c index 3c02dc48d299c52c6532be6a9a0ee4cde276acd0..9d6711bf26257049788939ecd0403c7c781b8363 100644 --- a/src/lib-sieve/plugins/include/ext-include-binary.c +++ b/src/lib-sieve/plugins/include/ext-include-binary.c @@ -288,7 +288,8 @@ static bool ext_include_binary_open } /* Can we find/open the script dependency ? */ - script_dir = ext_include_get_script_directory(location, str_c(script_name)); + script_dir = ext_include_get_script_directory + (ext, location, str_c(script_name)); if ( script_dir == NULL || !(script=sieve_script_create_in_directory (ext->svinst, script_dir, str_c(script_name), NULL, NULL)) ) { diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c index 4445c9b37ed372aefbcecd7c9ab5d0d31295e240..de16f8b81984716322c7734a2411253120cd271b 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.c +++ b/src/lib-sieve/plugins/include/ext-include-common.c @@ -7,7 +7,6 @@ #include "home-expand.h" #include "sieve-common.h" -#include "sieve-settings.h" #include "sieve-error.h" #include "sieve-script.h" #include "sieve-ast.h" @@ -69,16 +68,21 @@ struct ext_include_interpreter_context { */ const char *ext_include_get_script_directory -(enum ext_include_script_location location, const char *script_name) +(const struct sieve_extension *ext, enum ext_include_script_location location, + const char *script_name) { - const char *home, *sieve_dir; + struct sieve_instance *svinst = ext->svinst; + const char *home = NULL, *sieve_dir = NULL; switch ( location ) { case EXT_INCLUDE_LOCATION_PERSONAL: - sieve_dir = sieve_setting_get("dir"); - home = getenv("HOME"); + sieve_dir = sieve_get_setting(svinst, "sieve_dir"); + + if ( sieve_dir == NULL ) { + home = sieve_get_setting(svinst, "home"); + + if ( home == NULL ) home = getenv("HOME"); - if (sieve_dir == NULL) { if ( home == NULL ) { sieve_sys_error( "include: sieve_dir and home not set for :personal script include " @@ -94,7 +98,7 @@ const char *ext_include_get_script_directory break; case EXT_INCLUDE_LOCATION_GLOBAL: - sieve_dir = sieve_setting_get("global_dir"); + sieve_dir = sieve_get_setting(svinst, "global_dir"); if (sieve_dir == NULL) { sieve_sys_error( @@ -105,7 +109,7 @@ const char *ext_include_get_script_directory break; default: - return NULL; + break; } return sieve_dir; diff --git a/src/lib-sieve/plugins/include/ext-include-common.h b/src/lib-sieve/plugins/include/ext-include-common.h index ac367694cf2ccfd6c936cb4cf722c9933b47c168..6eb10cdc9a4362e71fd85d787945ae2ae38ab806 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.h +++ b/src/lib-sieve/plugins/include/ext-include-common.h @@ -52,16 +52,6 @@ static inline const char *ext_include_script_location_name extern const struct sieve_extension_def include_extension; extern const struct sieve_binary_extension include_binary_ext; -struct ext_include_context { - const struct sieve_extension *var_ext; -}; - -static inline struct ext_include_context *ext_include_get_context -(const struct sieve_extension *ext) -{ - return (struct ext_include_context *) ext->context; -} - /* * Commands */ @@ -93,12 +83,26 @@ extern const struct sieve_operation_def global_operation; */ const char *ext_include_get_script_directory - (enum ext_include_script_location location, const char *script_name); + (const struct sieve_extension *ext, + enum ext_include_script_location location, const char *script_name); /* * Context */ +/* Extension context */ + +struct ext_include_context { + /* Extension dependencies */ + const struct sieve_extension *var_ext; +}; + +static inline struct ext_include_context *ext_include_get_context +(const struct sieve_extension *ext) +{ + return (struct ext_include_context *) ext->context; +} + /* AST Context */ struct ext_include_ast_context { diff --git a/src/lib-sieve/plugins/include/ext-include.c b/src/lib-sieve/plugins/include/ext-include.c index edaa23c3bc3baeb02873979de12efd47e3d17a5c..90b40ad80c5419e09e900317cd83069795347005 100644 --- a/src/lib-sieve/plugins/include/ext-include.c +++ b/src/lib-sieve/plugins/include/ext-include.c @@ -84,8 +84,10 @@ static bool ext_include_load (const struct sieve_extension *ext, void **context) { struct ext_include_context *ctx = i_new(struct ext_include_context, 1); - + + /* Extension dependencies */ ctx->var_ext = sieve_ext_variables_get_extension(ext->svinst); + *context = ctx; return TRUE; @@ -95,6 +97,7 @@ static void ext_include_unload (const struct sieve_extension *ext) { struct ext_include_context *ctx = (struct ext_include_context *) ext->context; + i_free(ctx); } diff --git a/src/lib-sieve/plugins/subaddress/ext-subaddress.c b/src/lib-sieve/plugins/subaddress/ext-subaddress.c index fe7e8a09b4f857dd140d12c7ace727b8757595ed..367b11f3e5f83943a30e230337c2f618022aaf7c 100644 --- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c +++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c @@ -13,7 +13,6 @@ #include "sieve-common.h" -#include "sieve-settings.h" #include "sieve-code.h" #include "sieve-address.h" #include "sieve-extensions.h" @@ -51,7 +50,7 @@ static struct sieve_operand_def subaddress_operand; static bool ext_subaddress_load (const struct sieve_extension *ext, void **context); -static bool ext_subaddress_unload +static void ext_subaddress_unload (const struct sieve_extension *ext); static bool ext_subaddress_validator_load (const struct sieve_extension *ext, struct sieve_validator *validator); @@ -70,7 +69,7 @@ static bool ext_subaddress_load (const struct sieve_extension *ext, void **context) { struct ext_subaddress_config *config; - const char *sep = getenv("SIEVE_SUBADDRESS_SEP"); + const char *sep = sieve_get_setting(ext->svinst, "sieve_subaddress_sep"); if ( sep == NULL ) sep = SUBADDRESS_DEFAULT_SEP; @@ -83,7 +82,7 @@ static bool ext_subaddress_load return TRUE; } -static bool ext_subaddress_unload +static void ext_subaddress_unload (const struct sieve_extension *ext) { struct ext_subaddress_config *config = diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h index fbd44044af42dbaced66a8740d3ff0f87252a343..e92f83d4be96d3a61fc11864d312acde8e91a204 100644 --- a/src/lib-sieve/sieve-common.h +++ b/src/lib-sieve/sieve-common.h @@ -15,9 +15,9 @@ * Types */ -typedef size_t sieve_size_t; -typedef uint32_t sieve_offset_t; -typedef uint32_t sieve_number_t; +typedef size_t sieve_size_t; +typedef uint32_t sieve_offset_t; +typedef uint32_t sieve_number_t; #define SIEVE_MAX_NUMBER ((sieve_number_t) -1) @@ -135,13 +135,30 @@ bool sieve_validate */ struct sieve_instance { + /* Main engine pool */ pool_t pool; + /* Callbacks */ const struct sieve_callbacks *callbacks; - void *context; + /* Extension registry */ struct sieve_extension_registry *ext_reg; }; +/* + * Settings + */ + +static inline const char *sieve_get_setting +(struct sieve_instance *svinst, const char *identifier) +{ + const struct sieve_callbacks *callbacks = svinst->callbacks; + + if ( callbacks == NULL || callbacks->get_setting == NULL ) + return NULL; + + return callbacks->get_setting(svinst->context, identifier); +} + #endif /* __SIEVE_COMMON_H */ diff --git a/src/lib-sieve/sieve-settings.c b/src/lib-sieve/sieve-settings.c deleted file mode 100644 index afe0ccaefda605cb324e14ff75ffea4676b77b0c..0000000000000000000000000000000000000000 --- a/src/lib-sieve/sieve-settings.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file - */ - -#include "lib.h" - -#include "sieve-common.h" -#include "sieve-extensions.h" - -#include "sieve-settings.h" - -static sieve_settings_func_t sieve_settings_func = NULL; - -/* - * Initialization - */ - -void sieve_settings_init(sieve_settings_func_t settings_func) -{ - sieve_settings_func = settings_func; -} - -/* - * Retrieval - */ - -static const char *_sieve_setting_get_env_name -(const struct sieve_extension *ext, const char *identifier) -{ - if ( ext == NULL ) - return t_str_lcase(t_strconcat("sieve_", identifier, NULL)); - - return t_str_lcase(t_strconcat("sieve_", ext->name, "_", identifier, NULL)); -} - -const char *sieve_setting_get(const char *identifier) -{ - if ( sieve_settings_func == NULL ) - return NULL; - - return sieve_settings_func(_sieve_setting_get_env_name(NULL, identifier)); -} - -const char *sieve_setting_get_ext -(const struct sieve_extension *ext, const char *identifier) -{ - if ( sieve_settings_func == NULL ) - return NULL; - - return sieve_settings_func(_sieve_setting_get_env_name(ext, identifier)); -} diff --git a/src/lib-sieve/sieve-settings.h b/src/lib-sieve/sieve-settings.h deleted file mode 100644 index 6ea82863bf0cb14d974c8f92ea8617b30b287056..0000000000000000000000000000000000000000 --- a/src/lib-sieve/sieve-settings.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file - */ - -#ifndef __SIEVE_SETTINGS_H -#define __SIEVE_SETTINGS_H - -#include "sieve-common.h" - -typedef const char *(*sieve_settings_func_t)(const char *identifier); - -void sieve_settings_init(sieve_settings_func_t settings_func); - -const char *sieve_setting_get(const char *identifier); -const char *sieve_setting_get_ext - (const struct sieve_extension *ext, const char *identifier); - -#endif /* __SIEVE_SETTINGS_H */ diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index a4da11a2f2eaf89cd1029c758697fb07e6455e14..2da9f3107df2100434e70ed350c26900e6b6ef8a 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -6,7 +6,6 @@ #include "istream.h" #include "buffer.h" -#include "sieve-settings.h" #include "sieve-extensions.h" #include "sieve-script.h" diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h index 6272fc16f40ecd4a0682c6bf5e73448064d4836f..b13e066b92de0207e45c9e32ba4d27e0ef9d7262 100644 --- a/src/lib-sieve/sieve.h +++ b/src/lib-sieve/sieve.h @@ -12,7 +12,6 @@ struct sieve_binary; #include "sieve-config.h" #include "sieve-types.h" #include "sieve-error.h" -#include "sieve-settings.h" /* * Main Sieve library interface diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 1b4126c4a84e0f2b87e8684c41135f6e563dc763..357b9b782a85a9bd17420b9cb2856af32a9b3a43 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -12,7 +12,6 @@ #include "lda-settings.h" #include "sieve.h" -#include "sieve-settings.h" #include "lda-sieve-plugin.h" @@ -54,7 +53,6 @@ static const struct sieve_callbacks lda_sieve_callbacks = { lda_sieve_get_setting }; - /* * Mail transmission */ @@ -603,7 +601,6 @@ static int lda_sieve_deliver_mail ARRAY_TYPE (const_string) scripts_before; ARRAY_TYPE (const_string) scripts_after; bool debug = mdctx->dest_user->mail_debug; - const char *extensions = NULL; int ret = 0; *storage_r = NULL; diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c index 2de0e9570162145bc0ced5bb334cece7d982ee05..f6bd4b3e04c4c533d0d7144f2fe92b9c68a3d59e 100644 --- a/src/sieve-tools/sievec.c +++ b/src/sieve-tools/sievec.c @@ -72,7 +72,7 @@ int main(int argc, char **argv) { } if ( outfile == NULL && dump ) - outfile = "-"; + outfile = "-"; if ( extensions != NULL ) { sieve_set_extensions(sieve_instance, extensions); diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am index fb8c9f5501c4f9bec8db3cc6675bf48167186759..740d0a72b85b09e27d247cca8b6d8d2f7cb0ab11 100644 --- a/src/testsuite/Makefile.am +++ b/src/testsuite/Makefile.am @@ -56,6 +56,7 @@ testsuite_SOURCES = \ testsuite-smtp.c \ testsuite-mailstore.c \ testsuite-binary.c \ + testsuite-settings.c \ $(commands) \ $(tests) \ ext-testsuite.c \ @@ -73,5 +74,6 @@ noinst_HEADERS = \ testsuite-result.h \ testsuite-smtp.h \ testsuite-mailstore.h \ - testsuite-binary.h + testsuite-binary.h \ + testsuite-settings.h diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c index 82ee2af0ec37e54ce0e176e52db3c33e3229a8b0..eb9583d56983d1cc6c7af92bc5488c467777619b 100644 --- a/src/testsuite/testsuite.c +++ b/src/testsuite/testsuite.c @@ -51,11 +51,15 @@ const struct sieve_script_env *testsuite_scriptenv; * Testsuite initialization */ +static const struct sieve_callbacks testsuite_sieve_callbacks = { + testsuite_setting_get +}; + static void testsuite_tool_init(const char *extensions) { testsuite_settings_init(); - sieve_tool_init(testsuite_setting_get, FALSE); + sieve_tool_init(&testsuite_sieve_callbacks); sieve_extensions_set_string(sieve_instance, extensions);