mail-storage.c revision 62dbc0f29b961a2e0ffdb910fd27898e1d7b2e56
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen/* Copyright (c) 2002-2014 Dovecot authors, see the included COPYING file */
32b78da5dfbbf6a06b3dbdc9278c60b55714f9bcTimo Sirainenextern struct mail_search_register *mail_search_register_imap;
32b78da5dfbbf6a06b3dbdc9278c60b55714f9bcTimo Sirainenextern struct mail_search_register *mail_search_register_human;
8b5c520883aa37bb55646286d375fdbae294d710Timo Sirainenstruct mail_storage_module_register mail_storage_module_register = { 0 };
8b5c520883aa37bb55646286d375fdbae294d710Timo Sirainenstruct mail_module_register mail_module_register = { 0 };
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstruct mail_storage_mail_index_module mail_storage_mail_index_module =
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen MODULE_CONTEXT_INIT(&mail_index_module_register);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen mail_search_register_deinit(&mail_search_register_human);
db693bf6fcae96d834567f1782257517b7207655Timo Sirainen mail_search_register_deinit(&mail_search_register_imap);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenvoid mail_storage_class_register(struct mail_storage *storage_class)
a3fe8c0c54d87822f4b4f8f0d10caac611861b2bTimo Sirainen i_assert(mail_storage_find_class(storage_class->name) == NULL);
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen /* append it after the list, so the autodetection order is correct */
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen array_append(&mail_storage_classes, &storage_class, 1);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenvoid mail_storage_class_unregister(struct mail_storage *storage_class)
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen unsigned int i, count;
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen classes = array_get(&mail_storage_classes, &count);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen for (i = 0; i < count; i++) {
e0740628f6ca05f4bc79a9d8a90b650f4d38d4d0Timo Sirainenstruct mail_storage *mail_storage_find_class(const char *name)
3f603ef00e35fca21605afa0ad8d76e94fee2b96Timo Sirainen unsigned int i, count;
86791365b10f45982c88e70f2eb94fd6c3fea151Timo Sirainen classes = array_get(&mail_storage_classes, &count);
86791365b10f45982c88e70f2eb94fd6c3fea151Timo Sirainen for (i = 0; i < count; i++) {
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainenmail_storage_autodetect(const struct mail_namespace *ns,
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainen unsigned int i, count;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen classes = array_get(&mail_storage_classes, &count);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen for (i = 0; i < count; i++) {
0161376aac025266d8654577c4b9ce371ffc87eaTimo Sirainenmail_storage_set_autodetection(const char **data, const char **driver)
0161376aac025266d8654577c4b9ce371ffc87eaTimo Sirainen const char *p;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* check if data is in driver:data format (eg. mbox:~/mail) */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* no autodetection if the storage driver is given. */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenmail_storage_get_class(struct mail_namespace *ns, const char *driver,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen enum mail_storage_flags flags, const char **error_r)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* no mail_location, autodetect */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* explicit autodetection with "auto" driver. */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* handle the same as with driver=NULL */
275385a2ecc58e41dc7df3ce3cd943caaa58c4d1Timo Sirainen storage_class = mail_user_get_storage_class(ns->user, driver);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if (list_set->root_dir == NULL || *list_set->root_dir == '\0') {
db693bf6fcae96d834567f1782257517b7207655Timo Sirainen /* no root directory given. is this allowed? */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen (flags & MAIL_STORAGE_FLAG_NO_AUTODETECTION) == 0) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* autodetection should take care of this */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen (storage_class->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* root not required for this storage */
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen (list->props & MAILBOX_LIST_PROP_NO_ROOT) != 0) {
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen /* root not required for this layout */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen storage_class->v.get_list_settings(ns, list_set);
return storage_class;
return storage_class;
return NULL;
const char **error_r)
} else if (!autocreate) {
bool autocreate;
int ret;
&root_dir)) {
if (ret == 0) {
error_r);
return FALSE;
return FALSE;
return FALSE;
return TRUE;
static struct mail_storage *
return storage;
return NULL;
const char **error_r)
error_r) < 0)
error_r);
T_BEGIN {
} T_END;
const char *str;
const char *fmt, ...)
const char *str;
const char *str;
const struct mail_storage_settings *
void *context)
return error;
const char *error_string;
return FALSE;
return FALSE;
return TRUE;
const struct mailbox_settings *
return NULL;
return *box_set;
return NULL;
T_BEGIN {
if (open_error != 0)
} T_END;
return box;
const char *vname;
&metadata) < 0) {
return box;
return box;
return TRUE;
const char *errstr;
MAILBOX_SET_AUTO_SUBSCRIBE) == 0) {
int ret;
return ret;
const char **error_r)
if (prev_sep) {
return FALSE;
if (prev_sep && i > 0) {
return FALSE;
return TRUE;
vname++;
const char *path;
&path) < 0)
return TRUE;
return FALSE;
const char *name)
NAMESPACE_FLAG_LIST_CHILDREN)) == 0)
return TRUE;
return FALSE;
case MAIL_ERROR_NOTFOUND:
int ret;
case MAIL_ERROR_NOTFOUND:
MAIL_STORAGE_CLASS_FLAG_OPEN_STREAMS) == 0) {
T_BEGIN {
} T_END;
} T_END;
if (ret < 0) {
return FALSE;
return FALSE;
return FALSE;
return FALSE;
return TRUE;
const char *index_dir;
int ret;
&index_dir);
if (ret <= 0)
int ret;
return ret;
const char *name1;
return FALSE;
return TRUE;
bool directory)
int ret;
if (ret == 0)
return ret;
int ret;
return ret;
int ret;
if (ret < 0)
if (del)
int ret;
return ret;
int ret;
return ret;
const char **error_r)
return TRUE;
return FALSE;
return FALSE;
return TRUE;
const char **error_r)
return FALSE;
return FALSE;
return FALSE;
return TRUE;
struct mail_namespace *
return FALSE;
i_unreached();
const char **str_r)
const unsigned char *data;
int ret;
return ret;
int ret;
return ret;
struct mailbox_attribute_iter *
const char *prefix)
struct mailbox_sync_context *
T_BEGIN {
} T_END;
return ctx;
const char *errormsg;
int ret;
if (ret == 0)
return ret;
struct mail_search_context *
int ret;
return ret;
bool tryagain;
if (!tryagain)
return FALSE;
return TRUE;
return FALSE;
return TRUE;
int ret;
if (ret < 0)
return ret;
struct mailbox_transaction_context *
return trans;
int ret;
return ret;
int ret;
T_BEGIN {
} T_END;
return ret;
struct mailbox *
return t->box;
struct mail_save_context *
return ctx;
const char *const *keywords_list;
const char *envelope)
unsigned int order)
int ret;
if (ret < 0) {
int ret;
if (pvt_flags != 0)
t->save_count++;
return ret;
struct mailbox_transaction_context *
int ret;
if (ret == 0) {
if (pvt_flags != 0)
t->save_count++;
return ret;
const char **path_r)
int ret;
if (ret < 0) {
return ret;
int *fd_r)
int fd;
const char *root_dir;
int ret;
return ret;
&mail_dir) < 0)
unsigned int secs)
#ifndef MMAP_CONFLICTS_WRITE
return index_flags;