static int mail_sieve_user_init (struct mail_user *user, struct sieve_storage **svstorage_r) { struct sieve_mail_user *suser = SIEVE_USER_CONTEXT(user); enum sieve_storage_flags storage_flags = SIEVE_STORAGE_FLAG_READWRITE | SIEVE_STORAGE_FLAG_SYNCHRONIZING; struct sieve_environment svenv; i_assert( suser != NULL ); if ( suser->svinst != NULL ) { *svstorage_r = suser->sieve_storage; return suser->sieve_storage != NULL ? 1 : 0; } /* Delayed initialization of sieve storage until it's actually needed */ memset(&svenv, 0, sizeof(svenv)); svenv.username = user->username; (void)mail_user_get_home(user, &svenv.home_dir); svenv.base_dir = user->set->base_dir; svenv.flags = SIEVE_FLAG_HOME_RELATIVE; suser->svinst = sieve_init(&svenv, &mail_sieve_callbacks, user, user->mail_debug); suser->sieve_storage = sieve_storage_create_main (suser->svinst, user, storage_flags, NULL); *svstorage_r = suser->sieve_storage; return suser->sieve_storage != NULL ? 1 : 0; }
static int doveadm_sieve_cmd_run (struct doveadm_mail_cmd_context *_ctx, struct mail_user *user) { struct doveadm_sieve_cmd_context *ctx = (struct doveadm_sieve_cmd_context *)_ctx; struct sieve_environment svenv; enum sieve_error error; int ret; memset((void*)&svenv, 0, sizeof(svenv)); svenv.username = user->username; (void)mail_user_get_home(user, &svenv.home_dir); svenv.base_dir = user->set->base_dir; svenv.flags = SIEVE_FLAG_HOME_RELATIVE; ctx->svinst = sieve_init (&svenv, &sieve_callbacks, (void *)ctx, user->mail_debug); ctx->storage = sieve_storage_create_main (ctx->svinst, user, SIEVE_STORAGE_FLAG_READWRITE, &error); if ( ctx->storage == NULL ) { switch ( error ) { case SIEVE_ERROR_NOT_FOUND: i_error("Failed to open Sieve storage: Sieve disabled for user"); break; default: i_error("Failed to open Sieve storage."); } doveadm_sieve_cmd_failed_error(ctx, error); ret = -1; } else { i_assert( ctx->v.run != NULL ); ret = ctx->v.run(ctx); sieve_storage_unref(&ctx->storage); } sieve_deinit(&ctx->svinst); return ret; }
static int imap_sieve_get_storage(struct imap_sieve *isieve, struct sieve_storage **storage_r) { enum sieve_storage_flags storage_flags = 0; enum sieve_error error; if (isieve->storage != NULL) { *storage_r = isieve->storage; return 1; } // FIXME: limit interval between retries isieve->storage = sieve_storage_create_main (isieve->svinst, isieve->user, storage_flags, &error); if (isieve->storage == NULL) { if (error == SIEVE_ERROR_TEMP_FAILURE) return -1; return 0; } *storage_r = isieve->storage; return 1; }