dovecot-2.0: Mailbox opening and closing APIs changed.

dovecot at dovecot.org dovecot at dovecot.org
Mon Jun 15 21:31:52 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/653183a81b6c
changeset: 9468:653183a81b6c
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jun 15 14:28:55 2009 -0400
description:
Mailbox opening and closing APIs changed.

diffstat:

80 files changed, 1075 insertions(+), 1235 deletions(-)
src/imap/cmd-append.c                              |    9 
src/imap/cmd-close.c                               |    3 
src/imap/cmd-copy.c                                |   12 
src/imap/cmd-delete.c                              |    3 
src/imap/cmd-select.c                              |   18 -
src/imap/cmd-unselect.c                            |    3 
src/imap/imap-status.c                             |    9 
src/lda/main.c                                     |   14 
src/lib-lda/mail-deliver.c                         |   31 --
src/lib-storage/index/cydir/cydir-storage.c        |   97 +++---
src/lib-storage/index/cydir/cydir-storage.h        |    2 
src/lib-storage/index/cydir/cydir-sync.c           |    8 
src/lib-storage/index/dbox/dbox-file.c             |    8 
src/lib-storage/index/dbox/dbox-mail.c             |    5 
src/lib-storage/index/dbox/dbox-save.c             |    4 
src/lib-storage/index/dbox/dbox-storage-rebuild.c  |   36 +-
src/lib-storage/index/dbox/dbox-storage.c          |  213 +++++++--------
src/lib-storage/index/dbox/dbox-storage.h          |    9 
src/lib-storage/index/dbox/dbox-sync-rebuild.c     |    9 
src/lib-storage/index/dbox/dbox-sync.c             |   10 
src/lib-storage/index/index-storage.c              |  109 ++++---
src/lib-storage/index/index-storage.h              |   14 
src/lib-storage/index/index-thread.c               |    6 
src/lib-storage/index/maildir/maildir-copy.c       |    2 
src/lib-storage/index/maildir/maildir-keywords.c   |    2 
src/lib-storage/index/maildir/maildir-mail.c       |    5 
src/lib-storage/index/maildir/maildir-save.c       |    9 
src/lib-storage/index/maildir/maildir-storage.c    |  187 +++++--------
src/lib-storage/index/maildir/maildir-storage.h    |    3 
src/lib-storage/index/maildir/maildir-sync-index.c |    7 
src/lib-storage/index/maildir/maildir-sync.c       |   25 -
src/lib-storage/index/maildir/maildir-uidlist.c    |    4 
src/lib-storage/index/maildir/maildir-util.c       |   20 -
src/lib-storage/index/mbox/mbox-file.c             |   13 
src/lib-storage/index/mbox/mbox-lock.c             |   30 +-
src/lib-storage/index/mbox/mbox-mail.c             |    4 
src/lib-storage/index/mbox/mbox-save.c             |    2 
src/lib-storage/index/mbox/mbox-storage.c          |  284 ++++++++------------
src/lib-storage/index/mbox/mbox-storage.h          |    2 
src/lib-storage/index/mbox/mbox-sync-rewrite.c     |    9 
src/lib-storage/index/mbox/mbox-sync.c             |   64 ++--
src/lib-storage/index/raw/raw-mail.c               |    9 
src/lib-storage/index/raw/raw-storage.c            |   90 ++----
src/lib-storage/index/raw/raw-storage.h            |    3 
src/lib-storage/index/raw/raw-sync.c               |    8 
src/lib-storage/list/index-mailbox-list-sync.c     |   18 -
src/lib-storage/mail-storage-private.h             |   24 -
src/lib-storage/mail-storage.c                     |   63 ++--
src/lib-storage/mail-storage.h                     |   41 +-
src/lib-storage/mailbox-list-private.h             |    2 
src/lib-storage/mailbox-list.c                     |   17 -
src/lib-storage/test-mail-storage.c                |    2 
src/lib-storage/test-mail-storage.h                |    6 
src/lib-storage/test-mailbox.c                     |   19 -
src/lmtp/commands.c                                |   16 -
src/plugins/acl/acl-mailbox.c                      |   75 ++++-
src/plugins/acl/acl-plugin.h                       |    5 
src/plugins/acl/acl-storage.c                      |   47 ---
src/plugins/convert/convert-storage.c              |   26 -
src/plugins/expire/expire-plugin.c                 |   51 ---
src/plugins/expire/expire-tool.c                   |    8 
src/plugins/fts/fts-plugin.c                       |    6 
src/plugins/fts/fts-plugin.h                       |    4 
src/plugins/fts/fts-storage.c                      |   14 
src/plugins/imap-acl/imap-acl-plugin.c             |   22 -
src/plugins/imap-quota/imap-quota-plugin.c         |   13 
src/plugins/lazy-expunge/lazy-expunge-plugin.c     |   99 ++----
src/plugins/listescape/listescape-plugin.c         |   11 
src/plugins/mail-log/mail-log-plugin.c             |   12 
src/plugins/mbox-snarf/mbox-snarf-plugin.c         |   25 -
src/plugins/quota/quota-count.c                    |    9 
src/plugins/quota/quota-storage.c                  |   23 -
src/plugins/trash/trash-plugin.c                   |    8 
src/plugins/virtual/virtual-config.c               |    2 
src/plugins/virtual/virtual-storage.c              |  164 +++++------
src/plugins/virtual/virtual-storage.h              |    1 
src/plugins/virtual/virtual-sync.c                 |   26 +
src/plugins/zlib/zlib-plugin.c                     |   12 
src/pop3/pop3-client.c                             |   16 -
src/util/doveadm.c                                 |    9 

