diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c index 5fd76179782c46c4c22bc37371287593bbdef5c0..365247b3d04230bb1b02d151515d62606d3b9d0b 100644 --- a/src/lib-sieve/ext-fileinto.c +++ b/src/lib-sieve/ext-fileinto.c @@ -157,7 +157,7 @@ static bool ext_fileinto_opcode_execute return FALSE; t_push(); - + if ( !sieve_opr_string_read(renv->sbin, address, &folder) ) { t_pop(); return FALSE; diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 18cfe5ba9de866b877b6c3b83820923b7ab5a3a4..7978d8e5fbdb94d20e074cd55c6f31c63f2689dc 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -214,7 +214,7 @@ bool sieve_interpreter_handle_optional_operands (const struct sieve_runtime_env *renv, sieve_size_t *address, struct sieve_side_effects_list **list) { - int opt_code; + int opt_code = -1; if ( sieve_operand_optional_present(renv->sbin, address) ) { while ( opt_code != 0 ) { diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index 356d97d53b575adb177ce1338a16b58f057cd07e..2d7dad57a46723b55e4fb765267806a88ce1d852 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -211,6 +211,33 @@ bool sieve_result_print(struct sieve_result *result) return TRUE; } +static bool sieve_result_implicit_keep(struct sieve_result *result) +{ + bool success = TRUE; + bool dummy = TRUE; + struct act_store_context ctx; + void *tr_context; + + ctx.folder = result->action_env.mailenv->inbox; + + /* FIXME: Handle persistent side-effects for the (implicit) keep action */ + + success = act_store.start + (&act_store, &result->action_env, (void *) &ctx, &tr_context); + + success = success && act_store.execute + (&act_store, &result->action_env, tr_context); + + if ( success ) { + return act_store.commit + (&act_store, &result->action_env, tr_context, &dummy); + } + + act_store.rollback(&act_store, &result->action_env, tr_context, success); + + return FALSE; +} + bool sieve_result_execute (struct sieve_result *result, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv) @@ -225,7 +252,7 @@ bool sieve_result_execute /* Transaction start */ - printf("\nTransaction start:\n"); + printf("\nTransaction start:\n"); /* REMOVEME */ rac = result->first_action; while ( success && rac != NULL ) { @@ -241,7 +268,7 @@ bool sieve_result_execute /* Transaction execute */ - printf("\nTransaction execute:\n"); + printf("\nTransaction execute:\n"); /* REMOVEME */ last_attempted = rac; rac = result->first_action; @@ -282,7 +309,7 @@ bool sieve_result_execute } /* Transaction commit/rollback */ - if ( success ) + if ( success ) /* REMOVEME */ printf("\nTransaction commit:\n"); else printf("\nTransaction rollback:\n"); @@ -334,9 +361,25 @@ bool sieve_result_execute rac = rac->next; } + /* REMOVEME */ printf("\nTransaction result: %s\n", commit_ok ? "success" : "failed"); + + /* Return value indicates whether the caller should attempt an implicit keep + * of its own. So, if the above transaction fails, but the implicit keep below + * succeeds, the return value is still true. An error is/should be logged + * though. + */ - return commit_ok; + /* Execute implicit keep if the transaction failed or when the implicit keep + * was not canceled during transaction. + */ + if ( !commit_ok || implicit_keep ) { + printf("Executing implicit keep\n"); + return sieve_result_implicit_keep(result); + } + + /* Unconditional success */ + return TRUE; } /* diff --git a/src/sieve-bin/bin-common.c b/src/sieve-bin/bin-common.c index 31415cf49db7b8d186dcfeb803fcbe7ae7140410..dbac281108e29e03ad328327d6ee77c5c242d6c4 100644 --- a/src/sieve-bin/bin-common.c +++ b/src/sieve-bin/bin-common.c @@ -72,6 +72,7 @@ struct sieve_binary *bin_compile_sieve_script(const char *filename) struct sieve_binary *sbin; ehandler = sieve_stderr_ehandler_create(); + sieve_error_handler_accept_infolog(ehandler, TRUE); if ( (sbin = sieve_compile(filename, ehandler)) == NULL ) { sieve_error_handler_free(&ehandler); diff --git a/src/sieve-bin/sieve-exec.c b/src/sieve-bin/sieve-exec.c index 172d81907b6d3cae3d4a821b4e34136ce08f5fc5..82a7fcee2d043b73c5b2def88673b4ca59fecfe7 100644 --- a/src/sieve-bin/sieve-exec.c +++ b/src/sieve-bin/sieve-exec.c @@ -186,9 +186,13 @@ int main(int argc, char **argv) mailenv.duplicate_check = duplicate_check; ehandler = sieve_stderr_ehandler_create(); + sieve_error_handler_accept_infolog(ehandler, TRUE); /* Run */ - sieve_execute(sbin, &msgdata, &mailenv, ehandler); + if ( sieve_execute(sbin, &msgdata, &mailenv, ehandler) ) + i_info("Final result: success\n"); + else + i_info("Final result: failed (caller please handle implicit keep!)\n"); sieve_error_handler_free(&ehandler);