diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c index af09094de1bca44f9c70127783e2fff405c3b3d6..76ba2879dccea27c539aa76ba0f60d058d191fa5 100644 --- a/src/lib-sieve/sieve-storage.c +++ b/src/lib-sieve/sieve-storage.c @@ -673,11 +673,10 @@ void sieve_storage_set_modified * Script access */ -struct sieve_script *sieve_storage_get_script +static struct sieve_script *sieve_storage_get_script_direct (struct sieve_storage *storage, const char *name, enum sieve_error *error_r) { - struct sieve_instance *svinst = storage->svinst; struct sieve_script *script; if ( error_r != NULL ) @@ -697,7 +696,18 @@ struct sieve_script *sieve_storage_get_script i_assert(storage->v.get_script != NULL); script = storage->v.get_script(storage, name); + return script; +} + +struct sieve_script *sieve_storage_get_script +(struct sieve_storage *storage, const char *name, + enum sieve_error *error_r) +{ + struct sieve_instance *svinst = storage->svinst; + struct sieve_script *script; + script = sieve_storage_get_script_direct + (storage, name, error_r); if ( script == NULL ) { /* Error */ if ( storage->error_code == SIEVE_ERROR_NOT_FOUND && @@ -768,6 +778,26 @@ struct sieve_script *sieve_storage_open_script return script; } +static int sieve_storage_check_script_direct +(struct sieve_storage *storage, const char *name, + enum sieve_error *error_r) ATTR_NULL(3) +{ + struct sieve_script *script; + enum sieve_error error; + int ret; + + if ( error_r == NULL ) + error_r = &error; + + script = sieve_storage_get_script_direct(storage, name, error_r); + if ( script == NULL ) + return ( *error_r == SIEVE_ERROR_NOT_FOUND ? 0 : -1 ); + + ret = sieve_script_open(script, error_r); + return ( ret >= 0 ? 1 : + ( *error_r == SIEVE_ERROR_NOT_FOUND ? 0 : -1 ) ); +} + int sieve_storage_check_script (struct sieve_storage *storage, const char *name, enum sieve_error *error_r) @@ -775,12 +805,12 @@ int sieve_storage_check_script struct sieve_script *script; enum sieve_error error; - if (error_r == NULL) + if ( error_r == NULL ) error_r = &error; script = sieve_storage_open_script(storage, name, error_r); - if (script == NULL) - return ( *error_r == SIEVE_ERROR_NOT_FOUND ? 0 : -1); + if ( script == NULL ) + return ( *error_r == SIEVE_ERROR_NOT_FOUND ? 0 : -1 ); sieve_script_unref(&script); return 1; @@ -1117,7 +1147,9 @@ int sieve_storage_save_commit(struct sieve_storage_save_context **_sctx) storage->default_location != NULL && (storage->flags & SIEVE_STORAGE_FLAG_SYNCHRONIZING) == 0 && strcmp(sctx->scriptname, storage->default_name) == 0 && - sieve_storage_save_will_activate(sctx) ) + sieve_storage_save_will_activate(sctx) && + sieve_storage_check_script_direct + (storage, storage->default_name, NULL) <= 0 ) default_activate = TRUE; scriptname = t_strdup(sctx->scriptname);