Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6454:b5e6543b4385 HEAD
Make sure we do a mailbox sync after flag updates (STORE, FETCH). Also added
a new IMAP_SYNC_FLAG_SAFE which is used to figure out if appends and
expunges are safe to send to client when delay-newmail workaround is
enabled.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 22 Sep 2007 13:55:36 +0300 |
parents | d98617723bc2 |
children | 5ad7a36ca8c3 |
files | src/imap/cmd-append.c src/imap/cmd-check.c src/imap/cmd-copy.c src/imap/cmd-expunge.c src/imap/cmd-fetch.c src/imap/cmd-noop.c src/imap/cmd-store.c src/imap/imap-fetch.c src/imap/imap-fetch.h src/imap/imap-sync.c src/imap/imap-sync.h |
diffstat | 11 files changed, 32 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/cmd-append.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/cmd-append.c Sat Sep 22 13:55:36 2007 +0300 @@ -235,6 +235,7 @@ if (args->type == IMAP_ARG_EOL) { /* last message */ enum mailbox_sync_flags sync_flags; + enum imap_sync_flags imap_flags; uint32_t uid_validity, uid1, uid2; const char *msg; @@ -267,11 +268,16 @@ uid_validity, uid1, uid2); } - sync_flags = ctx->box == cmd->client->mailbox ? - 0 : MAILBOX_SYNC_FLAG_FAST; + if (ctx->box == cmd->client->mailbox) { + sync_flags = 0; + imap_flags = IMAP_SYNC_FLAG_SAFE; + } else { + sync_flags = MAILBOX_SYNC_FLAG_FAST; + imap_flags = 0; + } cmd_append_finish(ctx); - return cmd_sync(cmd, sync_flags, 0, msg); + return cmd_sync(cmd, sync_flags, imap_flags, msg); } if (!validate_args(args, &flags_list, &internal_date_str,
--- a/src/imap/cmd-check.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/cmd-check.c Sat Sep 22 13:55:36 2007 +0300 @@ -9,5 +9,6 @@ return TRUE; return cmd_sync(cmd, MAILBOX_SYNC_FLAG_FULL_READ | - MAILBOX_SYNC_FLAG_FULL_WRITE, 0, "OK Check completed."); + MAILBOX_SYNC_FLAG_FULL_WRITE, IMAP_SYNC_FLAG_SAFE, + "OK Check completed."); }
--- a/src/imap/cmd-copy.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/cmd-copy.c Sat Sep 22 13:55:36 2007 +0300 @@ -92,7 +92,8 @@ struct mailbox_transaction_context *t; struct mail_search_arg *search_arg; const char *messageset, *mailbox, *src_uidset, *msg = NULL; - enum mailbox_sync_flags sync_flags = 0; + enum mailbox_sync_flags sync_flags = 0; + enum imap_sync_flags imap_flags = 0; unsigned int copy_count; uint32_t uid_validity, uid1, uid2; int ret; @@ -159,11 +160,12 @@ if (destbox != client->mailbox) { sync_flags |= MAILBOX_SYNC_FLAG_FAST; + imap_flags |= IMAP_SYNC_FLAG_SAFE; mailbox_close(&destbox); } if (ret > 0) - return cmd_sync(cmd, sync_flags, 0, msg); + return cmd_sync(cmd, sync_flags, imap_flags, msg); else if (ret == 0) { /* some messages were expunged, sync them */ return cmd_sync(cmd, 0, 0,
--- a/src/imap/cmd-expunge.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/cmd-expunge.c Sat Sep 22 13:55:36 2007 +0300 @@ -28,9 +28,10 @@ if (search_arg == NULL) return TRUE; - if (imap_expunge(client->mailbox, search_arg)) - return cmd_sync(cmd, 0, 0, "OK Expunge completed."); - else { + if (imap_expunge(client->mailbox, search_arg)) { + return cmd_sync(cmd, 0, IMAP_SYNC_FLAG_SAFE, + "OK Expunge completed."); + } else { client_send_storage_error(cmd, mailbox_get_storage(client->mailbox)); return TRUE; @@ -44,9 +45,10 @@ if (!client_verify_open_mailbox(cmd)) return TRUE; - if (imap_expunge(client->mailbox, NULL)) - return cmd_sync(cmd, 0, 0, "OK Expunge completed."); - else { + if (imap_expunge(client->mailbox, NULL)) { + return cmd_sync(cmd, 0, IMAP_SYNC_FLAG_SAFE, + "OK Expunge completed."); + } else { client_send_storage_error(cmd, mailbox_get_storage(client->mailbox)); return TRUE;
--- a/src/imap/cmd-fetch.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/cmd-fetch.c Sat Sep 22 13:55:36 2007 +0300 @@ -95,7 +95,8 @@ return TRUE; } - return cmd_sync(cmd, MAILBOX_SYNC_FLAG_FAST | + return cmd_sync(cmd, + (ctx->seen_flags_changed ? MAILBOX_SYNC_FLAG_FAST : 0) | (cmd->uid ? 0 : MAILBOX_SYNC_FLAG_NO_EXPUNGES), 0, ok_message); }
--- a/src/imap/cmd-noop.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/cmd-noop.c Sat Sep 22 13:55:36 2007 +0300 @@ -5,5 +5,5 @@ bool cmd_noop(struct client_command_context *cmd) { - return cmd_sync(cmd, 0, 0, "OK NOOP completed."); + return cmd_sync(cmd, 0, IMAP_SYNC_FLAG_SAFE, "OK NOOP completed."); }
--- a/src/imap/cmd-store.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/cmd-store.c Sat Sep 22 13:55:36 2007 +0300 @@ -123,7 +123,7 @@ flag changes that were caused by UID STORE and those that came externally, so we'll just send the UID for all flag changes that we see. */ - return cmd_sync(cmd, MAILBOX_SYNC_FLAG_FAST | + return cmd_sync(cmd, (cmd->uid ? 0 : MAILBOX_SYNC_FLAG_NO_EXPUNGES), cmd->uid && !silent ? IMAP_SYNC_FLAG_SEND_UID : 0,
--- a/src/imap/imap-fetch.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/imap-fetch.c Sat Sep 22 13:55:36 2007 +0300 @@ -511,6 +511,7 @@ if (ctx->flags_update_seen && (flags & MAIL_SEEN) == 0) { /* Add \Seen flag */ + ctx->seen_flags_changed = TRUE; flags |= MAIL_SEEN; mail_update_flags(mail, MODIFY_ADD, MAIL_SEEN); } else if (ctx->flags_show_only_seen_changes) {
--- a/src/imap/imap-fetch.h Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/imap-fetch.h Sat Sep 22 13:55:36 2007 +0300 @@ -55,6 +55,7 @@ unsigned int flags_have_handler:1; unsigned int flags_update_seen:1; + unsigned int seen_flags_changed:1; unsigned int flags_show_only_seen_changes:1; unsigned int update_partial:1; unsigned int cur_have_eoh:1;
--- a/src/imap/imap-sync.c Sat Sep 22 13:45:14 2007 +0300 +++ b/src/imap/imap-sync.c Sat Sep 22 13:55:36 2007 +0300 @@ -244,7 +244,7 @@ } no_newmail = (client_workarounds & WORKAROUND_DELAY_NEWMAIL) != 0 && - (flags & MAILBOX_SYNC_FLAG_FAST) != 0; + (imap_flags & IMAP_SYNC_FLAG_SAFE) == 0; if (no_newmail) { /* expunges might break the client just as badly as new mail notifications. */