virtual-storage.c revision 4ba9a1d3facc515b3feb5238a16bcf91f76fac61
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen/* Copyright (c) 2008-2010 Dovecot authors, see the included COPYING file */
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen MODULE_CONTEXT(obj, virtual_mailbox_list_module)
713a54f695b8ad63826d22ebbe52f55c347e8c88Timo Sirainenstruct virtual_storage_module virtual_storage_module =
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen MODULE_CONTEXT_INIT(&mail_storage_module_register);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(virtual_mailbox_list_module,
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic bool ns_is_visible(struct mail_namespace *ns)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen return (ns->flags & NAMESPACE_FLAG_LIST_PREFIX) != 0 ||
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen (ns->flags & NAMESPACE_FLAG_LIST_CHILDREN) != 0 ||
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic const char *get_user_visible_mailbox_name(struct mailbox *box)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenvoid virtual_box_copy_error(struct mailbox *dest, struct mailbox *src)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen str = mail_storage_get_last_error(src->storage, &error);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen str = t_strdup_printf("%s (for backend mailbox %s)", str, name);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen mail_storage_set_error(dest->storage, error, str);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic struct mail_storage *virtual_storage_alloc(void)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen pool = pool_alloconly_create("virtual storage", 1024);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen storage = p_new(pool, struct virtual_storage, 1);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenvirtual_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen set->subscription_fname = VIRTUAL_SUBSCRIPTION_FILE_NAME;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenvirtual_backend_box_lookup_name(struct virtual_mailbox *mbox, const char *name)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen unsigned int i, count;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen bboxes = array_get(&mbox->backend_boxes, &count);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen for (i = 0; i < count; i++) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenvirtual_backend_box_lookup(struct virtual_mailbox *mbox, uint32_t mailbox_id)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen unsigned int i, count;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen bboxes = array_get(&mbox->backend_boxes, &count);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen for (i = 0; i < count; i++) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic bool virtual_mailbox_is_in_open_stack(struct virtual_storage *storage,
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen const char *const *names;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen unsigned int i, count;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen names = array_get(&storage->open_stack, &count);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen for (i = 0; i < count; i++) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic int virtual_backend_box_open_failed(struct virtual_mailbox *mbox,
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen str = mail_storage_get_last_error(mailbox_get_storage(bbox->box),
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen name = t_strdup(get_user_visible_mailbox_name(bbox->box));
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen /* ignore this. it could be intentional. */
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen if (mbox->storage->storage.user->mail_debug) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen "Skipping non-existing mailbox %s",
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen if (error == MAIL_ERROR_PERM && bbox->wildcard) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen /* this mailbox wasn't explicitly specified. just skip it. */
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen "Virtual mailbox open failed because of mailbox %s: %s",
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen mail_storage_set_error(mbox->box.storage, error, str);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic int virtual_backend_box_open(struct virtual_mailbox *mbox,
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen struct mail_user *user = mbox->storage->storage.user;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen ns = mail_namespace_find(user->namespaces, &mailbox);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen bbox->box = mailbox_alloc(ns->list, mailbox, flags);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen return virtual_backend_box_open_failed(mbox, bbox);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen i_array_init(&bbox->sync_pending_removes, 64);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen mail_search_args_init(bbox->search_args, bbox->box, FALSE, NULL);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic int virtual_mailboxes_open(struct virtual_mailbox *mbox,
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen unsigned int i, count;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen bboxes = array_get(&mbox->backend_boxes, &count);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen for (i = 0; i < count; ) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen ret = virtual_backend_box_open(mbox, bboxes[i], flags);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen mail_search_args_unref(&bboxes[i]->search_args);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen bboxes = array_get(&mbox->backend_boxes, &count);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen for (; i > 0; i--) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic struct mailbox *
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenvirtual_mailbox_alloc(struct mail_storage *_storage, struct mailbox_list *list,
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen struct virtual_storage *storage = (struct virtual_storage *)_storage;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen pool = pool_alloconly_create("virtual mailbox", 1024+512);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen mbox = p_new(pool, struct virtual_mailbox, 1);
sizeof(struct virtual_mail_index_record),
sizeof(uint32_t));
unsigned int i, count;
for (i = 0; i < count; i++) {
int ret = 0;
if (ret == 0) {
if (ret < 0) {
unsigned int i, count;
for (i = 0; i < count; i++) {
const char *virtual_path;
int ret;
return ret;
NULL);
return ret;
return FALSE;
return FALSE;
return FALSE;
return TRUE;
bool only_with_msgs)
unsigned int i, count;
for (i = 0; i < count; i++) {
return TRUE;
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,