dovecot-2.0: lib-storage: Added "none" mailbox list driver.

dovecot at dovecot.org dovecot at dovecot.org
Mon Apr 5 04:50:27 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/6b1f08814e59
changeset: 11060:6b1f08814e59
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Apr 05 04:49:17 2010 +0300
description:
lib-storage: Added "none" mailbox list driver.
Fixed the most obvious crashes when using the driver.

diffstat:

 src/lib-storage/index/index-storage.c    |    2 +-
 src/lib-storage/list/Makefile.am         |    1 +
 src/lib-storage/list/mailbox-list-none.c |  185 +++++++++++++++++++++++++++++++++++++
 src/lib-storage/mail-storage.c           |   34 ++++--
 src/lib-storage/mailbox-list.c           |   35 +++++-
 src/lib-storage/mailbox-list.h           |    7 +-
 src/lib-storage/register/Makefile.am     |    2 +-
 7 files changed, 245 insertions(+), 21 deletions(-)

diffs (truncated from 389 to 300 lines):

diff -r 6a65c0e043e2 -r 6b1f08814e59 src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c	Mon Apr 05 04:49:10 2010 +0300
+++ b/src/lib-storage/index/index-storage.c	Mon Apr 05 04:49:17 2010 +0300
@@ -39,7 +39,7 @@
 					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	index_dir = mailbox_list_get_path(list, name,
 					  MAILBOX_LIST_PATH_TYPE_INDEX);
-	if (strcmp(index_dir, root_dir) == 0 || *index_dir == '\0')
+	if (*index_dir == '\0' || strcmp(index_dir, root_dir) == 0)
 		return 0;
 
 	mailbox_list_get_dir_permissions(list, name, &mode, &gid, &origin);
diff -r 6a65c0e043e2 -r 6b1f08814e59 src/lib-storage/list/Makefile.am
--- a/src/lib-storage/list/Makefile.am	Mon Apr 05 04:49:10 2010 +0300
+++ b/src/lib-storage/list/Makefile.am	Mon Apr 05 04:49:17 2010 +0300
@@ -17,6 +17,7 @@
 	mailbox-list-fs-iter.c \
 	mailbox-list-maildir.c \
 	mailbox-list-maildir-iter.c \
+	mailbox-list-none.c \
 	mailbox-list-subscriptions.c \
 	subscription-file.c
 
