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