From c282435b57b6f9696fc12d99ea70468b7bdfe24c Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sun, 23 May 2004 01:36:46 +0300 Subject: [PATCH] Added pop3_mails_keep_recent option. Fixed recent assert crash. --HG-- branch : HEAD --- dovecot-example.conf | 5 +++++ src/lib-storage/index/index-storage.c | 1 + src/lib-storage/index/index-storage.h | 1 + src/lib-storage/index/maildir/maildir-sync.c | 3 ++- src/lib-storage/index/maildir/maildir-uidlist.c | 4 ++-- src/lib-storage/mail-storage.h | 3 ++- src/master/mail-process.c | 2 ++ src/master/master-settings.c | 6 ++++++ src/master/master-settings.h | 3 +++ src/pop3/client.c | 6 +++++- 10 files changed, 29 insertions(+), 5 deletions(-) diff --git a/dovecot-example.conf b/dovecot-example.conf index cbfb3daff5..4dcd0dbd25 100644 --- a/dovecot-example.conf +++ b/dovecot-example.conf @@ -355,6 +355,11 @@ protocol pop3 { # POP3 executable location #mail_executable = /usr/libexec/dovecot/pop3 + # Don't try to set mails non-recent with POP3 sessions. This is mostly + # intended to reduce disk I/O. With maildir it doesn't move files from + # new/ to cur/, with mbox it doesn't write Status-header. + #pop3_mails_keep_recent = no + # Support for dynamically loadable modules. #mail_use_modules = no #mail_modules = /usr/lib/dovecot/pop3 diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 48fbfab7b2..619e6261b6 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -330,6 +330,7 @@ index_storage_mailbox_init(struct index_storage *storage, struct mailbox *box, ibox->box.storage = &storage->storage; ibox->box.name = i_strdup(name); ibox->readonly = (flags & MAILBOX_OPEN_READONLY) != 0; + ibox->keep_recent = (flags & MAILBOX_OPEN_KEEP_RECENT) != 0; ibox->index = index; diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index 1739c6695a..6ff80f3f05 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -99,6 +99,7 @@ struct index_mailbox { unsigned int private_flags_mask; unsigned int readonly:1; + unsigned int keep_recent:1; unsigned int sent_diskspace_warning:1; unsigned int sent_readonly_flags_warning:1; unsigned int autosync_pending:1; diff --git a/src/lib-storage/index/maildir/maildir-sync.c b/src/lib-storage/index/maildir/maildir-sync.c index 54c53dba9a..bf54c1d405 100644 --- a/src/lib-storage/index/maildir/maildir-sync.c +++ b/src/lib-storage/index/maildir/maildir-sync.c @@ -434,7 +434,8 @@ static int maildir_scan_dir(struct maildir_sync_context *ctx, int new_dir) return -1; } - move_new = new_dir && !mailbox_is_readonly(&ctx->ibox->box); + move_new = new_dir && !mailbox_is_readonly(&ctx->ibox->box) && + !ctx->ibox->keep_recent; while ((dp = readdir(dirp)) != NULL) { if (dp->d_name[0] == '.') continue; diff --git a/src/lib-storage/index/maildir/maildir-uidlist.c b/src/lib-storage/index/maildir/maildir-uidlist.c index bfd21e6892..1c9fe8d099 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.c +++ b/src/lib-storage/index/maildir/maildir-uidlist.c @@ -145,9 +145,9 @@ void maildir_uidlist_deinit(struct maildir_uidlist *uidlist) static void maildir_uidlist_mark_recent(struct maildir_uidlist *uidlist, uint32_t uid) { - if (uidlist->first_recent_uid == 0) + if (uidlist->first_recent_uid == 0 || + uid < uidlist->first_recent_uid) uidlist->first_recent_uid = uid; - i_assert(uid >= uidlist->first_recent_uid); } static int maildir_uidlist_next(struct maildir_uidlist *uidlist, diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 158af234c4..15ddba35ac 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -7,7 +7,8 @@ struct message_size; enum mailbox_open_flags { MAILBOX_OPEN_READONLY = 0x01, - MAILBOX_OPEN_FAST = 0x02 + MAILBOX_OPEN_FAST = 0x02, + MAILBOX_OPEN_KEEP_RECENT = 0x04 }; enum mailbox_list_flags { diff --git a/src/master/mail-process.c b/src/master/mail-process.c index ee15b971da..f8af74b5b7 100644 --- a/src/master/mail-process.c +++ b/src/master/mail-process.c @@ -284,6 +284,8 @@ int create_mail_process(struct login_group *group, int socket, env_put("MAILDIR_CHECK_CONTENT_CHANGES=1"); if (set->mail_full_filesystem_access) env_put("FULL_FILESYSTEM_ACCESS=1"); + if (set->pop3_mails_keep_recent) + env_put("POP3_MAILS_KEEP_RECENT=1"); (void)umask(set->umask); env_put(t_strconcat("MBOX_LOCKS=", set->mbox_locks, NULL)); diff --git a/src/master/master-settings.c b/src/master/master-settings.c index 601ca3b2f4..5a527f1ccf 100644 --- a/src/master/master-settings.c +++ b/src/master/master-settings.c @@ -111,6 +111,9 @@ static struct setting_def setting_defs[] = { DEF(SET_INT, imap_max_line_length), DEF(SET_STR, imap_capability), + /* pop3 */ + DEF(SET_BOOL, pop3_mails_keep_recent), + { 0, NULL, 0 } }; @@ -240,6 +243,9 @@ struct settings default_settings = { MEMBER(imap_max_line_length) 65536, MEMBER(imap_capability) NULL, + /* pop3 */ + MEMBER(pop3_mails_keep_recent) FALSE, + /* .. */ MEMBER(login_uid) 0, MEMBER(listen_fd) -1, diff --git a/src/master/master-settings.h b/src/master/master-settings.h index 4cc06ae0bb..29825a7a0e 100644 --- a/src/master/master-settings.h +++ b/src/master/master-settings.h @@ -86,6 +86,9 @@ struct settings { unsigned int imap_max_line_length; const char *imap_capability; + /* pop3 */ + int pop3_mails_keep_recent; + /* .. */ uid_t login_uid; diff --git a/src/pop3/client.c b/src/pop3/client.c index 7a28601e82..f96785de9d 100644 --- a/src/pop3/client.c +++ b/src/pop3/client.c @@ -118,6 +118,7 @@ static int init_mailbox(struct client *client) struct client *client_create(int hin, int hout, struct mail_storage *storage) { struct client *client; + enum mailbox_open_flags flags; client = i_new(struct client, 1); client->input = i_stream_create_file(hin, default_pool, @@ -134,7 +135,10 @@ struct client *client_create(int hin, int hout, struct mail_storage *storage) mail_storage_set_callbacks(storage, &mail_storage_callbacks, client); - client->mailbox = mailbox_open(storage, "INBOX", 0); + flags = 0; + if (getenv("POP3_MAILS_KEEP_RECENT") != NULL) + flags |= MAILBOX_OPEN_KEEP_RECENT; + client->mailbox = mailbox_open(storage, "INBOX", flags); if (client->mailbox == NULL) { client_send_line(client, "-ERR No INBOX for user."); client_destroy(client); -- 2.47.3