diff -r 6a65c0e043e2 -r 6b1f08814e59 src/lib-storage/list/mailbox-list-none.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib-storage/list/mailbox-list-none.c	Mon Apr 05 04:49:17 2010 +0300
@@ -0,0 +1,185 @@
+/* Copyright (c) 2006-2010 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "mailbox-list-private.h"
+
+#define MAILBOX_LIST_NAME_NONE "none"
+#define GLOBAL_TEMP_PREFIX ".temp."
+
+extern struct mailbox_list none_mailbox_list;
+
+static struct mailbox_list *none_list_alloc(void)
+{
+	struct mailbox_list *list;
+	pool_t pool;
+
+	pool = pool_alloconly_create("none list", 2048);
+
+	list = p_new(pool, struct mailbox_list, 1);
+	*list = none_mailbox_list;
+	list->pool = pool;
+	return list;
+}
+
+static void none_list_deinit(struct mailbox_list *list)
+{
+	pool_unref(&list->pool);
+}
+
+static bool
+none_is_valid_pattern(struct mailbox_list *list ATTR_UNUSED,
+		      const char *pattern ATTR_UNUSED)
+{
+	return TRUE;
+}
+
+static bool
+none_is_valid_existing_name(struct mailbox_list *list ATTR_UNUSED,
+			    const char *name ATTR_UNUSED)
+{
+	return TRUE;
+}
+
+static bool
+none_is_valid_create_name(struct mailbox_list *list ATTR_UNUSED,
+			  const char *name ATTR_UNUSED)
+{
+	return FALSE;
+}
+
+static const char *
+none_list_get_path(struct mailbox_list *list ATTR_UNUSED,
+		   const char *name ATTR_UNUSED,
+		   enum mailbox_list_path_type type ATTR_UNUSED)
+{
+	if (type == MAILBOX_LIST_PATH_TYPE_INDEX)
+		return "";
+	return NULL;
+}
+
+static int
+none_list_get_mailbox_name_status(struct mailbox_list *list ATTR_UNUSED,
+				  const char *name ATTR_UNUSED,
+				  enum mailbox_name_status *status)
+{
+	*status = MAILBOX_NAME_VALID;
+	return 0;
+}
+
+static const char *
+none_list_get_temp_prefix(struct mailbox_list *list ATTR_UNUSED,
+			  bool global ATTR_UNUSED)
+{
+	return GLOBAL_TEMP_PREFIX;
+}
+
+static int none_list_set_subscribed(struct mailbox_list *list,
+				    const char *name ATTR_UNUSED,
+				    bool set ATTR_UNUSED)
+{
+	mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
+	return -1;
+}
+
+static int
+none_list_create_mailbox_dir(struct mailbox_list *list,
+			     const char *name ATTR_UNUSED,
+			     bool directory ATTR_UNUSED)
+{
+	mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
+	return -1;
+}
+
+static int none_list_delete_mailbox(struct mailbox_list *list,
+				    const char *name ATTR_UNUSED)
+{
+	mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
+	return -1;
+}
+
+static int none_list_delete_dir(struct mailbox_list *list,
+				const char *name ATTR_UNUSED)
+{
+	mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
+	return -1;
+}
+
+static int
+none_list_rename_mailbox(struct mailbox_list *oldlist,
+			 const char *oldname ATTR_UNUSED,
+			 struct mailbox_list *newlist ATTR_UNUSED,
+			 const char *newname ATTR_UNUSED,
+			 bool rename_children ATTR_UNUSED)
+{
+	mailbox_list_set_error(oldlist, MAIL_ERROR_NOTPOSSIBLE,
+			       "Not supported");
+	return -1;
+}
+
+static struct mailbox_list_iterate_context *
+none_list_iter_init(struct mailbox_list *list,
+		    const char *const *patterns ATTR_UNUSED,
+		    enum mailbox_list_iter_flags flags)
+{
+	struct mailbox_list_iterate_context *ctx;
+
+	ctx = i_new(struct mailbox_list_iterate_context, 1);
+	ctx->list = list;
+	ctx->flags = flags;
+	return ctx;
+}
+
+static int
+none_list_iter_deinit(struct mailbox_list_iterate_context *ctx)
+{
+	i_free(ctx);
+	return 0;
+}
+
+static const struct mailbox_info *
+none_list_iter_next(struct mailbox_list_iterate_context *ctx ATTR_UNUSED)
+{
+	return NULL;
+}
+
+static int
+none_list_get_mailbox_flags(struct mailbox_list *list ATTR_UNUSED,
+			    const char *dir ATTR_UNUSED,
+			    const char *fname ATTR_UNUSED,
+			    enum mailbox_list_file_type type ATTR_UNUSED,
+			    struct stat *st_r ATTR_UNUSED,
+			    enum mailbox_info_flags *flags)
+{
+	*flags = MAILBOX_NONEXISTENT;
+	return 0;
+}
+
+struct mailbox_list none_mailbox_list = {
+	.name = MAILBOX_LIST_NAME_NONE,
+	.hierarchy_sep = '/',
+	.props = MAILBOX_LIST_PROP_NO_ROOT,
+	.mailbox_name_max_length = MAILBOX_LIST_NAME_MAX_LENGTH,
+
+	{
+		none_list_alloc,
+		none_list_deinit,
+		NULL,
+		none_is_valid_pattern,
+		none_is_valid_existing_name,
+		none_is_valid_create_name,
+		none_list_get_path,
+		none_list_get_mailbox_name_status,
+		none_list_get_temp_prefix,
+		NULL,
+		none_list_iter_init,
+		none_list_iter_next,
+		none_list_iter_deinit,
+		none_list_get_mailbox_flags,
+		NULL,
+		none_list_set_subscribed,
+		none_list_create_mailbox_dir,
+		none_list_delete_mailbox,
+		none_list_delete_dir,
+		none_list_rename_mailbox
+	}
+};
diff -r 6a65c0e043e2 -r 6b1f08814e59 src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c	Mon Apr 05 04:49:10 2010 +0300
+++ b/src/lib-storage/mail-storage.c	Mon Apr 05 04:49:17 2010 +0300
@@ -118,9 +118,9 @@
 static struct mail_storage *
 mail_storage_get_class(struct mail_namespace *ns, const char *driver,
 		       struct mailbox_list_settings *list_set,
-		       const char **error_r)
+		       enum mail_storage_flags flags, const char **error_r)
 {
-	struct mail_storage *storage_class;
+	struct mail_storage *storage_class = NULL;
 	const char *home;
 
 	if (driver != NULL) {
@@ -130,7 +130,27 @@
 				"Unknown mail storage driver %s", driver);
 			return NULL;
 		}
+	}
 
+	if (list_set->root_dir == NULL || *list_set->root_dir == '\0') {
+		/* no root directory given. is this allowed? */
+		const struct mailbox_list *list;
+
+		list = list_set->layout == NULL ? NULL :
+			mailbox_list_find_class(list_set->layout);
+		if (storage_class == NULL &&
+		    (flags & MAIL_STORAGE_FLAG_NO_AUTODETECTION) == 0) {
+			/* autodetection should take care of this */
+		} else if (list != NULL &&
+			   (list->props & MAILBOX_LIST_PROP_NO_ROOT) != 0) {
+			/* root not required for this layout */
+		} else {
+			*error_r = "Root mail directory not given";
+			return NULL;
+		}
+	}
+
+	if (storage_class != NULL) {
 		storage_class->v.get_list_settings(ns, list_set);
 		return storage_class;
 	}
