From: Timo Sirainen Date: Wed, 9 Nov 2011 11:24:49 +0000 (+0200) Subject: maildir: Whenever we're guessing a filename correctly, remember it in uidlist. X-Git-Tag: 2.1.rc1~98 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2bde8972f2dcec46d96543407cc5b56954054359;p=thirdparty%2Fdovecot%2Fcore.git maildir: Whenever we're guessing a filename correctly, remember it in uidlist. --- diff --git a/src/lib-storage/index/maildir/maildir-uidlist.c b/src/lib-storage/index/maildir/maildir-uidlist.c index 8a9357257b..6cbbb66f22 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.c +++ b/src/lib-storage/index/maildir/maildir-uidlist.c @@ -1868,6 +1868,20 @@ bool maildir_uidlist_get_uid(struct maildir_uidlist *uidlist, return TRUE; } +void maildir_uidlist_update_fname(struct maildir_uidlist *uidlist, + const char *filename) +{ + struct maildir_uidlist_rec *rec; + + rec = hash_table_lookup(uidlist->files, filename); + if (rec == NULL) + return; + + rec->flags &= ~MAILDIR_UIDLIST_REC_FLAG_NONSYNCED; + if (strcmp(rec->filename, filename) != 0) + rec->filename = p_strdup(uidlist->record_pool, filename); +} + const char * maildir_uidlist_get_full_filename(struct maildir_uidlist *uidlist, const char *filename) diff --git a/src/lib-storage/index/maildir/maildir-uidlist.h b/src/lib-storage/index/maildir/maildir-uidlist.h index d78a31156f..9b6122c44b 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.h +++ b/src/lib-storage/index/maildir/maildir-uidlist.h @@ -127,6 +127,8 @@ void maildir_uidlist_sync_set_ext(struct maildir_uidlist_sync_ctx *ctx, struct maildir_uidlist_rec *rec, enum maildir_uidlist_rec_ext_key key, const char *value); +void maildir_uidlist_update_fname(struct maildir_uidlist *uidlist, + const char *filename); const char * maildir_uidlist_sync_get_full_filename(struct maildir_uidlist_sync_ctx *ctx, const char *filename); diff --git a/src/lib-storage/index/maildir/maildir-util.c b/src/lib-storage/index/maildir/maildir-util.c index 044a5628f2..6c258e0c96 100644 --- a/src/lib-storage/index/maildir/maildir-util.c +++ b/src/lib-storage/index/maildir/maildir-util.c @@ -88,17 +88,22 @@ static int maildir_file_do_try(struct maildir_mailbox *mbox, uint32_t uid, &flags, &have_flags); } + ret = 0; if ((flags & MAILDIR_UIDLIST_REC_FLAG_NEW_DIR) != 0) { /* probably in new/ dir */ path = t_strconcat(mailbox_get_path(&mbox->box), "/new/", fname, NULL); ret = callback(mbox, path, context); - if (ret != 0) - return ret; } - - path = t_strconcat(mailbox_get_path(&mbox->box), "/cur/", fname, NULL); - ret = callback(mbox, path, context); + if (ret == 0) { + path = t_strconcat(mailbox_get_path(&mbox->box), "/cur/", + fname, NULL); + ret = callback(mbox, path, context); + } + if (ret > 0 && (flags & MAILDIR_UIDLIST_REC_FLAG_NONSYNCED) != 0) { + /* file was found. make sure we remember its latest name. */ + maildir_uidlist_update_fname(mbox->uidlist, fname); + } return ret; }