diffs (truncated from 4684 to 300 lines):

diff -r 7b6fe859ec64 -r 653183a81b6c src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/imap/cmd-append.c	Mon Jun 15 14:28:55 2009 -0400
@@ -465,10 +465,11 @@ get_mailbox(struct client_command_contex
 	    mailbox_equals(cmd->client->mailbox, ns, name))
 		return cmd->client->mailbox;
 
-	box = mailbox_open(ns->list, name, NULL, MAILBOX_OPEN_SAVEONLY |
-			   MAILBOX_OPEN_KEEP_RECENT);
-	if (box == NULL) {
-		client_send_list_error(cmd, ns->list);
+	box = mailbox_alloc(ns->list, name, NULL, MAILBOX_FLAG_SAVEONLY |
+			    MAILBOX_FLAG_KEEP_RECENT);
+	if (mailbox_open(box) < 0) {
+		client_send_storage_error(cmd, mailbox_get_storage(box));
+		mailbox_close(&box);
 		return NULL;
 	}
 	if (cmd->client->enabled_features != 0)
diff -r 7b6fe859ec64 -r 653183a81b6c src/imap/cmd-close.c
--- a/src/imap/cmd-close.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/imap/cmd-close.c	Mon Jun 15 14:28:55 2009 -0400
@@ -23,8 +23,7 @@ bool cmd_close(struct client_command_con
 	if (mailbox_sync(mailbox, 0, 0, NULL) < 0)
 		client_send_untagged_storage_error(client, storage);
 
-	if (mailbox_close(&mailbox) < 0)
-		client_send_untagged_storage_error(client, storage);
+	mailbox_close(&mailbox);
 	client_update_mailbox_flags(client, NULL);
 
 	client_send_tagline(cmd, "OK Close completed.");
diff -r 7b6fe859ec64 -r 653183a81b6c src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/imap/cmd-copy.c	Mon Jun 15 14:28:55 2009 -0400
@@ -127,11 +127,13 @@ bool cmd_copy(struct client_command_cont
 	if (mailbox_equals(client->mailbox, dest_ns, mailbox))
 		destbox = client->mailbox;
 	else {
-		destbox = mailbox_open(dest_ns->list, mailbox, NULL,
-				       MAILBOX_OPEN_SAVEONLY |
-				       MAILBOX_OPEN_KEEP_RECENT);
-		if (destbox == NULL) {
-			client_send_list_error(cmd, dest_ns->list);
+		destbox = mailbox_alloc(dest_ns->list, mailbox, NULL,
+					MAILBOX_FLAG_SAVEONLY |
+					MAILBOX_FLAG_KEEP_RECENT);
+		if (mailbox_open(destbox) < 0) {
+			client_send_storage_error(cmd,
+				mailbox_get_storage(destbox));
+			mailbox_close(&destbox);
 			return TRUE;
 		}
 		if (client->enabled_features != 0)
diff -r 7b6fe859ec64 -r 653183a81b6c src/imap/cmd-delete.c
--- a/src/imap/cmd-delete.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/imap/cmd-delete.c	Mon Jun 15 14:28:55 2009 -0400
@@ -33,8 +33,7 @@ bool cmd_delete(struct client_command_co
 		storage = mailbox_get_storage(mailbox);
 		client->mailbox = NULL;
 
-		if (mailbox_close(&mailbox) < 0)
-			client_send_untagged_storage_error(client, storage);
+		mailbox_close(&mailbox);
 	}
 
 	if ((client->workarounds & WORKAROUND_TB_EXTRA_MAILBOX_SEP) != 0 &&
diff -r 7b6fe859ec64 -r 653183a81b6c src/imap/cmd-select.c
--- a/src/imap/cmd-select.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/imap/cmd-select.c	Mon Jun 15 14:28:55 2009 -0400
@@ -263,13 +263,15 @@ select_open(struct imap_select_context *
 {
 	struct client *client = ctx->cmd->client;
 	struct mailbox_status status;
-	enum mailbox_open_flags open_flags = 0;
+	enum mailbox_flags flags = 0;
 
 	if (readonly)
-		open_flags |= MAILBOX_OPEN_READONLY | MAILBOX_OPEN_KEEP_RECENT;
-	ctx->box = mailbox_open(ctx->ns->list, mailbox, NULL, open_flags);
-	if (ctx->box == NULL) {
-		client_send_list_error(ctx->cmd, ctx->ns->list);
+		flags |= MAILBOX_FLAG_READONLY | MAILBOX_FLAG_KEEP_RECENT;
+	ctx->box = mailbox_alloc(ctx->ns->list, mailbox, NULL, flags);
+	if (mailbox_open(ctx->box) < 0) {
+		client_send_storage_error(ctx->cmd,
+					  mailbox_get_storage(ctx->box));
+		mailbox_close(&ctx->box);
 		return -1;
 	}
 
@@ -370,15 +372,11 @@ bool cmd_select_full(struct client_comma
 	client->mailbox_change_lock = cmd;
 
 	if (client->mailbox != NULL) {
-		struct mail_storage *old_storage =
-			mailbox_get_storage(client->mailbox);
-
 		client_search_updates_free(client);
 		box = client->mailbox;
 		client->mailbox = NULL;
 
-		if (mailbox_close(&box) < 0)
-			client_send_untagged_storage_error(client, old_storage);
+		mailbox_close(&box);
 		/* CLOSED response is required by QRESYNC */
 		client_send_line(client, "* OK [CLOSED]");
 	}
diff -r 7b6fe859ec64 -r 653183a81b6c src/imap/cmd-unselect.c
--- a/src/imap/cmd-unselect.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/imap/cmd-unselect.c	Mon Jun 15 14:28:55 2009 -0400
@@ -18,8 +18,7 @@ bool cmd_unselect(struct client_command_
 	client->mailbox = NULL;
 
 	storage = mailbox_get_storage(mailbox);
-	if (mailbox_close(&mailbox) < 0)
-		client_send_untagged_storage_error(client, storage);
+	mailbox_close(&mailbox);
 	client_update_mailbox_flags(client, NULL);
 
 	client_send_tagline(cmd, "OK Unselect completed.");
diff -r 7b6fe859ec64 -r 653183a81b6c src/imap/imap-status.c
--- a/src/imap/imap-status.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/imap/imap-status.c	Mon Jun 15 14:28:55 2009 -0400
@@ -62,13 +62,8 @@ int imap_status_get(struct client *clien
 	}
 
 	/* open the mailbox */
-	box = mailbox_open(ns->list, mailbox, NULL, MAILBOX_OPEN_FAST |
-			   MAILBOX_OPEN_READONLY | MAILBOX_OPEN_KEEP_RECENT);
-	if (box == NULL) {
-		*error_r = mailbox_list_get_last_error(ns->list, &error);
-		*error_r = imap_get_error_string(*error_r, error);
-		return -1;
-	}
+	box = mailbox_alloc(ns->list, mailbox, NULL, MAILBOX_FLAG_READONLY |
+			    MAILBOX_FLAG_KEEP_RECENT);
 
 	if ((items & STATUS_HIGHESTMODSEQ) != 0)
 		client_enable(client, MAILBOX_FEATURE_CONDSTORE);
diff -r 7b6fe859ec64 -r 653183a81b6c src/lda/main.c
--- a/src/lda/main.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/lda/main.c	Mon Jun 15 14:28:55 2009 -0400
@@ -416,17 +416,17 @@ int main(int argc, char *argv[])
 		i_fatal("Couldn't create internal raw storage: %s", errstr);
 	if (path == NULL) {
 		input = create_raw_stream(&ctx, 0, &mtime);
-		box = mailbox_open(raw_ns->list, "Dovecot Delivery Mail",
-				   input, MAILBOX_OPEN_NO_INDEX_FILES);
+		box = mailbox_alloc(raw_ns->list, "Dovecot Delivery Mail",
+				    input, MAILBOX_FLAG_NO_INDEX_FILES);
 		i_stream_unref(&input);
 	} else {
 		mtime = (time_t)-1;
-		box = mailbox_open(raw_ns->list, path, NULL,
-				   MAILBOX_OPEN_NO_INDEX_FILES);
-	}
-	if (box == NULL) {
+		box = mailbox_alloc(raw_ns->list, path, NULL,
+				    MAILBOX_FLAG_NO_INDEX_FILES);
+	}
+	if (mailbox_open(box) < 0) {
 		i_fatal("Can't open delivery mail as raw: %s",
-			mailbox_list_get_last_error(raw_ns->list, &error));
+			mail_storage_get_last_error(box->storage, &error));
 	}
 	if (mailbox_sync(box, 0, 0, NULL) < 0) {
 		i_fatal("Can't sync delivery mail: %s",
diff -r 7b6fe859ec64 -r 653183a81b6c src/lib-lda/mail-deliver.c
--- a/src/lib-lda/mail-deliver.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/lib-lda/mail-deliver.c	Mon Jun 15 14:28:55 2009 -0400
@@ -79,16 +79,16 @@ mailbox_open_or_create_synced(struct mai
 	struct mail_storage *storage;
 	struct mailbox *box;
 	enum mail_error error;
-	enum mailbox_open_flags open_flags =
-		MAILBOX_OPEN_KEEP_RECENT | MAILBOX_OPEN_SAVEONLY |
-		MAILBOX_OPEN_POST_SESSION;
+	enum mailbox_flags flags =
+		MAILBOX_FLAG_KEEP_RECENT | MAILBOX_FLAG_SAVEONLY |
+		MAILBOX_FLAG_POST_SESSION;
 
 	*error_r = NULL;
 
 	if (strcasecmp(name, "INBOX") == 0) {
 		/* deliveries to INBOX must always succeed,
 		   regardless of ACLs */
-		open_flags |= MAILBOX_OPEN_IGNORE_ACLS;
+		flags |= MAILBOX_FLAG_IGNORE_ACLS;
 	}
 
 	*ns_r = ns = mail_namespace_find(ctx->dest_user->namespaces, &name);
@@ -101,16 +101,17 @@ mailbox_open_or_create_synced(struct mai
 		return NULL;
 	}
 
-	box = mailbox_open(ns->list, name, NULL, open_flags);
-	if (box != NULL)
+	box = mailbox_alloc(ns->list, name, NULL, flags);
+	if (mailbox_open(box) == 0)
 		return box;
 
-	*error_r = mailbox_list_get_last_error(ns->list, &error);
+	storage = mailbox_get_storage(box);
+	*error_r = mail_storage_get_last_error(storage, &error);
+	mailbox_close(&box);
 	if (!ctx->set->lda_mailbox_autocreate || error != MAIL_ERROR_NOTFOUND)
 		return NULL;
 
 	/* try creating it. */
-	storage = mail_namespace_get_default_storage(ns);
 	if (mail_storage_mailbox_create(storage, ns, name, FALSE) < 0) {
 		*error_r = mail_storage_get_last_error(storage, &error);
 		return NULL;
@@ -121,16 +122,12 @@ mailbox_open_or_create_synced(struct mai
 	}
 
 	/* and try opening again */
-	box = mailbox_open(ns->list, name, NULL, open_flags);
-	if (box == NULL) {
-		*error_r = mailbox_list_get_last_error(ns->list, &error);
-		return NULL;
-	}
-
-	if (mailbox_sync(box, 0, 0, NULL) < 0) {
+	box = mailbox_alloc(ns->list, name, NULL, flags);
+	storage = mailbox_get_storage(box);
+	if (mailbox_open(box) < 0 ||
+	    mailbox_sync(box, 0, 0, NULL) < 0) {
+		*error_r = mail_storage_get_last_error(storage, &error);
 		mailbox_close(&box);
-		*error_r = mail_storage_get_last_error(mailbox_get_storage(box),
-						       &error);
 		return NULL;
 	}
 	return box;
diff -r 7b6fe859ec64 -r 653183a81b6c src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c	Fri Jun 12 12:52:38 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-storage.c	Mon Jun 15 14:28:55 2009 -0400
@@ -48,13 +48,13 @@ cydir_storage_get_list_settings(const st
 		set->subscription_fname = CYDIR_SUBSCRIPTION_FILE_NAME;
 }
 
-static int create_cydir(struct mail_storage *storage, struct mail_namespace *ns,
+static int create_cydir(struct mail_storage *storage, struct mailbox_list *list,
 			const char *path)
 {
 	mode_t mode;
 	gid_t gid;
 
-	mailbox_list_get_dir_permissions(ns->list, NULL, &mode, &gid);
+	mailbox_list_get_dir_permissions(list, NULL, &mode, &gid);
 	if (mkdir_parents_chown(path, mode, (uid_t)-1, gid) < 0 &&
 	    errno != EEXIST) {
 		if (!mail_storage_set_error_from_errno(storage)) {
@@ -67,76 +67,64 @@ static int create_cydir(struct mail_stor
 }
 
 static struct mailbox *
-cydir_open(struct mail_storage *storage, struct mailbox_list *list,
-	   const char *name, enum mailbox_open_flags flags)
+cydir_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
+		    const char *name, struct istream *input,
+		    enum mailbox_flags flags)
 {
 	struct cydir_mailbox *mbox;
-	struct mail_index *index;
-	const char *path;
 	pool_t pool;
 
-	path = mailbox_list_get_path(list, name,
-				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	index = index_storage_alloc(list, name, flags, CYDIR_INDEX_PREFIX);
-	mail_index_set_fsync_types(index, MAIL_INDEX_SYNC_TYPE_APPEND |
-				   MAIL_INDEX_SYNC_TYPE_EXPUNGE);
+	/* cydir can't work without index files */
+	flags &= ~MAILBOX_FLAG_NO_INDEX_FILES;
 
 	pool = pool_alloconly_create("cydir mailbox", 1024+512);
 	mbox = p_new(pool, struct cydir_mailbox, 1);
 	mbox->ibox.box = cydir_mailbox;
 	mbox->ibox.box.pool = pool;
 	mbox->ibox.box.storage = storage;
+	mbox->ibox.box.list = list;
 	mbox->ibox.mail_vfuncs = &cydir_mail_vfuncs;
-	mbox->ibox.index = index;
+
+	index_storage_mailbox_alloc(&mbox->ibox, name, input, flags,
+				    CYDIR_INDEX_PREFIX);
+	mail_index_set_fsync_types(mbox->ibox.index,
+				   MAIL_INDEX_SYNC_TYPE_APPEND |
+				   MAIL_INDEX_SYNC_TYPE_EXPUNGE);
 
 	mbox->storage = (struct cydir_storage *)storage;
-	mbox->path = p_strdup(pool, path);
-
-	index_storage_mailbox_init(&mbox->ibox, name, flags, FALSE);
 	return &mbox->ibox.box;
 }
 


More information about the dovecot-cvs mailing list