]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added mailbox { driver } setting to specify which storage to use.
authorTimo Sirainen <tss@iki.fi>
Sat, 8 Jun 2013 21:48:14 +0000 (00:48 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 8 Jun 2013 21:48:14 +0000 (00:48 +0300)
src/lib-storage/mail-storage-settings.c
src/lib-storage/mail-storage-settings.h
src/lib-storage/mailbox-list.c

index 67f724de37526f89fc7b06687f667e1dd76999bd..6c13dbeab3a71e54b2362bbc05d44c04f342935f 100644 (file)
@@ -118,6 +118,7 @@ static const struct setting_define mailbox_setting_defines[] = {
        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 @@ const struct mailbox_settings mailbox_default_settings = {
        .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 = {
index aeeadc895c85f009731bb6a5c9645cf0d97b2028..7c5e52b742aca825f61c4fcfeda866ff5c3b13a0 100644 (file)
@@ -75,6 +75,7 @@ struct mailbox_settings {
        const char *name;
        const char *autocreate;
        const char *special_use;
+       const char *driver;
 };
 
 struct mail_user_settings {
index 29e878db20b1202debec61485c4ce25647904dd9..03e5fec70ead026f97bab42ec7f12561f347e093 100644 (file)
@@ -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 @@ mailbox_list_get_user(const struct mailbox_list *list)
        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,