virtual-storage.c revision dee43975a70bcdb9dc83d34d6a2b177d37bb7194
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Copyright (c) 2008 Dovecot authors, see the included COPYING file */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen MODULE_CONTEXT(obj, virtual_mailbox_list_module)
d8eedfaad386a8776e4931086b039b72e1ad38c4Timo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(virtual_mailbox_list_module,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvirtual_list_delete_mailbox(struct mailbox_list *list, const char *name);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvirtual_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvirtual_get_list_settings(struct mailbox_list_settings *list_set,
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainen const char *data, enum mail_storage_flags flags,
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainen bool debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen list_set->subscription_fname = VIRTUAL_SUBSCRIPTION_FILE_NAME;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen if (data == NULL || *data == '\0' || *data == ':') {
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen /* we won't do any guessing for this format. */
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen i_info("virtual: mailbox location not given");
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen return mailbox_list_settings_parse(data, list_set, layout_r, NULL,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenstatic struct mail_storage *virtual_alloc(void)
ad3a1b8f8e2a5596afb1b099a69ae6f688887eecTimo Sirainen pool = pool_alloconly_create("virtual storage", 512+256);
aff1e150e13980354cfd794c74dac76a791a641eTimo Sirainen storage = p_new(pool, struct virtual_storage, 1);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenstatic int virtual_create(struct mail_storage *_storage, const char *data,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen const char **error_r)
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen struct virtual_storage *storage = (struct virtual_storage *)_storage;
e6bdf53eb0143af99e3eb977ff0f8a496ecd1a8dTimo Sirainen if (virtual_get_list_settings(&list_set, data, _storage->flags,
9446c7a5d400cba60d097c528bd08312552438e3Timo Sirainen list_set.mail_storage_flags = &_storage->flags;
9446c7a5d400cba60d097c528bd08312552438e3Timo Sirainen list_set.lock_method = &_storage->lock_method;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen "Root mail directory doesn't exist: %s",
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen *error_r = t_strdup_printf("stat(%s) failed: %m",
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen if (mailbox_list_alloc(layout, &_storage->list, error_r) < 0)
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen storage->list_module_ctx.super = _storage->list->v;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen _storage->list->v.iter_is_mailbox = virtual_list_iter_is_mailbox;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen _storage->list->v.delete_mailbox = virtual_list_delete_mailbox;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen MODULE_CONTEXT_SET_FULL(_storage->list, virtual_mailbox_list_module,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen /* finish list init after we've overridden vfuncs */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen mailbox_list_init(_storage->list, _storage->ns, &list_set,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen mail_storage_get_list_flags(_storage->flags));
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvirtual_backend_box_lookup(struct virtual_mailbox *mbox, uint32_t mailbox_id)
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen unsigned int i, count;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen bboxes = array_get(&mbox->backend_boxes, &count);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenstatic int virtual_mailboxes_open(struct virtual_mailbox *mbox,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen unsigned int i, count;
for (i = 0; i < count; i++) {
if (i == count)
static struct mailbox *
const char *path;
sizeof(struct virtual_mail_index_record),
sizeof(uint32_t));
return NULL;
static struct mailbox *
const char *path;
return NULL;
path);
return NULL;
unsigned int i, count;
int ret = 0;
for (i = 0; i < count; i++) {
const char *name)
struct dirent *d;
unsigned int dir_len;
errno = 0;
path);
if (!unlinked_something) {
const char *src;
ret = 0;
return ret;
static void virtual_class_init(void)
static void virtual_class_deinit(void)
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,