dovecot-2.2: lib-storage: Added mailbox { driver } setting to sp...

dovecot at dovecot.org dovecot at dovecot.org
Sun Jun 9 00:48:19 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/7e91b0709f06
changeset: 16481:7e91b0709f06
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Jun 09 00:48:14 2013 +0300
description:
lib-storage: Added mailbox { driver } setting to specify which storage to use.

diffstat:

 src/lib-storage/mail-storage-settings.c |   4 ++-
 src/lib-storage/mail-storage-settings.h |   1 +
 src/lib-storage/mailbox-list.c          |  43 +++++++++++++++++++++++++++++---
 3 files changed, 43 insertions(+), 5 deletions(-)

diffs (98 lines):

diff -r d952b4091425 -r 7e91b0709f06 src/lib-storage/mail-storage-settings.c
--- a/src/lib-storage/mail-storage-settings.c	Sun Jun 09 00:46:06 2013 +0300
+++ b/src/lib-storage/mail-storage-settings.c	Sun Jun 09 00:48:14 2013 +0300
@@ -118,6 +118,7 @@
 	DEF(SET_STR, name),
 	{ SET_ENUM, "auto", offsetof(struct mailbox_settings, autocreate), NULL } ,
 	DEF(SET_STR, special_use),
+	DEF(SET_STR, driver),
 
 	SETTING_DEFINE_LIST_END
 };
@@ -127,7 +128,8 @@
 	.autocreate = MAILBOX_SET_AUTO_NO":"
 		MAILBOX_SET_AUTO_CREATE":"
 		MAILBOX_SET_AUTO_SUBSCRIBE,
-	.special_use = ""
+	.special_use = "",
+	.driver = ""
 };
 
 const struct setting_parser_info mailbox_setting_parser_info = {
diff -r d952b4091425 -r 7e91b0709f06 src/lib-storage/mail-storage-settings.h
--- a/src/lib-storage/mail-storage-settings.h	Sun Jun 09 00:46:06 2013 +0300
+++ b/src/lib-storage/mail-storage-settings.h	Sun Jun 09 00:48:14 2013 +0300
@@ -75,6 +75,7 @@
 	const char *name;
 	const char *autocreate;
 	const char *special_use;
+	const char *driver;
 };
 
 struct mail_user_settings {
diff -r d952b4091425 -r 7e91b0709f06 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Sun Jun 09 00:46:06 2013 +0300
+++ b/src/lib-storage/mailbox-list.c	Sun Jun 09 00:48:14 2013 +0300
@@ -15,7 +15,7 @@
 #include "imap-utf7.h"
 #include "mailbox-log.h"
 #include "mailbox-tree.h"
-#include "mail-storage.h"
+#include "mail-storage-private.h"
 #include "mail-storage-hooks.h"
 #include "mailbox-list-private.h"
 
@@ -770,15 +770,50 @@
 	return list->ns->user;
 }
 
+static int
+mailbox_list_get_storage_driver(struct mailbox_list *list, const char *driver,
+				struct mail_storage **storage_r)
+{
+	struct mail_storage *const *storagep;
+	const char *error, *data;
+
+	array_foreach(&list->ns->all_storages, storagep) {
+		if (strcmp((*storagep)->name, driver) == 0) {
+			*storage_r = *storagep;
+			return 0;
+		}
+	}
+
+	data = strchr(list->ns->set->location, ':');
+	if (data == NULL)
+		data = "";
+	else
+		data++;
+	if (mail_storage_create_full(list->ns, driver, data, 0,
+				     storage_r, &error) < 0) {
+		mailbox_list_set_critical(list,
+			"Namespace %s: Failed to create storage '%s': %s",
+			list->ns->prefix, driver, error);
+		return -1;
+	}
+	return 0;
+}
+
 int mailbox_list_get_storage(struct mailbox_list **list, const char *vname,
 			     struct mail_storage **storage_r)
 {
+	const struct mailbox_settings *set;
+
 	if ((*list)->v.get_storage != NULL)
 		return (*list)->v.get_storage(list, vname, storage_r);
-	else {
-		*storage_r = mail_namespace_get_default_storage((*list)->ns);
-		return 0;
+
+	set = mailbox_settings_find((*list)->ns->user, vname);
+	if (set != NULL && set->driver[0] != '\0') {
+		return mailbox_list_get_storage_driver(*list, set->driver,
+						       storage_r);
 	}
+	*storage_r = mail_namespace_get_default_storage((*list)->ns);
+	return 0;
 }
 
 void mailbox_list_get_default_storage(struct mailbox_list *list,


More information about the dovecot-cvs mailing list