[dovecot-cvs] dovecot/src/lib-index mail-index-fsck.c, 1.18, 1.19 mail-index-lock.c, 1.11, 1.12 mail-index-private.h, 1.11, 1.12 mail-index-reset.c, 1.3, 1.4 mail-index.c, 1.114, 1.115

cras at procontrol.fi cras at procontrol.fi
Sat May 1 19:22:57 EEST 2004


Update of /home/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv20191

Modified Files:
	mail-index-fsck.c mail-index-lock.c mail-index-private.h 
	mail-index-reset.c mail-index.c 
Log Message:
missing index file fixes



Index: mail-index-fsck.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-fsck.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- mail-index-fsck.c	29 Apr 2004 12:59:16 -0000	1.18
+++ mail-index-fsck.c	1 May 2004 16:22:54 -0000	1.19
@@ -130,6 +130,6 @@
 				     index->filepath, error);
 	}
 	if (ret == 0)
-		mail_index_reset(index);
+		mail_index_mark_corrupted(index);
 	return ret;
 }

Index: mail-index-lock.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-lock.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- mail-index-lock.c	1 May 2004 16:08:15 -0000	1.11
+++ mail-index-lock.c	1 May 2004 16:22:54 -0000	1.12
@@ -106,7 +106,7 @@
 			return -1;
 
 		/* lost it? recreate */
-		(void)mail_index_reset(index);
+		(void)mail_index_mark_corrupted(index);
 		return -1;
 	}
 

Index: mail-index-private.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-private.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- mail-index-private.h	1 May 2004 16:08:15 -0000	1.11
+++ mail-index-private.h	1 May 2004 16:22:54 -0000	1.12
@@ -128,6 +128,7 @@
 			    const void *data, size_t *data_offset);
 
 void mail_index_set_inconsistent(struct mail_index *index);
+int mail_index_mark_corrupted(struct mail_index *index);
 
 int mail_index_set_error(struct mail_index *index, const char *fmt, ...)
 	__attr_format__(2, 3);

Index: mail-index-reset.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-reset.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- mail-index-reset.c	1 May 2004 16:08:15 -0000	1.3
+++ mail-index-reset.c	1 May 2004 16:22:54 -0000	1.4
@@ -36,6 +36,7 @@
 
 int mail_index_reset(struct mail_index *index)
 {
+	struct mail_transaction_log *log;
 	struct mail_index_header hdr;
 	uint32_t file_seq;
 	uoff_t file_offset;
@@ -48,19 +49,23 @@
 	if (mail_index_mark_corrupted(index) < 0)
 		return -1;
 
-	log_locked = index->log_locked;
+	/*log_locked = index->log_locked;
 	if (log_locked)
                 mail_transaction_log_sync_unlock(index->log);
-        mail_index_close(index);
 
-	if (mail_index_open(index, MAIL_INDEX_OPEN_FLAG_CREATE) < 0)
+	log = index->log;
+	mail_index_close(index);
+	index->log = log;
+
+	if (mail_index_open(index, MAIL_INDEX_OPEN_FLAG_CREATE |
+			    MAIL_INDEX_OPEN_FLAG_REOPEN) < 0)
 		return -1;
 
 	if (log_locked) {
 		if (mail_transaction_log_sync_lock(index->log,
 						   &file_seq, &file_offset) < 0)
 			return -1;
-	}
+	}*/
 
 	return 0;
 }

Index: mail-index.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index.c,v
retrieving revision 1.114
retrieving revision 1.115
diff -u -d -r1.114 -r1.115
--- mail-index.c	1 May 2004 16:08:15 -0000	1.114
+++ mail-index.c	1 May 2004 16:22:54 -0000	1.115
@@ -655,6 +655,34 @@
 	index->indexid = 0;
 }
 
+int mail_index_mark_corrupted(struct mail_index *index)
+{
+	struct mail_index_header hdr;
+
+	if (index->readonly)
+		return 0;
+
+	/* make sure we can write the header */
+	if (!MAIL_INDEX_MAP_IS_IN_MEMORY(index->map)) {
+		if (mprotect(index->map->mmap_base, sizeof(hdr),
+			     PROT_READ | PROT_WRITE) < 0) {
+			mail_index_set_syscall_error(index, "mprotect()");
+			return -1;
+		}
+	}
+
+	hdr = *index->hdr;
+	hdr.flags |= MAIL_INDEX_HDR_FLAG_CORRUPTED;
+	if (mail_index_write_header(index, &hdr) < 0)
+		return -1;
+
+	if (fsync(index->fd) < 0)
+		return mail_index_set_syscall_error(index, "fsync()");
+
+	mail_index_set_inconsistent(index);
+	return 0;
+}
+
 int mail_index_set_syscall_error(struct mail_index *index,
 				 const char *function)
 {



More information about the dovecot-cvs mailing list