mail-storage.c revision 02f884382018f4435407374a059407caa44c9239
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainenextern struct mail_search_register *mail_search_register_imap;
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainenextern struct mail_search_register *mail_search_register_human;
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainenstruct mail_storage_module_register mail_storage_module_register = { 0 };
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainenstruct mail_module_register mail_module_register = { 0 };
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainenstruct mail_storage_mail_index_module mail_storage_mail_index_module =
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainen MODULE_CONTEXT_INIT(&mail_index_module_register);
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainen mail_search_register_deinit(&mail_search_register_human);
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainen mail_search_register_deinit(&mail_search_register_imap);
8759adc67109b5a12a7af3ed717c7040622a0a04Timo Sirainenvoid mail_storage_class_register(struct mail_storage *storage_class)
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainen i_assert(mail_storage_find_class(storage_class->name) == NULL);
d31c77e63713a6cf3687a4b38ff8daf6d6c7a3ddTimo Sirainen /* append it after the list, so the autodetection order is correct */
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen array_append(&mail_storage_classes, &storage_class, 1);
90cf976e328e093da91a8332d96182201f4ef6c1Timo Sirainenvoid mail_storage_class_unregister(struct mail_storage *storage_class)
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen unsigned int i, count;
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen classes = array_get(&mail_storage_classes, &count);
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen for (i = 0; i < count; i++) {
3ab7783791bd46cdd46e9b9de3e98e8efcb6c6bfTimo Sirainenstruct mail_storage *mail_storage_find_class(const char *name)
24d7c5fc9fa1cb1f49402ec796654113199ba4e6Timo Sirainen unsigned int i, count;
24d7c5fc9fa1cb1f49402ec796654113199ba4e6Timo Sirainen classes = array_get(&mail_storage_classes, &count);
ef4ca21b9195a2aca07a4965ea2d1d97c850b89amanuel for (i = 0; i < count; i++) {
145d2eef238ed8bbff635e3b06951a83f0ee5a03Timo Sirainenmail_storage_autodetect(const struct mail_namespace *ns,
8759adc67109b5a12a7af3ed717c7040622a0a04Timo Sirainen unsigned int i, count;
8759adc67109b5a12a7af3ed717c7040622a0a04Timo Sirainen classes = array_get(&mail_storage_classes, &count);
24d7c5fc9fa1cb1f49402ec796654113199ba4e6Timo Sirainen for (i = 0; i < count; i++) {
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenmail_storage_set_autodetection(const char **data, const char **driver)
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen const char *p;
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen /* check if data is in driver:data format (eg. mbox:~/mail) */
8759adc67109b5a12a7af3ed717c7040622a0a04Timo Sirainen while (i_isalnum(*p)) p++;
d31c77e63713a6cf3687a4b38ff8daf6d6c7a3ddTimo Sirainen /* no autodetection if the storage driver is given. */
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainenmail_storage_get_class(struct mail_namespace *ns, const char *driver,
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen enum mail_storage_flags flags, const char **error_r)
7a60e1dc9e93ef3f7c7fe1af6385a0bfa1e31bc3Timo Sirainen /* no mail_location, autodetect */
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen /* explicit autodetection with "auto" driver. */
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen /* handle the same as with driver=NULL */
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen storage_class = mail_storage_find_class(driver);
31a12066e4cd9310d64091c81b59fb8eb1986023Timo Sirainen if (list_set->root_dir == NULL || *list_set->root_dir == '\0') {
31a12066e4cd9310d64091c81b59fb8eb1986023Timo Sirainen /* no root directory given. is this allowed? */
47a5a7e8296f3b8f2fac9a0659d4de3f2723ba4aMartti Rannanjärvi list = list_set->layout == NULL ? NULL :
61618d4c58080570f689614fec204ae14e90cef2Timo Sirainen (flags & MAIL_STORAGE_FLAG_NO_AUTODETECTION) == 0) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* autodetection should take care of this */
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen (storage_class->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0) {
dc9bfb7dc057964238e181d3d8b08751527bb08aTimo Sirainen /* root not required for this storage */
8ef7c24178fd798c3e0301c5b8afa1a9bdedd27fTimo Sirainen (list->props & MAILBOX_LIST_PROP_NO_ROOT) != 0) {
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen /* root not required for this layout */
return NULL;
return storage_class;
return storage_class;
return NULL;
const char **error_r)
} else if (!autocreate) {
bool autocreate;
int ret;
if (ret == 0) {
error_r);
return FALSE;
return FALSE;
return FALSE;
return TRUE;
static struct mail_storage *
return storage;
return NULL;
error_r) < 0)
error_r);
T_BEGIN {
} T_END;
const char *str;
const char *fmt, ...)
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 NULL;
return *box_set;
return NULL;
T_BEGIN {
} T_END;
return box;
const char *vname;
&metadata) < 0) {
return box;
return box;
const char *name)
NAMESPACE_FLAG_LIST_CHILDREN)) == 0)
return TRUE;
return FALSE;
return TRUE;
case MAIL_ERROR_NOTFOUND:
vname++;
if (*p == list_sep) {
list_sep));
const char *errstr;
MAILBOX_SET_AUTO_SUBSCRIBE) == 0) {
int ret;
return ret;
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 TRUE;
bool directory)
int ret;
if (directory ||
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;
bool rename_children)
struct mail_namespace *
return FALSE;
i_unreached();
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;
return ret;
struct mailbox_transaction_context *
int ret;
return ret;
const char *path;
int *fd_r)
int fd;
unsigned int secs)