int sieve_multiscript_tempfail(struct sieve_multiscript **_mscript, struct sieve_error_handler *action_ehandler, enum sieve_execute_flags flags) { struct sieve_multiscript *mscript = *_mscript; struct sieve_result *result = mscript->result; int ret = mscript->status; sieve_result_set_keep_action (mscript->result, NULL, &act_store); if ( mscript->active ) { ret = SIEVE_EXEC_TEMP_FAILURE; if ( mscript->teststream == NULL && sieve_result_executed(result) ) { /* Part of the result is already executed, need to fall back to * to implicit keep (FIXME) */ switch ( sieve_result_implicit_keep (result, action_ehandler, flags, FALSE) ) { case SIEVE_EXEC_OK: ret = SIEVE_EXEC_FAILURE; break; default: ret = SIEVE_EXEC_KEEP_FAILED; } } } /* Cleanup */ sieve_result_unref(&result); *_mscript = NULL; return ret; }
static void sieve_multiscript_execute (struct sieve_multiscript *mscript, struct sieve_error_handler *ehandler, enum sieve_execute_flags flags, bool *keep) { if ( mscript->status > 0 ) { mscript->status = sieve_result_execute (mscript->result, keep, ehandler, flags); } else { if ( sieve_result_implicit_keep (mscript->result, ehandler, flags, FALSE) <= 0 ) mscript->status = SIEVE_EXEC_KEEP_FAILED; else if ( keep != NULL ) *keep = TRUE; } }
int sieve_execute (struct sieve_binary *sbin, const struct sieve_message_data *msgdata, const struct sieve_script_env *senv, struct sieve_error_handler *exec_ehandler, struct sieve_error_handler *action_ehandler, enum sieve_runtime_flags flags, bool *keep) { struct sieve_result *result = NULL; int ret; if ( keep != NULL ) *keep = FALSE; /* Run the script */ ret = sieve_run(sbin, &result, msgdata, senv, exec_ehandler, flags); /* Evaluate status and execute the result: * Strange situations, e.g. currupt binaries, must be handled by the caller. * In that case no implicit keep is attempted, because the situation may be * resolved. */ if ( ret > 0 ) { /* Execute result */ ret = sieve_result_execute(result, keep, action_ehandler); } else if ( ret == SIEVE_EXEC_FAILURE ) { /* Perform implicit keep if script failed with a normal runtime error */ switch ( sieve_result_implicit_keep (result, action_ehandler) ) { case SIEVE_EXEC_OK: if ( keep != NULL ) *keep = TRUE; break; case SIEVE_EXEC_TEMP_FAILURE: ret = SIEVE_EXEC_TEMP_FAILURE; break; default: ret = SIEVE_EXEC_KEEP_FAILED; } } /* Cleanup */ if ( result != NULL ) sieve_result_unref(&result); return ret; }
int sieve_multiscript_finish(struct sieve_multiscript **_mscript, struct sieve_error_handler *action_ehandler, enum sieve_execute_flags flags, bool *keep) { struct sieve_multiscript *mscript = *_mscript; struct sieve_result *result = mscript->result; int ret = mscript->status; sieve_result_set_keep_action (mscript->result, NULL, &act_store); if ( mscript->active ) { if ( mscript->teststream != NULL ) { mscript->keep = TRUE; } else { switch ( sieve_result_implicit_keep (result, action_ehandler, flags, TRUE) ) { case SIEVE_EXEC_OK: mscript->keep = TRUE; break; case SIEVE_EXEC_TEMP_FAILURE: if (!sieve_result_executed(result)) { ret = SIEVE_EXEC_TEMP_FAILURE; break; } /* fall through */ default: ret = SIEVE_EXEC_KEEP_FAILED; } } } if ( keep != NULL ) *keep = mscript->keep; /* Cleanup */ sieve_result_unref(&result); *_mscript = NULL; return ret; }