diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c index caa23f2db3ad7fd848cc396398487e1e70af310d..e280d8ea8f99ada7d172ec7312a213a24425f026 100644 --- a/src/lib-sieve/sieve-script.c +++ b/src/lib-sieve/sieve-script.c @@ -161,14 +161,22 @@ struct sieve_script *sieve_script_init /* First obtain stat data from the system */ if ( (ret=lstat(path, &st)) < 0 ) { - if ( errno == ENOENT ) { + switch ( errno ) { + case ENOENT: if ( exists_r == NULL ) sieve_error(ehandler, basename, "sieve script does not exist"); else *exists_r = FALSE; - } else + break; + case EACCES: + sieve_critical(ehandler, basename, + "failed to stat sieve script: %s", + eacces_error_get("lstat", path)); + break; + default: sieve_critical(ehandler, basename, "failed to stat sieve script: lstat(%s) failed: %m", path); + } script = NULL; ret = 1; @@ -180,14 +188,23 @@ 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 ) { - if ( errno == ENOENT ) { + switch ( errno ) { + case ENOENT: if ( exists_r == NULL ) sieve_error(ehandler, basename, "sieve script does not exist"); else *exists_r = FALSE; - } else + break; + case EACCES: + sieve_critical(ehandler, basename, + "failed to stat sieve script: %s", + eacces_error_get("stat", path)); + break; + default: sieve_critical(ehandler, basename, "failed to stat sieve script: stat(%s) failed: %m", path); + break; + } script = NULL; ret = 1; @@ -338,20 +355,24 @@ struct istream *sieve_script_open *deleted_r = FALSE; if ( (fd=open(script->path, O_RDONLY)) < 0 ) { - if ( errno == ENOENT ) { + switch( errno ) { + case ENOENT: if ( deleted_r == NULL ) /* Not supposed to occur, create() does stat already */ sieve_error(script->ehandler, script->basename, "sieve script does not exist"); else *deleted_r = TRUE; - } else if ( errno == EACCES ) { + break; + case EACCES: sieve_critical(script->ehandler, script->path, "failed to open sieve script: %s", eacces_error_get("open", script->path)); - } else { + break; + default: sieve_critical(script->ehandler, script->path, "failed to open sieve script: open(%s) failed: %m", script->path); + break; } return NULL; } diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index 9b3ca195c8ca0080abc68d4253370cdc8638821c..cc5c52456509a8a291dc1a067cd7662e79db96a9 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -5,6 +5,7 @@ #include "str.h" #include "istream.h" #include "buffer.h" +#include "eacces-error.h" #include "sieve-limits.h" #include "sieve-settings.h" @@ -605,14 +606,28 @@ struct sieve_directory *sieve_directory_open(const char *path) struct stat st; /* Specified path can either be a regular file or a directory */ - if ( stat(path, &st) != 0 ) + if ( stat(path, &st) != 0 ) { + switch ( errno ) { + case ENOENT: + break; + case EACCES: + sieve_sys_error("failed to open sieve dir: %s", + eacces_error_get("stat", path)); + break; + default: + sieve_sys_error("failed to open sieve dir: " + "stat(%s) failed: %m", path); + break; + } return NULL; + } if ( S_ISDIR(st.st_mode) ) { /* Open the directory */ if ( (dirp = opendir(path)) == NULL ) { - sieve_sys_error("opendir(%s) failed: %m", path); + sieve_sys_error("failed to open sieve dir: " + "opendir(%s) failed: %m", path); return NULL; } @@ -642,7 +657,8 @@ const char *sieve_directory_get_scriptfile(struct sieve_directory *sdir) errno = 0; if ( (dp = readdir(sdir->dirp)) == NULL ) { if ( errno != 0 ) { - sieve_sys_error("readdir(%s) failed: %m", sdir->path); + sieve_sys_error("failed to read sieve dir: " + "readdir(%s) failed: %m", sdir->path); continue; } else return NULL; @@ -673,7 +689,8 @@ void sieve_directory_close(struct sieve_directory **sdir) { /* Close the directory */ if ( (*sdir)->dirp != NULL && closedir((*sdir)->dirp) < 0 ) - sieve_sys_error("closedir(%s) failed: %m", (*sdir)->path); + sieve_sys_error("failed to close sieve dir: " + "closedir(%s) failed: %m", (*sdir)->path); *sdir = NULL; } diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index e056a1527ab60c45af64e0163be9d0d8cdcbfb72..0ddb0dd603dadbf84a40a14951a1cb7283a80085 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -4,6 +4,7 @@ #include "lib.h" #include "array.h" #include "home-expand.h" +#include "eacces-error.h" #include "mail-storage.h" #include "mail-deliver.h" #include "mail-user.h" @@ -659,17 +660,27 @@ static int lda_sieve_deliver_mail if ( user_script != NULL && stat(user_script, &st) < 0 ) { - if (errno != ENOENT) - sieve_sys_error("stat(%s) failed: %m " - "(using global script path in stead)", user_script); - else if ( debug ) - sieve_sys_debug("local script path %s doesn't exist " - "(using global script path in stead)", user_script); + switch ( errno ) { + case ENOENT: + if (getenv("DEBUG") != NULL) + sieve_sys_info("user's script path %s doesn't exist " + "(using global script path in stead)", user_script); + break; + case EACCES: + sieve_sys_error("failed to stat user's sieve script: %s " + "(using global script path in stead)", + eacces_error_get("stat", user_script)); + break; + default: + sieve_sys_error("failed to stat user's sieve script: " + "stat(%s) failed: %m (using global script path in stead)", + user_script); + break; + } user_script = NULL; } - if ( debug ) { const char *script = user_script == NULL ? default_script : user_script;