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