bool exists;
int ret;
- ret = maildir_uidlist_lookup(mbox->uidlist, mail->uid, &flags, fname_r);
+ ret = maildir_sync_lookup(mbox, mail->uid, &flags, fname_r);
if (ret != 0)
return ret;
if (field == MAIL_FETCH_VIRTUAL_SIZE) {
/* make sure it gets removed from uidlist.
if it's in file name, we can't really do more than log it. */
- ret = maildir_uidlist_lookup(mbox->uidlist, _mail->uid,
- &flags, &fname);
+ ret = maildir_sync_lookup(mbox, _mail->uid, &flags, &fname);
if (ret <= 0)
return;
if (maildir_filename_get_size(fname, MAILDIR_EXTRA_VIRTUAL_SIZE,
}
if (find_uid != NULL && *find_uid != 0) {
- ret = maildir_uidlist_lookup_nosync(ctx->mbox->uidlist,
- *find_uid, &flags, &fname);
+ ret = maildir_uidlist_lookup(ctx->mbox->uidlist,
+ *find_uid, &flags, &fname);
if (ret < 0)
return -1;
if (ret == 0) {
return maildir_uidlist_sync_deinit(&ctx->uidlist_sync_ctx, TRUE);
}
+int maildir_sync_lookup(struct maildir_mailbox *mbox, uint32_t uid,
+ enum maildir_uidlist_rec_flag *flags_r,
+ const char **fname_r)
+{
+ int ret;
+
+ ret = maildir_uidlist_lookup(mbox->uidlist, uid, flags_r, fname_r);
+ if (ret <= 0) {
+ if (ret < 0)
+ return -1;
+ if (maildir_uidlist_is_open(mbox->uidlist)) {
+ /* refresh uidlist and check again in case it was added
+ after the last mailbox sync */
+ if (maildir_uidlist_refresh(mbox->uidlist) < 0)
+ return -1;
+ } else {
+ /* the uidlist doesn't exist. */
+ if (maildir_storage_sync_force(mbox, uid) < 0)
+ return -1;
+ }
+
+ /* try again */
+ ret = maildir_uidlist_lookup(mbox->uidlist, uid,
+ flags_r, fname_r);
+ }
+
+ return ret;
+}
+
int maildir_storage_sync_force(struct maildir_mailbox *mbox, uint32_t uid)
{
struct maildir_sync_context *ctx;
void maildir_sync_set_new_msgs_count(struct maildir_index_sync_context *ctx,
unsigned int count);
+int maildir_sync_lookup(struct maildir_mailbox *mbox, uint32_t uid,
+ enum maildir_uidlist_rec_flag *flags_r,
+ const char **fname_r);
+
int maildir_list_index_has_changed(struct mailbox *box,
struct mail_index_view *list_view,
uint32_t seq);
#include "nfs-workarounds.h"
#include "eacces-error.h"
#include "maildir-storage.h"
-#include "maildir-sync.h"
#include "maildir-filename.h"
#include "maildir-uidlist.h"
return uidlist->initial_read;
}
+bool maildir_uidlist_is_open(struct maildir_uidlist *uidlist)
+{
+ return uidlist->fd != -1;
+}
+
void maildir_uidlist_unlock(struct maildir_uidlist *uidlist)
{
i_assert(uidlist->lock_count > 0);
int maildir_uidlist_lookup(struct maildir_uidlist *uidlist, uint32_t uid,
enum maildir_uidlist_rec_flag *flags_r,
const char **fname_r)
-{
- int ret;
-
- ret = maildir_uidlist_lookup_nosync(uidlist, uid, flags_r, fname_r);
- if (ret <= 0) {
- if (ret < 0)
- return -1;
- if (uidlist->fd != -1 || uidlist->mbox == NULL) {
- /* refresh uidlist and check again in case it was added
- after the last mailbox sync */
- if (maildir_uidlist_refresh(uidlist) < 0)
- return -1;
- } else {
- /* the uidlist doesn't exist. */
- if (maildir_storage_sync_force(uidlist->mbox, uid) < 0)
- return -1;
- }
-
- /* try again */
- ret = maildir_uidlist_lookup_nosync(uidlist, uid,
- flags_r, fname_r);
- }
-
- return ret;
-}
-
-int maildir_uidlist_lookup_nosync(struct maildir_uidlist *uidlist, uint32_t uid,
- enum maildir_uidlist_rec_flag *flags_r,
- const char **fname_r)
{
struct maildir_uidlist_rec *rec;
int ret;
void maildir_uidlist_unlock(struct maildir_uidlist *uidlist);
bool maildir_uidlist_is_locked(struct maildir_uidlist *uidlist);
bool maildir_uidlist_is_read(struct maildir_uidlist *uidlist);
+/* Returns TRUE if uidlist file is currently open */
+bool maildir_uidlist_is_open(struct maildir_uidlist *uidlist);
struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox);
void maildir_uidlist_deinit(struct maildir_uidlist **uidlist);
int maildir_uidlist_lookup(struct maildir_uidlist *uidlist, uint32_t uid,
enum maildir_uidlist_rec_flag *flags_r,
const char **fname_r);
-int maildir_uidlist_lookup_nosync(struct maildir_uidlist *uidlist, uint32_t uid,
- enum maildir_uidlist_rec_flag *flags_r,
- const char **fname_r);
/* Returns extension's value or NULL if it doesn't exist. */
const char *
maildir_uidlist_lookup_ext(struct maildir_uidlist *uidlist, uint32_t uid,
bool have_flags;
int ret;
- ret = maildir_uidlist_lookup(mbox->uidlist, uid, &flags, &fname);
+ ret = maildir_sync_lookup(mbox, uid, &flags, &fname);
if (ret <= 0)
return ret == 0 ? -2 : -1;