Mercurial > dovecot > original-hg > dovecot-1.2
changeset 8174:4ff103f5b64c HEAD
Subscriptions file: If read/write fails due to EACCES, give an error message that mentions subscriptions.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 08 Sep 2008 11:45:34 +0300 |
parents | 6dd0c6755afe |
children | 69e933c5cc26 |
files | src/lib-storage/list/subscription-file.c |
diffstat | 1 files changed, 29 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ /* 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 @@ 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 @@ 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 @@ 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 @@ 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;