]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
missing index file fixes
authorTimo Sirainen <tss@iki.fi>
Sat, 1 May 2004 16:22:54 +0000 (19:22 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 1 May 2004 16:22:54 +0000 (19:22 +0300)
--HG--
branch : HEAD

src/lib-index/mail-index-fsck.c
src/lib-index/mail-index-lock.c
src/lib-index/mail-index-private.h
src/lib-index/mail-index-reset.c
src/lib-index/mail-index.c

index 95d2869a20c09744ab8acb21964d77c6bb6bf97e..04f6c3400fb9da1bc3b332edf56bfb00f66a89a1 100644 (file)
@@ -130,6 +130,6 @@ int mail_index_fsck(struct mail_index *index)
                                     index->filepath, error);
        }
        if (ret == 0)
-               mail_index_reset(index);
+               mail_index_mark_corrupted(index);
        return ret;
 }
index 5a1c1bcd234b818b795c9e8296e033ecaba8864c..e9f5283b2834afa157727b7c05c87958c2a61f70 100644 (file)
@@ -106,7 +106,7 @@ static int mail_index_has_changed(struct mail_index *index)
                        return -1;
 
                /* lost it? recreate */
-               (void)mail_index_reset(index);
+               (void)mail_index_mark_corrupted(index);
                return -1;
        }
 
index fcc9d8a6673e14446313f37482ce462d1cc9f119..4f79678051007115704370f841f03f1769dbd54d 100644 (file)
@@ -128,6 +128,7 @@ int mail_index_sync_get_rec(struct mail_index_view *view,
                            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 ec608fcd2db9c2d992bc6786a818af1bb24a619a..626902af0240a342de9ad16a8736b60af88eaae3 100644 (file)
@@ -36,6 +36,7 @@ static int mail_index_mark_corrupted(struct mail_index *index)
 
 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 @@ int mail_index_reset(struct mail_index *index)
        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 672c7f04b8a661d72194737e6e267c33e7434137..26660799180eba94e9ffe004213f52fe15484d83 100644 (file)
@@ -655,6 +655,34 @@ void mail_index_set_inconsistent(struct mail_index *index)
        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)
 {