@@ -255,14 +275,8 @@
 			return -1;
 	}
 
-	if ((list_set.root_dir == NULL || *list_set.root_dir == '\0') &&
-	    (driver != NULL ||
-	     (flags & MAIL_STORAGE_FLAG_NO_AUTODETECTION) != 0)) {
-		*error_r = "Root mail directory not given";
-		return -1;
-	}
-
-	storage_class = mail_storage_get_class(ns, driver, &list_set, error_r);
+	storage_class = mail_storage_get_class(ns, driver, &list_set, flags,
+					       error_r);
 	if (storage_class == NULL)
 		return -1;
 	i_assert(list_set.layout != NULL);
diff -r 6a65c0e043e2 -r 6b1f08814e59 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Mon Apr 05 04:49:10 2010 +0300
+++ b/src/lib-storage/mailbox-list.c	Mon Apr 05 04:49:17 2010 +0300
@@ -93,6 +93,19 @@
 	array_delete(&mailbox_list_drivers, idx, 1);
 }
 
+const struct mailbox_list *
+mailbox_list_find_class(const char *driver)
+{
+	const struct mailbox_list *const *class_p;
+	unsigned int idx;
+
+	if (!mailbox_list_driver_find(driver, &idx))
+		return NULL;
+
+	class_p = array_idx(&mailbox_list_drivers, idx);
+	return *class_p;
+}
+
 int mailbox_list_create(const char *driver, struct mail_namespace *ns,
 			const struct mailbox_list_settings *set,
 			enum mailbox_list_flags flags, const char **error_r)
@@ -103,7 +116,6 @@
 
 	i_assert(ns->list == NULL);
 
-	i_assert(set->root_dir == NULL || *set->root_dir != '\0');


More information about the dovecot-cvs mailing list