dovecot-2.0: Initial commit for making mail_storage:mailbox_list...

dovecot at dovecot.org dovecot at dovecot.org
Wed Jun 3 05:31:53 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/e374a365521d
changeset: 9434:e374a365521d
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jun 02 22:30:28 2009 -0400
description:
Initial commit for making mail_storage:mailbox_list to be from 1:1 to n:n.
This will allow namespaces to share the same storage and a single namespace
to have multiple storages (multiple mailbox formats). Neither works
currently, and this commit probably breaks some things.

diffstat:

102 files changed, 2164 insertions(+), 2528 deletions(-)
src/config/settings-get.pl                         |    1 
src/imap/cmd-append.c                              |   13 
src/imap/cmd-copy.c                                |   16 
src/imap/cmd-create.c                              |    6 
src/imap/cmd-delete.c                              |   20 
src/imap/cmd-list.c                                |   12 
src/imap/cmd-rename.c                              |   24 
src/imap/cmd-select.c                              |   31 
src/imap/cmd-status.c                              |   15 
src/imap/cmd-subscribe.c                           |    8 
src/imap/imap-client.c                             |    7 
src/imap/imap-commands-util.c                      |   31 
src/imap/imap-commands-util.h                      |    9 
src/imap/imap-commands.h                           |    1 
src/imap/imap-status.c                             |   25 
src/imap/imap-status.h                             |    6 
src/lda/main.c                                     |    8 
src/lib-lda/mail-deliver.c                         |   55 -
src/lib-storage/index/cydir/cydir-mail.c           |    2 
src/lib-storage/index/cydir/cydir-save.c           |    4 
src/lib-storage/index/cydir/cydir-storage.c        |  198 ++----
src/lib-storage/index/cydir/cydir-sync.c           |    3 
src/lib-storage/index/dbox/dbox-map.c              |   13 
src/lib-storage/index/dbox/dbox-settings.c         |   20 
src/lib-storage/index/dbox/dbox-storage-rebuild.c  |   48 +
src/lib-storage/index/dbox/dbox-storage.c          |  313 +++------
src/lib-storage/index/dbox/dbox-storage.h          |    7 
src/lib-storage/index/dbox/dbox-sync-rebuild.c     |    8 
src/lib-storage/index/index-storage.c              |   55 -
src/lib-storage/index/index-storage.h              |    4 
src/lib-storage/index/maildir/maildir-keywords.c   |    5 
src/lib-storage/index/maildir/maildir-storage.c    |  423 +++++--------
src/lib-storage/index/maildir/maildir-storage.h    |    3 
src/lib-storage/index/maildir/maildir-sync-index.c |    5 
src/lib-storage/index/maildir/maildir-uidlist.c    |   11 
src/lib-storage/index/maildir/maildir-util.c       |   10 
src/lib-storage/index/mbox/mbox-lock.c             |    2 
src/lib-storage/index/mbox/mbox-save.c             |    2 
src/lib-storage/index/mbox/mbox-storage.c          |  650 +++++++-------------
src/lib-storage/index/mbox/mbox-storage.h          |    2 
src/lib-storage/index/raw/raw-storage.c            |  155 +---
src/lib-storage/index/shared/shared-list.c         |   73 +-
src/lib-storage/index/shared/shared-storage.c      |  185 ++---
src/lib-storage/index/shared/shared-storage.h      |    6 
src/lib-storage/list/index-mailbox-list-sync.c     |   14 
src/lib-storage/list/index-mailbox-list.c          |   12 
src/lib-storage/list/mailbox-list-fs.c             |   15 
src/lib-storage/list/mailbox-list-maildir.h        |    3 
src/lib-storage/mail-namespace.c                   |   44 +
src/lib-storage/mail-namespace.h                   |   20 
src/lib-storage/mail-storage-private.h             |   16 
src/lib-storage/mail-storage-settings.c            |   14 
src/lib-storage/mail-storage-settings.h            |    4 
src/lib-storage/mail-storage.c                     |  337 +++++-----
src/lib-storage/mail-storage.h                     |   39 -
src/lib-storage/mail-user.c                        |   11 
src/lib-storage/mailbox-list-private.h             |   11 
src/lib-storage/mailbox-list.c                     |  191 +++--
src/lib-storage/mailbox-list.h                     |   22 
src/lmtp/commands.c                                |   11 
src/plugins/acl/acl-api-private.h                  |    2 
src/plugins/acl/acl-api.c                          |    6 
src/plugins/acl/acl-api.h                          |    2 
src/plugins/acl/acl-backend-vfile-acllist.c        |    7 
src/plugins/acl/acl-backend-vfile.c                |   41 -
src/plugins/acl/acl-backend.c                      |    2 
src/plugins/acl/acl-lookup-dict.c                  |    4 
src/plugins/acl/acl-mailbox-list.c                 |   93 +-
src/plugins/acl/acl-mailbox.c                      |   23 
src/plugins/acl/acl-plugin.h                       |   19 
src/plugins/acl/acl-shared-storage.c               |   22 
src/plugins/acl/acl-storage.c                      |  145 ----
src/plugins/acl/acl-storage.h                      |    4 
src/plugins/autocreate/autocreate-plugin.c         |    6 
src/plugins/convert/convert-storage.c              |  103 +--
src/plugins/expire/expire-plugin.c                 |   23 
src/plugins/expire/expire-tool.c                   |    6 
src/plugins/fts-lucene/fts-backend-lucene.c        |    4 
src/plugins/fts-solr/fts-backend-solr.c            |   10 
src/plugins/fts-squat/fts-backend-squat.c          |    9 
src/plugins/fts/fts-storage.c                      |    6 
src/plugins/imap-acl/imap-acl-plugin.c             |   36 -
src/plugins/imap-quota/imap-quota-plugin.c         |   20 
src/plugins/lazy-expunge/lazy-expunge-plugin.c     |  139 ++--
src/plugins/listescape/listescape-plugin.c         |   44 -
src/plugins/mail-log/mail-log-plugin.c             |   17 
src/plugins/mbox-snarf/mbox-snarf-plugin.c         |   17 
src/plugins/quota/quota-count.c                    |   24 
src/plugins/quota/quota-dirsize.c                  |   14 
src/plugins/quota/quota-fs.c                       |   22 
src/plugins/quota/quota-maildir.c                  |   79 +-
src/plugins/quota/quota-private.h                  |   17 
src/plugins/quota/quota-storage.c                  |   96 +-
src/plugins/quota/quota.c                          |   91 +-
src/plugins/trash/trash-plugin.c                   |    7 
src/plugins/virtual/virtual-config.c               |   18 
src/plugins/virtual/virtual-mail.c                 |    2 
src/plugins/virtual/virtual-storage.c              |  195 ++----
src/plugins/virtual/virtual-storage.h              |    1 
src/plugins/zlib/zlib-plugin.c                     |   24 
src/pop3/pop3-client.c                             |   27 
src/util/doveadm.c                                 |    6 

