diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c index bb4596fc1a1ed0e98ef14116dd5c8444a7e941c3..b415906f4f2cfb9fcb75051b40c9a2d78c5a78d7 100644 --- a/src/lib-sieve-tool/sieve-tool.c +++ b/src/lib-sieve-tool/sieve-tool.c @@ -49,7 +49,7 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED) /* HACK */ static bool _init_lib = FALSE; -void sieve_tool_init(bool init_lib) +void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib) { _init_lib = init_lib; @@ -65,7 +65,7 @@ void sieve_tool_init(bool init_lib) lib_signals_ignore(SIGALRM, FALSE); } - if ( !sieve_init() ) + if ( !sieve_init(settings_func) ) i_fatal("failed to initialize sieve implementation\n"); } diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h index 4c7dbd43e61c4f4fd7db4c73e040b7b9e52af179..e9c2b535f750138fefe71c39ebd2353b138b479f 100644 --- a/src/lib-sieve-tool/sieve-tool.h +++ b/src/lib-sieve-tool/sieve-tool.h @@ -4,13 +4,15 @@ #ifndef __SIEVE_TOOL_H #define __SIEVE_TOOL_H +#include "sieve-common.h" + /* Functionality common to all Sieve command line tools. */ /* * Initialization */ -void sieve_tool_init(bool init_lib); +void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib); void sieve_tool_deinit(void); /* diff --git a/src/lib-sieve/sieve-settings.c b/src/lib-sieve/sieve-settings.c index b6217a8c054af93f9609e53ee42cb88fb3ffe948..afe0ccaefda605cb324e14ff75ffea4676b77b0c 100644 --- a/src/lib-sieve/sieve-settings.c +++ b/src/lib-sieve/sieve-settings.c @@ -2,29 +2,21 @@ */ #include "lib.h" -#include "mail-user.h" -#include "master-service.h" -#include "master-service-settings.h" #include "sieve-common.h" #include "sieve-extensions.h" #include "sieve-settings.h" -#include <stdlib.h> - -static struct mail_user *_settings_user; -static struct master_service *_settings_service; +static sieve_settings_func_t sieve_settings_func = NULL; /* * Initialization */ -void sieve_settings_init -(struct master_service *service, struct mail_user *user) +void sieve_settings_init(sieve_settings_func_t settings_func) { - _settings_user = user; - _settings_service = service; + sieve_settings_func = settings_func; } /* @@ -42,48 +34,17 @@ static const char *_sieve_setting_get_env_name const char *sieve_setting_get(const char *identifier) { - const char *value = mail_user_plugin_getenv - (_settings_user, _sieve_setting_get_env_name(NULL, identifier)); - - printf("GET(%s) = %s\n", identifier, value); + if ( sieve_settings_func == NULL ) + return NULL; - return value; + 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) { - return mail_user_plugin_getenv - (_settings_user, _sieve_setting_get_env_name(ext, identifier)); -} - -void sieve_setting_set(const char *identifier, const char *value) -{ - const char *setting; - - if ( _settings_service == NULL ) return; - - setting = t_strconcat("plugin/", - _sieve_setting_get_env_name(NULL, identifier), "=", value, NULL); - - printf("%s\n", setting); - - if ( master_service_set(_settings_service, setting) < 0 ) - i_unreached(); -} - -void sieve_setting_set_ext -(const struct sieve_extension *ext, const char *identifier, const char *value) -{ - const char *setting; - - if ( _settings_service == NULL ) return; - - setting = t_strconcat("plugin/", - _sieve_setting_get_env_name(NULL, identifier), "=", value, NULL); - - printf("%s\n", setting); + if ( sieve_settings_func == NULL ) + return NULL; - if ( master_service_set(_settings_service, setting) < 0 ) - i_unreached(); + 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 index 1a869aa3ee253518e8f13988aa64f10ffb44894f..6ea82863bf0cb14d974c8f92ea8617b30b287056 100644 --- a/src/lib-sieve/sieve-settings.h +++ b/src/lib-sieve/sieve-settings.h @@ -6,22 +6,12 @@ #include "sieve-common.h" -struct mail_user; -struct master_service; +typedef const char *(*sieve_settings_func_t)(const char *identifier); -void sieve_settings_init - (struct master_service *service, struct mail_user *user); - -/* - * Retrieval - */ +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); -void sieve_setting_set(const char *identifier, const char *value); -void sieve_setting_set_ext - (const struct sieve_extension *ext, const char *identifier, const char *value); - #endif /* __SIEVE_SETTINGS_H */ diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index 3c6848bcf0fe8c17d5c52a5a528790bfe34930aa..4f7cac4482b63bdf91f821db3753f5e690e23934 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -6,6 +6,7 @@ #include "istream.h" #include "buffer.h" +#include "sieve-settings.h" #include "sieve-extensions.h" #include "sieve-script.h" @@ -35,8 +36,10 @@ * Main Sieve library interface */ -bool sieve_init(void) +bool sieve_init(sieve_settings_func_t settings_func) { + sieve_settings_init(settings_func); + return sieve_extensions_init(); } diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h index 5aa953d260455d472e4a0910568053a9c3285433..fbdcacd1a77a249592e0e681418894af1b8b8f37 100644 --- a/src/lib-sieve/sieve.h +++ b/src/lib-sieve/sieve.h @@ -12,6 +12,7 @@ struct sieve_binary; #include "sieve-config.h" #include "sieve-types.h" #include "sieve-error.h" +#include "sieve-settings.h" /* * Main Sieve library interface @@ -21,7 +22,7 @@ struct sieve_binary; * Initializes the sieve engine. Must be called before any sieve functionality * is used. */ -bool sieve_init(void); +bool sieve_init(sieve_settings_func_t settings_func); /* sieve_deinit(): * Frees all memory allocated by the sieve engine. diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 1e9bc0642c28a32b533e8c0f70ae587c164a25c0..c7240d1b24444517e9ec3b8a103fb0347871c2a8 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -34,6 +34,19 @@ */ static deliver_mail_func_t *next_deliver_mail; +struct mail_user *lda_sieve_mail_user = NULL; + +/* + * Settings handling + */ + +static const char *lda_sieve_setting_get(const char *identifier) +{ + if ( lda_sieve_mail_user == NULL ) + return NULL; + + return mail_user_plugin_getenv(lda_sieve_mail_user, identifier); +} /* * Mail transmission @@ -127,7 +140,7 @@ static const char *lda_sieve_get_default_path(struct mail_user *user) const char *script_path; /* Use global script path, if one exists */ - script_path = sieve_setting_get("global_path"); + script_path = mail_user_plugin_getenv(user, "global_path"); if (script_path == NULL) { /* For backwards compatibility */ script_path = mail_user_plugin_getenv(user, "global_script_path"); @@ -564,7 +577,7 @@ static int lda_sieve_deliver_mail *storage_r = NULL; - sieve_settings_init(NULL, mdctx->dest_user); + lda_sieve_mail_user = mdctx->dest_user; extensions = sieve_setting_get("extensions"); if ( extensions != NULL ) { @@ -665,7 +678,7 @@ static int lda_sieve_deliver_mail void sieve_plugin_init(void) { /* Initialize Sieve engine */ - sieve_init(); + sieve_init(lda_sieve_setting_get); /* Hook into the delivery process */ next_deliver_mail = deliver_mail; diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c index 298c729fd47fec2714ee5e11d39ebdd3a6ea4fff..9b72f8261e1836a4a83aa4293381b076e6f2c994 100644 --- a/src/sieve-tools/sieve-filter.c +++ b/src/sieve-tools/sieve-filter.c @@ -231,7 +231,7 @@ int main(int argc, char **argv) const char *user, *home, *folder; int i; - sieve_tool_init(); + sieve_tool_init(NULL, FALSE); /* Parse arguments */ scriptfile = recipient = sender = extensions = src_mailstore = dst_mailstore diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c index dd28e7d2bb7edab62d13b05990189e74fea97222..ffba6f172ebf531a6d6454aeab3a9890b64348ed 100644 --- a/src/sieve-tools/sieve-test.c +++ b/src/sieve-tools/sieve-test.c @@ -124,7 +124,7 @@ int main(int argc, char **argv) service = master_service_init("sieve-test", MASTER_SERVICE_FLAG_STANDALONE, argc, argv); - sieve_tool_init(FALSE); + sieve_tool_init(NULL, FALSE); t_array_init(&scriptfiles, 16); diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c index b30c035a987497107be90951ed3ad2d8ff861927..5143a4c748922afa7da4ee86291e2477506a0c0c 100644 --- a/src/sieve-tools/sievec.c +++ b/src/sieve-tools/sievec.c @@ -41,7 +41,7 @@ int main(int argc, char **argv) { bool dump = FALSE; const char *scriptfile, *outfile, *extensions; - sieve_tool_init(TRUE); + sieve_tool_init(NULL, TRUE); scriptfile = outfile = extensions = NULL; for (i = 1; i < argc; i++) { diff --git a/src/sieve-tools/sieved.c b/src/sieve-tools/sieved.c index f687a9cddd38a626d91a80c1b6b4332d4235d297..1b1e7c90ef887d981fb9bd163fa4e6e630408dd2 100644 --- a/src/sieve-tools/sieved.c +++ b/src/sieve-tools/sieved.c @@ -37,7 +37,7 @@ int main(int argc, char **argv) { struct sieve_binary *sbin; const char *binfile, *outfile, *extensions; - sieve_tool_init(TRUE); + sieve_tool_init(NULL, TRUE); binfile = outfile = extensions = NULL; for (i = 1; i < argc; i++) { diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am index d722fdab26df0321921ddd0d2ce3710bccbbbc81..fb8c9f5501c4f9bec8db3cc6675bf48167186759 100644 --- a/src/testsuite/Makefile.am +++ b/src/testsuite/Makefile.am @@ -45,6 +45,7 @@ tests = \ testsuite_SOURCES = \ testsuite-common.c \ + testsuite-settings.c \ testsuite-objects.c \ testsuite-substitutions.c \ testsuite-arguments.c \ @@ -62,6 +63,7 @@ testsuite_SOURCES = \ noinst_HEADERS = \ testsuite-common.h \ + testsuite-settings.h \ testsuite-objects.h \ testsuite-substitutions.h \ testsuite-arguments.h \ diff --git a/src/testsuite/testsuite-common.c b/src/testsuite/testsuite-common.c index 2d8a8dd1f1ea8bc6c7560c9e38240ccd2d8ea194..21f573a9cb01efdd6e117dcd3fbc44eba98517c5 100644 --- a/src/testsuite/testsuite-common.c +++ b/src/testsuite/testsuite-common.c @@ -24,6 +24,7 @@ #include "sieve-dump.h" #include "testsuite-common.h" +#include "testsuite-settings.h" #include "testsuite-objects.h" #include "testsuite-log.h" #include "testsuite-script.h" diff --git a/src/testsuite/testsuite-script.c b/src/testsuite/testsuite-script.c index 7e4ea3b1e13da6c29b39ddcc5d6b8df7dfcb1822..27d51022e4ed5b766d250287cff591521e54c935 100644 --- a/src/testsuite/testsuite-script.c +++ b/src/testsuite/testsuite-script.c @@ -12,6 +12,7 @@ #include "sieve-result.h" #include "testsuite-common.h" +#include "testsuite-settings.h" #include "testsuite-log.h" #include "testsuite-result.h" @@ -48,8 +49,10 @@ static struct sieve_binary *_testsuite_script_compile(const char *script_path) sieve_dir = t_strdup_until(script_path, sieve_dir+1); /* Currently needed for include (FIXME) */ - sieve_setting_set("dir", t_strconcat(sieve_dir, "included", NULL)); - sieve_setting_set("global_dir", t_strconcat(sieve_dir, "included-global", NULL)); + testsuite_setting_set + ("sieve_dir", t_strconcat(sieve_dir, "included", NULL)); + testsuite_setting_set + ("sieve_global_dir", t_strconcat(sieve_dir, "included-global", NULL)); if ( (sbin = sieve_compile(script_path, NULL, testsuite_log_ehandler)) == NULL ) return NULL; diff --git a/src/testsuite/testsuite-settings.c b/src/testsuite/testsuite-settings.c new file mode 100644 index 0000000000000000000000000000000000000000..a038529f1c75de12202108d6d282c5fa696cc358 --- /dev/null +++ b/src/testsuite/testsuite-settings.c @@ -0,0 +1,72 @@ +#include "lib.h" +#include "hash.h" +#include "imem.h" +#include "strfuncs.h" + +#include "sieve-common.h" +#include "sieve-settings.h" + +#include "testsuite-common.h" +#include "testsuite-settings.h" + +struct testsuite_setting { + char *identifier; + char *value; +}; + +static struct hash_table *settings; + +void testsuite_settings_init(void) +{ + settings = hash_table_create + (default_pool, default_pool, 0, str_hash, (hash_cmp_callback_t *)strcmp); +} + +void testsuite_settings_deinit(void) +{ + struct hash_iterate_context *itx = + hash_table_iterate_init(settings); + void *key; + void *value; + + while ( hash_table_iterate(itx, &key, &value) ) { + struct testsuite_setting *setting = (struct testsuite_setting *) value; + + i_free(setting->identifier); + i_free(setting->value); + i_free(setting); + } + + hash_table_iterate_deinit(&itx); + + hash_table_destroy(&settings); +} + +const char *testsuite_setting_get(const char *identifier) +{ + struct testsuite_setting *setting = (struct testsuite_setting *) + hash_table_lookup(settings, identifier); + + if ( setting == NULL ) { + return NULL; + } + + return setting->value; +} + +void testsuite_setting_set(const char *identifier, const char *value) +{ + struct testsuite_setting *setting = (struct testsuite_setting *) + hash_table_lookup(settings, identifier); + + if ( setting != NULL ) { + i_free(setting->value); + setting->value = i_strdup(value); + } else { + setting = i_new(struct testsuite_setting, 1); + setting->identifier = i_strdup(identifier); + setting->value = i_strdup(value); + + hash_table_insert(settings, (void *) identifier, (void *) setting); + } +} diff --git a/src/testsuite/testsuite-settings.h b/src/testsuite/testsuite-settings.h new file mode 100644 index 0000000000000000000000000000000000000000..69e31c453b13d536b5ae0dbdc5521ef1ceaf9ff5 --- /dev/null +++ b/src/testsuite/testsuite-settings.h @@ -0,0 +1,12 @@ +#ifndef __TESTSUITE_SETTINGS_H +#define __TESTSUITE_SETTINGS_H + +#include "sieve-common.h" + +void testsuite_settings_init(void); +void testsuite_settings_deinit(void); + +const char *testsuite_setting_get(const char *identifier); +void testsuite_setting_set(const char *identifier, const char *value); + +#endif /* __TESTSUITE_SETTINGS_H */ diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c index ea053e9f184426f57c4239e00876a0bd6fb70fc4..f21e82cea5030c6f471783b7aabd63d68524feba 100644 --- a/src/testsuite/testsuite.c +++ b/src/testsuite/testsuite.c @@ -25,6 +25,7 @@ #include "sieve-tool.h" #include "testsuite-common.h" +#include "testsuite-settings.h" #include "testsuite-result.h" #include "testsuite-message.h" #include "testsuite-smtp.h" @@ -50,12 +51,11 @@ const struct sieve_script_env *testsuite_scriptenv; * Testsuite initialization */ -static void testsuite_tool_init -(struct master_service *service, struct mail_user *mail_user, const char *extensions) +static void testsuite_tool_init(const char *extensions) { - sieve_settings_init(service, mail_user); + testsuite_settings_init(); - sieve_tool_init(FALSE); + sieve_tool_init(testsuite_setting_get, FALSE); sieve_extensions_set_string(extensions); (void) sieve_extension_register(&testsuite_extension, TRUE); @@ -68,6 +68,8 @@ static void testsuite_tool_deinit(void) testsuite_deinit(); sieve_tool_deinit(); + + testsuite_settings_deinit(); } /* @@ -192,7 +194,7 @@ int main(int argc, char **argv) (service, &input, NULL, service_flags); /* Initialize testsuite */ - testsuite_tool_init(service, mail_user_dovecot, extensions); + testsuite_tool_init(extensions); printf("Test case: %s:\n\n", scriptfile); @@ -205,8 +207,10 @@ int main(int argc, char **argv) sieve_dir = t_strdup_until(scriptfile, sieve_dir+1); /* Currently needed for include (FIXME) */ - sieve_setting_set("dir", t_strconcat(sieve_dir, "included", NULL)); - sieve_setting_set("global_dir", t_strconcat(sieve_dir, "included-global", NULL)); + testsuite_setting_set + ("sieve_dir", t_strconcat(sieve_dir, "included", NULL)); + testsuite_setting_set + ("sieve_global_dir", t_strconcat(sieve_dir, "included-global", NULL)); /* Compile sieve script */ if ( (sbin = sieve_tool_script_compile(scriptfile, NULL)) != NULL ) {