]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir: Whenever we're guessing a filename correctly, remember it in uidlist.
authorTimo Sirainen <tss@iki.fi>
Wed, 9 Nov 2011 11:24:49 +0000 (13:24 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 9 Nov 2011 11:24:49 +0000 (13:24 +0200)
src/lib-storage/index/maildir/maildir-uidlist.c
src/lib-storage/index/maildir/maildir-uidlist.h
src/lib-storage/index/maildir/maildir-util.c

index 8a9357257b276ff9be8c0486508c1543e4f7c35d..6cbbb66f22d6ebef9e258897521ae9cdf36c65a8 100644 (file)
@@ -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)
index d78a31156f6620ecdba79582c43889adc64fb518..9b6122c44b419cf2dddd9acb31a8c9d4030bb1c1 100644 (file)
@@ -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);
index 044a5628f2bc5a524cc303f58ac30f4984a7802d..6c258e0c960f6eb7cdd31d2b8729c5b7b7eedef0 100644 (file)
@@ -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;
 }