index->filepath, error);
}
if (ret == 0)
- mail_index_reset(index);
+ mail_index_mark_corrupted(index);
return ret;
}
return -1;
/* lost it? recreate */
- (void)mail_index_reset(index);
+ (void)mail_index_mark_corrupted(index);
return -1;
}
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);
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;
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->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)
{