dovecot: Added support for binc IMAP style IMAPdir. It doesn't s...

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 16 19:08:28 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/aa00e299dfe6
changeset: 6304:aa00e299dfe6
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 16 19:07:34 2007 +0300
description:
Added support for binc IMAP style IMAPdir. It doesn't support escaping, but
should be good enough.

diffstat:

4 files changed, 77 insertions(+), 19 deletions(-)
src/lib-storage/list/mailbox-list-maildir-iter.c |   21 ++++--
src/lib-storage/list/mailbox-list-maildir.c      |   70 ++++++++++++++++++----
src/lib-storage/list/mailbox-list-maildir.h      |    3 
src/lib-storage/register/Makefile.am             |    2 

diffs (220 lines):

diff -r 9e33d9b9905a -r aa00e299dfe6 src/lib-storage/list/mailbox-list-maildir-iter.c
--- a/src/lib-storage/list/mailbox-list-maildir-iter.c	Thu Aug 16 19:06:27 2007 +0300
+++ b/src/lib-storage/list/mailbox-list-maildir-iter.c	Thu Aug 16 19:07:34 2007 +0300
@@ -81,13 +81,13 @@ maildir_fill_readdir(struct maildir_list
 {
 	DIR *dirp;
 	struct dirent *d;
-	const char *mailbox_c;
+	const char *mailbox_name, *mailbox_c;
 	string_t *mailbox;
 	enum mailbox_info_flags flags;
 	enum imap_match_result match;
 	struct mailbox_node *node;
 	bool created;
-	char hierarchy_sep;
+	char prefix_char;
 	int ret;
 
 	dirp = opendir(ctx->dir);
@@ -100,15 +100,22 @@ maildir_fill_readdir(struct maildir_list
 		return 0;
 	}
 
-	hierarchy_sep = ctx->ctx.list->hierarchy_sep;
+	prefix_char =
+		strcmp(ctx->ctx.list->name, MAILBOX_LIST_NAME_IMAPDIR) != 0 ?
+		ctx->ctx.list->hierarchy_sep : '\0';
 
 	t_push();
 	mailbox = t_str_new(PATH_MAX);
 	while ((d = readdir(dirp)) != NULL) {
 		const char *fname = d->d_name;
 
-		if (fname[0] != hierarchy_sep)
-			continue;
+		if (fname[0] == prefix_char)
+			mailbox_name = fname + 1;
+		else {
+			if (prefix_char != '\0' || fname[0] == '.')
+				continue;
+			mailbox_name = fname;
+		}
 
 		/* skip . and .. */
 		if (fname[0] == '.' &&
@@ -118,9 +125,9 @@ maildir_fill_readdir(struct maildir_list
 		/* make sure the pattern matches */
 		str_truncate(mailbox, 0);
 		if ((ctx->ctx.list->ns->flags & NAMESPACE_FLAG_INBOX) == 0 ||
-		    strcasecmp(fname + 1, "INBOX") != 0)
+		    strcasecmp(mailbox_name, "INBOX") != 0)
 			str_append(mailbox, ctx->ctx.list->ns->prefix);
-		str_append(mailbox, fname + 1);
+		str_append(mailbox, mailbox_name);
                 mailbox_c = str_c(mailbox);
 
 		match = imap_match(glob, mailbox_c);
diff -r 9e33d9b9905a -r aa00e299dfe6 src/lib-storage/list/mailbox-list-maildir.c
--- a/src/lib-storage/list/mailbox-list-maildir.c	Thu Aug 16 19:06:27 2007 +0300
+++ b/src/lib-storage/list/mailbox-list-maildir.c	Thu Aug 16 19:07:34 2007 +0300
@@ -11,6 +11,7 @@
 #include <sys/stat.h>
 
 extern struct mailbox_list maildir_mailbox_list;
+extern struct mailbox_list imapdir_mailbox_list;
 
 static struct mailbox_list *maildir_list_alloc(void)
 {
@@ -18,7 +19,6 @@ static struct mailbox_list *maildir_list
 	pool_t pool;
 
 	pool = pool_alloconly_create("maildir++ list", 1024);
-
 	list = p_new(pool, struct maildir_mailbox_list, 1);
 	list->list = maildir_mailbox_list;
 	list->list.pool = pool;
@@ -28,12 +28,37 @@ static struct mailbox_list *maildir_list
 	return &list->list;
 }
 
+static struct mailbox_list *imapdir_list_alloc(void)
+{
+	struct maildir_mailbox_list *list;
+	pool_t pool;
+
+	pool = pool_alloconly_create("imapdir list", 1024);
+	list = p_new(pool, struct maildir_mailbox_list, 1);
+	list->list = imapdir_mailbox_list;
+	list->list.pool = pool;
+
+	list->temp_prefix = p_strconcat(pool, ".temp.", my_hostname, ".",
+					my_pid, ".", NULL);
+	return &list->list;
+}
+
 static void maildir_list_deinit(struct mailbox_list *_list)
 {
 	struct maildir_mailbox_list *list =
 		(struct maildir_mailbox_list *)_list;
 
 	pool_unref(list->list.pool);
+}
+
+static const char *
+maildir_list_get_dirname_path(struct mailbox_list *list, const char *dir,
+			      const char *name)
+{
+	if (strcmp(list->name, MAILBOX_LIST_NAME_IMAPDIR) == 0)
+		return t_strdup_printf("%s/%s", dir, name);
+	
+	return t_strdup_printf("%s/%c%s", dir, list->hierarchy_sep, name);
 }
 
 static const char *
@@ -49,8 +74,8 @@ maildir_list_get_absolute_path(struct ma
 	p = strrchr(name, '/');
 	if (p == NULL)
 		return name;
-	return t_strdup_printf("%s/%c%s", t_strdup_until(name, p),
-			       list->hierarchy_sep, p+1);
+	return maildir_list_get_dirname_path(list, t_strdup_until(name, p),
+					     p+1);
 }
 
 static bool
@@ -170,17 +195,16 @@ maildir_list_get_path(struct mailbox_lis
 		break;
 	case MAILBOX_LIST_PATH_TYPE_CONTROL:
 		if (_list->set.control_dir != NULL) {
-			return t_strdup_printf("%s/%c%s",
-					       _list->set.control_dir,
-					       _list->hierarchy_sep, name);
+			return maildir_list_get_dirname_path(_list,
+					       _list->set.control_dir, name);
 		}
 		break;
 	case MAILBOX_LIST_PATH_TYPE_INDEX:
 		if (_list->set.index_dir != NULL) {
 			if (*_list->set.index_dir == '\0')
 				return "";
-			return t_strdup_printf("%s/%c%s", _list->set.index_dir,
-					       _list->hierarchy_sep, name);
+			return maildir_list_get_dirname_path(_list,
+						_list->set.index_dir, name);
 		}
 		break;
 	}
@@ -190,8 +214,7 @@ maildir_list_get_path(struct mailbox_lis
 			_list->set.inbox_path : _list->set.root_dir;
 	}
 
-	return t_strdup_printf("%s/%c%s", _list->set.root_dir,
-			       _list->hierarchy_sep, name);
+	return maildir_list_get_dirname_path(_list, _list->set.root_dir, name);
 }
 
 static int
@@ -403,7 +426,7 @@ static int maildir_list_rename_mailbox(s
 }
 
 struct mailbox_list maildir_mailbox_list = {
-	MEMBER(name) "maildir++",
+	MEMBER(name) MAILBOX_LIST_NAME_MAILDIRPLUSPLUS,
 	MEMBER(hierarchy_sep) '.',
 	MEMBER(mailbox_name_max_length) PATH_MAX,
 
@@ -426,3 +449,28 @@ struct mailbox_list maildir_mailbox_list
 		maildir_list_rename_mailbox
 	}
 };
+
+struct mailbox_list imapdir_mailbox_list = {
+	MEMBER(name) MAILBOX_LIST_NAME_IMAPDIR,
+	MEMBER(hierarchy_sep) '.',
+	MEMBER(mailbox_name_max_length) PATH_MAX,
+
+	{
+		imapdir_list_alloc,
+		maildir_list_deinit,
+		maildir_is_valid_pattern,
+		maildir_is_valid_existing_name,
+		maildir_is_valid_create_name,
+		maildir_list_get_path,
+		maildir_list_get_mailbox_name_status,
+		maildir_list_get_temp_prefix,
+		NULL,
+		maildir_list_iter_init,
+		maildir_list_iter_next,
+		maildir_list_iter_deinit,
+		NULL,
+		maildir_list_set_subscribed,
+		maildir_list_delete_mailbox,
+		maildir_list_rename_mailbox
+	}
+};
diff -r 9e33d9b9905a -r aa00e299dfe6 src/lib-storage/list/mailbox-list-maildir.h
--- a/src/lib-storage/list/mailbox-list-maildir.h	Thu Aug 16 19:06:27 2007 +0300
+++ b/src/lib-storage/list/mailbox-list-maildir.h	Thu Aug 16 19:07:34 2007 +0300
@@ -2,6 +2,9 @@
 #define __MAILBOX_LIST_MAILDIR_H
 
 #include "mailbox-list-private.h"
+
+#define MAILBOX_LIST_NAME_MAILDIRPLUSPLUS "maildir++"
+#define MAILBOX_LIST_NAME_IMAPDIR "imapdir"
 
 /* Don't allow creating too long mailbox names. They could start causing
    problems when they reach the limit. */
diff -r 9e33d9b9905a -r aa00e299dfe6 src/lib-storage/register/Makefile.am
--- a/src/lib-storage/register/Makefile.am	Thu Aug 16 19:06:27 2007 +0300
+++ b/src/lib-storage/register/Makefile.am	Thu Aug 16 19:07:34 2007 +0300
@@ -3,7 +3,7 @@ BUILT_SOURCES = mail-storage-register.c
 BUILT_SOURCES = mail-storage-register.c
 mail_storages = @mail_storages@
 
-mailbox_list_drivers = maildir fs
+mailbox_list_drivers = maildir imapdir fs
 
 mail-storage-register.c: Makefile
 	rm -f $@


More information about the dovecot-cvs mailing list