static int cmd_test_config_reload_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { const struct sieve_extension *ext; int opt_code = 0; string_t *extension = NULL; int ret; /* * Read operands */ /* Optional operands */ for (;;) { int opt; if ( (opt=sieve_opr_optional_read(renv, address, &opt_code)) < 0 ) return SIEVE_EXEC_BIN_CORRUPT; if ( opt == 0 ) break; switch ( opt_code ) { case OPT_EXTENSION: ret = sieve_opr_string_read(renv, address, "extension", &extension); break; default: sieve_runtime_trace_error(renv, "unknown optional operand"); ret = SIEVE_EXEC_BIN_CORRUPT; } if ( ret <= 0 ) return ret; } /* * Perform operation */ if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) { sieve_runtime_trace(renv, 0, "testsuite: test_config_reload command"); sieve_runtime_trace_descend(renv); } if ( extension == NULL ) { if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) { sieve_runtime_trace(renv, 0, "reload configuration for sieve engine"); } sieve_settings_load(renv->svinst); } else { if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) { sieve_runtime_trace(renv, 0, "reload configuration for extension `%s'", str_c(extension)); } ext = sieve_extension_get_by_name(renv->svinst, str_c(extension)); if ( ext == NULL ) { testsuite_test_failf("test_config_reload: " "unknown extension '%s'", str_c(extension)); return SIEVE_EXEC_OK; } sieve_extension_reload(ext); } return SIEVE_EXEC_OK; }
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; }