From c593c41a81370b5013a067bd20703f73e21b4baf Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 8 May 2003 07:53:47 +0300 Subject: [PATCH] Some fixes to get read-only mboxes working. --HG-- branch : HEAD --- src/imap/cmd-close.c | 6 ++++-- src/lib-index/mbox/mbox-index.c | 4 +++- src/lib-storage/index/index-storage.c | 3 +++ src/lib-storage/index/mbox/mbox-storage.c | 8 +++++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/imap/cmd-close.c b/src/imap/cmd-close.c index 1275c676be..02a364cd0d 100644 --- a/src/imap/cmd-close.c +++ b/src/imap/cmd-close.c @@ -12,8 +12,10 @@ int cmd_close(struct client *client) client->mailbox = NULL; - if (!mailbox->expunge(mailbox, FALSE)) - client_send_untagged_storage_error(client); + if (!mailbox->readonly) { + if (!mailbox->expunge(mailbox, FALSE)) + client_send_untagged_storage_error(client); + } if (!mailbox->close(mailbox)) client_send_untagged_storage_error(client); diff --git a/src/lib-index/mbox/mbox-index.c b/src/lib-index/mbox/mbox-index.c index 6cc5eddc38..bf80edc169 100644 --- a/src/lib-index/mbox/mbox-index.c +++ b/src/lib-index/mbox/mbox-index.c @@ -35,7 +35,8 @@ int mbox_file_open(struct mail_index *index) i_assert(index->mbox_fd == -1); - fd = open(index->mailbox_path, O_RDWR); + fd = open(index->mailbox_path, index->mailbox_readonly ? + O_RDONLY : O_RDWR); if (fd == -1) { mbox_set_syscall_error(index, "open()"); return FALSE; @@ -755,6 +756,7 @@ struct mail_index *mbox_index_alloc(const char *dir, const char *mbox_path) index->mbox_fd = -1; index->mbox_sync_counter = (unsigned int)-1; + index->mailbox_readonly = access(index->mailbox_path, W_OK) < 0; index->mailbox_path = i_strdup(mbox_path); mail_index_init(index, dir); diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 5b96f9a4b2..9a252d436f 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -197,6 +197,9 @@ static void lock_notify(enum mail_lock_notify_type notify_type, void index_storage_init_lock_notify(struct index_mailbox *ibox) { + if (ibox->index->mailbox_readonly) + ibox->box.readonly = TRUE; + ibox->next_lock_notify = time(NULL) + LOCK_NOTIFY_INTERVAL; ibox->last_notify_type = (enum mail_lock_notify_type)-1; diff --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index 1141ce2c15..0711021e1b 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -648,9 +648,11 @@ static int mbox_storage_close(struct mailbox *box) /* update flags by rewrite mbox file */ index_storage_init_lock_notify(ibox); - if (!mbox_index_rewrite(ibox->index)) { - mail_storage_set_index_error(ibox); - failed = TRUE; + if (!ibox->index->mailbox_readonly) { + if (!mbox_index_rewrite(ibox->index)) { + mail_storage_set_index_error(ibox); + failed = TRUE; + } } ibox->index->set_lock_notify_callback(ibox->index, NULL, NULL); -- 2.47.3