sdbox-storage.c revision b18b7c9b35a2f66a63c364c11ce4045bec6b8de9
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2007-2011 Dovecot authors, see the included COPYING file */
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen#include "lib.h"
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen#include "master-service.h"
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen#include "mail-index-modseq.h"
5601c23c0d59376dfda22c7eb807c9e1a0870426Timo Sirainen#include "mail-search-build.h"
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen#include "mailbox-list-private.h"
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen#include "dbox-mail.h"
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen#include "dbox-save.h"
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen#include "sdbox-file.h"
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen#include "sdbox-sync.h"
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen#include "sdbox-storage.h"
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainenextern struct mail_storage dbox_storage, sdbox_storage;
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainenextern struct mailbox sdbox_mailbox;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainenextern struct dbox_storage_vfuncs sdbox_dbox_storage_vfuncs;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainenstatic struct mail_storage *sdbox_storage_alloc(void)
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_storage *storage;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen pool_t pool;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen pool = pool_alloconly_create("sdbox storage", 512+256);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen storage = p_new(pool, struct sdbox_storage, 1);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen storage->storage.v = sdbox_dbox_storage_vfuncs;
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen storage->storage.storage = sdbox_storage;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen storage->storage.storage.pool = pool;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return &storage->storage.storage;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic const char *
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainensdbox_storage_find_root_dir(const struct mail_namespace *ns)
12055678401e913f4be130fa41b22fbeb626cc7eTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen bool debug = ns->mail_set->mail_debug;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen const char *home, *path;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen if (mail_user_get_home(ns->owner, &home) > 0) {
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen path = t_strconcat(home, "/sdbox", NULL);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (access(path, R_OK|W_OK|X_OK) == 0) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (debug)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen i_debug("sdbox: root exists (%s)", path);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return path;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (debug)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen i_debug("sdbox: access(%s, rwx): failed: %m", path);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return NULL;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainenstatic bool sdbox_storage_autodetect(const struct mail_namespace *ns,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct mailbox_list_settings *set)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen bool debug = ns->mail_set->mail_debug;
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen struct stat st;
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen const char *path, *root_dir;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (set->root_dir != NULL)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen root_dir = set->root_dir;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen else {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen root_dir = sdbox_storage_find_root_dir(ns);
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen if (root_dir == NULL) {
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen if (debug)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen i_debug("sdbox: couldn't find root dir");
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return FALSE;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen /* NOTE: this check works for mdbox as well. we'll rely on the
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen autodetect ordering to catch mdbox before we get here. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen path = t_strconcat(root_dir, "/"DBOX_MAILBOX_DIR_NAME, NULL);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (stat(path, &st) < 0) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (debug)
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen i_debug("sdbox autodetect: stat(%s) failed: %m", path);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return FALSE;
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (!S_ISDIR(st.st_mode)) {
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen if (debug)
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen i_debug("sdbox autodetect: %s not a directory", path);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return FALSE;
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen }
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen set->root_dir = root_dir;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_storage_get_list_settings(ns, set);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return TRUE;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic struct mailbox *
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainensdbox_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen const char *vname, enum mailbox_flags flags)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_mailbox *mbox;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct index_mailbox_context *ibox;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen pool_t pool;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* dbox can't work without index files */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen flags &= ~MAILBOX_FLAG_NO_INDEX_FILES;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen pool = pool_alloconly_create("sdbox mailbox", 1024*3);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mbox = p_new(pool, struct sdbox_mailbox, 1);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mbox->box = sdbox_mailbox;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mbox->box.pool = pool;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen mbox->box.storage = storage;
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen mbox->box.list = list;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen mbox->box.mail_vfuncs = &sdbox_mail_vfuncs;
ebfbf5d78dcf95e8b176429f4b5b0694eb4e17d5Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_mailbox_alloc(&mbox->box, vname,
ac383c437b1ccb9420cae6b4c4b03af3c8019e02Timo Sirainen flags, DBOX_INDEX_PREFIX);
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen ibox = INDEX_STORAGE_CONTEXT(&mbox->box);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen ibox->index_flags |= MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS |
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY;
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen mbox->storage = (struct sdbox_storage *)storage;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return &mbox->box;
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen}
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint sdbox_read_header(struct sdbox_mailbox *mbox,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct sdbox_index_header *hdr, bool log_error)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen struct mail_index_view *view;
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen const void *data;
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen size_t data_size;
ac383c437b1ccb9420cae6b4c4b03af3c8019e02Timo Sirainen int ret;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
ac383c437b1ccb9420cae6b4c4b03af3c8019e02Timo Sirainen view = mail_index_view_open(mbox->box.index);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen mail_index_get_header_ext(view, mbox->hdr_ext_id,
ac383c437b1ccb9420cae6b4c4b03af3c8019e02Timo Sirainen &data, &data_size);
ebfbf5d78dcf95e8b176429f4b5b0694eb4e17d5Timo Sirainen if (data_size < SDBOX_INDEX_HEADER_MIN_SIZE &&
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen (!mbox->box.creating || data_size != 0)) {
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen if (log_error) {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen mail_storage_set_critical(
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen &mbox->storage->storage.storage,
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen "sdbox %s: Invalid dbox header size",
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen mailbox_get_path(&mbox->box));
4ae81f8f7aad06aad2f570535cad6e40aaec2b28Timo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen ret = -1;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen } else {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen memset(hdr, 0, sizeof(*hdr));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen memcpy(hdr, data, I_MIN(data_size, sizeof(*hdr)));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen ret = 0;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen }
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen mail_index_view_close(&view);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return ret;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainenvoid sdbox_update_header(struct sdbox_mailbox *mbox,
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen struct mail_index_transaction *trans,
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen const struct mailbox_update *update)
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_index_header hdr, new_hdr;
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen if (sdbox_read_header(mbox, &hdr, TRUE) < 0)
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen memset(&hdr, 0, sizeof(hdr));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen new_hdr = hdr;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (update != NULL && !guid_128_is_empty(update->mailbox_guid)) {
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen memcpy(new_hdr.mailbox_guid, update->mailbox_guid,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sizeof(new_hdr.mailbox_guid));
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen } else if (guid_128_is_empty(new_hdr.mailbox_guid)) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen guid_128_generate(new_hdr.mailbox_guid);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen if (memcmp(&hdr, &new_hdr, sizeof(hdr)) != 0) {
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen mail_index_update_header_ext(trans, mbox->hdr_ext_id, 0,
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen &new_hdr, sizeof(new_hdr));
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen }
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen memcpy(mbox->mailbox_guid, new_hdr.mailbox_guid,
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen sizeof(mbox->mailbox_guid));
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen}
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainen
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainenstatic int sdbox_mailbox_create_indexes(struct mailbox *box,
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen const struct mailbox_update *update,
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen struct mail_index_transaction *trans)
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen{
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen struct mail_index_transaction *new_trans = NULL;
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen const struct mail_index_header *hdr;
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen uint32_t uid_validity, uid_next;
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen
fcde781c3ceb470c8dff34a68df19c69f93bcec9Timo Sirainen if (trans == NULL) {
fcde781c3ceb470c8dff34a68df19c69f93bcec9Timo Sirainen new_trans = mail_index_transaction_begin(box->view, 0);
fcde781c3ceb470c8dff34a68df19c69f93bcec9Timo Sirainen trans = new_trans;
fcde781c3ceb470c8dff34a68df19c69f93bcec9Timo Sirainen }
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainen
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen hdr = mail_index_get_header(box->view);
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen if (update != NULL && update->uid_validity != 0)
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen uid_validity = update->uid_validity;
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen else if (hdr->uid_validity != 0)
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen uid_validity = hdr->uid_validity;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen else {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* set uidvalidity */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen uid_validity = dbox_get_uidvalidity_next(box->list);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (hdr->uid_validity != uid_validity) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (hdr->uid_validity != 0) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* UIDVALIDITY change requires index to be reset */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_index_reset(trans);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_index_update_header(trans,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen offsetof(struct mail_index_header, uid_validity),
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen &uid_validity, sizeof(uid_validity), TRUE);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (update != NULL && hdr->next_uid < update->min_next_uid) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen uid_next = update->min_next_uid;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_index_update_header(trans,
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen offsetof(struct mail_index_header, next_uid),
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen &uid_next, sizeof(uid_next), TRUE);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen if (update != NULL && update->min_first_recent_uid != 0 &&
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen hdr->first_recent_uid < update->min_first_recent_uid) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen uint32_t first_recent_uid = update->min_first_recent_uid;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_index_update_header(trans,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen offsetof(struct mail_index_header, first_recent_uid),
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen &first_recent_uid, sizeof(first_recent_uid), FALSE);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen if (update != NULL && update->min_highest_modseq != 0 &&
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen mail_index_modseq_get_highest(box->view) <
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen update->min_highest_modseq) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_index_modseq_enable(box->index);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_index_update_highest_modseq(trans,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen update->min_highest_modseq);
fcde781c3ceb470c8dff34a68df19c69f93bcec9Timo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_update_header(mbox, trans, update);
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen if (new_trans != NULL) {
1caf757864e7734345660e7d190f84e42668a6f8Timo Sirainen if (mail_index_transaction_commit(&new_trans) < 0) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_storage_set_index_error(box);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return -1;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return 0;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic const char *
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainensdbox_get_attachment_path_suffix(struct dbox_file *_file)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_file *file = (struct sdbox_file *)_file;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return t_strdup_printf("-%s-%u",
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen guid_128_to_string(file->mbox->mailbox_guid),
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen file->uid);
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen}
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainenvoid sdbox_set_mailbox_corrupted(struct mailbox *box)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen struct sdbox_index_header hdr;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (sdbox_read_header(mbox, &hdr, TRUE) < 0 || hdr.rebuild_count == 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mbox->corrupted_rebuild_count = 1;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen else
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mbox->corrupted_rebuild_count = hdr.rebuild_count;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void sdbox_set_file_corrupted(struct dbox_file *_file)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen struct sdbox_file *file = (struct sdbox_file *)_file;
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen sdbox_set_mailbox_corrupted(&file->mbox->box);
37cd04fc1d01c4a7140ffcb514e15cee1e97986aTimo Sirainen}
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainenstatic int sdbox_mailbox_open(struct mailbox *box)
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_index_header hdr;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen if (dbox_mailbox_open(box) < 0)
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen return -1;
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen mbox->hdr_ext_id =
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_index_ext_register(box->index, "dbox-hdr",
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sizeof(struct sdbox_index_header), 0, 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (box->creating) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* wait for mailbox creation to initialize the index */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return 0;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (box->creating) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* wait for mailbox creation to initialize the index */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return 0;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* get/generate mailbox guid */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (sdbox_read_header(mbox, &hdr, FALSE) < 0) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* it's possible that this mailbox is just now being created
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen by another process. lock it first and see if the header is
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen available then. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct mail_index_sync_ctx *sync_ctx;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct mail_index_view *view;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct mail_index_transaction *trans;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (mail_index_sync_begin(box->index, &sync_ctx,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen &view, &trans, 0) > 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)mail_index_sync_commit(&sync_ctx);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (sdbox_read_header(mbox, &hdr, TRUE) < 0) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* looks like the mailbox is corrupted */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)sdbox_sync(mbox, SDBOX_SYNC_FLAG_FORCE);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (sdbox_read_header(mbox, &hdr, TRUE) < 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen memset(&hdr, 0, sizeof(hdr));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (guid_128_is_empty(hdr.mailbox_guid)) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* regenerate it */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (sdbox_mailbox_create_indexes(box, NULL, NULL) < 0 ||
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_read_header(mbox, &hdr, TRUE) < 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return -1;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen memcpy(mbox->mailbox_guid, hdr.mailbox_guid,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sizeof(mbox->mailbox_guid));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return 0;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic void sdbox_mailbox_close(struct mailbox *box)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (mbox->corrupted_rebuild_count != 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)sdbox_sync(mbox, 0);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_mailbox_close(box);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic int
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainensdbox_mailbox_get_metadata(struct mailbox *box,
de11cf486e0d0448537b1b5d546496ab85e7cda8Timo Sirainen enum mailbox_metadata_items items,
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen struct mailbox_metadata *metadata_r)
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen{
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (index_mailbox_get_metadata(box, items, metadata_r) < 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return -1;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if ((items & MAILBOX_METADATA_GUID) != 0) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen memcpy(metadata_r->guid, mbox->mailbox_guid,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sizeof(metadata_r->guid));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return 0;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstatic int
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainendbox_mailbox_update(struct mailbox *box, const struct mailbox_update *update)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen{
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (!box->opened) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (mailbox_open(box) < 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return -1;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (update->cache_updates != NULL)
5601c23c0d59376dfda22c7eb807c9e1a0870426Timo Sirainen index_storage_mailbox_update_cache(box, update);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return sdbox_mailbox_create_indexes(box, update, NULL);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstruct mail_storage sdbox_storage = {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen .name = SDBOX_STORAGE_NAME,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen .class_flags = 0,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen .v = {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen NULL,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_storage_alloc,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_storage_create,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_storage_destroy,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen NULL,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_storage_get_list_settings,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_storage_autodetect,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_mailbox_alloc,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen NULL
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen};
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstruct mail_storage dbox_storage = {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen .name = "dbox", /* alias */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen .class_flags = MAIL_STORAGE_CLASS_FLAG_FILE_PER_MSG,
5601c23c0d59376dfda22c7eb807c9e1a0870426Timo Sirainen
d9076f5939edf5d20a261494b1a861dcbb0d32e2Timo Sirainen .v = {
d9076f5939edf5d20a261494b1a861dcbb0d32e2Timo Sirainen NULL,
5601c23c0d59376dfda22c7eb807c9e1a0870426Timo Sirainen sdbox_storage_alloc,
5601c23c0d59376dfda22c7eb807c9e1a0870426Timo Sirainen dbox_storage_create,
5601c23c0d59376dfda22c7eb807c9e1a0870426Timo Sirainen dbox_storage_destroy,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen NULL,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_storage_get_list_settings,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_storage_autodetect,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_mailbox_alloc,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen NULL
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen }
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen};
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstruct mailbox sdbox_mailbox = {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen .v = {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_is_readonly,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_mailbox_enable,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_mailbox_exists,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_mailbox_open,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_mailbox_close,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_mailbox_free,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_mailbox_create,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_mailbox_update,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_mailbox_delete,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_mailbox_rename,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_get_status,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_mailbox_get_metadata,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_set_subscribed,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_list_index_has_changed,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_list_index_update_sync,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_storage_sync_init,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_mailbox_sync_next,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_mailbox_sync_deinit,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen NULL,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_notify_changes,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_transaction_begin,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_transaction_commit,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_transaction_rollback,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen NULL,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_mail_alloc,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_search_init,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_search_deinit,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_search_next_nonblock,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen index_storage_search_next_update_seq,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_save_alloc,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_save_begin,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_save_continue,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_save_finish,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_save_cancel,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_copy,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_transaction_save_commit_pre,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_transaction_save_commit_post,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_transaction_save_rollback,
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen index_storage_is_inconsistent
e62f6437a4ff01d692a5a61369fe4168d69191edTimo Sirainen }
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen};
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstruct dbox_storage_vfuncs sdbox_dbox_storage_vfuncs = {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_file_free,
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen sdbox_file_create_fd,
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen sdbox_mail_open,
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen sdbox_mailbox_create_indexes,
0007969c084c671b9f9378706083fad47799c84eTimo Sirainen sdbox_get_attachment_path_suffix,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen sdbox_set_mailbox_corrupted,
74ab5ea66c0c4b388f1c774ae6a47ab94f1b4f18Timo Sirainen sdbox_set_file_corrupted
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen};
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen