From 0bbc07907fc7d81c6252fbefaf9f49c1cc70c5eb Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Thu, 5 Nov 2009 15:29:20 +0100 Subject: [PATCH] Properly implemented settings retrieval API. --- src/lib-sieve-tool/sieve-tool.c | 21 ++++++-- src/lib-sieve-tool/sieve-tool.h | 2 +- src/lib-sieve/Makefile.am | 2 - src/lib-sieve/plugins/include/cmd-include.c | 2 +- .../plugins/include/ext-include-binary.c | 3 +- .../plugins/include/ext-include-common.c | 20 +++++--- .../plugins/include/ext-include-common.h | 26 ++++++---- src/lib-sieve/plugins/include/ext-include.c | 5 +- .../plugins/subaddress/ext-subaddress.c | 7 ++- src/lib-sieve/sieve-common.h | 25 ++++++++-- src/lib-sieve/sieve-settings.c | 50 ------------------- src/lib-sieve/sieve-settings.h | 17 ------- src/lib-sieve/sieve.c | 1 - src/lib-sieve/sieve.h | 1 - src/plugins/lda-sieve/lda-sieve-plugin.c | 3 -- src/sieve-tools/sievec.c | 2 +- src/testsuite/Makefile.am | 4 +- src/testsuite/testsuite.c | 6 ++- 18 files changed, 84 insertions(+), 113 deletions(-) delete mode 100644 src/lib-sieve/sieve-settings.c delete mode 100644 src/lib-sieve/sieve-settings.h diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c index 390f5107c..61d95f0e2 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 80f12ef60..dacda5e51 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 fed7eb2f6..fcf02ea48 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 8e6816529..473c9e6c0 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 3c02dc48d..9d6711bf2 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 4445c9b37..de16f8b81 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 ac367694c..6eb10cdc9 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 edaa23c3b..90b40ad80 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 fe7e8a09b..367b11f3e 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 fbd44044a..e92f83d4b 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 afe0ccaef..000000000 --- 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 6ea82863b..000000000 --- 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 a4da11a2f..2da9f3107 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 6272fc16f..b13e066b9 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 1b4126c4a..357b9b782 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 2de0e9570..f6bd4b3e0 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 fb8c9f550..740d0a72b 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 82ee2af0e..eb9583d56 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); -- GitLab