mail-storage.c revision 7baab0b0b60df7ce9093d0881cd322dff1e79491
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
8b247780e911909a9fdc47f69ce6d1478902ad98Timo Sirainenextern struct mail_search_register *mail_search_register_imap;
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainenextern struct mail_search_register *mail_search_register_human;
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainenstruct mail_storage_module_register mail_storage_module_register = { 0 };
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainenstruct mail_module_register mail_module_register = { 0 };
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainenstruct mail_storage_mail_index_module mail_storage_mail_index_module =
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen MODULE_CONTEXT_INIT(&mail_index_module_register);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen mail_search_register_deinit(&mail_search_register_human);
9a48c2243fe98ca8393be7908f84d20c634bcdf9Timo Sirainen mail_search_register_deinit(&mail_search_register_imap);
2d2ebe91d56e9a158de000c9d0026f65600fbcfaTimo Sirainenvoid mail_storage_class_register(struct mail_storage *storage_class)
f988b93c2ef773987bcdcbfb4cca39b955e3a392Timo Sirainen i_assert(mail_storage_find_class(storage_class->name) == NULL);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen /* append it after the list, so the autodetection order is correct */
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen array_append(&mail_storage_classes, &storage_class, 1);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainenvoid mail_storage_class_unregister(struct mail_storage *storage_class)
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen unsigned int i, count;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen classes = array_get(&mail_storage_classes, &count);
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen for (i = 0; i < count; i++) {
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainenstruct mail_storage *mail_storage_find_class(const char *name)
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen unsigned int i, count;
5a1b498b646b5c5dbd1b3f3861df766f560578c5Timo Sirainen classes = array_get(&mail_storage_classes, &count);
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen for (i = 0; i < count; i++) {
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainenmail_storage_autodetect(const struct mail_namespace *ns,
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainen unsigned int i, count;
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainen classes = array_get(&mail_storage_classes, &count);
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainen for (i = 0; i < count; i++) {
211ed7806d8715ec2280ffbf5d10f0d6e4f1beb2Timo Sirainenmail_storage_set_autodetection(const char **data, const char **driver)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const char *p;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen /* check if data is in driver:data format (eg. mbox:~/mail) */
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen while (i_isalnum(*p)) p++;
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen /* no autodetection if the storage driver is given. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenmail_storage_get_class(struct mail_namespace *ns, const char *driver,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen enum mail_storage_flags flags, const char **error_r)
556f95092c3bc850517d5ab2bb502024a55645f1Timo Sirainen storage_class = mail_storage_find_class(driver);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen if (list_set->root_dir == NULL || *list_set->root_dir == '\0') {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* no root directory given. is this allowed? */
3d77cc0d502dc69ffe2afe318605964dd40b7b20Timo Sirainen (flags & MAIL_STORAGE_FLAG_NO_AUTODETECTION) == 0) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* autodetection should take care of this */
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen (storage_class->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* root not required for this storage */
10ff47d5d6146995e16da00d36eca7d162064a7bTimo Sirainen (list->props & MAILBOX_LIST_PROP_NO_ROOT) != 0) {
10ff47d5d6146995e16da00d36eca7d162064a7bTimo Sirainen /* root not required for this layout */
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen storage_class->v.get_list_settings(ns, list_set);
d66ef20c30fee728899ee168c75fcc5ff8fbdac1Timo Sirainen storage_class = mail_storage_autodetect(ns, list_set);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen if (ns->set->location == NULL || *ns->set->location == '\0') {
d66ef20c30fee728899ee168c75fcc5ff8fbdac1Timo Sirainen if (home == NULL || *home == '\0') home = "(not set)";
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen "Mail storage autodetection failed with home=%s", home);
5238111c460098d9cc8cc22527026138a278b9a4Timo Sirainen "Ambiguous mail location setting, "
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen "don't know what to do with it: %s "
5238111c460098d9cc8cc22527026138a278b9a4Timo Sirainen "(try prefixing it with mbox: or maildir:)",
68a4946b12583b88fa802e52ebee45cd96056772Timo Sirainenmail_storage_verify_root(const char *root_dir, bool autocreate,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char **error_r)
de954ff15b495be13007a8aca2c09fd1d356a283Timo Sirainen *error_r = mail_error_eacces_msg("stat", root_dir);
de954ff15b495be13007a8aca2c09fd1d356a283Timo Sirainen } else if (errno != ENOENT && errno != ENOTDIR) {
de954ff15b495be13007a8aca2c09fd1d356a283Timo Sirainen *error_r = t_strdup_printf("stat(%s) failed: %m", root_dir);
de954ff15b495be13007a8aca2c09fd1d356a283Timo Sirainen } else if (!autocreate) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen "Root mail directory doesn't exist: %s", root_dir);
3d77cc0d502dc69ffe2afe318605964dd40b7b20Timo Sirainen /* doesn't exist */
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenmail_storage_create_root(struct mailbox_list *list,
d66ef20c30fee728899ee168c75fcc5ff8fbdac1Timo Sirainen enum mail_storage_flags flags, const char **error_r)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen /* storage doesn't use directories (e.g. shared root) */
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if ((flags & MAIL_STORAGE_FLAG_NO_AUTOVERIFY) != 0) {
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen /* we don't need to verify, but since debugging is
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen enabled, check and log if the root doesn't exist */
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen if (mail_storage_verify_root(root_dir, FALSE, &error) < 0) {
0ce5f96804e81cb0f857e7df32c0272f1eed9377Timo Sirainen i_debug("Namespace %s: Creating storage despite: %s",
0ce5f96804e81cb0f857e7df32c0272f1eed9377Timo Sirainen autocreate = (flags & MAIL_STORAGE_FLAG_NO_AUTOCREATE) == 0;
0ce5f96804e81cb0f857e7df32c0272f1eed9377Timo Sirainen ret = mail_storage_verify_root(root_dir, autocreate, error_r);
0ce5f96804e81cb0f857e7df32c0272f1eed9377Timo Sirainen /* we need to create the root directory. */
6cc0546c058f3e6253c6f99727b28dd602712974Timo Sirainen mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
6cc0546c058f3e6253c6f99727b28dd602712974Timo Sirainen if (mkdir_parents_chgrp(root_dir, dir_mode, gid, origin) < 0 &&
6cc0546c058f3e6253c6f99727b28dd602712974Timo Sirainen *error_r = mail_error_create_eacces_msg("mkdir", root_dir);
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen /* created */
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen struct mail_storage *storage = user->storages;
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen for (; storage != NULL; storage = storage->next) {
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen if (strcmp(storage->name, storage_class->name) == 0 &&
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen strcmp(storage->unique_root_dir, set->root_dir) == 0))
555ebb032f9b8f0cdb66f27ce7374734833e7cacTimo Sirainenint mail_storage_create(struct mail_namespace *ns, const char *driver,
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen enum mail_storage_flags flags, const char **error_r)
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen struct mail_storage *storage_class, *storage = NULL;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen const char *p;
4e8d6d03c2ff85448df79b181a2ea850fb5d4199Timo Sirainen if ((flags & MAIL_STORAGE_FLAG_KEEP_HEADER_MD5) == 0 &&
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen /* if pop3_uidl_format contains %m, we want to keep the
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen header MD5 sums stored even if we're not running POP3
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen right now. */
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen /* autodetect */
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen } else if (driver != NULL && strcmp(driver, "shared") == 0) {
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen /* internal shared namespace */
3d77cc0d502dc69ffe2afe318605964dd40b7b20Timo Sirainen mail_storage_set_autodetection(&data, &driver);
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen if (mailbox_list_settings_parse(ns->user, data, &list_set,
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen storage_class = mail_storage_get_class(ns, driver, &list_set, flags,
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen /* first storage for namespace */
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen if (mail_storage_is_mailbox_file(storage_class))
9de176ef7f3d28ff486c2a8805110b84389e4f19Timo Sirainen list_flags |= MAILBOX_LIST_FLAG_MAILBOX_FILES;
f988b93c2ef773987bcdcbfb4cca39b955e3a392Timo Sirainen if (mailbox_list_create(list_set.layout, ns, &list_set,
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen *error_r = t_strdup_printf("Mailbox list driver %s: %s",
98a73e104c7b9c3747053e63113451e24daf7f36Timo Sirainen if (mail_storage_create_root(ns->list, flags, error_r) < 0)
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen storage = mail_storage_find(ns->user, storage_class, &list_set);
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen /* using an existing storage */
6adf683655750bcb809275cd65dc75fd12214198Timo Sirainen p_array_init(&storage->module_contexts, storage->pool, 5);
378e6cb162b355d6f103526505bc00b9a78962e7Timo Sirainen storage->v.create(storage, ns, error_r) < 0) {
6adf683655750bcb809275cd65dc75fd12214198Timo Sirainen *error_r = t_strdup_printf("%s: %s", storage->name, *error_r);
378e6cb162b355d6f103526505bc00b9a78962e7Timo Sirainenvoid mail_storage_unref(struct mail_storage **_storage)
378e6cb162b355d6f103526505bc00b9a78962e7Timo Sirainen /* set *_storage=NULL only after calling destroy() callback.
378e6cb162b355d6f103526505bc00b9a78962e7Timo Sirainen for example mdbox wants to access ns->storage */
378e6cb162b355d6f103526505bc00b9a78962e7Timo Sirainen i_panic("Trying to deinit storage before freeing its objects");
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen DLLIST_REMOVE(&storage->user->storages, storage);
b90fb7f78aca271243c26074ddd6587cce112a1eTimo Sirainenvoid mail_storage_obj_ref(struct mail_storage *storage)
378e6cb162b355d6f103526505bc00b9a78962e7Timo Sirainenvoid mail_storage_obj_unref(struct mail_storage *storage)
8cdb3234fe3c77e477c7a0e6934678f58fc54d4dTimo Sirainenvoid mail_storage_clear_error(struct mail_storage *storage)
d66ef20c30fee728899ee168c75fcc5ff8fbdac1Timo Sirainenvoid mail_storage_set_error(struct mail_storage *storage,
8cdb3234fe3c77e477c7a0e6934678f58fc54d4dTimo Sirainenvoid mail_storage_set_internal_error(struct mail_storage *storage)
8ab3d88c56dff2f567193f80cc29821a64e576d1Timo Sirainen i_strdup(str) : i_strdup(MAIL_ERRSTR_CRITICAL_MSG);
378e6cb162b355d6f103526505bc00b9a78962e7Timo Sirainenvoid mail_storage_set_critical(struct mail_storage *storage,
8ab3d88c56dff2f567193f80cc29821a64e576d1Timo Sirainen const char *fmt, ...)
71da447014454c84828d9dface77219875554d7dTimo Sirainen /* critical errors may contain sensitive data, so let user
71da447014454c84828d9dface77219875554d7dTimo Sirainen see only "Internal error" with a timestamp to make it
71da447014454c84828d9dface77219875554d7dTimo Sirainen easier to look from log files the actual error message. */
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainenvoid mail_storage_copy_list_error(struct mail_storage *storage,
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen const char *str;
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen str = mailbox_list_get_last_error(list, &error);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenvoid mail_storage_set_index_error(struct mailbox *box)
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen mail_storage_set_internal_error(box->storage);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenmail_storage_get_settings(struct mail_storage *storage)
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenstruct mail_user *mail_storage_get_user(struct mail_storage *storage)
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenvoid mail_storage_set_callbacks(struct mail_storage *storage,
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenint mail_storage_purge(struct mail_storage *storage)
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenconst char *mail_storage_get_last_error(struct mail_storage *storage,
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen /* We get here only in error situations, so we have to return some
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen error. If storage->error is NONE, it means we forgot to set it at
2d2ebe91d56e9a158de000c9d0026f65600fbcfaTimo Sirainen some point.. */
d691782ae9eb4f6ab06bc42f1617e889e7c18a3bTimo Sirainen return storage->error_string != NULL ? storage->error_string :
d691782ae9eb4f6ab06bc42f1617e889e7c18a3bTimo Sirainen "BUG: Unknown internal error";
d691782ae9eb4f6ab06bc42f1617e889e7c18a3bTimo Sirainen /* This shouldn't happen.. */
d691782ae9eb4f6ab06bc42f1617e889e7c18a3bTimo Sirainenconst char *mailbox_get_last_error(struct mailbox *box,
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen return mail_storage_get_last_error(box->storage, error_r);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenenum mail_error mailbox_get_last_mail_error(struct mailbox *box)
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen (void)mail_storage_get_last_error(box->storage, &error);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenbool mail_storage_is_mailbox_file(struct mail_storage *storage)
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen MAIL_STORAGE_CLASS_FLAG_MAILBOX_IS_FILE) != 0;
f28583935a4509d3f7932738bba6c548ef455c82Timo Sirainenbool mail_storage_set_error_from_errno(struct mail_storage *storage)
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen if (!mail_error_from_errno(&error, &error_string))
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen if (storage->set->mail_debug && error != MAIL_ERROR_NOTFOUND) {
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen /* debugging is enabled - admin may be debugging a
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen (permission) problem, so return FALSE to get the caller to
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen log the full error message. */
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen mail_storage_set_error(storage, error, error_string);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenstruct mailbox *mailbox_alloc(struct mailbox_list *list, const char *vname,
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen (list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
981139bb2e446bb2050c1158614725f8413fd709Timo Sirainen /* make sure INBOX shows up in uppercase everywhere */
981139bb2e446bb2050c1158614725f8413fd709Timo Sirainen if (mailbox_list_get_storage(&new_list, vname, &storage) < 0) {
981139bb2e446bb2050c1158614725f8413fd709Timo Sirainen /* just use the first storage. FIXME: does this break? */
981139bb2e446bb2050c1158614725f8413fd709Timo Sirainen box = storage->v.mailbox_alloc(storage, new_list, vname, flags);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenstatic bool have_listable_namespace_prefix(struct mail_namespace *ns,
378e6cb162b355d6f103526505bc00b9a78962e7Timo Sirainen if ((ns->flags & (NAMESPACE_FLAG_LIST_PREFIX |
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen /* if prefix has multiple hierarchies, match
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen any of the hierarchies */
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen if (strncmp(ns->prefix, name, name_len) == 0 &&
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen ns->prefix[name_len] == mail_namespace_get_sep(ns))
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenint mailbox_exists(struct mailbox *box, enum mailbox_existence *existence_r)
8b2cf1c1bd8ddcea0525b62fd35ba76e136828a1Timo Sirainen if (!mailbox_list_is_valid_existing_name(box->list, box->name)) {
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_PARAMS,
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen "Invalid mailbox name");
f28583935a4509d3f7932738bba6c548ef455c82Timo Sirainen if (have_listable_namespace_prefix(box->storage->user->namespaces,
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen /* listable namespace prefix always exists */
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainenstatic int mailbox_check_mismatching_separators(struct mailbox *box)
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen list_sep = mailbox_list_get_hierarchy_sep(box->list);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen /* vname is prefix with or without separator */
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen i_assert(strncmp(vname, ns->prefix, ns->prefix_len-1) == 0);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen i_assert(vname[0] == ns->prefix[ns->prefix_len-1]);
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_PARAMS,
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen "in mailbox name: '%c'",
0c1835a90dd1dcedaeaedd1cd91672299cbeb5beTimo Sirainenstatic int mailbox_open_full(struct mailbox *box, struct istream *input)
0c1835a90dd1dcedaeaedd1cd91672299cbeb5beTimo Sirainen if (mailbox_check_mismatching_separators(box) < 0)
0c1835a90dd1dcedaeaedd1cd91672299cbeb5beTimo Sirainen if (!mailbox_list_is_valid_existing_name(box->list, box->name)) {
0c1835a90dd1dcedaeaedd1cd91672299cbeb5beTimo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_PARAMS,
0c1835a90dd1dcedaeaedd1cd91672299cbeb5beTimo Sirainen "Invalid mailbox name");
f4735bf7ec2019fdc730e9ebdb39e5a4ea580405Timo Sirainen "Storage doesn't support streamed mailboxes");
981139bb2e446bb2050c1158614725f8413fd709Timo Sirainen if (ret < 0 && box->storage->error == MAIL_ERROR_NOTFOUND &&
981139bb2e446bb2050c1158614725f8413fd709Timo Sirainen box->input == NULL && box->inbox_user) T_BEGIN {
} T_END;
if (ret < 0) {
bool directory)
int ret;
if (directory ||
return ret;
int ret;
if (ret < 0)
if (del)
return FALSE;
return FALSE;
return FALSE;
return TRUE;
int ret;
return ret;
return TRUE;
return FALSE;
return FALSE;
return TRUE;
bool rename_children)
const char *subs_name;
struct mail_namespace *
return FALSE;
i_unreached();
struct mailbox_sync_context *
T_BEGIN {
} T_END;
return ctx;
const char *errormsg;
int ret;
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)
int ret;
if (ret < 0) {
int ret;
return ret;
struct mailbox_transaction_context *
int ret;
return ret;
const char *path;
const char *origin;
int *fd_r)
int fd;
unsigned int secs)