diff --git a/src/lib-sieve/plugins/imap4flags/tag-flags.c b/src/lib-sieve/plugins/imap4flags/tag-flags.c index bd85baabf3f7e7b0189b6c5d0e8afc8da0c95ee9..0536b829f00fa55e5b356879d9f98f93b1f70c63 100644 --- a/src/lib-sieve/plugins/imap4flags/tag-flags.c +++ b/src/lib-sieve/plugins/imap4flags/tag-flags.c @@ -74,14 +74,12 @@ seff_flags_pre_execute(const struct sieve_side_effect *seffect, const struct sieve_side_effect_def flags_side_effect = { SIEVE_OBJECT("flags", &flags_side_effect_operand, 0), - &act_store, - - seff_flags_dump_context, - seff_flags_read_context, - seff_flags_merge, - seff_flags_print, - seff_flags_pre_execute, - NULL, NULL, NULL + .to_action = &act_store, + .dump_context = seff_flags_dump_context, + .read_context = seff_flags_read_context, + .merge = seff_flags_merge, + .print = seff_flags_print, + .pre_execute = seff_flags_pre_execute }; /* diff --git a/src/lib-sieve/plugins/mailbox/tag-mailbox-create.c b/src/lib-sieve/plugins/mailbox/tag-mailbox-create.c index 026c697bf23226faecb7142c1fbfb197d5eddc17..04977d9a52468ae1940f7206073393131ca5546f 100644 --- a/src/lib-sieve/plugins/mailbox/tag-mailbox-create.c +++ b/src/lib-sieve/plugins/mailbox/tag-mailbox-create.c @@ -50,6 +50,7 @@ seff_mailbox_create_pre_execute(const struct sieve_side_effect *seffect, const struct sieve_side_effect_def mailbox_create_side_effect = { SIEVE_OBJECT("create", &mailbox_create_operand, 0), + .precedence = 100, .to_action = &act_store, .print = seff_mailbox_create_print, .pre_execute = seff_mailbox_create_pre_execute diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h index e86c688c840c7c7db96c8fd92e239b32d936faa5..4c9017ec6c6a1002816b11fd6bf2bc3da3e42ccf 100644 --- a/src/lib-sieve/sieve-actions.h +++ b/src/lib-sieve/sieve-actions.h @@ -103,6 +103,10 @@ struct sieve_action { struct sieve_side_effect_def { struct sieve_object_def obj_def; + /* Precedence (side effects with higher value are executed first) */ + + unsigned int precedence; + /* The action it is supposed to link to */ const struct sieve_action_def *to_action; diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index dcb9e21c1875be42124b086e5827cb2b9722bae0..9a90d903b997d031b7dfc7fc7159bf9398c09a7e 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -1604,13 +1604,24 @@ sieve_side_effects_list_create(struct sieve_result *result) void sieve_side_effects_list_add(struct sieve_side_effects_list *list, const struct sieve_side_effect *seffect) { - struct sieve_result_side_effect *reffect; + struct sieve_result_side_effect *reffect, *reffect_pos; /* Prevent duplicates */ reffect = list->first_effect; + reffect_pos = NULL; while (reffect != NULL) { - if (reffect->seffect.def == seffect->def) + const struct sieve_side_effect_def *ref_def = reffect->seffect.def; + const struct sieve_side_effect_def *sef_def = seffect->def; + + if (sef_def == ref_def) { + /* already listed */ + i_assert(reffect_pos == NULL); return; + } + if (sef_def->precedence > ref_def->precedence) { + /* insert it before this position */ + reffect_pos = reffect; + } reffect = reffect->next; } @@ -1619,17 +1630,25 @@ void sieve_side_effects_list_add(struct sieve_side_effects_list *list, reffect = p_new(list->result->pool, struct sieve_result_side_effect, 1); reffect->seffect = *seffect; - /* Add */ - if (list->first_effect == NULL) { - list->first_effect = reffect; - list->last_effect = reffect; - reffect->prev = NULL; - reffect->next = NULL; + if (reffect_pos != NULL) { + /* Insert */ + reffect->next = reffect_pos; + reffect_pos->prev = reffect; + if (list->first_effect == reffect_pos) + list->first_effect = reffect; } else { - list->last_effect->next = reffect; - reffect->prev = list->last_effect; - list->last_effect = reffect; - reffect->next = NULL; + /* Add */ + if ( list->first_effect == NULL ) { + list->first_effect = reffect; + list->last_effect = reffect; + reffect->prev = NULL; + reffect->next = NULL; + } else { + list->last_effect->next = reffect; + reffect->prev = list->last_effect; + list->last_effect = reffect; + reffect->next = NULL; + } } }