From 385ce7aa63a6e118e67e7053898ac28b25cab24f Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Tue, 27 Nov 2007 00:25:12 +0100 Subject: [PATCH] Added (not yet active) handling of implicit keep and adjusted commands accordingly. --- README | 2 +- src/lib-sieve/cmd-discard.c | 27 +-------------------------- src/lib-sieve/cmd-keep.c | 9 +++++++-- src/lib-sieve/cmd-redirect.c | 5 +++-- src/lib-sieve/ext-fileinto.c | 3 ++- src/lib-sieve/sieve-result.c | 9 ++++++++- src/lib-sieve/sieve-result.h | 2 ++ 7 files changed, 24 insertions(+), 33 deletions(-) diff --git a/README b/README index 206e7c577..f5492c27f 100644 --- a/README +++ b/README @@ -56,7 +56,7 @@ Base tests and their implementation status: Base commands and their implementation status: require: full if,elsif,else: full - discard: no action effect + discard: full keep: no action effect redirect: full stop: trivial, full diff --git a/src/lib-sieve/cmd-discard.c b/src/lib-sieve/cmd-discard.c index ee3541574..e03bd1f03 100644 --- a/src/lib-sieve/cmd-discard.c +++ b/src/lib-sieve/cmd-discard.c @@ -43,18 +43,6 @@ const struct sieve_opcode cmd_discard_opcode = { opc_discard_execute }; -/* Discard action */ - -static int act_discard_execute - (const struct sieve_action *action, const struct sieve_action_exec_env *aenv, - void *context); - -const struct sieve_action act_discard = { - "discard", - NULL, NULL, NULL, - act_discard_execute -}; - /* * Generation */ @@ -79,22 +67,9 @@ static bool opc_discard_execute { printf(">> DISCARD\n"); - sieve_result_add_action(renv, &act_discard, NULL); + sieve_result_cancel_implicit_keep(renv->result); return TRUE; } -/* - * Action - */ - -static int act_discard_execute -(const struct sieve_action *action ATTR_UNUSED, - const struct sieve_action_exec_env *aenv, void *context) -{ - - return 0; -} - - diff --git a/src/lib-sieve/cmd-keep.c b/src/lib-sieve/cmd-keep.c index 64e2ca7b5..13f871757 100644 --- a/src/lib-sieve/cmd-keep.c +++ b/src/lib-sieve/cmd-keep.c @@ -64,12 +64,17 @@ static bool opc_keep_execute const struct sieve_runtime_env *renv ATTR_UNUSED, sieve_size_t *address ATTR_UNUSED) { + bool added = FALSE; + printf(">> KEEP\n"); if ( renv->mailenv != NULL && renv->mailenv->inbox != NULL ) - sieve_act_store_add_to_result(renv, renv->mailenv->inbox); + added = sieve_act_store_add_to_result(renv, renv->mailenv->inbox); else - sieve_act_store_add_to_result(renv, "INBOX"); + added = sieve_act_store_add_to_result(renv, "INBOX"); + + if ( added ) + sieve_result_cancel_implicit_keep(renv->result); return TRUE; } diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c index b681eba26..1dbee6daf 100644 --- a/src/lib-sieve/cmd-redirect.c +++ b/src/lib-sieve/cmd-redirect.c @@ -145,7 +145,8 @@ static bool cmd_redirect_opcode_execute act = p_new(pool, struct act_redirect_context, 1); act->to_address = p_strdup(pool, str_c(redirect)); - sieve_result_add_action(renv, &act_redirect, (void *) act); + if ( sieve_result_add_action(renv, &act_redirect, (void *) act) ) + sieve_result_cancel_implicit_keep(renv->result); t_pop(); return TRUE; @@ -189,7 +190,7 @@ static int act_redirect_execute send_forward(msgdata, ctx->to_address)) == 0) { i_info("msgid=%s: forwarded to <%s>", msgdata->id == NULL ? "" : str_sanitize(msgdata->id, 80), - str_sanitize(ctx->to_address, 80)); + str_sanitize(ctx->to_address, 80)); } return res; diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c index a24c1433e..2f9433679 100644 --- a/src/lib-sieve/ext-fileinto.c +++ b/src/lib-sieve/ext-fileinto.c @@ -155,7 +155,8 @@ static bool ext_fileinto_opcode_execute printf(">> FILEINTO \"%s\"\n", str_c(folder)); - sieve_act_store_add_to_result(renv, str_c(folder)); + if ( sieve_act_store_add_to_result(renv, str_c(folder)) ) + sieve_result_cancel_implicit_keep(renv->result); t_pop(); return TRUE; diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index e6c123e17..07e7efc34 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -37,7 +37,7 @@ struct sieve_result *sieve_result_create(void) result->first_action = NULL; result->last_action = NULL; - result->implicit_keep = 1; + result->implicit_keep = TRUE; return result; } @@ -62,6 +62,11 @@ inline pool_t sieve_result_pool(struct sieve_result *result) return result->pool; } +void sieve_result_cancel_implicit_keep(struct sieve_result *result) +{ + result->implicit_keep = FALSE; +} + bool sieve_result_add_action (const struct sieve_runtime_env *renv, const struct sieve_action *action, void *context) @@ -132,6 +137,8 @@ bool sieve_result_print(struct sieve_result *result) rac = rac->next; } + printf("\nImplicit keep: %s\n", result->implicit_keep ? "yes" : "no"); + return TRUE; } diff --git a/src/lib-sieve/sieve-result.h b/src/lib-sieve/sieve-result.h index 1e3596f2d..46c01a04c 100644 --- a/src/lib-sieve/sieve-result.h +++ b/src/lib-sieve/sieve-result.h @@ -16,6 +16,8 @@ bool sieve_result_add_action bool sieve_result_print(struct sieve_result *result); +void sieve_result_cancel_implicit_keep(struct sieve_result *result); + bool sieve_result_execute (struct sieve_result *result, const struct sieve_message_data *msgdata, const struct sieve_mail_environment *menv); -- GitLab