diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c index f949155404698dae5af6d337da40e9a23b8b55fc..89d1cb986ddd14b1a3b565d577854a4f3d5ac084 100644 --- a/src/lib-sieve/sieve-script.c +++ b/src/lib-sieve/sieve-script.c @@ -49,7 +49,7 @@ struct sieve_script *sieve_script_init const char *filename, *dirpath, *basename; if ( exists_r != NULL ) - *exists_r = FALSE; + *exists_r = TRUE; T_BEGIN { /* Extract filename from path */ @@ -71,9 +71,11 @@ struct sieve_script *sieve_script_init /* First obtain stat data from the system */ if ( (ret=lstat(path, &st)) < 0 && (errno != ENOENT || exists_r == NULL) ) { - if ( errno == ENOENT ) + if ( errno == ENOENT ) { sieve_error(ehandler, basename, "sieve script does not exist"); - else + if ( exists_r != NULL ) + *exists_r = FALSE; + } else sieve_critical(ehandler, basename, "failed to lstat sieve script file '%s': %m", path); script = NULL; ret = 1; @@ -84,9 +86,11 @@ struct sieve_script *sieve_script_init /* Only create/init the object if it stat()s without problems */ if (S_ISLNK(st.st_mode)) { if ( (ret=stat(path, &st)) < 0 && (errno != ENOENT || exists_r == NULL) ) { - if ( errno == ENOENT ) + if ( errno == ENOENT ) { sieve_error(ehandler, basename, "sieve script does not exist"); - else + if ( exists_r != NULL ) + *exists_r = FALSE; + } else sieve_critical(ehandler, basename, "failed to stat sieve script file '%s': %m", path); script = NULL; @@ -102,9 +106,6 @@ struct sieve_script *sieve_script_init } if ( ret <= 0 ) { - if ( exists_r != NULL ) - *exists_r = ( ret == 0 ); - if ( script == NULL ) { pool = pool_alloconly_create("sieve_script", 1024); script = p_new(pool, struct sieve_script, 1); diff --git a/src/lib-sieve/sieve-script.h b/src/lib-sieve/sieve-script.h index 78c37e34df116f28d1fc1cf57c0a2d88daafb1d4..c484c46cd82086d8536deef3f45a18bde2e28ed9 100644 --- a/src/lib-sieve/sieve-script.h +++ b/src/lib-sieve/sieve-script.h @@ -16,7 +16,7 @@ struct sieve_script *sieve_script_create_in_directory void sieve_script_ref(struct sieve_script *script); void sieve_script_unref(struct sieve_script **script); -/* Stream manageement */ +/* Stream management */ struct istream *sieve_script_open(struct sieve_script *script, bool *deleted_r); void sieve_script_close(struct sieve_script *script); diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index 7e330420619594282a2045d4337ba09c7db24b8d..8b46281551896d21a828288e5b9c37e52acaba9f 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -156,14 +156,14 @@ struct sieve_binary *sieve_compile */ struct sieve_binary *sieve_open -(const char *script_path, struct sieve_error_handler *ehandler) +(const char *script_path, struct sieve_error_handler *ehandler, bool *exists_r) { struct sieve_script *script; struct sieve_binary *sbin; const char *binpath; /* First open the scriptfile itself */ - script = sieve_script_create(script_path, NULL, ehandler, NULL); + script = sieve_script_create(script_path, NULL, ehandler, exists_r); if ( script == NULL ) { /* Failed */ diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h index 819ad61235e86862c686680c3b2280e676db6503..84fdb1271251db092390436d11ef46f5744b0eb2 100644 --- a/src/lib-sieve/sieve.h +++ b/src/lib-sieve/sieve.h @@ -61,7 +61,8 @@ struct sieve_binary *sieve_compile * */ struct sieve_binary *sieve_open - (const char *scriptpath, struct sieve_error_handler *ehandler); + (const char *scriptpath, struct sieve_error_handler *ehandler, + bool *exists_r); /* sieve_save: * Saves the binary as the file indicated by the path parameter. diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 6a74edb02144003abd923d91385aac6942b8e98b..85e0326747258c6488b614d4b999b0489746ba16 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -89,6 +89,7 @@ static int lda_sieve_run struct sieve_error_handler *ehandler; struct sieve_binary *sbin; const char *scriptlog; + bool exists = TRUE; int ret = 0; /* Create error handler */ @@ -100,12 +101,19 @@ static int lda_sieve_run if ( debug ) sieve_sys_info("opening script %s", script_path); - if ( (sbin=sieve_open(script_path, ehandler)) == NULL ) { - sieve_sys_error("failed to open script %s; " - "log should be available as %s", script_path, scriptlog); + if ( (sbin=sieve_open(script_path, ehandler, &exists)) == NULL ) { + + ret = sieve_get_errors(ehandler) > 0 ? -1 : 0; + + if ( debug ) { + if ( !exists && ret == 0 ) + sieve_sys_info("script file %s is missing; ending sieve processing", script_path); + else + sieve_sys_info("failed to openscript file %s; ending sieve processing", script_path); + } sieve_error_handler_unref(&ehandler); - return -1; + return ret; } /* Log the messages to the system error handlers as well from this moment @@ -179,6 +187,7 @@ static int lda_sieve_run case SIEVE_EXEC_FAILURE: sieve_sys_error("execution of script %s failed, but implicit keep was successful", script_path); + ret = SIEVE_EXEC_OK; break; case SIEVE_EXEC_BIN_CORRUPT: sieve_sys_error("!!BUG!!: binary compiled from %s is still corrupt; bailing out", diff --git a/src/sieve-bin/bin-common.c b/src/sieve-bin/bin-common.c index cfcf717bcbab57680816ee8d65d61dd3d36139ef..47f9622b485870bda0891453e8b7d601ff1deca7 100644 --- a/src/sieve-bin/bin-common.c +++ b/src/sieve-bin/bin-common.c @@ -93,7 +93,7 @@ struct sieve_binary *bin_open_sieve_script(const char *filename) ehandler = sieve_stderr_ehandler_create(0); sieve_error_handler_accept_infolog(ehandler, TRUE); - if ( (sbin = sieve_open(filename, ehandler)) == NULL ) { + if ( (sbin = sieve_open(filename, ehandler, NULL)) == NULL ) { sieve_error_handler_unref(&ehandler); i_fatal("Failed to compile sieve script\n"); }