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