16
16
#include "ext-mailbox-common.h"
22
22
static bool tag_mailbox_create_validate
23
(struct sieve_validator *valdtr, struct sieve_ast_argument **arg,
23
(struct sieve_validator *valdtr, struct sieve_ast_argument **arg,
24
24
struct sieve_command *cmd);
25
25
static bool tag_mailbox_create_generate
26
26
(const struct sieve_codegen_env *cgenv, struct sieve_ast_argument *arg,
27
27
struct sieve_command *context);
29
const struct sieve_argument_def mailbox_create_tag = {
29
const struct sieve_argument_def mailbox_create_tag = {
32
tag_mailbox_create_validate,
32
tag_mailbox_create_validate,
34
34
tag_mailbox_create_generate
41
41
static void seff_mailbox_create_print
42
(const struct sieve_side_effect *seffect, const struct sieve_action *action,
42
(const struct sieve_side_effect *seffect, const struct sieve_action *action,
43
43
const struct sieve_result_print_env *rpenv, bool *keep);
44
static bool seff_mailbox_create_pre_execute
45
(const struct sieve_side_effect *seffect, const struct sieve_action *action,
46
const struct sieve_action_exec_env *aenv, void **se_context,
44
static int seff_mailbox_create_pre_execute
45
(const struct sieve_side_effect *seffect, const struct sieve_action *action,
46
const struct sieve_action_exec_env *aenv, void **se_context,
49
49
const struct sieve_side_effect_def mailbox_create_side_effect = {
77
77
static bool tag_mailbox_create_validate
78
(struct sieve_validator *valdtr ATTR_UNUSED,
78
(struct sieve_validator *valdtr ATTR_UNUSED,
79
79
struct sieve_ast_argument **arg, struct sieve_command *cmd ATTR_UNUSED)
81
81
*arg = sieve_ast_argument_next(*arg);
105
105
* Side effect implementation
108
108
static void seff_mailbox_create_print
109
(const struct sieve_side_effect *seffect ATTR_UNUSED,
110
const struct sieve_action *action ATTR_UNUSED,
109
(const struct sieve_side_effect *seffect ATTR_UNUSED,
110
const struct sieve_action *action ATTR_UNUSED,
111
111
const struct sieve_result_print_env *rpenv, bool *keep ATTR_UNUSED)
113
113
sieve_result_seffect_printf(rpenv, "create mailbox if it does not exist");
116
static bool seff_mailbox_create_pre_execute
117
(const struct sieve_side_effect *seffect ATTR_UNUSED,
118
const struct sieve_action *action ATTR_UNUSED,
116
static int seff_mailbox_create_pre_execute
117
(const struct sieve_side_effect *seffect ATTR_UNUSED,
118
const struct sieve_action *action ATTR_UNUSED,
119
119
const struct sieve_action_exec_env *aenv ATTR_UNUSED,
120
120
void **se_context ATTR_UNUSED, void *tr_context ATTR_UNUSED)
122
struct act_store_transaction *trans =
122
struct act_store_transaction *trans =
123
123
(struct act_store_transaction *) tr_context;
124
124
struct mail_storage **storage = &(aenv->exec_status->last_storage);
125
125
enum mail_error error;
127
127
/* Check whether creation is necessary */
128
128
if ( trans->box == NULL || trans->disabled )
129
return SIEVE_EXEC_OK;
131
131
/* Check whether creation has a chance of working */
132
if ( trans->error_code != MAIL_ERROR_NONE &&
133
trans->error_code != MAIL_ERROR_NOTFOUND )
132
switch ( trans->error_code ) {
133
case MAIL_ERROR_NONE:
134
case MAIL_ERROR_NOTFOUND:
136
case MAIL_ERROR_TEMP:
137
return SIEVE_EXEC_TEMP_FAILURE;
139
return SIEVE_EXEC_FAILURE;
136
142
trans->error = NULL;
137
143
trans->error_code = MAIL_ERROR_NONE;
140
145
*storage = mailbox_get_storage(trans->box);
144
149
(void)mail_storage_get_last_error(*storage, &error);
145
150
if ( error != MAIL_ERROR_EXISTS ) {
146
151
sieve_act_store_get_storage_error(aenv, trans);
152
return ( trans->error_code == MAIL_ERROR_TEMP ?
153
SIEVE_EXEC_TEMP_FAILURE : SIEVE_EXEC_FAILURE );
158
164
/* Try opening again */
159
if ( mailbox_sync(trans->box, 0) < 0 ) {
165
if ( mailbox_open(trans->box) < 0 ) {
160
166
/* Failed definitively */
161
167
sieve_act_store_get_storage_error(aenv, trans);
168
return ( trans->error_code == MAIL_ERROR_TEMP ?
169
SIEVE_EXEC_TEMP_FAILURE : SIEVE_EXEC_FAILURE );
172
return SIEVE_EXEC_OK;