[dovecot-cvs] dovecot/src/lib-storage/index/maildir
maildir-uidlist.c, 1.24, 1.25
cras at procontrol.fi
cras at procontrol.fi
Sun May 30 09:38:57 EEST 2004
Update of /home/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv24602
Modified Files:
maildir-uidlist.c
Log Message:
small fixes
Index: maildir-uidlist.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- a/maildir-uidlist.c 24 May 2004 02:47:23 -0000 1.24
+++ b/maildir-uidlist.c 30 May 2004 06:38:55 -0000 1.25
@@ -227,6 +227,7 @@
struct mail_storage *storage = uidlist->ibox->box.storage;
const struct maildir_uidlist_rec *const *rec_p;
const char *line;
+ unsigned int uid_validity, next_uid;
struct istream *input;
struct stat st;
uint32_t last_uid;
@@ -283,15 +284,23 @@
/* get header */
line = i_stream_read_next_line(input);
if (line == NULL || sscanf(line, "%u %u %u", &uidlist->version,
- &uidlist->uid_validity,
- &uidlist->next_uid) != 3 ||
+ &uid_validity, &next_uid) != 3 ||
uidlist->version < 1 || uidlist->version > 2) {
/* broken file */
mail_storage_set_critical(storage,
"Corrupted header in file %s (version = %u)",
uidlist->fname, uidlist->version);
ret = 0;
+ } else if (uid_validity == uidlist->uid_validity &&
+ next_uid < uidlist->next_uid) {
+ mail_storage_set_critical(storage,
+ "%s: next_uid was lowered (%u -> %u)",
+ uidlist->fname, uidlist->next_uid, next_uid);
+ ret = 0;
} else {
+ uidlist->uid_validity = uid_validity;
+ uidlist->next_uid = next_uid;
+
ret = 1;
while ((line = i_stream_read_next_line(input)) != NULL) {
if (!maildir_uidlist_next(uidlist, line, last_uid)) {
@@ -522,15 +531,14 @@
FALSE) <= 0) {
mail_storage_set_critical(ibox->box.storage,
"file_dotlock_replace(%s) failed: %m", db_path);
+ (void)unlink(temp_path);
ret = -1;
}
+ uidlist->lock_fd = -1;
} else {
- (void)close(uidlist->lock_fd);
+ maildir_uidlist_unlock(uidlist);
}
- uidlist->lock_fd = -1;
- if (ret < 0)
- (void)unlink(temp_path);
return ret;
}
@@ -582,6 +590,8 @@
{
int ret;
+ i_assert(!ctx->synced);
+
if (!ctx->uidlist->initial_read) {
/* first time reading the uidlist,
no locking yet */
@@ -751,6 +761,8 @@
unsigned int dest;
size_t size;
+ i_assert(UIDLIST_IS_LOCKED(uidlist));
+
rec_p = buffer_get_modifyable_data(uidlist->record_buf, &size);
size /= sizeof(*rec_p);
@@ -782,7 +794,7 @@
struct maildir_uidlist_rec **rec_p;
size_t size;
- /* buffer is unsorted, sort it by UID up to beginning of new messages */
+ /* buffer is unsorted, sort it by UID */
rec_p = buffer_get_modifyable_data(ctx->record_buf, &size);
size /= sizeof(*rec_p);
qsort(rec_p, size, sizeof(*rec_p), maildir_uid_cmp);
@@ -817,6 +829,7 @@
ctx->first_new_pos);
}
}
+
ctx->finished = TRUE;
ctx->uidlist->initial_sync = TRUE;
return !ctx->locked;
More information about the dovecot-cvs
mailing list