static void mail_sieve_user_deinit(struct mail_user *user) { struct sieve_mail_user *suser = SIEVE_USER_CONTEXT(user); if ( suser->svinst != NULL ) { if (suser->sieve_storage != NULL) sieve_storage_unref(&suser->sieve_storage); sieve_deinit(&suser->svinst); } suser->module_ctx.super.deinit(user); }
void sieve_tool_deinit(struct sieve_tool **_tool) { struct sieve_tool *tool = *_tool; *_tool = NULL; /* Deinitialize Sieve engine */ sieve_deinit(&tool->svinst); /* Free options */ if ( tool->username != NULL ) i_free(tool->username); if ( tool->homedir != NULL ) i_free(tool->homedir); if ( tool->sieve_extensions != NULL ) i_free(tool->sieve_extensions); array_free(&tool->sieve_plugins); /* Free raw mail */ if ( tool->mail_raw != NULL ) mail_raw_close(&tool->mail_raw); if ( tool->mail_raw_user != NULL ) mail_user_unref(&tool->mail_raw_user); /* Free mail service */ if ( tool->mail_user != NULL ) mail_user_unref(&tool->mail_user); if ( tool->mail_user_dovecot != NULL ) mail_user_unref(&tool->mail_user_dovecot); mail_storage_service_user_free(&tool->service_user); mail_storage_service_deinit(&tool->storage_service); /* Free sieve tool object */ i_free(tool->name); i_free(tool); /* Deinitialize service */ master_service_deinit(&master_service); }
void imap_sieve_deinit(struct imap_sieve **_isieve) { struct imap_sieve *isieve = *_isieve; *_isieve = NULL; sieve_error_handler_unref(&isieve->master_ehandler); if (isieve->storage != NULL) sieve_storage_unref(&isieve->storage); sieve_extension_unregister(isieve->ext_imapsieve); sieve_deinit(&isieve->svinst); duplicate_deinit(&isieve->dup_ctx); pool_unref(&isieve->pool); }
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; }
struct sieve_instance *sieve_init (const struct sieve_environment *env, const struct sieve_callbacks *callbacks, void *context, bool debug) { struct sieve_instance *svinst; const char *domain; pool_t pool; /* Create Sieve engine instance */ pool = pool_alloconly_create("sieve", 8192); svinst = p_new(pool, struct sieve_instance, 1); svinst->pool = pool; svinst->callbacks = callbacks; svinst->context = context; svinst->debug = debug; svinst->base_dir = p_strdup_empty(pool, env->base_dir); svinst->username = p_strdup_empty(pool, env->username); svinst->home_dir = p_strdup_empty(pool, env->home_dir); svinst->temp_dir = p_strdup_empty(pool, env->temp_dir); svinst->flags = env->flags; svinst->env_location = env->location; svinst->delivery_phase = env->delivery_phase; /* Determine domain */ if ( env->domainname != NULL && *(env->domainname) != '\0' ) { domain = env->domainname; } else { /* Fall back to parsing username localpart@domain */ domain = svinst->username == NULL ? NULL : strchr(svinst->username, '@'); if ( domain == NULL || *(domain+1) == '\0' ) { /* Fall back to parsing hostname host.domain */ domain = ( env->hostname != NULL ? strchr(env->hostname, '.') : NULL ); if ( domain == NULL || *(domain+1) == '\0' || strchr(domain+1, '.') == NULL ) { /* Fall back to bare hostname */ domain = env->hostname; } else { domain++; } } else { domain++; } } svinst->hostname = p_strdup_empty(pool, env->hostname); svinst->domainname = p_strdup(pool, domain); sieve_errors_init(svinst); if ( debug ) { sieve_sys_debug(svinst, "%s version %s initializing", PIGEONHOLE_NAME, PIGEONHOLE_VERSION_FULL); } /* Read configuration */ sieve_settings_load(svinst); /* Initialize extensions */ if ( !sieve_extensions_init(svinst) ) { sieve_deinit(&svinst); return NULL; } /* Initialize storage classes */ sieve_storages_init(svinst); /* Initialize plugins */ sieve_plugins_load(svinst, NULL, NULL); /* Configure extensions */ sieve_extensions_configure(svinst); return svinst; }