index->mmap_full_length = INDEX_FILE_MIN_SIZE;
index->mmap_base = mmap_anon(index->mmap_full_length);
- if (index->mmap_base == MAP_FAILED)
+ if (index->mmap_base == MAP_FAILED) {
+ index->mmap_base = NULL;
return index_set_error(index, "mmap_anon() failed: %m");
+ }
mail_index_init_header(index, index->mmap_base);
index->header = index->mmap_base;
if ((ret = mail_index_read_header(index, &hdr)) < 0)
return FALSE;
- if (ret == 0 || !mail_index_is_compatible(&hdr)) {
+ if (ret == 0 || !mail_index_is_compatible(&hdr) ||
+ (hdr.flags & MAIL_INDEX_FLAG_REBUILD) != 0) {
if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0)
return FALSE;
void mail_index_close(struct mail_index *index)
{
- index->set_flags = 0;
+ if (index->set_flags != 0) {
+ if (index->header != NULL) {
+#ifdef DEBUG
+ mprotect(index->mmap_base, index->mmap_used_length,
+ PROT_READ|PROT_WRITE);
+#endif
+ index->header->flags |= index->set_flags;
+ (void)msync(index->mmap_base,
+ sizeof(struct mail_index_header), MS_SYNC);
+ }
+ index->set_flags = 0;
+ }
+
index->set_cache_fields = 0;
index->opened = FALSE;
index->custom_flags = NULL;
}
- if (index->control_dir != NULL) {
- i_free(index->control_dir);
- index->control_dir = NULL;
- }
-
if (index->error != NULL) {
i_free(index->error);
index->error = NULL;
mail_index_close(index);
i_free(index->dir);
i_free(index->mailbox_path);
+ i_free(index->control_dir);
i_free(index);
}