From a781e5776f7be7494c7c05dc4b9b4e89b01bb03f Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Mon, 19 Oct 2009 11:58:11 +0200 Subject: [PATCH] Finished new settings handling, including debugging support. --- src/lib-sieve-tool/sieve-tool.c | 4 +- src/lib-sieve-tool/sieve-tool.h | 4 +- src/lib-sieve/sieve-settings.c | 57 +++---------------- src/lib-sieve/sieve-settings.h | 14 +---- src/lib-sieve/sieve.c | 5 +- src/lib-sieve/sieve.h | 3 +- src/plugins/lda-sieve/lda-sieve-plugin.c | 19 ++++++- src/sieve-tools/sieve-filter.c | 2 +- src/sieve-tools/sieve-test.c | 2 +- src/sieve-tools/sievec.c | 2 +- src/sieve-tools/sieved.c | 2 +- src/testsuite/Makefile.am | 2 + src/testsuite/testsuite-common.c | 1 + src/testsuite/testsuite-script.c | 7 ++- src/testsuite/testsuite-settings.c | 72 ++++++++++++++++++++++++ src/testsuite/testsuite-settings.h | 12 ++++ src/testsuite/testsuite.c | 18 +++--- 17 files changed, 145 insertions(+), 81 deletions(-) create mode 100644 src/testsuite/testsuite-settings.c create mode 100644 src/testsuite/testsuite-settings.h diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c index bb4596fc1..b415906f4 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 4c7dbd43e..e9c2b535f 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 b6217a8c0..afe0ccaef 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 1a869aa3e..6ea82863b 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 3c6848bcf..4f7cac448 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 5aa953d26..fbdcacd1a 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 1e9bc0642..c7240d1b2 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 298c729fd..9b72f8261 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 dd28e7d2b..ffba6f172 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 b30c035a9..5143a4c74 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 f687a9cdd..1b1e7c90e 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 d722fdab2..fb8c9f550 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 2d8a8dd1f..21f573a9c 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 7e4ea3b1e..27d51022e 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 000000000..a038529f1 --- /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 000000000..69e31c453 --- /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 ea053e9f1..f21e82cea 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 ) { -- GitLab