dovecot-2.0: mail storages can now be shared between namespaces.
dovecot at dovecot.org
dovecot at dovecot.org
Wed Jun 3 23:46:09 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/4f46cee3a1d4
changeset: 9436:4f46cee3a1d4
user: Timo Sirainen <tss at iki.fi>
date: Wed Jun 03 16:45:23 2009 -0400
description:
mail storages can now be shared between namespaces.
diffstat:
15 files changed, 112 insertions(+), 93 deletions(-)
src/lib-storage/index/cydir/cydir-storage.c | 19 ++------
src/lib-storage/index/dbox/dbox-storage-rebuild.c | 19 ++------
src/lib-storage/index/dbox/dbox-storage.c | 16 +++----
src/lib-storage/index/maildir/maildir-storage.c | 13 ++---
src/lib-storage/index/mbox/mbox-storage.c | 13 ++---
src/lib-storage/index/raw/raw-storage.c | 18 ++-----
src/lib-storage/index/shared/shared-storage.c | 5 +-
src/lib-storage/mail-namespace.c | 9 ++-
src/lib-storage/mail-storage-private.h | 14 +++++-
src/lib-storage/mail-storage.c | 48 +++++++++++++++++++--
src/lib-storage/mail-storage.h | 3 -
src/lib-storage/mail-user.h | 1
src/lib-storage/mailbox-list.c | 3 -
src/plugins/convert/convert-storage.c | 2
src/plugins/virtual/virtual-storage.c | 22 +++------
diffs (truncated from 646 to 300 lines):
diff -r da12e994d942 -r 4f46cee3a1d4 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c Wed Jun 03 15:57:55 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-storage.c Wed Jun 03 16:45:23 2009 -0400
@@ -26,8 +26,6 @@ static MODULE_CONTEXT_DEFINE_INIT(cydir_
static MODULE_CONTEXT_DEFINE_INIT(cydir_mailbox_list_module,
&mailbox_list_module_register);
-static void cydir_list_init(struct mailbox_list *list);
-
static struct mail_storage *cydir_storage_alloc(void)
{
struct cydir_storage *storage;
@@ -38,15 +36,6 @@ static struct mail_storage *cydir_storag
storage->storage = cydir_storage;
storage->storage.pool = pool;
return &storage->storage;
-}
-
-static int
-cydir_storage_create(struct mail_storage *_storage ATTR_UNUSED,
- struct mail_namespace *ns,
- const char **error_r ATTR_UNUSED)
-{
- cydir_list_init(ns->list);
- return 0;
}
static void
@@ -336,7 +325,8 @@ static void cydir_class_deinit(void)
cydir_transaction_class_deinit();
}
-static void cydir_list_init(struct mailbox_list *list)
+static void cydir_storage_add_list(struct mail_storage *storage ATTR_UNUSED,
+ struct mailbox_list *list)
{
struct cydir_mailbox_list *mlist;
@@ -351,15 +341,16 @@ static void cydir_list_init(struct mailb
struct mail_storage cydir_storage = {
MEMBER(name) CYDIR_STORAGE_NAME,
- MEMBER(mailbox_is_file) FALSE,
+ MEMBER(class_flags) 0,
{
NULL,
cydir_class_init,
cydir_class_deinit,
cydir_storage_alloc,
- cydir_storage_create,
+ NULL,
index_storage_destroy,
+ cydir_storage_add_list,
cydir_storage_get_list_settings,
NULL,
cydir_mailbox_open,
diff -r da12e994d942 -r 4f46cee3a1d4 src/lib-storage/index/dbox/dbox-storage-rebuild.c
--- a/src/lib-storage/index/dbox/dbox-storage-rebuild.c Wed Jun 03 15:57:55 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-storage-rebuild.c Wed Jun 03 16:45:23 2009 -0400
@@ -469,20 +469,13 @@ static int rebuild_mailboxes(struct dbox
{
struct mail_user *user = ctx->storage->storage.user;
struct mail_namespace *ns;
- const char *rebuild_dir, *ns_dir;
-
- rebuild_dir = ctx->storage->storage_dir;
+
for (ns = user->namespaces; ns != NULL; ns = ns->next) {
- if (strcmp(ns->storage->name, "dbox") != 0)
- continue;
-
- ns_dir = mailbox_list_get_path(ns->list, NULL,
- MAILBOX_LIST_PATH_TYPE_DIR);
- if (strcmp(ns_dir, rebuild_dir) != 0)
- continue;
-
- if (rebuild_namespace_mailboxes(ctx, ns) < 0)
- return -1;
+ if (ns->storage == &ctx->storage->storage &&
+ ns->alias_for == NULL) {
+ if (rebuild_namespace_mailboxes(ctx, ns) < 0)
+ return -1;
+ }
}
return 0;
}
diff -r da12e994d942 -r 4f46cee3a1d4 src/lib-storage/index/dbox/dbox-storage.c
--- a/src/lib-storage/index/dbox/dbox-storage.c Wed Jun 03 15:57:55 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-storage.c Wed Jun 03 16:45:23 2009 -0400
@@ -39,9 +39,6 @@ static MODULE_CONTEXT_DEFINE_INIT(dbox_m
static MODULE_CONTEXT_DEFINE_INIT(dbox_mailbox_list_module,
&mailbox_list_module_register);
-static void dbox_list_init(struct mailbox_list *list,
- const struct dbox_settings *set);
-
static struct mail_storage *dbox_storage_alloc(void)
{
struct dbox_storage *storage;
@@ -69,7 +66,8 @@ dbox_storage_create(struct mail_storage
return -1;
}
- dbox_list_init(ns->list, storage->set);
+ _storage->unique_root_dir =
+ p_strdup(_storage->pool, ns->list->set.root_dir);
dir = mailbox_list_get_path(ns->list, NULL, MAILBOX_LIST_PATH_TYPE_DIR);
storage->storage_dir = p_strconcat(_storage->pool, dir,
@@ -162,6 +160,7 @@ dbox_open(struct dbox_storage *storage,
mbox->ibox.box = dbox_mailbox;
mbox->ibox.box.pool = pool;
mbox->ibox.box.storage = _storage;
+ mbox->ibox.box.list = list;
mbox->ibox.mail_vfuncs = &dbox_mail_vfuncs;
mbox->ibox.index = index;
mbox->ibox.keep_index_backups = TRUE;
@@ -720,14 +719,14 @@ static void dbox_class_deinit(void)
dbox_transaction_class_deinit();
}
-static void dbox_list_init(struct mailbox_list *list,
- const struct dbox_settings *set)
+static void dbox_storage_add_list(struct mail_storage *storage,
+ struct mailbox_list *list)
{
struct dbox_mailbox_list *mlist;
mlist = p_new(list->pool, struct dbox_mailbox_list, 1);
mlist->module_ctx.super = list->v;
- mlist->set = set;
+ mlist->set = mail_storage_get_driver_settings(storage);
list->v.iter_is_mailbox = dbox_list_iter_is_mailbox;
list->v.delete_mailbox = dbox_list_delete_mailbox;
@@ -739,7 +738,7 @@ static void dbox_list_init(struct mailbo
struct mail_storage dbox_storage = {
MEMBER(name) DBOX_STORAGE_NAME,
- MEMBER(mailbox_is_file) FALSE,
+ MEMBER(class_flags) MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT, /* FIXME: for multi-dbox only.. */
{
dbox_get_setting_parser_info,
@@ -748,6 +747,7 @@ struct mail_storage dbox_storage = {
dbox_storage_alloc,
dbox_storage_create,
dbox_storage_destroy,
+ dbox_storage_add_list,
dbox_storage_get_list_settings,
NULL,
dbox_mailbox_open,
diff -r da12e994d942 -r 4f46cee3a1d4 src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c Wed Jun 03 15:57:55 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-storage.c Wed Jun 03 16:45:23 2009 -0400
@@ -44,9 +44,6 @@ static MODULE_CONTEXT_DEFINE_INIT(maildi
&mailbox_list_module_register);
static const char *maildir_subdirs[] = { "cur", "new", "tmp" };
-static void maildir_list_init(struct mailbox_list *list,
- const struct maildir_settings *set);
-
static bool maildir_is_internal_name(const char *name)
{
return strcmp(name, "cur") == 0 ||
@@ -114,7 +111,6 @@ maildir_storage_create(struct mail_stora
const char *dir;
storage->set = mail_storage_get_driver_settings(_storage);
- maildir_list_init(list, storage->set);
storage->maildir_list_ext_id = (uint32_t)-1;
storage->temp_prefix = mailbox_list_get_temp_prefix(list);
@@ -1007,14 +1003,14 @@ static void maildir_class_deinit(void)
maildir_transaction_class_deinit();
}
-static void maildir_list_init(struct mailbox_list *list,
- const struct maildir_settings *set)
+static void maildir_storage_add_list(struct mail_storage *storage,
+ struct mailbox_list *list)
{
struct maildir_mailbox_list *mlist;
mlist = p_new(list->pool, struct maildir_mailbox_list, 1);
mlist->module_ctx.super = list->v;
- mlist->set = set;
+ mlist->set = mail_storage_get_driver_settings(storage);
if (strcmp(list->name, MAILBOX_LIST_NAME_MAILDIRPLUSPLUS) == 0) {
list->v.iter_is_mailbox = maildirplusplus_iter_is_mailbox;
@@ -1032,7 +1028,7 @@ static void maildir_list_init(struct mai
struct mail_storage maildir_storage = {
MEMBER(name) MAILDIR_STORAGE_NAME,
- MEMBER(mailbox_is_file) FALSE,
+ MEMBER(class_flags) 0,
{
maildir_get_setting_parser_info,
@@ -1041,6 +1037,7 @@ struct mail_storage maildir_storage = {
maildir_storage_alloc,
maildir_storage_create,
index_storage_destroy,
+ maildir_storage_add_list,
maildir_storage_get_list_settings,
maildir_storage_autodetect,
maildir_mailbox_open,
diff -r da12e994d942 -r 4f46cee3a1d4 src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c Wed Jun 03 15:57:55 2009 -0400
+++ b/src/lib-storage/index/mbox/mbox-storage.c Wed Jun 03 16:45:23 2009 -0400
@@ -73,9 +73,6 @@ static MODULE_CONTEXT_DEFINE_INIT(mbox_m
static MODULE_CONTEXT_DEFINE_INIT(mbox_mailbox_list_module,
&mailbox_list_module_register);
-static void mbox_list_init(struct mailbox_list *list,
- const struct mbox_settings *set);
-
int mbox_set_syscall_error(struct mbox_mailbox *mbox, const char *function)
{
i_assert(function != NULL);
@@ -134,7 +131,6 @@ mbox_storage_create(struct mail_storage
const char *dir;
storage->set = mail_storage_get_driver_settings(_storage);
- mbox_list_init(ns->list, storage->set);
dir = mailbox_list_get_path(ns->list, NULL,
MAILBOX_LIST_PATH_TYPE_INDEX);
@@ -841,14 +837,14 @@ static void mbox_class_deinit(void)
mbox_transaction_class_deinit();
}
-static void mbox_list_init(struct mailbox_list *list,
- const struct mbox_settings *set)
+static void mbox_storage_add_list(struct mail_storage *storage,
+ struct mailbox_list *list)
{
struct mbox_mailbox_list *mlist;
mlist = p_new(list->pool, struct mbox_mailbox_list, 1);
mlist->module_ctx.super = list->v;
- mlist->set = set;
+ mlist->set = mail_storage_get_driver_settings(storage);
if (strcmp(list->name, MAILBOX_LIST_NAME_FS) == 0 &&
*list->set.maildir_name == '\0') {
@@ -865,7 +861,7 @@ static void mbox_list_init(struct mailbo
struct mail_storage mbox_storage = {
MEMBER(name) MBOX_STORAGE_NAME,
- MEMBER(mailbox_is_file) TRUE,
+ MEMBER(class_flags) MAIL_STORAGE_CLASS_FLAG_MAILBOX_IS_FILE,
{
mbox_get_setting_parser_info,
@@ -874,6 +870,7 @@ struct mail_storage mbox_storage = {
mbox_storage_alloc,
mbox_storage_create,
index_storage_destroy,
+ mbox_storage_add_list,
mbox_storage_get_list_settings,
mbox_storage_autodetect,
mbox_mailbox_open,
diff -r da12e994d942 -r 4f46cee3a1d4 src/lib-storage/index/raw/raw-storage.c
--- a/src/lib-storage/index/raw/raw-storage.c Wed Jun 03 15:57:55 2009 -0400
+++ b/src/lib-storage/index/raw/raw-storage.c Wed Jun 03 16:45:23 2009 -0400
@@ -16,8 +16,6 @@ extern struct mail_storage raw_storage;
extern struct mail_storage raw_storage;
extern struct mailbox raw_mailbox;
-static void raw_list_init(struct mailbox_list *list);
-
static struct mail_storage *raw_storage_alloc(void)
{
struct raw_storage *storage;
@@ -28,14 +26,6 @@ static struct mail_storage *raw_storage_
storage->storage = raw_storage;
storage->storage.pool = pool;
return &storage->storage;
-}
-
-static int
-raw_storage_create(struct mail_storage *_storage ATTR_UNUSED,
- struct mail_namespace *ns, const char **error_r ATTR_UNUSED)
-{
- raw_list_init(ns->list);
- return 0;
}
static void
@@ -196,7 +186,8 @@ static void raw_class_deinit(void)
raw_transaction_class_deinit();
}
-static void raw_list_init(struct mailbox_list *list)
+static void raw_storage_add_list(struct mail_storage *storage ATTR_UNUSED,
+ struct mailbox_list *list)
{
More information about the dovecot-cvs
mailing list