diff --git a/src/lib-sieve/plugins/copy/ext-copy.c b/src/lib-sieve/plugins/copy/ext-copy.c index ad4f7ddc4a00e38983e7e11e02dd4f40fa94a843..a0a5494024a1d32ff180f0eb60c819a25c3a0be9 100644 --- a/src/lib-sieve/plugins/copy/ext-copy.c +++ b/src/lib-sieve/plugins/copy/ext-copy.c @@ -14,6 +14,7 @@ #include "sieve-code.h" #include "sieve-extensions.h" +#include "sieve-actions.h" #include "sieve-commands.h" #include "sieve-validator.h" #include "sieve-generator.h" @@ -44,6 +45,25 @@ static bool ext_copy_load(int ext_id) return TRUE; } +/* Side effect */ + +const struct sieve_side_effect_extension ext_copy_side_effect; + +const struct sieve_side_effect copy_side_effect = { + "copy", + &act_store, + + &ext_copy_side_effect, + 0, + NULL, NULL, NULL, NULL +}; + +const struct sieve_side_effect_extension ext_copy_side_effect = { + ©_extension, + + SIEVE_EXT_DEFINE_SIDE_EFFECT(copy_side_effect) +}; + /* Tag validation */ static bool tag_copy_validate @@ -57,12 +77,30 @@ static bool tag_copy_validate return TRUE; } +/* Tag generation */ + +static bool tag_copy_generate +(struct sieve_generator *generator, struct sieve_ast_argument *arg, + struct sieve_command_context *context ATTR_UNUSED) +{ + struct sieve_binary *sbin = sieve_generator_get_binary(generator); + + if ( sieve_ast_argument_type(arg) != SAAT_TAG ) { + return FALSE; + } + + sieve_opr_side_effect_emit(sbin, ©_side_effect, ext_my_id); + + return TRUE; +} + /* Tag */ static const struct sieve_argument copy_tag = { "copy", NULL, tag_copy_validate, - NULL, NULL + NULL, + tag_copy_generate }; /* Load extension into validator */ @@ -72,8 +110,8 @@ static bool ext_copy_validator_load(struct sieve_validator *validator) * whether these commands are registered or even whether they will be * registered at all. The validator handles either situation gracefully */ - sieve_validator_register_external_tag(validator, ©_tag, "redirect", 0); - sieve_validator_register_external_tag(validator, ©_tag, "fileinto", 0); + sieve_validator_register_external_tag(validator, ©_tag, "redirect", -1); + sieve_validator_register_external_tag(validator, ©_tag, "fileinto", -1); return TRUE; } diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags.c b/src/lib-sieve/plugins/imapflags/ext-imapflags.c index 82be527f9532731fa4d05010f5f8ac3b8ad21b59..d08a91f23f6d9daa1bede62dab4511454057a6b9 100644 --- a/src/lib-sieve/plugins/imapflags/ext-imapflags.c +++ b/src/lib-sieve/plugins/imapflags/ext-imapflags.c @@ -89,8 +89,8 @@ static bool ext_imapflags_validator_load * whether these commands are registered or even whether they will be * registered at all. The validator handles either situation gracefully */ - sieve_validator_register_external_tag(validator, &tag_flags, "keep", 0); - sieve_validator_register_external_tag(validator, &tag_flags, "fileinto", 0); + sieve_validator_register_external_tag(validator, &tag_flags, "keep", -1); + sieve_validator_register_external_tag(validator, &tag_flags, "fileinto", -1); return TRUE; } diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c index cafa3d18b15893ef993588d28c32f790ab10379a..41de0063c3c4aa583eb538fdbb5e46b1c42b73c2 100644 --- a/src/lib-sieve/sieve-actions.c +++ b/src/lib-sieve/sieve-actions.c @@ -71,7 +71,8 @@ struct sieve_operand side_effect_operand = { "side-effect", &side_effect_class, FALSE }; void sieve_opr_side_effect_emit - (struct sieve_binary *sbin, struct sieve_side_effect *seffect, int ext_id) + (struct sieve_binary *sbin, const struct sieve_side_effect *seffect, + int ext_id) { sieve_binary_emit_extension (sbin, seffect, ext_id, 0, SIEVE_OPERAND_SIDE_EFFECT, diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h index b4edd6e55fcca7a845c7eeef2db7270ec3608140..64cdbd169c786adf236888e017b9b3e0ab1834a4 100644 --- a/src/lib-sieve/sieve-actions.h +++ b/src/lib-sieve/sieve-actions.h @@ -91,7 +91,8 @@ void sieve_side_effect_extension_set const struct sieve_side_effect_extension *ext); void sieve_opr_side_effect_emit - (struct sieve_binary *sbin, struct sieve_side_effect *seffect, int ext_id); + (struct sieve_binary *sbin, const struct sieve_side_effect *seffect, + int ext_id); /* Actions common to multiple commands */