Beispiel #1
0
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;
}
Beispiel #2
0
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;
}