diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c index 96302d13d23112b50421bcb13ad1c098f2dfa634..48605df0d41067e65718bea3fcdd8c31904fcc1d 100644 --- a/src/lib-sieve/sieve-error.c +++ b/src/lib-sieve/sieve-error.c @@ -285,7 +285,7 @@ struct sieve_error_handler *sieve_master_ehandler_create return ehandler; } -struct sieve_error_handler _sieve_system_ehandler = { +struct sieve_error_handler _sieve_system_ehandler_object = { NULL, 0, 0, 0, 0, FALSE, TRUE, @@ -295,7 +295,20 @@ struct sieve_error_handler _sieve_system_ehandler = { NULL }; -struct sieve_error_handler *sieve_system_ehandler = &_sieve_system_ehandler; +struct sieve_error_handler *_sieve_system_ehandler = &_sieve_system_ehandler_object; + +void sieve_system_ehandler_set(struct sieve_error_handler *ehandler) +{ + sieve_error_handler_unref(&_sieve_system_ehandler); + _sieve_system_ehandler = ehandler; + sieve_error_handler_ref(_sieve_system_ehandler); +} + +void sieve_system_ehandler_reset(void) +{ + sieve_error_handler_unref(&_sieve_system_ehandler); + _sieve_system_ehandler = &_sieve_system_ehandler_object; +} /* * STDERR error handler diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h index d449dbac4d2d28a27e814f749bfb07794f9226bd..4ee103e01c07344cd0d1b8e0e2c80add2635bc73 100644 --- a/src/lib-sieve/sieve-error.h +++ b/src/lib-sieve/sieve-error.h @@ -28,11 +28,14 @@ typedef void (*sieve_error_vfunc_t) * System errors */ -extern struct sieve_error_handler *sieve_system_ehandler; +extern struct sieve_error_handler *_sieve_system_ehandler; -#define sieve_sys_error(...) sieve_error(sieve_system_ehandler, NULL, __VA_ARGS__ ) -#define sieve_sys_warning(...) sieve_warning(sieve_system_ehandler, NULL, __VA_ARGS__ ) -#define sieve_sys_info(...) sieve_info(sieve_system_ehandler, NULL, __VA_ARGS__ ) +#define sieve_sys_error(...) sieve_error(_sieve_system_ehandler, NULL, __VA_ARGS__ ) +#define sieve_sys_warning(...) sieve_warning(_sieve_system_ehandler, NULL, __VA_ARGS__ ) +#define sieve_sys_info(...) sieve_info(_sieve_system_ehandler, NULL, __VA_ARGS__ ) + +void sieve_system_ehandler_set(struct sieve_error_handler *ehandler); +void sieve_system_ehandler_reset(void); /* * Main error functions diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c index d74038692e0d55224d3bde3b1ca3754f479ed2aa..cbb1d559b03721cc1f716cadfba379f4d8d948b5 100644 --- a/src/sieve-tools/sieve-filter.c +++ b/src/sieve-tools/sieve-filter.c @@ -10,11 +10,14 @@ #include "env-util.h" #include "sieve.h" +#include "sieve-extensions.h" #include "sieve-binary.h" #include "mail-raw.h" #include "sieve-tool.h" +#include "sieve-ext-debug.h" + #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -187,6 +190,14 @@ int main(int argc, char **argv) sieve_set_extensions(extensions); } + /* Register tool-specific extensions */ + (void) sieve_extension_register(&debug_extension, TRUE); + + /* Create error handler */ + ehandler = sieve_stderr_ehandler_create(0); + sieve_system_ehandler_set(ehandler); + sieve_error_handler_accept_infolog(ehandler, TRUE); + /* Compile main sieve script */ if ( force_compile ) { main_sbin = sieve_tool_script_compile(scriptfile, NULL); @@ -226,7 +237,7 @@ int main(int argc, char **argv) box = mailbox_open(&storage, mailbox, NULL, open_flags); if ( box == NULL ) { i_fatal("Couldn't open mailbox '%s': %s", - mailbox, mail_storage_get_last_error(storage, &error)); + mailbox, mail_storage_get_last_error(storage, &error)); } if ( mailbox == NULL ) @@ -246,20 +257,17 @@ int main(int argc, char **argv) scriptenv.trace_stream = NULL; scriptenv.exec_status = &estatus; - /* Create error handler */ - ehandler = sieve_stderr_ehandler_create(0); - sieve_error_handler_accept_infolog(ehandler, TRUE); - /* Apply Sieve filter to all messages found */ filter_mailbox(box, main_sbin, &scriptenv, ehandler, user); - /* Cleanup error handler */ - sieve_error_handler_unref(&ehandler); - - /* Close the mailbox */ + /* Close the mailbox */ if ( box != NULL ) mailbox_close(&box); + /* Cleanup error handler */ + sieve_error_handler_unref(&ehandler); + sieve_system_ehandler_reset(); + /* De-initialize mail user object */ if ( mail_user != NULL ) mail_user_unref(&mail_user); diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c index 8029e45dfe025d26169def0e3dbdd00d32f95fb1..828361ba75de4e696c4304ec1de523d892a1cf1d 100644 --- a/src/sieve-tools/sieve-test.c +++ b/src/sieve-tools/sieve-test.c @@ -206,6 +206,11 @@ int main(int argc, char **argv) /* Register tool-specific extensions */ (void) sieve_extension_register(&debug_extension, TRUE); + /* Create error handler */ + ehandler = sieve_stderr_ehandler_create(0); + sieve_system_ehandler_set(ehandler); + sieve_error_handler_accept_infolog(ehandler, TRUE); + /* Compile main sieve script */ if ( force_compile ) { main_sbin = sieve_tool_script_compile(scriptfile, NULL); @@ -278,10 +283,6 @@ int main(int argc, char **argv) scriptenv.trace_stream = ( trace ? teststream : NULL ); scriptenv.exec_status = &estatus; - /* Create error handler */ - ehandler = sieve_stderr_ehandler_create(0); - sieve_error_handler_accept_infolog(ehandler, TRUE); - /* Run the test */ ret = 1; if ( array_count(&scriptfiles) == 0 ) { @@ -383,9 +384,6 @@ int main(int argc, char **argv) sieve_close(&sbin); if ( main_sbin != NULL ) sieve_close(&main_sbin); - /* Cleanup error handler */ - sieve_error_handler_unref(&ehandler); - /* De-initialize raw mail object */ mail_raw_close(mailr); mail_raw_deinit(); @@ -399,6 +397,10 @@ int main(int argc, char **argv) mail_users_deinit(); } + /* Cleanup error handler */ + sieve_error_handler_unref(&ehandler); + sieve_system_ehandler_reset(); + sieve_tool_deinit(); return 0; diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c index 3e407b9563c888cd59b0a0a816bfbba9ee3c9215..9ba488ec2d2153373d565b92e3ff7523046677f1 100644 --- a/src/sieve-tools/sievec.c +++ b/src/sieve-tools/sievec.c @@ -4,9 +4,12 @@ #include "lib.h" #include "sieve.h" +#include "sieve-extensions.h" #include "sieve-script.h" #include "sieve-tool.h" +#include "sieve-ext-debug.h" + #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> @@ -73,6 +76,9 @@ int main(int argc, char **argv) { sieve_set_extensions(extensions); } + /* Register tool-specific extensions */ + (void) sieve_extension_register(&debug_extension, TRUE); + if ( stat(scriptfile, &st) == 0 && S_ISDIR(st.st_mode) ) { /* Script directory */ DIR *dirp; @@ -119,7 +125,7 @@ int main(int argc, char **argv) { } } - /* Close the directory */ + /* Close the directory */ if ( closedir(dirp) < 0 ) i_fatal("closedir(%s) failed: %m", scriptfile); diff --git a/src/sieve-tools/sieved.c b/src/sieve-tools/sieved.c index 5447e3b14a2060b70f4d0b9d8d1c980e38a1f902..33166797971f5ebbccd1d80ba51224ac5497aa0b 100644 --- a/src/sieve-tools/sieved.c +++ b/src/sieve-tools/sieved.c @@ -4,9 +4,12 @@ #include "lib.h" #include "sieve.h" +#include "sieve-extensions.h" #include "sieve-binary.h" #include "sieve-tool.h" +#include "sieve-ext-debug.h" + #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> @@ -63,6 +66,9 @@ int main(int argc, char **argv) { if ( extensions != NULL ) { sieve_set_extensions(extensions); } + + /* Register tool-specific extensions */ + (void) sieve_extension_register(&debug_extension, TRUE); sbin = sieve_binary_open(binfile, NULL);