[dovecot-cvs]
dovecot/src/lib-index/maildir maildir-sync.c,1.43,1.44
maildir-uidlist.c,1.6,1.7 maildir-uidlist.h,1.2,1.3
maildir-update-flags.c,1.3,1.4
cras at procontrol.fi
cras at procontrol.fi
Fri May 30 01:08:55 EEST 2003
Update of /home/cvs/dovecot/src/lib-index/maildir
In directory danu:/tmp/cvs-serv23007/lib-index/maildir
Modified Files:
maildir-sync.c maildir-uidlist.c maildir-uidlist.h
maildir-update-flags.c
Log Message:
uidlist file is read/updated much less often now. did some other
improvements for syncing as well.
Index: maildir-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/maildir/maildir-sync.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- maildir-sync.c 28 May 2003 11:15:04 -0000 1.43
+++ maildir-sync.c 29 May 2003 21:08:53 -0000 1.44
@@ -99,6 +99,22 @@
dirty flag. If there's dirty flags, this should be tried every time
after expunge or when closing the mailbox.
+ uidlist
+ -------
+
+ This file contains UID <-> filename mappings. It's updated only when
+ new mail arrives, so it may contain filenames that have already been
+ deleted. Updating is done by getting uidlist.lock file, writing the
+ whole uidlist into it and rename()ing it over the old uidlist. This
+ means there's no need to lock the file for reading.
+
+ Whenever uidlist is rewritten, it's mtime must be larger than the old
+ one's. Use utime() before rename() if needed.
+
+ Only time you have to read this file is when assigning new UIDs for
+ messages, to see if they already have UIDs. If file's mtime hasn't
+ changed, you don't have to do even that.
+
broken clients
--------------
@@ -220,8 +236,11 @@
struct maildir_uidlist *uidlist;
unsigned int readonly_check:1;
unsigned int flag_updates:1;
+ unsigned int uidlist_rewrite:1;
};
+static int maildir_sync_cur_dir(struct maildir_sync_context *ctx);
+
/* a char* hash function from ASU -- from glib */
static unsigned int maildir_hash(const void *p)
{
@@ -248,7 +267,7 @@
s1++; s2++;
}
if ((*s1 == '\0' || *s1 == ':') &&
- (*s2 == '\0' || *s2 == '\0'))
+ (*s2 == '\0' || *s2 == ':'))
return 0;
return *s1 - *s2;
}
@@ -307,6 +326,69 @@
return TRUE;
}
+static int maildir_sync_open_uidlist(struct maildir_sync_context *ctx)
+{
+ struct mail_index *index = ctx->index;
+ struct stat st;
+ const char *path;
+
+ if (ctx->uidlist != NULL)
+ return TRUE;
+
+ /* open it only if it's changed since we last synced it. */
+ path = t_strconcat(index->control_dir, "/" MAILDIR_UIDLIST_NAME, NULL);
+ if (stat(path, &st) < 0) {
+ if (errno == ENOENT) {
+ /* doesn't exist yet, create it */
+ switch (maildir_uidlist_try_lock(ctx->index)) {
+ case -1:
+ return FALSE;
+ case 1:
+ ctx->uidlist_rewrite = TRUE;
+ break;
+ }
+
+ return TRUE;
+ }
+ return index_file_set_syscall_error(index, path, "stat()");
+ }
+
+ /* FIXME: last_uidlist_mtime should be in index headers */
+ if (st.st_mtime == index->last_uidlist_mtime)
+ return TRUE;
+
+ ctx->uidlist = maildir_uidlist_open(index);
+ if (ctx->uidlist == NULL)
+ return TRUE;
+
+ if (ctx->uidlist->uid_validity != index->header->uid_validity) {
+ /* uidvalidity changed */
+ if (!index->rebuilding && index->opened) {
+ index_set_corrupted(index,
+ "UIDVALIDITY changed in uidlist");
+ return FALSE;
+ }
+
+ if (!index->rebuilding) {
+ index->set_flags |= MAIL_INDEX_FLAG_REBUILD;
+ return FALSE;
+ }
+
+ index->header->uid_validity = ctx->uidlist->uid_validity;
+ i_assert(index->header->next_uid == 1);
+ }
+
+ if (index->header->next_uid > ctx->uidlist->next_uid) {
+ index_set_corrupted(index, "index.next_uid (%u) > "
+ "uidlist.next_uid (%u)",
+ index->header->next_uid,
+ ctx->uidlist->next_uid);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static int is_file_content_changed(struct mail_index *index,
struct mail_index_record *rec,
const char *dir, const char *fname)
@@ -357,10 +439,10 @@
buffer_append(buf, (const void *) &key, sizeof(key));
}
-static int maildir_sync_uidlist(struct maildir_sync_context *ctx)
+static int maildir_full_sync_finish(struct maildir_sync_context *ctx)
{
struct mail_index *index = ctx->index;
- struct maildir_uidlist *uidlist = ctx->uidlist;
+ struct maildir_uidlist *uidlist;
struct mail_index_record *rec;
struct maildir_hash_rec *hash_rec;
struct maildir_uidlist_rec uid_rec;
@@ -370,8 +452,20 @@
int new_dir;
buffer_t *buf;
+ if (ctx->new_count > 0) {
+ /* new mails, either they're already in uidlist or we have
+ to add them there. If we want to add them, we'll need to
+ sync it locked. */
+ if (maildir_uidlist_try_lock(ctx->index) < 0)
+ return FALSE;
+
+ if (!maildir_sync_open_uidlist(ctx))
+ return FALSE;
+ }
+
seq = 0;
rec = index->lookup(index, 1);
+ uidlist = ctx->uidlist;
if (uidlist == NULL)
memset(&uid_rec, 0, sizeof(uid_rec));
@@ -385,7 +479,6 @@
/* skip over the expunged records in uidlist */
while (uid_rec.uid != 0 && uid_rec.uid < uid) {
- uidlist->rewrite = TRUE;
if (maildir_uidlist_next(uidlist, &uid_rec) < 0)
return FALSE;
}
@@ -412,13 +505,11 @@
if (uid_rec.uid > uid &&
(ACTION(hash_rec) == MAILDIR_FILE_ACTION_UPDATE_FLAGS ||
ACTION(hash_rec) == MAILDIR_FILE_ACTION_NONE)) {
- /* it's UID has changed */
+ /* it's UID has changed. shouldn't happen. */
+ i_warning("UID changed for %s/%s: %u -> %u",
+ index->mailbox_path, fname, uid, uid_rec.uid);
hash_rec->action = MAILDIR_FILE_ACTION_UPDATE_CONTENT |
(hash_rec->action & MAILDIR_FILE_FLAG_NEWDIR);
-
- /* make sure filename is not invalidated by expunge */
- hash_insert(ctx->files, p_strdup(ctx->pool, fname),
- hash_rec);
}
switch (ACTION(hash_rec)) {
@@ -462,14 +553,26 @@
/* if there's new mails which are already in uidlist, get them */
last_uid = 0;
while (uid_rec.uid != 0) {
- if (!hash_lookup_full(ctx->files, uid_rec.filename,
- &orig_key, &orig_value)) {
- /* expunged */
- if (uidlist != NULL)
- uidlist->rewrite = TRUE;
- } else {
+ if (hash_lookup_full(ctx->files, uid_rec.filename,
+ &orig_key, &orig_value))
hash_rec = orig_value;
- i_assert(ACTION(hash_rec) == MAILDIR_FILE_ACTION_NEW);
+ else
+ hash_rec = NULL;
+
+ if (hash_rec != NULL &&
+ ACTION(hash_rec) == MAILDIR_FILE_ACTION_NONE) {
+ /* it's a duplicate, shouldn't happen */
+ i_error("%s: Found duplicate filename %s, rebuilding",
+ ctx->uidlist->fname, uid_rec.filename);
+ (void)unlink(ctx->uidlist->fname);
+
+ if (INDEX_IS_UIDLIST_LOCKED(index))
+ ctx->uidlist_rewrite = TRUE;
+ hash_rec = NULL;
+ }
+
+ if (hash_rec != NULL) {
+ i_assert(ACTION(hash_rec) == MAILDIR_FILE_ACTION_NEW);
/* make sure we set the same UID for it. */
if (index->header->next_uid > uid_rec.uid) {
@@ -499,13 +602,29 @@
return FALSE;
}
+ if (ctx->uidlist != NULL) {
+ /* update our next_uid. it should have been checked for
+ sanity already. */
+ struct stat st;
+
+ i_assert(index->header->next_uid <= ctx->uidlist->next_uid);
+ index->header->next_uid = ctx->uidlist->next_uid;
+
+ /* uidlist is now synced, remember that. */
+ if (fstat(i_stream_get_fd(ctx->uidlist->input), &st) < 0) {
+ return index_file_set_syscall_error(index,
+ ctx->uidlist->fname,
+ "fstat()");
+ }
+ index->last_uidlist_mtime = st.st_mtime;
+ }
+
if (ctx->new_count == 0 || !INDEX_IS_UIDLIST_LOCKED(index)) {
/* all done (or can't do it since we don't have lock) */
return TRUE;
}
- if (uidlist != NULL)
- uidlist->rewrite = TRUE;
+ ctx->uidlist_rewrite = TRUE;
/* then there's the completely new mails. sort them by the filename
so we should get them to same order as they were created. */
@@ -544,7 +663,7 @@
return TRUE;
}
-static int maildir_index_full_sync_init(struct maildir_sync_context *ctx)
+static int maildir_full_sync_init(struct maildir_sync_context *ctx)
{
struct mail_index *index = ctx->index;
struct mail_index_record *rec;
@@ -582,9 +701,14 @@
hash_rec->rec = rec;
hash_rec->action = MAILDIR_FILE_ACTION_EXPUNGE;
- /* FIXME: p_strdup() eats uselessly memory. fix the code so
- that it's not needed. */
- hash_insert(ctx->files, (void *) p_strdup(ctx->pool, fname), hash_rec);
+ if (hash_lookup(ctx->files, fname) != NULL) {
+ index_set_corrupted(index, "Duplicated message %s",
+ fname);
+ return FALSE;
+ }
+
+ /* FIXME: wastes memory */
+ hash_insert(ctx->files, p_strdup(ctx->pool, fname), hash_rec);
rec = index->next(index, rec);
}
@@ -593,9 +717,36 @@
return TRUE;
}
-static int maildir_index_full_sync_dir(struct maildir_sync_context *ctx,
- const char *dir, int new_dir,
- DIR *dirp, struct dirent *d)
+static int maildir_fix_duplicate(struct mail_index *index,
+ const char *old_fname, int new_dir)
+{
+ const char *new_fname, *old_path, *new_path;
+ int ret = TRUE;
+
+ t_push();
+
+ old_path = t_strconcat(index->mailbox_path, new_dir ? "/new/" : "/cur/",
+ old_fname, NULL);
+
+ new_fname = maildir_generate_tmp_filename(&ioloop_timeval);
+ new_path = t_strconcat(index->mailbox_path, "/new/", new_fname, NULL);
+
+ if (rename(old_path, new_path) == 0) {
+ i_warning("Fixed duplicate in %s: %s -> %s",
+ index->mailbox_path, old_fname, new_fname);
+ } else if (errno != ENOENT) {
+ index_set_error(index, "rename(%s, %s) failed: %m",
+ old_path, new_path);
+ ret = FALSE;
+ }
+ t_pop();
+
+ return ret;
+}
+
+static int maildir_full_sync_dir(struct maildir_sync_context *ctx,
+ const char *dir, int new_dir,
+ DIR *dirp, struct dirent *d)
{
struct maildir_hash_rec *hash_rec;
void *orig_key, *orig_value;
@@ -617,8 +768,13 @@
hash_rec = p_new(ctx->pool, struct maildir_hash_rec, 1);
} else {
hash_rec = orig_value;
+ if (strncmp(d->d_name, "1053604786.28152_4.red.int.bppiac.hu", 36) == 0) {
+ i_warning("got: %s", d->d_name);
+ }
if (ACTION(hash_rec) != MAILDIR_FILE_ACTION_EXPUNGE) {
- /* FIXME: duplicate */
+ if (!maildir_fix_duplicate(ctx->index,
+ d->d_name, new_dir))
+ return FALSE;
continue;
}
}
@@ -702,7 +858,7 @@
return TRUE;
}
-static int maildir_index_full_sync_dirs(struct maildir_sync_context *ctx)
+static int maildir_full_sync_dirs(struct maildir_sync_context *ctx)
{
DIR *dirp;
int failed;
@@ -714,8 +870,8 @@
}
if (ctx->new_dent != NULL) {
- if (!maildir_index_full_sync_dir(ctx, ctx->new_dir, TRUE,
- ctx->new_dirp, ctx->new_dent))
+ if (!maildir_full_sync_dir(ctx, ctx->new_dir, TRUE,
+ ctx->new_dirp, ctx->new_dent))
return FALSE;
}
@@ -725,8 +881,8 @@
"opendir()");
}
- failed = !maildir_index_full_sync_dir(ctx, ctx->cur_dir, FALSE,
- dirp, readdir(dirp));
+ failed = !maildir_full_sync_dir(ctx, ctx->cur_dir, FALSE,
+ dirp, readdir(dirp));
if (closedir(dirp) < 0) {
return index_file_set_syscall_error(ctx->index, ctx->cur_dir,
@@ -743,6 +899,30 @@
string_t *sourcepath, *destpath;
const char *final_dir;
+ if (append_index) {
+ if (!ctx->index->set_lock(ctx->index, MAIL_LOCK_EXCLUSIVE))
+ return FALSE;
+
+ switch (maildir_uidlist_try_lock(ctx->index)) {
+ case -1:
+ return FALSE;
+ case 0:
+ /* couldn't get a lock.
+ no point in doing more. */
+ return TRUE;
+ }
+
+ /* make sure uidlist is up to date.
+ if it's not, do a full sync. */
+ if (!maildir_sync_open_uidlist(ctx))
+ return FALSE;
+
+ if (ctx->uidlist != NULL)
+ return maildir_sync_cur_dir(ctx);
+
+ ctx->uidlist_rewrite = TRUE;
+ }
+
d = ctx->new_dent;
ctx->new_dent = NULL;
@@ -789,10 +969,10 @@
}
if (append_index) {
+ /* FIXME: it may be already indexed if it couldn't
+ be moved to cur! */
if (!move_to_cur)
ctx->index->maildir_have_new = TRUE;
- if (ctx->uidlist != NULL)
- ctx->uidlist->rewrite = TRUE;
t_push();
if (!maildir_index_append_file(ctx->index, final_dir,
@@ -808,27 +988,47 @@
return TRUE;
}
+static int maildir_sync_cur_dir(struct maildir_sync_context *ctx)
+{
+ struct mail_index *index = ctx->index;
+
+ if (ctx->new_dent != NULL && !index->maildir_keep_new) {
+ /* there's also new mails. move them into cur/ first, if we
+ can lock the uidlist */
+ switch (maildir_uidlist_try_lock(index)) {
+ case -1:
+ return FALSE;
+ case 1:
+ if (!maildir_sync_new_dir(ctx, TRUE, FALSE))
+ return FALSE;
+ }
+ }
+
+ if (!index->set_lock(index, MAIL_LOCK_EXCLUSIVE))
+ return FALSE;
+
+ if (!maildir_full_sync_init(ctx) ||
+ !maildir_full_sync_dirs(ctx) ||
+ !maildir_full_sync_finish(ctx))
+ return FALSE;
+
+ return TRUE;
+}
+
static int maildir_index_sync_context(struct maildir_sync_context *ctx,
int *changes)
{
struct mail_index *index = ctx->index;
struct stat st;
- const char *uidlist_path;
- time_t uidlist_mtime, new_mtime, cur_mtime;
- int new_changed, full_sync;
-
- uidlist_path = t_strconcat(index->control_dir,
- "/" MAILDIR_UIDLIST_NAME, NULL);
+ time_t new_mtime, cur_mtime;
- if (index->fd == -1) {
- /* anon-mmaped */
- index->last_cur_mtime = index->file_sync_stamp;
- } else {
- /* FIXME: we should save it in index's header */
+ if (index->fd != -1) {
+ /* FIXME: file_sync_stamp should be in index file's headers.
+ it should also contain maildir_cur_dirty. */
if (fstat(index->fd, &st) < 0)
return index_set_syscall_error(index, "fstat()");
- index->last_cur_mtime = st.st_mtime;
+ index->file_sync_stamp = st.st_mtime;
}
if (stat(ctx->new_dir, &st) < 0) {
@@ -843,118 +1043,29 @@
}
cur_mtime = st.st_mtime;
- if (new_mtime == index->last_new_mtime &&
- new_mtime < ioloop_time - MAILDIR_SYNC_SECS)
- new_changed = FALSE;
- else {
+ if (new_mtime != index->last_new_mtime ||
+ new_mtime >= ioloop_time - MAILDIR_SYNC_SECS) {
if (!maildir_new_scan_first_file(ctx))
return FALSE;
- new_changed = ctx->new_dent != NULL;
}
- if (cur_mtime != index->last_cur_mtime ||
+ if (cur_mtime != index->file_sync_stamp ||
(index->maildir_cur_dirty != 0 &&
index->maildir_cur_dirty < ioloop_time - MAILDIR_SYNC_SECS)) {
/* cur/ changed, or delayed cur/ check */
- full_sync = TRUE;
- } else if (stat(uidlist_path, &st) < 0) {
- if (errno != ENOENT) {
- return index_file_set_syscall_error(index, uidlist_path,
- "stat()");
- }
-
- /* have to create uidlist */
- full_sync = TRUE;
- } else if (st.st_mtime != index->last_uidlist_mtime) {
- /* uidlist changed */
- full_sync = TRUE;
- } else if (!new_changed) {
- /* no changes to anything */
- return TRUE;
- } else {
- full_sync = index->maildir_have_new;
- }
-
- if (maildir_uidlist_try_lock(index) < 0)
- return FALSE;
-
- /* we may or may not have succeeded. if we didn't,
- just continue by syncing with existing uidlist file */
-
- if (!full_sync && !INDEX_IS_UIDLIST_LOCKED(index)) {
- /* just new mails in new/ dir, we can't sync them
- if we can't get the lock. */
- return TRUE;
- }
-
- if (!index->set_lock(index, MAIL_LOCK_EXCLUSIVE))
- return FALSE;
-
- ctx->uidlist = maildir_uidlist_open(index);
- if (ctx->uidlist != NULL &&
- ctx->uidlist->uid_validity != index->header->uid_validity) {
- /* uidvalidity changed */
- if (!index->rebuilding && index->opened) {
- index_set_corrupted(index,
- "UIDVALIDITY changed in uidlist");
- return FALSE;
- }
-
- if (!index->rebuilding) {
- index->set_flags |= MAIL_INDEX_FLAG_REBUILD;
- return FALSE;
- }
-
- index->header->uid_validity = ctx->uidlist->uid_validity;
- i_assert(index->header->next_uid == 1);
- }
-
- if (ctx->uidlist != NULL) {
- /* get uidlist's mtime again now that we have opened the file.
- it might have changed from out last check. */
- if (fstat(i_stream_get_fd(ctx->uidlist->input), &st) < 0) {
- return index_file_set_syscall_error(index, uidlist_path,
- "fstat()");
- }
- uidlist_mtime = st.st_mtime;
- }
-
- if (ctx->uidlist != NULL &&
- index->header->next_uid > ctx->uidlist->next_uid) {
- index_set_corrupted(index, "index.next_uid (%u) > "
- "uidlist.next_uid (%u)",
- index->header->next_uid,
- ctx->uidlist->next_uid);
- return FALSE;
- }
-
- if (changes != NULL)
- *changes = TRUE;
+ if (changes != NULL)
+ *changes = TRUE;
- if (new_changed && full_sync &&
- INDEX_IS_UIDLIST_LOCKED(index) && !index->maildir_keep_new) {
- /* we'll be syncing cur/ anyway, so move the mails from
- new/ to cur/ first. */
- if (!maildir_sync_new_dir(ctx, TRUE, FALSE))
+ if (!maildir_sync_cur_dir(ctx))
return FALSE;
-
- /* new_dent is non-NULL only if rename() failed because there
- was no disk space */
- new_changed = ctx->new_dent != NULL;
}
- if (full_sync) {
- if (!maildir_index_full_sync_init(ctx) ||
- !maildir_index_full_sync_dirs(ctx) ||
- !maildir_sync_uidlist(ctx))
- return FALSE;
- new_changed = !INDEX_IS_UIDLIST_LOCKED(index);
- } else if (new_changed) {
- i_assert(INDEX_IS_UIDLIST_LOCKED(index));
+ if (ctx->new_dent != NULL) {
+ if (changes != NULL)
+ *changes = TRUE;
if (!maildir_sync_new_dir(ctx, !index->maildir_keep_new, TRUE))
return FALSE;
- new_changed = FALSE;
/* this will set maildir_cur_dirty. it may actually be
different from cur/'s mtime if we're unlucky, but that
@@ -962,19 +1073,10 @@
cur_mtime = time(NULL);
}
- if (ctx->uidlist != NULL &&
- ctx->uidlist->next_uid > index->header->next_uid)
- index->header->next_uid = ctx->uidlist->next_uid;
-
- if (ctx->uidlist == NULL || ctx->uidlist->rewrite) {
- if (!INDEX_IS_UIDLIST_LOCKED(index)) {
- /* there's more new mails, but we need .lock file to
- be able to sync them. */
- index->last_uidlist_mtime = uidlist_mtime;
- return TRUE;
- }
+ if (ctx->uidlist_rewrite) {
+ i_assert(INDEX_IS_UIDLIST_LOCKED(index));
- if (!maildir_uidlist_rewrite(index, &uidlist_mtime))
+ if (!maildir_uidlist_rewrite(index, &index->last_uidlist_mtime))
return FALSE;
}
@@ -983,18 +1085,14 @@
else
index->maildir_cur_dirty = cur_mtime;
- index->last_uidlist_mtime = uidlist_mtime;
- index->last_cur_mtime = cur_mtime;
- if (!new_changed)
- index->last_new_mtime = new_mtime;
-
- /* update sync stamp */
index->file_sync_stamp = cur_mtime;
+ if (ctx->new_dent == NULL)
+ index->last_new_mtime = new_mtime;
return TRUE;
}
-static int maildir_index_sync_readonly_flags(struct maildir_sync_context *ctx)
+static int maildir_full_sync_finish_readonly(struct maildir_sync_context *ctx)
{
struct mail_index *index = ctx->index;
struct mail_index_record *rec;
@@ -1042,7 +1140,7 @@
return FALSE;
}
- cur_changed = st.st_mtime != index->last_cur_mtime ||
+ cur_changed = st.st_mtime != index->file_sync_stamp ||
index->maildir_cur_dirty != 0;
if (!cur_changed) {
@@ -1071,9 +1169,9 @@
directly. but don't rely on it. */
(void)index->try_lock(index, MAIL_LOCK_EXCLUSIVE);
- if (!maildir_index_full_sync_init(ctx) ||
- !maildir_index_full_sync_dirs(ctx) ||
- !maildir_index_sync_readonly_flags(ctx))
+ if (!maildir_full_sync_init(ctx) ||
+ !maildir_full_sync_dirs(ctx) ||
+ !maildir_full_sync_finish_readonly(ctx))
return FALSE;
return TRUE;
Index: maildir-uidlist.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/maildir/maildir-uidlist.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- maildir-uidlist.c 18 May 2003 12:56:15 -0000 1.6
+++ maildir-uidlist.c 29 May 2003 21:08:53 -0000 1.7
@@ -23,7 +23,8 @@
const char *path;
int fd, i;
- i_assert(!INDEX_IS_UIDLIST_LOCKED(index));
+ if (INDEX_IS_UIDLIST_LOCKED(index))
+ return 1;
path = t_strconcat(index->control_dir,
"/" MAILDIR_UIDLIST_NAME ".lock", NULL);
Index: maildir-uidlist.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/maildir/maildir-uidlist.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- maildir-uidlist.h 21 Apr 2003 13:42:00 -0000 1.2
+++ maildir-uidlist.h 29 May 2003 21:08:53 -0000 1.3
@@ -11,8 +11,9 @@
char *fname;
struct istream *input;
+ time_t cur_stamp;
+
unsigned int uid_validity, next_uid, last_read_uid;
- unsigned int rewrite:1;
};
struct maildir_uidlist_rec {
@@ -33,5 +34,9 @@
uidlist->next_uid. */
int maildir_uidlist_next(struct maildir_uidlist *uidlist,
struct maildir_uidlist_rec *uid_rec);
+
+/* Try to update cur/ stamp in */
+int maildir_uidlist_update_cur_stamp(struct maildir_uidlist *uidlist,
+ time_t stamp);
#endif
Index: maildir-update-flags.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/maildir/maildir-update-flags.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- maildir-update-flags.c 29 May 2003 14:15:57 -0000 1.3
+++ maildir-update-flags.c 29 May 2003 21:08:53 -0000 1.4
@@ -97,7 +97,7 @@
}
/* cur/ was updated, set it dirty-synced */
- index->file_sync_stamp = ioloop_time;
+ index->file_sync_stamp = ioloop_time;
index->maildir_cur_dirty = ioloop_time;
}
More information about the dovecot-cvs
mailing list