virtual-storage.c revision bf47f6022ec3c9ca52d33995fb00784feed63560
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger/* Copyright (c) 2008-2009 Dovecot authors, see the included COPYING file */
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger MODULE_CONTEXT(obj, virtual_mailbox_list_module)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergerextern struct mail_storage virtual_storage;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergerstruct virtual_storage_module virtual_storage_module =
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger MODULE_CONTEXT_INIT(&mail_storage_module_register);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergerstatic MODULE_CONTEXT_DEFINE_INIT(virtual_mailbox_list_module,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergervirtual_list_delete_mailbox(struct mailbox_list *list, const char *name);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergervirtual_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergervoid virtual_copy_error(struct mail_storage *dest, struct mail_storage *src)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str = mail_storage_get_last_error(src, &error);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger if ((src->ns->flags & NAMESPACE_FLAG_HIDDEN) == 0) {
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str = t_strdup_printf("%s (namespace %s)", str,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergervoid virtual_box_copy_error(struct mailbox *dest, struct mailbox *src)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str = mail_storage_get_last_error(src->storage, &error);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger if ((src->storage->ns->flags & NAMESPACE_FLAG_HIDDEN) != 0)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str = t_strdup_printf("%s (mailbox %s)", str, src->name);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger str = t_strdup_printf("%s (mailbox %s%s)", str,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger mail_storage_set_error(dest->storage, error, str);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergervirtual_get_list_settings(struct mailbox_list_settings *list_set,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger const char *data, struct mail_storage *storage,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger const char **layout_r, const char **error_r)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger list_set->subscription_fname = VIRTUAL_SUBSCRIPTION_FILE_NAME;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger if (data == NULL || *data == '\0' || *data == ':') {
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger /* we won't do any guessing for this format. */
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger i_info("virtual: mailbox location not given");
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger *error_r = "Root mail directory not given";
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger return mailbox_list_settings_parse(data, list_set, storage->ns,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergerstatic struct mail_storage *virtual_alloc(void)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger pool = pool_alloconly_create("virtual storage", 512+256);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger storage = p_new(pool, struct virtual_storage, 1);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger p_array_init(&storage->open_stack, pool, 8);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergerstatic int virtual_create(struct mail_storage *_storage, const char *data,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger struct virtual_storage *storage = (struct virtual_storage *)_storage;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger _storage->ns->flags |= NAMESPACE_FLAG_NOQUOTA;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger if (virtual_get_list_settings(&list_set, data, _storage,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger list_set.mail_storage_flags = &_storage->flags;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger list_set.lock_method = &_storage->lock_method;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger "Root mail directory doesn't exist: %s",
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger *error_r = t_strdup_printf("stat(%s) failed: %m",
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger if (mailbox_list_alloc(layout, &_storage->list, error_r) < 0)
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger storage->list_module_ctx.super = _storage->list->v;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger _storage->list->v.iter_is_mailbox = virtual_list_iter_is_mailbox;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger _storage->list->v.delete_mailbox = virtual_list_delete_mailbox;
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger MODULE_CONTEXT_SET_FULL(_storage->list, virtual_mailbox_list_module,
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger /* finish list init after we've overridden vfuncs */
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornberger mailbox_list_init(_storage->list, _storage->ns, &list_set, 0);
65f00d360b7b3fabfc829fcc19a019bfef587595Julian Kornbergervirtual_backend_box_lookup_name(struct virtual_mailbox *mbox, const char *name)
unsigned int i, count;
for (i = 0; i < count; i++) {
return bboxes[i];
return NULL;
struct virtual_backend_box *
unsigned int i, count;
if (mailbox_id == 0)
return NULL;
for (i = 0; i < count; i++) {
return bboxes[i];
return NULL;
const char *name)
const char *const *names;
unsigned int i, count;
for (i = 0; i < count; i++) {
return TRUE;
return FALSE;
unsigned int i, count;
for (i = 0; i < count; ) {
if (i == count)
static struct mailbox *
const char *path;
bool failed;
return NULL;
sizeof(struct virtual_mail_index_record),
sizeof(uint32_t));
if (failed) {
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;
unsigned int count;
return FALSE;
return FALSE;
return FALSE;
return TRUE;
bool only_with_msgs)
unsigned int i, count;
for (i = 0; i < count; i++) {
static void virtual_class_init(void)
static void virtual_class_deinit(void)
NULL,
NULL,
NULL,
NULL,
NULL,