diffs (truncated from 9622 to 300 lines):

diff -r 438491c166cb -r e374a365521d src/config/settings-get.pl
--- a/src/config/settings-get.pl	Tue Jun 02 17:42:40 2009 -0400
+++ b/src/config/settings-get.pl	Tue Jun 02 22:30:28 2009 -0400
@@ -4,6 +4,7 @@ print '#include "lib.h"'."\n";
 print '#include "lib.h"'."\n";
 print '#include "array.h"'."\n";
 print '#include "var-expand.h"'."\n";
+print '#include "file-lock.h"'."\n";
 print '#include "settings-parser.h"'."\n";
 print '#include "all-settings.h"'."\n";
 print '#include <stddef.h>'."\n";
diff -r 438491c166cb -r e374a365521d src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-append.c	Tue Jun 02 22:30:28 2009 -0400
@@ -8,7 +8,6 @@
 #include "imap-commands.h"
 #include "imap-parser.h"
 #include "imap-date.h"
-#include "mail-storage.h"
 
 #include <sys/time.h>
 
@@ -452,24 +451,24 @@ static struct mailbox *
 static struct mailbox *
 get_mailbox(struct client_command_context *cmd, const char *name)
 {
-	struct mail_storage *storage;
+	struct mail_namespace *ns;
 	struct mailbox *box;
 
 	if (!client_verify_mailbox_name(cmd, name, TRUE, FALSE))
 		return NULL;
 
-	storage = client_find_storage(cmd, &name);
-	if (storage == NULL)
+	ns = client_find_namespace(cmd, &name);
+	if (ns == NULL)
 		return NULL;
 
 	if (cmd->client->mailbox != NULL &&
-	    mailbox_equals(cmd->client->mailbox, storage, name))
+	    mailbox_equals(cmd->client->mailbox, ns, name))
 		return cmd->client->mailbox;
 
