Fallback driver after autodection
Bjoern Koenig
dovecot at koenigbj.8bx.de
Sat May 16 00:17:55 EEST 2020
Dear developers and dovecot users,
I am running a dovecot with virtual users that have a mailbox using the
Maildir format.
mail_location = maildir:/usr/local/virtual/%d/%n
New mailboxes are created on-the-fly if a new user logs in. I had the
wish that the mailboxes of new users are created using the sdbox format
and old mailboxes remain in Maildir format.
In case the Maildir and sdbox mailboxes already exist, it is easy to use
the "auto" driver which detects the correct format. But it is not
possible to create mailboxes with the "auto" driver because there is no
way to tell dovecot the preferred mailbox format. I wrote some lines of
code which add the possibility to specify a fallback driver that will be
used if a mailbox is created with the "auto" driver.
mail_location = auto:/usr/local/virtual/%d/%n:FALLBACK=sdbox
In case you like the idea you might want to develop it further. I am
aware of the fact that there are some caveats if you mix it with other
settings like LAYOUT. It won't work in any case.
Best regards
Bjoern
---------------------------------------------------------------------------
diff -ruN src.bak/lib-storage/mail-storage.c
src/lib-storage/mail-storage.c
--- src/lib-storage/mail-storage.c.bak 2020-03-05 15:35:53.000000000
+0100
+++ src/lib-storage/mail-storage.c 2020-05-15 22:35:40.975992000 +0200
@@ -144,6 +144,10 @@
return classes[i];
}
}
+
+ if (set->fallback_driver != NULL)
+ return mail_storage_find_class(set->fallback_driver);
+
return NULL;
}
@@ -216,8 +220,10 @@
}
storage_class = mail_storage_autodetect(ns, list_set);
- if (storage_class != NULL)
+ if (storage_class != NULL) {
+ storage_class->v.get_list_settings(ns, list_set);
return storage_class;
+ }
(void)mail_user_get_home(ns->user, &home);
if (home == NULL || *home == '\0') home = "(not set)";
diff -ruN src.bak/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.c
--- src/lib-storage/mailbox-list.c.bak 2020-03-05 15:35:53.000000000
+0100
+++ src/lib-storage/mailbox-list.c 2020-05-15 22:34:44.329802000 +0200
@@ -173,6 +173,8 @@
list->set.inbox_path = p_strdup(list->pool, set->inbox_path);
list->set.subscription_fname =
p_strdup(list->pool, set->subscription_fname);
+ list->set.fallback_driver =
+ p_strdup(list->pool, set->fallback_driver);
list->set.list_index_fname =
p_strdup(list->pool, set->list_index_fname);
list->set.list_index_dir =
@@ -360,6 +362,8 @@
else if (strcmp(key, "FULLDIRNAME") == 0) {
set_r->index_control_use_maildir_name = TRUE;
dest = &set_r->maildir_name;
+ } else if (strcmp(key, "FALLBACK") == 0) {
+ dest = &set_r->fallback_driver;
} else if (strcmp(key, "BROKENCHAR") == 0) {
if (strlen(value) != 1) {
*error_r = "BROKENCHAR value must be a single character";
diff -ruN src.bak/lib-storage/mailbox-list.h
src/lib-storage/mailbox-list.h
--- src/lib-storage/mailbox-list.h.bak 2020-03-05 15:35:53.000000000
+0100
+++ src/lib-storage/mailbox-list.h 2020-05-15 22:35:01.251579000 +0200
@@ -121,6 +121,7 @@
const char *inbox_path;
const char *subscription_fname;
+ const char *fallback_driver;
const char *list_index_fname;
/* Mailbox list index directory. NULL defaults to index directory.
The path may be relative to the index directory. */
---------------------------------------------------------------------------
More information about the dovecot
mailing list