From bb78d0b1c60c0ce5718708dcbc159899c6d4ab67 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Thu, 6 Dec 2007 17:22:16 +0100 Subject: [PATCH] Changed execution error handling a little. --- src/lib-sieve/sieve-interpreter.c | 10 +++++---- src/lib-sieve/sieve-interpreter.h | 2 +- src/lib-sieve/sieve-result.c | 10 ++++++--- src/lib-sieve/sieve-result.h | 2 +- src/lib-sieve/sieve.c | 20 ++++++++--------- src/lib-sieve/sieve.h | 4 ++-- src/plugins/lda-sieve/lda-sieve-plugin.c | 28 ++++++++++++------------ src/sieve-bin/sieve-exec.c | 2 +- 8 files changed, 42 insertions(+), 36 deletions(-) diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index d75b7db05..8266d5419 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -274,11 +274,12 @@ bool sieve_interpreter_execute_operation return FALSE; } -bool sieve_interpreter_run +int sieve_interpreter_run (struct sieve_interpreter *interp, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv, struct sieve_result **result) { bool is_topmost = ( *result == NULL ); + int ret = 0; sieve_interpreter_reset(interp); if ( is_topmost ) @@ -297,7 +298,7 @@ bool sieve_interpreter_run if ( !sieve_interpreter_execute_operation(interp) ) { printf("Execution aborted.\n"); sieve_result_unref(result); - return FALSE; + return -1; } } @@ -305,13 +306,14 @@ bool sieve_interpreter_run interp->runenv.msgdata = NULL; interp->runenv.mailenv = NULL; + ret = 1; if ( is_topmost ) { - sieve_result_execute(*result, msgdata, menv); + ret = sieve_result_execute(*result, msgdata, menv); } sieve_result_unref(result); - return TRUE; + return ret; } diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h index 5fb77fe38..abd5018df 100644 --- a/src/lib-sieve/sieve-interpreter.h +++ b/src/lib-sieve/sieve-interpreter.h @@ -69,7 +69,7 @@ bool sieve_interpreter_handle_optional_operands bool sieve_interpreter_execute_operation(struct sieve_interpreter *interp); -bool sieve_interpreter_run +int sieve_interpreter_run (struct sieve_interpreter *interp, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv, struct sieve_result **result); diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index 2d7dad57a..853540217 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -238,7 +238,7 @@ static bool sieve_result_implicit_keep(struct sieve_result *result) return FALSE; } -bool sieve_result_execute +int sieve_result_execute (struct sieve_result *result, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv) { @@ -375,11 +375,15 @@ bool sieve_result_execute */ if ( !commit_ok || implicit_keep ) { printf("Executing implicit keep\n"); - return sieve_result_implicit_keep(result); + + if ( !sieve_result_implicit_keep(result) ) + return -1; + + return ( commit_ok ? 1 /* Success */ : 0 /* Implicit keep executed */ ); } /* Unconditional success */ - return TRUE; + return 1; } /* diff --git a/src/lib-sieve/sieve-result.h b/src/lib-sieve/sieve-result.h index f0889ccbe..f24ff09f3 100644 --- a/src/lib-sieve/sieve-result.h +++ b/src/lib-sieve/sieve-result.h @@ -31,7 +31,7 @@ bool sieve_result_print(struct sieve_result *result); void sieve_result_cancel_implicit_keep(struct sieve_result *result); -bool sieve_result_execute +int sieve_result_execute (struct sieve_result *result, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv); diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index 5bffec481..9a9489bda 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -151,7 +151,7 @@ void sieve_dump(struct sieve_binary *sbin, struct ostream *stream) sieve_code_dumper_free(dumpr); } -bool sieve_test +int sieve_test (struct sieve_binary *sbin, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv, struct sieve_error_handler *ehandler) @@ -159,19 +159,19 @@ bool sieve_test struct sieve_result *sres = sieve_result_create(ehandler); struct sieve_interpreter *interp = sieve_interpreter_create(sbin, ehandler); - bool result = TRUE; + int ret = 0; - result = sieve_interpreter_run(interp, msgdata, menv, &sres); + ret = sieve_interpreter_run(interp, msgdata, menv, &sres); - if ( result ) - sieve_result_print(sres); + if ( ret > 0 ) + ret = sieve_result_print(sres); sieve_interpreter_free(interp); sieve_result_unref(&sres); - return result; + return ret; } -bool sieve_execute +int sieve_execute (struct sieve_binary *sbin, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv, struct sieve_error_handler *ehandler) @@ -179,13 +179,13 @@ bool sieve_execute struct sieve_result *sres = NULL; struct sieve_interpreter *interp = sieve_interpreter_create(sbin, ehandler); - bool result = TRUE; + int ret = 0; - result = sieve_interpreter_run(interp, msgdata, menv, &sres); + ret = sieve_interpreter_run(interp, msgdata, menv, &sres); sieve_interpreter_free(interp); sieve_result_unref(&sres); - return result; + return ret; } diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h index e4f755b13..d19c3edc7 100644 --- a/src/lib-sieve/sieve.h +++ b/src/lib-sieve/sieve.h @@ -51,12 +51,12 @@ struct sieve_binary *sieve_compile (const char *scriptpath, struct sieve_error_handler *ehandler); void sieve_dump(struct sieve_binary *sbin, struct ostream *stream); -bool sieve_test +int sieve_test (struct sieve_binary *sbin, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv, struct sieve_error_handler *ehandler); -bool sieve_execute +int sieve_execute (struct sieve_binary *sbin, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv, struct sieve_error_handler *ehandler); diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 328bd8f1b..5167b8a27 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -84,8 +84,7 @@ static int lda_sieve_run struct sieve_error_handler *ehandler; struct sieve_binary *sbin; const char *scriptlog; - - t_push(); + int ret = 0; scriptlog = t_strconcat(script_path, ".log", NULL); ehandler = sieve_logfile_ehandler_create(scriptlog); @@ -98,7 +97,6 @@ static int lda_sieve_run "Log should be available as %s", scriptlog); sieve_error_handler_free(&ehandler); - t_pop(); return -1; } @@ -129,17 +127,14 @@ static int lda_sieve_run if ( debug ) i_info("sieve: Executing (in-memory) script %s", script_path); - if ( sieve_execute(sbin, &msgdata, &mailenv, ehandler) ) { - sieve_error_handler_free(&ehandler); - t_pop(); - return 1; - } + ret = sieve_execute(sbin, &msgdata, &mailenv, ehandler); + + if ( ret < 0 ) + i_error("sieve: Failed to execute script %s", script_path); - i_error("sieve: Failed to execute script"); - sieve_error_handler_free(&ehandler); - t_pop(); - return -1; + + return ret; } static int lda_sieve_deliver_mail @@ -147,6 +142,7 @@ static int lda_sieve_deliver_mail struct mail *mail, const char *destaddr, const char *mailbox) { const char *script_path; + int ret; script_path = lda_sieve_get_path(); if (script_path == NULL) @@ -155,8 +151,12 @@ static int lda_sieve_deliver_mail if (getenv("DEBUG") != NULL) i_info("sieve: Using sieve path: %s", script_path); - return lda_sieve_run(namespaces, mail, script_path, - destaddr, getenv("USER"), mailbox); + T_FRAME( + ret = lda_sieve_run(namespaces, mail, script_path, destaddr, + getenv("USER"), mailbox) + ); + + return ( ret >= 0 ? 1 : -1 ); } void sieve_plugin_init(void) diff --git a/src/sieve-bin/sieve-exec.c b/src/sieve-bin/sieve-exec.c index 82a7fcee2..cce9edce7 100644 --- a/src/sieve-bin/sieve-exec.c +++ b/src/sieve-bin/sieve-exec.c @@ -189,7 +189,7 @@ int main(int argc, char **argv) sieve_error_handler_accept_infolog(ehandler, TRUE); /* Run */ - if ( sieve_execute(sbin, &msgdata, &mailenv, ehandler) ) + if ( sieve_execute(sbin, &msgdata, &mailenv, ehandler) > 0 ) i_info("Final result: success\n"); else i_info("Final result: failed (caller please handle implicit keep!)\n"); -- GitLab