changeset 13711:e0556ffd1527

lib-storage: Fixed using "auto" driver with shared namespaces.
author Timo Sirainen <tss@iki.fi>
date Wed, 16 Nov 2011 19:39:33 +0200
parents f11ce0efa6a8
children 4bdfe947a0b2
files src/lib-storage/index/shared/shared-storage.c src/lib-storage/index/shared/shared-storage.h
diffstat 2 files changed, 11 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/shared/shared-storage.c	Wed Nov 16 19:39:18 2011 +0200
+++ b/src/lib-storage/index/shared/shared-storage.c	Wed Nov 16 19:39:33 2011 +0200
@@ -31,6 +31,7 @@
 		      const char **error_r)
 {
 	struct shared_storage *storage = (struct shared_storage *)_storage;
+	struct mail_storage *storage_class;
 	const char *driver, *p;
 	char *wildcardp, key;
 	bool have_username;
@@ -45,13 +46,14 @@
 	storage->location = p_strdup(_storage->pool, ns->set->location);
 	storage->unexpanded_location =
 		p_strdup(_storage->pool, ns->unexpanded_set->location);
-	storage->storage_class = mail_storage_find_class(driver);
-	if (storage->storage_class == NULL) {
+	storage_class = mail_storage_find_class(driver);
+	if (storage_class != NULL)
+		_storage->class_flags = storage_class->class_flags;
+	else if (strcmp(driver, "auto") != 0) {
 		*error_r = t_strconcat("Unknown shared storage driver: ",
 				       driver, NULL);
 		return -1;
 	}
-	_storage->class_flags = storage->storage_class->class_flags;
 
 	wildcardp = strchr(ns->prefix, '%');
 	if (wildcardp == NULL) {
@@ -106,7 +108,7 @@
 {
 	/* user wasn't found. we'll still need to create the storage
 	   to avoid exposing which users exist and which don't. */
-	str_append(location, storage->storage_class->name);
+	str_append(location, storage->storage_class_name);
 	str_append_c(location, ':');
 
 	/* use a reachable but nonexistent path as the mail root directory */
@@ -309,6 +311,10 @@
 	*_name = mailbox_list_get_storage_name(new_ns->list,
 				t_strconcat(new_ns->prefix, name, NULL));
 	*_ns = new_ns;
+	if (_storage->class_flags == 0) {
+		/* flags are unset if we were using "auto" storage */
+		_storage->class_flags = new_ns->storage->class_flags;
+	}
 
 	mail_user_add_namespace(user, &new_ns);
 	return 0;
--- a/src/lib-storage/index/shared/shared-storage.h	Wed Nov 16 19:39:18 2011 +0200
+++ b/src/lib-storage/index/shared/shared-storage.h	Wed Nov 16 19:39:33 2011 +0200
@@ -10,7 +10,7 @@
 	const char *ns_prefix_pattern;
 	const char *location, *unexpanded_location;
 
-	struct mail_storage *storage_class;
+	const char *storage_class_name;
 };
 
 struct mailbox_list *shared_mailbox_list_alloc(void);