virtual-storage.c revision 9847ec56efa15fa063eea9988eee2d4ed9ec7d58
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen/* Copyright (c) 2008-2013 Dovecot authors, see the included COPYING file */
f6c0407545ee77d4647c8cd912e3156b0a48e2f1Timo Sirainenextern struct virtual_mailbox_vfuncs virtual_mailbox_vfuncs;
f6c0407545ee77d4647c8cd912e3156b0a48e2f1Timo Sirainenstruct virtual_storage_module virtual_storage_module =
f6c0407545ee77d4647c8cd912e3156b0a48e2f1Timo Sirainen MODULE_CONTEXT_INIT(&mail_storage_module_register);
f6c0407545ee77d4647c8cd912e3156b0a48e2f1Timo Sirainenstatic bool ns_is_visible(struct mail_namespace *ns)
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen return (ns->flags & NAMESPACE_FLAG_LIST_PREFIX) != 0 ||
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen (ns->flags & NAMESPACE_FLAG_LIST_CHILDREN) != 0 ||
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainenstatic const char *get_user_visible_mailbox_name(struct mailbox *box)
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainenvoid virtual_box_copy_error(struct mailbox *dest, struct mailbox *src)
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen str = t_strdup_printf("%s (for backend mailbox %s)", str, name);
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen mail_storage_set_error(dest->storage, error, str);
306f6bb8791755257c0db900f17659402c660057Timo Sirainenstatic struct mail_storage *virtual_storage_alloc(void)
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen pool = pool_alloconly_create("virtual storage", 1024);
6a7bc57cdd2aaa7778478bf76c20c61640c725e6Timo Sirainen storage = p_new(pool, struct virtual_storage, 1);
1388b590dbd85245b591346f860bc1319953318aTimo Sirainenvirtual_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen set->subscription_fname = VIRTUAL_SUBSCRIPTION_FILE_NAME;
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainenvirtual_backend_box_lookup_name(struct virtual_mailbox *mbox, const char *name)
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen unsigned int i, count;
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen bboxes = array_get(&mbox->backend_boxes, &count);
a40f21e8239a87a8fab2648955b0f568908ca8b5Timo Sirainen for (i = 0; i < count; i++) {
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainenvirtual_backend_box_lookup(struct virtual_mailbox *mbox, uint32_t mailbox_id)
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen unsigned int i, count;
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen bboxes = array_get(&mbox->backend_boxes, &count);
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen for (i = 0; i < count; i++) {
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainenstatic bool virtual_mailbox_is_in_open_stack(struct virtual_storage *storage,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen const char *const *names;
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen unsigned int i, count;
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen names = array_get(&storage->open_stack, &count);
5c6410e8882d021ad9cff91d87b3ce68e309bd44Timo Sirainen for (i = 0; i < count; i++) {
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainenstatic int virtual_backend_box_open_failed(struct virtual_mailbox *mbox,
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen str = mailbox_get_last_error(bbox->box, &error);
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen name = t_strdup(get_user_visible_mailbox_name(bbox->box));
4dc5662260a63669054cd0dc1bac2ccab3fa2ae7Timo Sirainen /* ignore this. it could be intentional. */
4dc5662260a63669054cd0dc1bac2ccab3fa2ae7Timo Sirainen if (mbox->storage->storage.user->mail_debug) {
f6c0407545ee77d4647c8cd912e3156b0a48e2f1Timo Sirainen "Skipping non-existing mailbox %s",
a40f21e8239a87a8fab2648955b0f568908ca8b5Timo Sirainen if (error == MAIL_ERROR_PERM && bbox->wildcard) {
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen /* this mailbox wasn't explicitly specified. just skip it. */
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen "Virtual mailbox open failed because of mailbox %s: %s",
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen mail_storage_set_error(mbox->box.storage, error, str);
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainenstatic int virtual_backend_box_open(struct virtual_mailbox *mbox,
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen struct mail_user *user = mbox->storage->storage.user;
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen ns = mail_namespace_find(user->namespaces, mailbox);
6a029ebed745994ce2e5f64182d8b5c8f10d53d6Timo Sirainen bbox->box = mailbox_alloc(ns->list, mailbox, flags);
unsigned int i, count;
int ret;
for (i = 0; i < count; ) {
if (ret <= 0) {
if (ret < 0)
if (i == count)
static struct mailbox *
unsigned int i, count;
for (i = 0; i < count; i++) {
int ret = 0;
if (ret == 0) {
if (ret < 0) {
sizeof(struct virtual_mail_index_record),
sizeof(uint32_t));
unsigned int i, count;
for (i = 0; i < count; i++) {
unsigned int n, i, count;
unsigned int n, i, count;
bool only_with_msgs)
unsigned int i, count;
for (i = 0; i < count; i++) {
return TRUE;
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,