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