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