Mercurial > dovecot > core-2.2
changeset 286:e5fdb222d38a HEAD
mbox fsck() didn't like files containing only "\n". fsck also now resets
dirty flag in header if it didn't find any dirty flags. this also fixes
mbox_rewrite() creating those \n-files.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 20 Sep 2002 18:58:23 +0300 |
parents | 49e6f5496071 |
children | 51eea5cbb075 |
files | src/lib-index/mbox/mbox-fsck.c |
diffstat | 1 files changed, 19 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mbox/mbox-fsck.c Fri Sep 20 18:41:19 2002 +0300 +++ b/src/lib-index/mbox/mbox-fsck.c Fri Sep 20 18:58:23 2002 +0300 @@ -112,7 +112,7 @@ static int match_next_record(MailIndex *index, MailIndexRecord *rec, unsigned int seq, IOBuffer *inbuf, - MailIndexRecord **next_rec) + MailIndexRecord **next_rec, int *dirty) { MailIndexUpdate *update; MessageSize hdr_size; @@ -150,6 +150,9 @@ /* update_flags() sets dirty flag, remove it */ rec->index_flags &= ~INDEX_MAIL_FLAG_DIRTY; + } else { + if (rec->msg_flags != ctx.flags) + *dirty = TRUE; } /* update location */ @@ -189,12 +192,19 @@ MailIndexRecord *rec; uoff_t from_offset; unsigned char *data; + size_t size; unsigned int seq; - size_t size; + int dirty; if (!index->set_lock(index, MAIL_LOCK_EXCLUSIVE)) return FALSE; + /* skip empty lines at beginning */ + while (io_buffer_read_data_blocking(inbuf, &data, &size, 0) > 0 && + (data[0] == '\r' || data[0] == '\n')) { + io_buffer_skip(inbuf, 1); + } + /* first make sure we start with a "From " line. If file is too small, we'll just treat it as empty mbox file. */ if (io_buffer_read_data_blocking(inbuf, &data, &size, 5) > 0 && @@ -215,6 +225,7 @@ seq = 1; rec = index->lookup(index, 1); + dirty = FALSE; while (rec != NULL) { from_offset = inbuf->offset; if (inbuf->offset != 0) { @@ -230,7 +241,7 @@ if (inbuf->offset == inbuf->size) break; - if (!match_next_record(index, rec, seq, inbuf, &rec)) + if (!match_next_record(index, rec, seq, inbuf, &rec, &dirty)) return FALSE; if (rec == NULL) { @@ -250,6 +261,11 @@ rec = index->next(index, rec); } + if (!dirty && (index->header->flags & MAIL_INDEX_FLAG_DIRTY_MESSAGES)) { + /* no flags were dirty anymore, no need to rewrite */ + index->header->flags &= ~MAIL_INDEX_FLAG_DIRTY_MESSAGES; + } + if (inbuf->offset == inbuf->size) return TRUE; else