-	box = mailbox_open(&storage, name, NULL, MAILBOX_OPEN_SAVEONLY |
+	box = mailbox_open(ns->list, name, NULL, MAILBOX_OPEN_SAVEONLY |
 			   MAILBOX_OPEN_KEEP_RECENT);
 	if (box == NULL) {
-		client_send_storage_error(cmd, storage);
+		client_send_list_error(cmd, ns->list);
 		return NULL;
 	}
 	if (cmd->client->enabled_features != 0)
diff -r 438491c166cb -r e374a365521d src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c	Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-copy.c	Tue Jun 02 22:30:28 2009 -0400
@@ -93,7 +93,8 @@ bool cmd_copy(struct client_command_cont
 bool cmd_copy(struct client_command_context *cmd)
 {
 	struct client *client = cmd->client;
-	struct mail_storage *storage;
+	struct mail_namespace *dest_ns;
+	struct mail_storage *dest_storage;
 	struct mailbox *destbox;
 	struct mailbox_transaction_context *t;
         struct mail_search_args *search_args;
@@ -119,18 +120,18 @@ bool cmd_copy(struct client_command_cont
 	if (ret <= 0)
 		return ret < 0;
 
-	storage = client_find_storage(cmd, &mailbox);
-	if (storage == NULL)
+	dest_ns = client_find_namespace(cmd, &mailbox);
+	if (dest_ns == NULL)
 		return TRUE;
 
-	if (mailbox_equals(client->mailbox, storage, mailbox))
+	if (mailbox_equals(client->mailbox, dest_ns, mailbox))
 		destbox = client->mailbox;
 	else {
-		destbox = mailbox_open(&storage, mailbox, NULL,
+		destbox = mailbox_open(dest_ns->list, mailbox, NULL,
 				       MAILBOX_OPEN_SAVEONLY |
 				       MAILBOX_OPEN_KEEP_RECENT);
 		if (destbox == NULL) {
-			client_send_storage_error(cmd, storage);
+			client_send_list_error(cmd, dest_ns->list);
 			return TRUE;
 		}
 		if (client->enabled_features != 0)
@@ -168,6 +169,7 @@ bool cmd_copy(struct client_command_cont
 		}
 	}
 
+	dest_storage = mailbox_get_storage(destbox);
 	if (destbox != client->mailbox) {
 		sync_flags |= MAILBOX_SYNC_FLAG_FAST;
 		imap_flags |= IMAP_SYNC_FLAG_SAFE;
@@ -182,7 +184,7 @@ bool cmd_copy(struct client_command_cont
 			"NO ["IMAP_RESP_CODE_EXPUNGEISSUED"] "
 			"Some of the requested messages no longer exist.");
 	} else {
-		client_send_storage_error(cmd, storage);
+		client_send_storage_error(cmd, dest_storage);
 		return TRUE;
 	}
 }
diff -r 438491c166cb -r e374a365521d src/imap/cmd-create.c
--- a/src/imap/cmd-create.c	Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-create.c	Tue Jun 02 22:30:28 2009 -0400
@@ -7,6 +7,7 @@ bool cmd_create(struct client_command_co
 bool cmd_create(struct client_command_context *cmd)
 {
 	struct mail_namespace *ns;
+	struct mail_storage *storage;
 	const char *mailbox, *full_mailbox;
 	bool directory;
 	size_t len;
@@ -38,8 +39,9 @@ bool cmd_create(struct client_command_co
 	if (!client_verify_mailbox_name(cmd, full_mailbox, FALSE, TRUE))
 		return TRUE;
 
-	if (mail_storage_mailbox_create(ns->storage, mailbox, directory) < 0)
-		client_send_storage_error(cmd, ns->storage);
+	storage = mail_namespace_get_default_storage(ns);
+	if (mail_storage_mailbox_create(storage, ns, mailbox, directory) < 0)
+		client_send_storage_error(cmd, storage);
 	else
 		client_send_tagline(cmd, "OK Create completed.");
 	return TRUE;
diff -r 438491c166cb -r e374a365521d src/imap/cmd-delete.c
--- a/src/imap/cmd-delete.c	Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-delete.c	Tue Jun 02 22:30:28 2009 -0400
@@ -6,8 +6,8 @@ bool cmd_delete(struct client_command_co
 bool cmd_delete(struct client_command_context *cmd)
 {
 	struct client *client = cmd->client;
+	struct mail_namespace *ns;
 	struct mail_storage *storage;
-	struct mailbox_list *list;
 	struct mailbox *mailbox;
 	const char *name;
 
@@ -21,8 +21,13 @@ bool cmd_delete(struct client_command_co
 		return TRUE;
 	}
 
+	ns = client_find_namespace(cmd, &name);
+	if (ns == NULL)
+		return TRUE;
+
 	mailbox = client->mailbox;
-	if (mailbox != NULL && strcmp(mailbox_get_name(mailbox), name) == 0) {
+	if (mailbox != NULL && mailbox_get_namespace(mailbox) == ns &&
+	    strcmp(mailbox_get_name(mailbox), name) == 0) {
 		/* deleting selected mailbox. close it first */
 		client_search_updates_free(client);
 		storage = mailbox_get_storage(mailbox);
@@ -30,22 +35,17 @@ bool cmd_delete(struct client_command_co
 
 		if (mailbox_close(&mailbox) < 0)
 			client_send_untagged_storage_error(client, storage);
-	} else {
-		storage = client_find_storage(cmd, &name);
-		if (storage == NULL)
-			return TRUE;
 	}
 
 	if ((client->workarounds & WORKAROUND_TB_EXTRA_MAILBOX_SEP) != 0 &&
 	    *name != '\0' &&
-	    name[strlen(name)-1] == mail_storage_get_hierarchy_sep(storage)) {
+	    name[strlen(name)-1] == mailbox_list_get_hierarchy_sep(ns->list)) {
 		/* drop the extra trailing hierarchy separator */
 		name = t_strndup(name, strlen(name)-1);
 	}
 
-	list = mail_storage_get_list(storage);
-	if (mailbox_list_delete_mailbox(list, name) < 0)
-		client_send_list_error(cmd, list);
+	if (mailbox_list_delete_mailbox(ns->list, name) < 0)
+		client_send_list_error(cmd, ns->list);
 	else {
 		client_send_tagline(cmd, "OK Delete completed.");
 	}
diff -r 438491c166cb -r e374a365521d src/imap/cmd-list.c
--- a/src/imap/cmd-list.c	Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-list.c	Tue Jun 02 22:30:28 2009 -0400
@@ -310,16 +310,16 @@ static void list_send_status(struct cmd_
 static void list_send_status(struct cmd_list_context *ctx, const char *name)
 {
 	struct mailbox_status status;
-	const char *storage_name;
+	const char *storage_name, *error;
 	size_t prefix_len = strlen(ctx->ns->prefix);
 
 	storage_name = strncmp(name, ctx->ns->prefix, prefix_len) == 0 ?
 		name + prefix_len : name;
 
-	if (!imap_status_get(ctx->cmd->client, ctx->ns->storage, storage_name,
-			     ctx->status_items, &status)) {
-		client_send_untagged_storage_error(ctx->cmd->client,
-						   ctx->ns->storage);
+	if (imap_status_get(ctx->cmd->client, ctx->ns, storage_name,
+			    ctx->status_items, &status, &error) < 0) {
+		client_send_line(ctx->cmd->client,
+				 t_strconcat("* NO ", error, NULL));
 		return;
 	}
 
@@ -775,7 +775,7 @@ static void cmd_list_ref_root(struct cli
 		ns_sep = ns->sep;
 	} else {
 		ns_prefix = "";
-		ns_sep = mail_namespace_get_root_sep(client->user->namespaces);
+		ns_sep = mail_namespaces_get_root_sep(client->user->namespaces);
 	}
 
 	str = t_str_new(64);
diff -r 438491c166cb -r e374a365521d src/imap/cmd-rename.c
--- a/src/imap/cmd-rename.c	Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-rename.c	Tue Jun 02 22:30:28 2009 -0400
@@ -6,9 +6,7 @@
 
 bool cmd_rename(struct client_command_context *cmd)
 {
-	struct mail_storage *old_storage, *new_storage;
-	struct mailbox_list *old_list, *new_list;
-	struct mail_namespace *old_ns;
+	struct mail_namespace *old_ns, *new_ns;
 	const char *oldname, *newname;
 	unsigned int oldlen;
 
@@ -19,20 +17,18 @@ bool cmd_rename(struct client_command_co
 	if (!client_verify_mailbox_name(cmd, newname, FALSE, TRUE))
 		return TRUE;
 
-	old_storage = client_find_storage(cmd, &oldname);
-	if (old_storage == NULL)
+	old_ns = client_find_namespace(cmd, &oldname);
+	if (old_ns == NULL)
 		return TRUE;
-	old_list = mail_storage_get_list(old_storage);
 
-	new_storage = client_find_storage(cmd, &newname);
-	if (new_storage == NULL)
+	new_ns = client_find_namespace(cmd, &newname);
+	if (new_ns == NULL)
 		return TRUE;
-	new_list = mail_storage_get_list(new_storage);
 
-	if (old_storage == new_storage) {
+	if (old_ns == new_ns) {
 		/* disallow box -> box/child, because it may break clients and
 		   there's really no point in doing it anyway. */
-		old_ns = mailbox_list_get_namespace(old_list);
+		old_ns = mailbox_list_get_namespace(old_ns->list);
 		oldlen = strlen(oldname);
 		if (strncmp(oldname, newname, oldlen) == 0 &&
 		    newname[oldlen] == old_ns->real_sep) {
@@ -42,9 +38,9 @@ bool cmd_rename(struct client_command_co
 		}
 	}
 
-	if (mailbox_list_rename_mailbox(old_list, oldname,
-					new_list, newname, TRUE) < 0)
-		client_send_list_error(cmd, old_list);
+	if (mailbox_list_rename_mailbox(old_ns->list, oldname,
+					new_ns->list, newname, TRUE) < 0)
+		client_send_list_error(cmd, old_ns->list);
 	else
 		client_send_tagline(cmd, "OK Rename completed.");
 	return TRUE;
diff -r 438491c166cb -r e374a365521d src/imap/cmd-select.c
--- a/src/imap/cmd-select.c	Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-select.c	Tue Jun 02 22:30:28 2009 -0400
@@ -12,7 +12,7 @@
 
 struct imap_select_context {
 	struct client_command_context *cmd;
-	struct mail_storage *storage;
+	struct mail_namespace *ns;
 	struct mailbox *box;
 
 	struct imap_fetch_context *fetch_ctx;
@@ -188,7 +188,6 @@ static void cmd_select_finish(struct ima
 	if (ret < 0) {
 		if (ctx->box != NULL)
 			mailbox_close(&ctx->box);
-		client_send_storage_error(ctx->cmd, ctx->storage);
 		ctx->cmd->client->mailbox = NULL;
 	} else {
 		client_send_tagline(ctx->cmd, mailbox_is_readonly(ctx->box) ?
@@ -209,6 +208,10 @@ static bool cmd_select_continue(struct c
 	}
 
 	ret = imap_fetch_deinit(ctx->fetch_ctx);
+	if (ret < 0) {
+		client_send_storage_error(ctx->cmd,
+					  mailbox_get_storage(ctx->box));
+	}


More information about the dovecot-cvs mailing list