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

dovecot at dovecot.org dovecot at dovecot.org
Mon Sep 8 11:49:08 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/ffeda6b30755
changeset: 7863:ffeda6b30755
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 44ad27f77ba3 -r ffeda6b30755 src/lib-storage/list/subscription-file.c
--- a/src/lib-storage/list/subscription-file.c	Sun Sep 07 20:33:55 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;
@@ -103,7 +114,7 @@ int subsfile_set_subscribed(struct mailb
 		dir = p == NULL ? NULL : t_strdup_until(path, p);
 		if (dir != NULL && mkdir_parents(dir, 0700) < 0 &&
 		    errno != EEXIST) {
-			subsfile_set_syscall_error(list, "mkdir()", dir);
+			subswrite_set_syscall_error(list, "mkdir()", dir);
 			return -1;
 		}
 		fd_out = file_dotlock_open(&dotlock_set, path, 0, &dotlock);
@@ -113,15 +124,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;
 	}
@@ -141,7 +152,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;
 		}
@@ -151,13 +162,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;
 	}
 
@@ -167,7 +178,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;
 		}
@@ -175,7 +186,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;
 		}
@@ -195,7 +206,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 {
@@ -245,8 +256,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