struct mdbox_map * mdbox_map_init(struct mdbox_storage *storage, struct mailbox_list *root_list) { struct mdbox_map *map; const char *root, *index_root; root = mailbox_list_get_root_forced(root_list, MAILBOX_LIST_PATH_TYPE_DIR); index_root = mailbox_list_get_root_forced(root_list, MAILBOX_LIST_PATH_TYPE_INDEX); map = i_new(struct mdbox_map, 1); map->storage = storage; map->set = storage->set; map->path = i_strconcat(root, "/"MDBOX_GLOBAL_DIR_NAME, NULL); map->index_path = i_strconcat(index_root, "/"MDBOX_GLOBAL_DIR_NAME, NULL); map->index = mail_index_alloc(map->index_path, MDBOX_GLOBAL_INDEX_PREFIX); mail_index_set_fsync_mode(map->index, MAP_STORAGE(map)->set->parsed_fsync_mode, 0); mail_index_set_lock_method(map->index, MAP_STORAGE(map)->set->parsed_lock_method, mail_storage_get_lock_timeout(MAP_STORAGE(map), UINT_MAX)); map->root_list = root_list; map->map_ext_id = mail_index_ext_register(map->index, "map", sizeof(struct mdbox_map_mail_index_header), sizeof(struct mdbox_map_mail_index_record), sizeof(uint32_t)); map->ref_ext_id = mail_index_ext_register(map->index, "ref", 0, sizeof(uint16_t), sizeof(uint16_t)); return map; }
int index_storage_mailbox_alloc_index(struct mailbox *box) { if (box->index != NULL) return 0; if (mailbox_create_missing_dir(box, MAILBOX_LIST_PATH_TYPE_INDEX) < 0) return -1; if (index_mailbox_alloc_index(box, &box->index) < 0) return -1; mail_index_set_fsync_mode(box->index, box->storage->set->parsed_fsync_mode, 0); mail_index_set_lock_method(box->index, box->storage->set->parsed_lock_method, mail_storage_get_lock_timeout(box->storage, UINT_MAX)); return 0; }
static int mailbox_list_index_index_open(struct mailbox_list *list) { struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); const struct mail_storage_settings *set = list->mail_set; struct mailbox_permissions perm; enum mail_index_open_flags index_flags; unsigned int lock_timeout; if (ilist->opened) return 0; if (mailbox_list_mkdir_missing_index_root(list) < 0) return -1; index_flags = mail_storage_settings_to_index_flags(set); if (strcmp(list->name, MAILBOX_LIST_NAME_INDEX) == 0) { /* LAYOUT=index. this is the only location for the mailbox data, so we must never move it into memory. */ index_flags |= MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY; } lock_timeout = set->mail_max_lock_timeout == 0 ? UINT_MAX : set->mail_max_lock_timeout; mailbox_list_get_root_permissions(list, &perm); mail_index_set_permissions(ilist->index, perm.file_create_mode, perm.file_create_gid, perm.file_create_gid_origin); mail_index_set_lock_method(ilist->index, set->parsed_lock_method, lock_timeout); if (mail_index_open_or_create(ilist->index, index_flags) < 0) { if (mail_index_move_to_memory(ilist->index) < 0) { /* try opening once more. it should be created directly into memory now, except if it fails with LAYOUT=index backend. */ if (mail_index_open_or_create(ilist->index, index_flags) < 0) { mailbox_list_set_internal_error(list); return -1; } } } ilist->opened = TRUE; return 0; }