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