From 3d4541e62d6e618c56e2c47c13f90c55a90485a0 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Fri, 20 Mar 2009 19:30:37 +0100 Subject: [PATCH] Improved error handling and added debug extension to all applicable Sieve tools. --- src/lib-sieve/sieve-error.c | 17 +++++++++++++++-- src/lib-sieve/sieve-error.h | 11 +++++++---- src/sieve-tools/sieve-filter.c | 26 +++++++++++++++++--------- src/sieve-tools/sieve-test.c | 16 +++++++++------- src/sieve-tools/sievec.c | 8 +++++++- src/sieve-tools/sieved.c | 6 ++++++ 6 files changed, 61 insertions(+), 23 deletions(-) diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c index 96302d13d..48605df0d 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 d449dbac4..4ee103e01 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 d74038692..cbb1d559b 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 8029e45df..828361ba7 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 3e407b956..9ba488ec2 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 5447e3b14..331667979 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); -- GitLab