raw-storage.c revision 61b0637759146621cbb7edcbd0b03a71cfd66dfe
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "lib.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "ioloop.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "istream.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "index-mail.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "mail-copy.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "raw-sync.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "raw-storage.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenextern struct mail_storage raw_storage;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenextern struct mailbox raw_mailbox;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstatic struct mail_storage *raw_storage_alloc(void)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct raw_storage *storage;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen pool_t pool;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen pool = pool_alloconly_create("raw storage", 512+256);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen storage = p_new(pool, struct raw_storage, 1);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen storage->storage = raw_storage;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen storage->storage.pool = pool;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return &storage->storage;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstatic void
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenraw_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mailbox_list_settings *set)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen{
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen if (set->layout == NULL)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen set->layout = MAILBOX_LIST_NAME_FS;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen if (set->subscription_fname == NULL)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen set->subscription_fname = RAW_SUBSCRIPTION_FILE_NAME;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen}
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstatic struct mailbox *
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenraw_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen const char *name, struct istream *input,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen enum mailbox_flags flags)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct raw_mailbox *mbox;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen pool_t pool;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen flags |= MAILBOX_FLAG_READONLY | MAILBOX_FLAG_NO_INDEX_FILES;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen pool = pool_alloconly_create("raw mailbox", 1024+512);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mbox = p_new(pool, struct raw_mailbox, 1);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mbox->box = raw_mailbox;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mbox->box.pool = pool;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mbox->box.storage = storage;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mbox->box.list = list;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mbox->box.mail_vfuncs = &raw_mail_vfuncs;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen index_storage_mailbox_alloc(&mbox->box, name, input, flags, NULL);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen mbox->storage = (struct raw_storage *)storage;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen if (input != NULL)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mbox->mtime = mbox->ctime = ioloop_time;
80cc932b7d4fd914ed6ccb68e988e9002118d5deTimo Sirainen else {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mbox->mtime = mbox->ctime = (time_t)-1;
80cc932b7d4fd914ed6ccb68e988e9002118d5deTimo Sirainen mbox->have_filename = TRUE;
80cc932b7d4fd914ed6ccb68e988e9002118d5deTimo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mbox->size = (uoff_t)-1;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen return &mbox->box;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenstatic int raw_mailbox_open(struct mailbox *box)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen int fd;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen if (box->input != NULL)
d22301419109ed4a38351715e6760011421dadecTimo Sirainen return index_storage_mailbox_open(box, FALSE);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen fd = open(box->path, O_RDONLY);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen if (fd == -1) {
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen if (ENOTFOUND(errno)) {
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen mail_storage_set_error(box->storage,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen MAIL_ERROR_NOTFOUND,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name));
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen } else if (!mail_storage_set_error_from_errno(box->storage)) {
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen mail_storage_set_critical(box->storage,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen "open(%s) failed: %m", box->path);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen }
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen return -1;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen }
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen box->input = i_stream_create_fd(fd, MAIL_READ_FULL_BLOCK_SIZE, TRUE);
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen i_stream_set_init_buffer_size(box->input, MAIL_READ_FULL_BLOCK_SIZE);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen return index_storage_mailbox_open(box, FALSE);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstatic int
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainenraw_mailbox_create(struct mailbox *box,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen const struct mailbox_update *update ATTR_UNUSED,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen bool directory ATTR_UNUSED)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen "Raw mailbox creation isn't supported");
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return -1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainenstatic int
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainenraw_mailbox_update(struct mailbox *box,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen const struct mailbox_update *update ATTR_UNUSED)
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen{
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen "Raw mailbox update isn't supported");
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen return -1;
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen}
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstatic void raw_notify_changes(struct mailbox *box ATTR_UNUSED)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstatic int raw_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen const char *dir, const char *fname,
7230352f1177a8ed2b924c6992e751fd2ab9bc27Timo Sirainen const char *mailbox_name ATTR_UNUSED,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen enum mailbox_list_file_type type,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen enum mailbox_info_flags *flags_r)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen const char *path;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct stat st;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen /* try to avoid stat() with these checks */
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (type == MAILBOX_LIST_FILE_TYPE_DIR) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *flags_r = MAILBOX_NOSELECT | MAILBOX_CHILDREN;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return 1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (type != MAILBOX_LIST_FILE_TYPE_SYMLINK &&
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen type != MAILBOX_LIST_FILE_TYPE_UNKNOWN &&
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen (ctx->flags & MAILBOX_LIST_ITER_RETURN_NO_FLAGS) != 0) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *flags_r = MAILBOX_NOINFERIORS;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return 1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen /* need to stat() then */
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen path = t_strconcat(dir, "/", fname, NULL);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (stat(path, &st) == 0) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (S_ISDIR(st.st_mode))
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *flags_r = MAILBOX_NOSELECT | MAILBOX_CHILDREN;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen else
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *flags_r = MAILBOX_NOINFERIORS;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen return 1;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen } else if (errno == EACCES || errno == ELOOP) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *flags_r = MAILBOX_NOSELECT;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen return 1;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen } else if (ENOTFOUND(errno)) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *flags_r = MAILBOX_NONEXISTENT;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen return 0;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen } else {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen mailbox_list_set_critical(ctx->list, "stat(%s) failed: %m",
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen path);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen return -1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenstatic void raw_storage_add_list(struct mail_storage *storage ATTR_UNUSED,
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct mailbox_list *list)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen{
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen list->v.iter_is_mailbox = raw_list_iter_is_mailbox;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen}
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstruct mail_storage raw_storage = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .name = RAW_STORAGE_NAME,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .class_flags = MAIL_STORAGE_CLASS_FLAG_MAILBOX_IS_FILE,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .v = {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen NULL,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen raw_storage_alloc,
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen NULL,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen NULL,
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen raw_storage_add_list,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen raw_storage_get_list_settings,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen NULL,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen raw_mailbox_alloc,
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainen NULL
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen};
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstruct mailbox raw_mailbox = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen .v = {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_storage_is_readonly,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_storage_allow_new_keywords,
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen index_storage_mailbox_enable,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen raw_mailbox_open,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen index_storage_mailbox_close,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen raw_mailbox_create,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen raw_mailbox_update,
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen index_storage_mailbox_delete,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_storage_get_status,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen NULL,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen NULL,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen raw_storage_sync_init,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mailbox_sync_next,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mailbox_sync_deinit,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen NULL,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen raw_notify_changes,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_transaction_begin,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_transaction_commit,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_transaction_rollback,
48270badadd82279bfe50ae3d187aea8b0b2b30eTimo Sirainen index_transaction_set_max_modseq,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_keywords_create,
14ab4610b6038da6c5d0814fecabc6b74bc81a6bTimo Sirainen index_keywords_create_from_indexes,
84ed9f8f3d0e5ed47607ef417618e49e4f865557Timo Sirainen index_keywords_ref,
84ed9f8f3d0e5ed47607ef417618e49e4f865557Timo Sirainen index_keywords_unref,
e3796bfd2bc0fd5ba664893d346df9334a5b3af0Timo Sirainen index_keyword_is_valid,
5afa8e2edf4f313cd56e5909f92f39c3b5b7b4d3Timo Sirainen index_storage_get_seq_range,
408e5be344c9131fdebe771718a5bf49f88cc51cTimo Sirainen index_storage_get_uid_range,
370b60cfccff7c50586fc30f4f591499a55301a8Timo Sirainen index_storage_get_expunges,
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen NULL,
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen NULL,
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen NULL,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_alloc,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_header_lookup_init,
de58be41126e5d68008d2ea706d62ccdc1f29337Timo Sirainen index_header_lookup_deinit,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_storage_search_init,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_storage_search_deinit,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_storage_search_next_nonblock,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_storage_search_next_update_seq,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen NULL,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen NULL,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen NULL,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen NULL,
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen NULL,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mail_storage_copy,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_storage_is_inconsistent
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen};