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; }
static int mbox_mailbox_open_finish(struct mbox_mailbox *mbox, bool move_to_memory) { if (index_storage_mailbox_open(&mbox->box, move_to_memory) < 0) return -1; mbox->mbox_ext_idx = mail_index_ext_register(mbox->box.index, "mbox", sizeof(mbox->mbox_hdr), sizeof(uint64_t), sizeof(uint64_t)); mbox->md5hdr_ext_idx = mail_index_ext_register(mbox->box.index, "header-md5", 0, 16, 1); return 0; }
struct mail_index *mail_index_alloc(const char *dir, const char *prefix) { struct mail_index *index; index = i_new(struct mail_index, 1); index->dir = i_strdup(dir); index->prefix = i_strdup(prefix); index->fd = -1; index->extension_pool = pool_alloconly_create(MEMPOOL_GROWING"index extension", 1024); p_array_init(&index->extensions, index->extension_pool, 5); i_array_init(&index->sync_lost_handlers, 4); i_array_init(&index->module_contexts, I_MIN(5, mail_index_module_register.id)); index->mode = 0600; index->gid = (gid_t)-1; index->lock_method = FILE_LOCK_METHOD_FCNTL; index->max_lock_timeout_secs = UINT_MAX; index->keywords_ext_id = mail_index_ext_register(index, MAIL_INDEX_EXT_KEYWORDS, 128, 2, 1); index->keywords_pool = pool_alloconly_create("keywords", 512); i_array_init(&index->keywords, 16); hash_table_create(&index->keywords_hash, index->keywords_pool, 0, strcase_hash, strcasecmp); index->log = mail_transaction_log_alloc(index); mail_index_modseq_init(index); return index; }
int mdbox_mailbox_open(struct mailbox *box) { struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box; if (dbox_mailbox_open(box) < 0) return -1; mbox->ext_id = mail_index_ext_register(mbox->box.index, "mdbox", 0, sizeof(struct mdbox_mail_index_record), sizeof(uint32_t)); mbox->hdr_ext_id = mail_index_ext_register(mbox->box.index, "mdbox-hdr", sizeof(struct mdbox_index_header), 0, 0); mbox->guid_ext_id = mail_index_ext_register(mbox->box.index, "guid", 0, GUID_128_SIZE, 1); return 0; }
static unsigned int mbox_list_get_ext_id(struct mbox_mailbox *mbox, struct mail_index_view *view) { if (mbox->mbox_list_index_ext_id == (uint32_t)-1) { mbox->mbox_list_index_ext_id = mail_index_ext_register(mail_index_view_get_index(view), "mbox", 0, sizeof(struct mbox_list_index_record), sizeof(uint32_t)); } return mbox->mbox_list_index_ext_id; }
static struct mailbox * mbox_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list, const char *name, enum mailbox_flags flags) { struct mbox_mailbox *mbox; struct index_mailbox_context *ibox; pool_t pool; pool = pool_alloconly_create("mbox mailbox", 1024*3); mbox = p_new(pool, struct mbox_mailbox, 1); mbox->box = mbox_mailbox; mbox->box.pool = pool; mbox->box.storage = storage; mbox->box.list = list; mbox->box.mail_vfuncs = &mbox_mail_vfuncs; index_storage_mailbox_alloc(&mbox->box, name, flags, MBOX_INDEX_PREFIX); ibox = INDEX_STORAGE_CONTEXT(&mbox->box); ibox->save_commit_pre = mbox_transaction_save_commit_pre; ibox->save_commit_post = mbox_transaction_save_commit_post; ibox->save_rollback = mbox_transaction_save_rollback; mbox->storage = (struct mbox_storage *)storage; mbox->mbox_fd = -1; mbox->mbox_lock_type = F_UNLCK; mbox->mbox_ext_idx = mail_index_ext_register(mbox->box.index, "mbox", sizeof(mbox->mbox_hdr), sizeof(uint64_t), sizeof(uint64_t)); mbox->md5hdr_ext_idx = mail_index_ext_register(mbox->box.index, "header-md5", 0, 16, 1); if ((storage->flags & MAIL_STORAGE_FLAG_KEEP_HEADER_MD5) != 0) mbox->mbox_save_md5 = TRUE; return &mbox->box; }
int index_storage_mailbox_open(struct mailbox *box, bool move_to_memory) { struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box); enum mail_index_open_flags index_flags; int ret; i_assert(!box->opened); index_flags = ibox->index_flags; if (move_to_memory) ibox->index_flags &= ~MAIL_INDEX_OPEN_FLAG_CREATE; if (index_storage_mailbox_alloc_index(box) < 0) return -1; /* make sure mail_index_set_permissions() has been called */ (void)mailbox_get_permissions(box); ret = mail_index_open(box->index, index_flags); if (ret <= 0 || move_to_memory) { if ((index_flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) != 0) { i_assert(ret <= 0); mailbox_set_index_error(box); return -1; } if (mail_index_move_to_memory(box->index) < 0) { /* try opening once more. it should be created directly into memory now. */ if (mail_index_open_or_create(box->index, index_flags) < 0) i_panic("in-memory index creation failed"); } } if ((index_flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) != 0) { if (mail_index_is_in_memory(box->index)) { mail_storage_set_critical(box->storage, "Couldn't create index file"); mail_index_close(box->index); return -1; } } if ((box->flags & MAILBOX_FLAG_OPEN_DELETED) == 0) { if (mail_index_is_deleted(box->index)) { mailbox_set_deleted(box); mail_index_close(box->index); return -1; } } box->cache = mail_index_get_cache(box->index); index_cache_register_defaults(box); box->view = mail_index_view_open(box->index); ibox->keyword_names = mail_index_get_keywords(box->index); ibox->vsize_hdr_ext_id = mail_index_ext_register(box->index, "hdr-vsize", sizeof(struct index_vsize_header), 0, sizeof(uint64_t)); box->opened = TRUE; if ((box->enabled_features & MAILBOX_FEATURE_CONDSTORE) != 0) mail_index_modseq_enable(box->index); index_thread_mailbox_opened(box); hook_mailbox_opened(box); return 0; }