diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index d75b7db05ec6d50add2a3188c40fb51bdde1643a..8266d541942c4c769d7b9e1e0172e52f1752165b 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 5fb77fe38fb357e553c7c2e63f3836e2c0d1e9b7..abd5018df936235ee0f3766f2fdd41d72bf6fc9f 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 2d7dad57a46723b55e4fb765267806a88ce1d852..8535402174c6c4a1a1dae1ed5496473b65fbe183 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 f0889ccbea5048d3cefd9d5d6e0814da563efb16..f24ff09f3e5e24b2faab4a3b5f2e8687dd5ba101 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 5bffec481f6ebe4dedd37ac1a29312d1aba0fb02..9a9489bda721b86aaf880f71ef6834b1f171ccdd 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 e4f755b131cc6034f18ca29c7d73ed390e3b9ef3..d19c3edc7056ce4b493eca306f78a299d118ce34 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 328bd8f1bbe87b98737020e87eb9d637dc3cdce3..5167b8a2744a8e8b847573503366c98dfe03d785 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 82a7fcee2d043b73c5b2def88673b4ca59fecfe7..cce9edce71c6e2963b7d991976df327caee4f175 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");