dovecot-1.2: Subscriptions file: If read/write fails due to EACC...

dovecot at dovecot.org dovecot at dovecot.org
Mon Sep 8 11:45:40 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/4ff103f5b64c
changeset: 8174:4ff103f5b64c
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Sep 08 11:45:34 2008 +0300
description:
Subscriptions file: If read/write fails due to EACCES, give an error message that mentions subscriptions.

diffstat:

1 file changed, 29 insertions(+), 18 deletions(-)
src/lib-storage/list/subscription-file.c |   47 ++++++++++++++++++------------

diffs (135 lines):

diff -r 6dd0c6755afe -r 4ff103f5b64c src/lib-storage/list/subscription-file.c
--- a/src/lib-storage/list/subscription-file.c	Sun Sep 07 22:34:11 2008 +0300
+++ b/src/lib-storage/list/subscription-file.c	Mon Sep 08 11:45:34 2008 +0300
@@ -24,14 +24,25 @@ struct subsfile_list_context {
 	bool failed;
 };
 
-static void subsfile_set_syscall_error(struct mailbox_list *list,
+static void subsread_set_syscall_error(struct mailbox_list *list,
 				       const char *function, const char *path)
 {
-	i_assert(function != NULL);
-
 	if (errno == EACCES) {
 		mailbox_list_set_error(list, MAIL_ERROR_PERM,
-				       MAIL_ERRSTR_NO_PERMISSION);
+				       "No permission to read subscriptions");
+	} else {
+		mailbox_list_set_critical(list,
+			"%s failed with subscription file %s: %m",
+			function, path);
+	}
+}
+
+static void subswrite_set_syscall_error(struct mailbox_list *list,
+					const char *function, const char *path)
+{
+	if (errno == EACCES) {
+		mailbox_list_set_error(list, MAIL_ERROR_PERM,
+				       "No permission to modify subscriptions");
 	} else {
 		mailbox_list_set_critical(list,
 			"%s failed with subscription file %s: %m",
@@ -54,8 +65,8 @@ static const char *next_line(struct mail
 		case -1:
                         if (input->stream_errno != 0 &&
                             (input->stream_errno != ESTALE || !ignore_estale)) {
-                                subsfile_set_syscall_error(list,
-                                                           "read()", path);
+                                subswrite_set_syscall_error(list,
+							    "read()", path);
                                 *failed_r = TRUE;
                         }
 			return NULL;
@@ -109,7 +120,7 @@ int subsfile_set_subscribed(struct mailb
 		if (dir != NULL &&
 		    mkdir_parents_chown(dir, dir_mode, (uid_t)-1, gid) < 0 &&
 		    errno != EEXIST) {
-			subsfile_set_syscall_error(list, "mkdir()", dir);
+			subswrite_set_syscall_error(list, "mkdir()", dir);
 			return -1;
 		}
 		fd_out = file_dotlock_open_mode(&dotlock_set, path, 0,
@@ -120,15 +131,15 @@ int subsfile_set_subscribed(struct mailb
 			mailbox_list_set_error(list, MAIL_ERROR_TEMP,
 				"Timeout waiting for subscription file lock");
 		} else {
-			subsfile_set_syscall_error(list,
-						   "file_dotlock_open()", path);
+			subswrite_set_syscall_error(list, "file_dotlock_open()",
+						    path);
 		}
 		return -1;
 	}
 
 	fd_in = nfs_safe_open(path, O_RDONLY);
 	if (fd_in == -1 && errno != ENOENT) {
-		subsfile_set_syscall_error(list, "open()", path);
+		subswrite_set_syscall_error(list, "open()", path);
 		(void)file_dotlock_delete(&dotlock);
 		return -1;
 	}
@@ -148,7 +159,7 @@ int subsfile_set_subscribed(struct mailb
 
 		if (o_stream_send_str(output, line) < 0 ||
 		    o_stream_send(output, "\n", 1) < 0) {
-			subsfile_set_syscall_error(list, "write()", path);
+			subswrite_set_syscall_error(list, "write()", path);
 			failed = TRUE;
 			break;
 		}
@@ -158,13 +169,13 @@ int subsfile_set_subscribed(struct mailb
 		/* append subscription */
 		line = t_strconcat(name, "\n", NULL);
 		if (o_stream_send_str(output, line) < 0) {
-			subsfile_set_syscall_error(list, "write()", path);
+			subswrite_set_syscall_error(list, "write()", path);
 			failed = TRUE;
 		}
 	}
 
 	if (!failed && fsync(fd_out) < 0) {
-		subsfile_set_syscall_error(list, "fsync()", path);
+		subswrite_set_syscall_error(list, "fsync()", path);
 		failed = TRUE;
 	}
 
@@ -174,7 +185,7 @@ int subsfile_set_subscribed(struct mailb
 
 	if (failed || (set && found) || (!set && !found)) {
 		if (file_dotlock_delete(&dotlock) < 0) {
-			subsfile_set_syscall_error(list,
+			subswrite_set_syscall_error(list,
 				"file_dotlock_delete()", path);
 			failed = TRUE;
 		}
@@ -182,7 +193,7 @@ int subsfile_set_subscribed(struct mailb
 		enum dotlock_replace_flags flags =
 			DOTLOCK_REPLACE_FLAG_VERIFY_OWNER;
 		if (file_dotlock_replace(&dotlock, flags) < 0) {
-			subsfile_set_syscall_error(list,
+			subswrite_set_syscall_error(list,
 				"file_dotlock_replace()", path);
 			failed = TRUE;
 		}
@@ -202,7 +213,7 @@ subsfile_list_init(struct mailbox_list *
 	fd = nfs_safe_open(path, O_RDONLY);
 	if (fd == -1) {
 		if (errno != ENOENT) {
-			subsfile_set_syscall_error(list, "open()", path);
+			subsread_set_syscall_error(list, "open()", path);
 			ctx->failed = TRUE;
 		}
 	} else {
@@ -252,8 +263,8 @@ const char *subsfile_list_next(struct su
                            Just return end of subscriptions list in that
                            case. */
                         if (errno != ENOENT) {
-                                subsfile_set_syscall_error(ctx->list, "open()",
-                                                           ctx->path);
+                                subsread_set_syscall_error(ctx->list, "open()",
+							   ctx->path);
                                 ctx->failed = TRUE;
                         }
                         return NULL;


More information about the dovecot-cvs mailing list