mail-storage.c revision 5505efe43cc7d5058561cda8882487b7971f8ad9
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Copyright (C) 2002-2003 Timo Sirainen */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#include "lib.h"
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#include "ioloop.h"
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#include "array.h"
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#include "mail-storage-private.h"
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#include <stdlib.h>
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#include <time.h>
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#include <ctype.h>
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Message to show to users when critical error occurs */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#define CRITICAL_MSG \
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter "Internal error occurred. Refer to server log for more information."
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#define CRITICAL_MSG_STAMP CRITICAL_MSG " [%Y-%m-%d %H:%M:%S]"
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* 20 * (200+1) < 4096 which is the standard PATH_MAX. Having these settings
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter prevents malicious user from creating eg. "a/a/a/.../a" mailbox name and
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter then start renaming them to larger names from end to beginning, which
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter eventually would start causing the failures when trying to use too
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter long mailbox names. */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#define MAILBOX_MAX_HIERARCHY_LEVELS 20
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#define MAILBOX_MAX_HIERARCHY_NAME_LENGTH 200
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterunsigned int mail_storage_module_id = 0;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic array_t ARRAY_DEFINE(storages, struct mail_storage *);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid mail_storage_init(void)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter{
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ARRAY_CREATE(&storages, default_pool, struct mail_storage *, 8);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid mail_storage_deinit(void)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (array_is_created(&storages))
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek array_free(&storages);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnikvoid mail_storage_class_register(struct mail_storage *storage_class)
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik{
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik /* append it after the list, so the autodetection order is correct */
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik array_append(&storages, &storage_class, 1);
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik}
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnikvoid mail_storage_class_unregister(struct mail_storage *storage_class)
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik{
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik struct mail_storage *const *classes;
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik unsigned int i, count;
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik classes = array_get(&storages, &count);
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik for (i = 0; i < count; i++) {
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik if (classes[i] == storage_class) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter array_delete(&storages, i, 1);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter break;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter}
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid mail_storage_parse_env(enum mail_storage_flags *flags_r,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter enum mail_storage_lock_method *lock_method_r)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter{
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter const char *str;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *flags_r = 0;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (getenv("FULL_FILESYSTEM_ACCESS") != NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *flags_r |= MAIL_STORAGE_FLAG_FULL_FS_ACCESS;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (getenv("DEBUG") != NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *flags_r |= MAIL_STORAGE_FLAG_DEBUG;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (getenv("MMAP_DISABLE") != NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *flags_r |= MAIL_STORAGE_FLAG_MMAP_DISABLE;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (getenv("MMAP_NO_WRITE") != NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *flags_r |= MAIL_STORAGE_FLAG_MMAP_NO_WRITE;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (getenv("MAIL_READ_MMAPED") != NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *flags_r |= MAIL_STORAGE_FLAG_MMAP_MAILS;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if (getenv("MAIL_SAVE_CRLF") != NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *flags_r |= MAIL_STORAGE_FLAG_SAVE_CRLF;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter str = getenv("LOCK_METHOD");
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (str == NULL || strcmp(str, "fcntl") == 0)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *lock_method_r = MAIL_STORAGE_LOCK_FCNTL;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter else if (strcmp(str, "flock") == 0)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *lock_method_r = MAIL_STORAGE_LOCK_FLOCK;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter else if (strcmp(str, "dotlock") == 0)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter *lock_method_r = MAIL_STORAGE_LOCK_DOTLOCK;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter else
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter i_fatal("Unknown lock_method: %s", str);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter}
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic struct mail_storage *mail_storage_find(const char *name)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter{
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter struct mail_storage *const *classes;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter unsigned int i, count;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter i_assert(name != NULL);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter classes = array_get(&storages, &count);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter for (i = 0; i < count; i++) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (strcasecmp(classes[i]->name, name) == 0)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return classes[i];
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return NULL;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter}
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstruct mail_storage *
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltermail_storage_create(const char *name, const char *data, const char *user,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter enum mail_storage_flags flags,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter enum mail_storage_lock_method lock_method)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter{
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter struct mail_storage *storage;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter storage = mail_storage_find(name);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (storage != NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return storage->v.create(data, user, flags, lock_method);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter else
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return NULL;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter}
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstruct mail_storage *
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltermail_storage_create_default(const char *user, enum mail_storage_flags flags,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter enum mail_storage_lock_method lock_method)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter{
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter struct mail_storage *const *classes;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter struct mail_storage *storage;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter unsigned int i, count;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter classes = array_get(&storages, &count);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter for (i = 0; i < count; i++) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter storage = classes[i]->v.create(NULL, user, flags, lock_method);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (storage != NULL)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return storage;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return NULL;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter}
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walterstatic struct mail_storage *
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Waltermail_storage_autodetect(const char *data, enum mail_storage_flags flags)
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter{
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter struct mail_storage *const *classes;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter unsigned int i, count;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter classes = array_get(&storages, &count);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter for (i = 0; i < count; i++) {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if (classes[i]->v.autodetect(data, flags))
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter return classes[i];
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter }
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter return NULL;
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter}
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walterstruct mail_storage *
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Waltermail_storage_create_with_data(const char *data, const char *user,
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter enum mail_storage_flags flags,
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter enum mail_storage_lock_method lock_method)
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter{
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter struct mail_storage *storage;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter const char *p, *name;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if (data == NULL || *data == '\0')
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter return mail_storage_create_default(user, flags, lock_method);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter /* check if we're in the form of mailformat:data
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter (eg. maildir:Maildir) */
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter p = data;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter while (i_isalnum(*p)) p++;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if (*p == ':') {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter name = t_strdup_until(data, p);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter storage = mail_storage_create(name, p+1, user, flags,
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter lock_method);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter } else {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter storage = mail_storage_autodetect(data, flags);
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter if (storage == NULL) {
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter i_error("Ambiguous mail location setting, "
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter "don't know what to do with it: %s "
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter "(try prefixing it with mbox: or maildir:)",
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter data);
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter } else {
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter storage = storage->v.create(data, user, flags,
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter lock_method);
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter }
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter }
c3c6eb141d6a288b3da20ad6a2e5718844b2d4adPavel Reichl
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter return storage;
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter}
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Waltervoid mail_storage_destroy(struct mail_storage **_storage)
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter{
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter struct mail_storage *storage = *_storage;
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter i_assert(storage != NULL);
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter *_storage = NULL;
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter storage->v.destroy(storage);
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter}
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter
c2cc119de8eac712c040b3993f41c967ff2278deStef Waltervoid mail_storage_clear_error(struct mail_storage *storage)
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter{
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter i_free(storage->error);
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter storage->error = NULL;
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter storage->syntax_error = FALSE;
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter storage->temporary_error = FALSE;
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter}
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter
c2cc119de8eac712c040b3993f41c967ff2278deStef Waltervoid mail_storage_set_error(struct mail_storage *storage, const char *fmt, ...)
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter{
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter va_list va;
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter mail_storage_clear_error(storage);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (fmt != NULL) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter va_start(va, fmt);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter storage->error = i_strdup_vprintf(fmt, va);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter va_end(va);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter }
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter}
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid mail_storage_set_syntax_error(struct mail_storage *storage,
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter const char *fmt, ...)
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter{
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter va_list va;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walter mail_storage_clear_error(storage);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walter if (fmt != NULL) {
1203e462650f035b0df2304075d60b9a99e36715Stef Walter va_start(va, fmt);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter storage->error = i_strdup_vprintf(fmt, va);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter storage->syntax_error = TRUE;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter va_end(va);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter }
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid mail_storage_set_internal_error(struct mail_storage *storage)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter struct tm *tm;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter char str[256];
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walter tm = localtime(&ioloop_time);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walter i_free(storage->error);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter storage->error =
1203e462650f035b0df2304075d60b9a99e36715Stef Walter strftime(str, sizeof(str), CRITICAL_MSG_STAMP, tm) > 0 ?
1203e462650f035b0df2304075d60b9a99e36715Stef Walter i_strdup(str) : i_strdup(CRITICAL_MSG);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter storage->syntax_error = FALSE;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter storage->temporary_error = TRUE;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid mail_storage_set_critical(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter const char *fmt, ...)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter va_list va;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walter mail_storage_clear_error(storage);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter if (fmt != NULL) {
1203e462650f035b0df2304075d60b9a99e36715Stef Walter va_start(va, fmt);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter i_error("%s", t_strdup_vprintf(fmt, va));
1203e462650f035b0df2304075d60b9a99e36715Stef Walter va_end(va);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walter /* critical errors may contain sensitive data, so let user
1203e462650f035b0df2304075d60b9a99e36715Stef Walter see only "Internal error" with a timestamp to make it
1203e462650f035b0df2304075d60b9a99e36715Stef Walter easier to look from log files the actual error message. */
1203e462650f035b0df2304075d60b9a99e36715Stef Walter mail_storage_set_internal_error(storage);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter }
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterchar mail_storage_get_hierarchy_sep(struct mail_storage *storage)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->hierarchy_sep;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid mail_storage_set_callbacks(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter struct mail_storage_callbacks *callbacks,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter void *context)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter storage->v.set_callbacks(storage, callbacks, context);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_mailbox_create(struct mail_storage *storage, const char *name,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter bool directory)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.mailbox_create(storage, name, directory);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_mailbox_delete(struct mail_storage *storage, const char *name)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.mailbox_delete(storage, name);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_mailbox_rename(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter const char *oldname, const char *newname)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.mailbox_rename(storage, oldname, newname);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterstruct mailbox_list_context *
1203e462650f035b0df2304075d60b9a99e36715Stef Waltermail_storage_mailbox_list_init(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter const char *ref, const char *mask,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter enum mailbox_list_flags flags)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.mailbox_list_init(storage, ref, mask, flags);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterstruct mailbox_list *
1203e462650f035b0df2304075d60b9a99e36715Stef Waltermail_storage_mailbox_list_next(struct mailbox_list_context *ctx)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return ctx->storage->v.mailbox_list_next(ctx);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_mailbox_list_deinit(struct mailbox_list_context **_ctx)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter struct mailbox_list_context *ctx = *_ctx;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walter *_ctx = NULL;
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return ctx->storage->v.mailbox_list_deinit(ctx);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_set_subscribed(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter const char *name, bool set)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.set_subscribed(storage, name, set);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_get_mailbox_name_status(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter const char *name,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter enum mailbox_name_status *status)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.get_mailbox_name_status(storage, name, status);
1203e462650f035b0df2304075d60b9a99e36715Stef Walter}
1203e462650f035b0df2304075d60b9a99e36715Stef Walter
1203e462650f035b0df2304075d60b9a99e36715Stef Walterconst char *mail_storage_get_last_error(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter bool *syntax_error_r,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter bool *temporary_error_r)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.get_last_error(storage, syntax_error_r,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter temporary_error_r);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekconst char *mail_storage_get_mailbox_path(struct mail_storage *storage,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *name, bool *is_file_r)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return storage->v.get_mailbox_path(storage, name, is_file_r);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekconst char *mail_storage_get_mailbox_control_dir(struct mail_storage *storage,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *name)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return storage->v.get_mailbox_control_dir(storage, name);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstruct mailbox *mailbox_open(struct mail_storage *storage, const char *name,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct istream *input,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek enum mailbox_open_flags flags)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return storage->v.mailbox_open(storage, name, input, flags);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_close(struct mailbox **_box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mailbox *box = *_box;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek *_box = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->v.close(box);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstruct mail_storage *mailbox_get_storage(struct mailbox *box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->storage;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekconst char *mailbox_get_name(struct mailbox *box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->name;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekbool mailbox_is_readonly(struct mailbox *box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->v.is_readonly(box);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekbool mailbox_allow_new_keywords(struct mailbox *box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->v.allow_new_keywords(box);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_get_status(struct mailbox *box,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek enum mailbox_status_items items,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mailbox_status *status)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->v.get_status(box, items, status);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstruct mailbox_sync_context *
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekmailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->v.sync_init(box, flags);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_sync_next(struct mailbox_sync_context *ctx,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mailbox_sync_rec *sync_rec_r)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->box->v.sync_next(ctx, sync_rec_r);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_sync_deinit(struct mailbox_sync_context **_ctx,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mailbox_status *status_r)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mailbox_sync_context *ctx = *_ctx;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek *_ctx = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->box->v.sync_deinit(ctx, status_r);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid mailbox_notify_changes(struct mailbox *box, unsigned int min_interval,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek mailbox_notify_callback_t *callback, void *context)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek box->v.notify_changes(box, min_interval, callback, context);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstruct mail_keywords *
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekmailbox_keywords_create(struct mailbox_transaction_context *t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *const keywords[])
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return t->box->v.keywords_create(t, keywords);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid mailbox_keywords_free(struct mailbox_transaction_context *t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mail_keywords **_keywords)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mail_keywords *keywords = *_keywords;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek *_keywords = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek t->box->v.keywords_free(t, keywords);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_get_uids(struct mailbox *box, uint32_t uid1, uint32_t uid2,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek uint32_t *seq1_r, uint32_t *seq2_r)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
58229439447d5617913a5a2e173b78105c694842Pavel Březina return box->v.get_uids(box, uid1, uid2, seq1_r, seq2_r);
58229439447d5617913a5a2e173b78105c694842Pavel Březina}
58229439447d5617913a5a2e173b78105c694842Pavel Březina
58229439447d5617913a5a2e173b78105c694842Pavel Březinastruct mailbox_header_lookup_ctx *
58229439447d5617913a5a2e173b78105c694842Pavel Březinamailbox_header_lookup_init(struct mailbox *box, const char *const headers[])
58229439447d5617913a5a2e173b78105c694842Pavel Březina{
58229439447d5617913a5a2e173b78105c694842Pavel Březina return box->v.header_lookup_init(box, headers);
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozek}
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozek
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozekvoid mailbox_header_lookup_deinit(struct mailbox_header_lookup_ctx **_ctx)
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozek{
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozek struct mailbox_header_lookup_ctx *ctx = *_ctx;
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozek
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozek *_ctx = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek ctx->box->v.header_lookup_deinit(ctx);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstruct mail_search_context *
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekmailbox_search_init(struct mailbox_transaction_context *t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *charset, struct mail_search_arg *args,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const enum mail_sort_type *sort_program)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return t->box->v.search_init(t, charset, args, sort_program);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_search_deinit(struct mail_search_context **_ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mail_search_context *ctx = *_ctx;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek *_ctx = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->transaction->box->v.search_deinit(ctx);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_search_next(struct mail_search_context *ctx, struct mail *mail)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->transaction->box->v.search_next(ctx, mail);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstruct mailbox_transaction_context *
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekmailbox_transaction_begin(struct mailbox *box,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek enum mailbox_transaction_flags flags)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->v.transaction_begin(box, flags);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_transaction_commit(struct mailbox_transaction_context **_t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek enum mailbox_sync_flags flags)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mailbox_transaction_context *t = *_t;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek *_t = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return t->box->v.transaction_commit(t, flags);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid mailbox_transaction_rollback(struct mailbox_transaction_context **_t)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mailbox_transaction_context *t = *_t;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek *_t = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek t->box->v.transaction_rollback(t);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_save_init(struct mailbox_transaction_context *t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek enum mail_flags flags, struct mail_keywords *keywords,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek time_t received_date, int timezone_offset,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *from_envelope, struct istream *input,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mail *dest_mail, struct mail_save_context **ctx_r)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (t->box->v.save_init(t, flags, keywords,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek received_date, timezone_offset,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek from_envelope, input, dest_mail, ctx_r) < 0)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return -1;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek (*ctx_r)->dest_mail = dest_mail;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return 0;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_save_continue(struct mail_save_context *ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->transaction->box->v.save_continue(ctx);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_save_finish(struct mail_save_context **_ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mail_save_context *ctx = *_ctx;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek *_ctx = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->transaction->box->v.save_finish(ctx);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid mailbox_save_cancel(struct mail_save_context **_ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mail_save_context *ctx = *_ctx;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
1203e462650f035b0df2304075d60b9a99e36715Stef Walter *_ctx = NULL;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek ctx->transaction->box->v.save_cancel(ctx);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_copy(struct mailbox_transaction_context *t, struct mail *mail,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek enum mail_flags flags, struct mail_keywords *keywords,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mail *dest_mail)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return t->box->v.copy(t, mail, flags, keywords, dest_mail);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
1203e462650f035b0df2304075d60b9a99e36715Stef Walterbool mailbox_is_inconsistent(struct mailbox *box)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return box->v.is_inconsistent(box);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekbool mailbox_name_is_too_large(const char *name, char sep)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek{
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek unsigned int levels = 1, level_len = 0;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek for (; *name != '\0'; name++) {
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (*name == sep) {
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (level_len > MAILBOX_MAX_HIERARCHY_NAME_LENGTH)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return TRUE;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek levels++;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek level_len = 0;
58229439447d5617913a5a2e173b78105c694842Pavel Březina } else {
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozek level_len++;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek }
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek }
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (level_len > MAILBOX_MAX_HIERARCHY_NAME_LENGTH)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return TRUE;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (levels > MAILBOX_MAX_HIERARCHY_LEVELS)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return TRUE;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return FALSE;
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek}
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek