dovecot-2.2: lib-storage: Removed mailbox_list.create_mailbox_di...

dovecot at dovecot.org dovecot at dovecot.org
Wed Sep 26 00:39:03 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/6e90fc8dfa25
changeset: 15112:6e90fc8dfa25
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Sep 26 00:35:10 2012 +0300
description:
lib-storage: Removed mailbox_list.create_mailbox_dir() virtual function.
It really didn't need to be virtual. Some storages didn't care about it,
others wanted it to work basically the same.

diffstat:

 src/lib-storage/index/cydir/cydir-storage.c      |   7 +-
 src/lib-storage/index/dbox-common/dbox-storage.c |   6 +-
 src/lib-storage/index/imapc/imapc-list.c         |  11 ----
 src/lib-storage/index/index-storage.c            |  57 ++++++++++++++++++++++++
 src/lib-storage/index/index-storage.h            |   1 +
 src/lib-storage/index/maildir/maildir-storage.c  |  15 +-----
 src/lib-storage/index/mbox/mbox-storage.c        |   5 +-
 src/lib-storage/index/shared/shared-list.c       |  16 ------
 src/lib-storage/list/mailbox-list-fs.c           |  56 -----------------------
 src/lib-storage/list/mailbox-list-index.c        |  12 -----
 src/lib-storage/list/mailbox-list-maildir.c      |  52 ---------------------
 src/lib-storage/list/mailbox-list-none.c         |  10 ----
 src/lib-storage/mail-storage.c                   |  12 -----
 src/lib-storage/mailbox-list-private.h           |   9 ---
 src/plugins/acl/acl-mailbox-list.c               |  24 ----------
 15 files changed, 68 insertions(+), 225 deletions(-)

diffs (truncated from 511 to 300 lines):

diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/index/cydir/cydir-storage.c	Wed Sep 26 00:35:10 2012 +0300
@@ -92,9 +92,10 @@
 cydir_mailbox_create(struct mailbox *box, const struct mailbox_update *update,
 		     bool directory)
 {
-	if (directory &&
-	    (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0)
-		return 0;
+	int ret;
+
+	if ((ret = index_storage_mailbox_create(box, directory)) <= 0)
+		return ret;
 
 	return update == NULL ? 0 :
 		index_storage_mailbox_update(box, update);
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/index/dbox-common/dbox-storage.c
--- a/src/lib-storage/index/dbox-common/dbox-storage.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/index/dbox-common/dbox-storage.c	Wed Sep 26 00:35:10 2012 +0300
@@ -242,10 +242,8 @@
 	struct stat st;
 	int ret;
 
-	if (directory &&
-	    (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0)
-		return 0;
-
+	if ((ret = index_storage_mailbox_create(box, directory)) <= 0)
+		return ret;
 	if (mailbox_open(box) < 0)
 		return -1;
 
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/index/imapc/imapc-list.c
--- a/src/lib-storage/index/imapc/imapc-list.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-list.c	Wed Sep 26 00:35:10 2012 +0300
@@ -561,16 +561,6 @@
 }
 
 static int
-imapc_list_create_mailbox_dir(struct mailbox_list *list ATTR_UNUSED,
-			      const char *name ATTR_UNUSED,
-			      enum mailbox_dir_create_type type ATTR_UNUSED)
-{
-	/* this gets called just before mailbox.create().
-	   we don't need to do anything. */
-	return 0;
-}
-
-static int
 imapc_list_delete_mailbox(struct mailbox_list *_list, const char *name)
 {
 	struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
@@ -692,7 +682,6 @@
 		NULL,
 		imapc_list_subscriptions_refresh,
 		imapc_list_set_subscribed,
-		imapc_list_create_mailbox_dir,
 		imapc_list_delete_mailbox,
 		imapc_list_delete_dir,
 		imapc_list_delete_symlink,
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/index/index-storage.c	Wed Sep 26 00:35:10 2012 +0300
@@ -461,6 +461,63 @@
 	return ret;
 }
 
+int index_storage_mailbox_create(struct mailbox *box, bool directory)
+{
+	const char *path, *p;
+	enum mailbox_existence existence;
+	bool create_parent_dir;
+	int ret;
+
+	path = mailbox_list_get_path(box->list, box->name,
+				     directory ? MAILBOX_LIST_PATH_TYPE_DIR :
+				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	if (path == NULL) {
+		/* layout=none */
+		mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
+				       "Mailbox creation not supported");
+		return -1;
+	}
+	create_parent_dir = !directory &&
+		(box->list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0;
+	if (create_parent_dir) {
+		/* we only need to make sure that the parent directory exists */
+		p = strrchr(path, '/');
+		if (p == NULL)
+			return 1;
+		path = t_strdup_until(path, p);
+	}
+
+	if ((ret = mailbox_list_mkdir(box->list, box->name, path)) < 0) {
+		mail_storage_copy_list_error(box->storage, box->list);
+		return -1;
+	}
+	if (ret == 0) {
+		/* directory already exists */
+		if (create_parent_dir)
+			return 1;
+		if (!directory && *box->list->set.mailbox_dir_name == '\0') {
+			/* For example: layout=fs, path=~/Maildir/foo
+			   might itself exist, but does it have the
+			   cur|new|tmp subdirs? */
+			if (mailbox_exists(box, TRUE, &existence) < 0)
+				return -1;
+			if (existence == MAILBOX_EXISTENCE_NONE)
+				return 1;
+		}
+		mail_storage_set_error(box->storage, MAIL_ERROR_EXISTS,
+				       "Mailbox already exists");
+		return -1;
+	}
+
+	if (directory &&
+	    (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0) {
+		/* we only wanted to create the directory and it's done now */
+		return 0;
+	}
+	/* the caller should still create the mailbox */
+	return 1;
+}
+
 int index_storage_mailbox_delete_dir(struct mailbox *box, bool mailbox_deleted)
 {
 	guid_128_t dir_sha128;
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/index/index-storage.h
--- a/src/lib-storage/index/index-storage.h	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/index/index-storage.h	Wed Sep 26 00:35:10 2012 +0300
@@ -73,6 +73,7 @@
 				 const struct mailbox_update *update);
 void index_storage_mailbox_update_cache(struct mailbox *box,
 					const struct mailbox_update *update);
+int index_storage_mailbox_create(struct mailbox *box, bool directory);
 int index_storage_mailbox_delete(struct mailbox *box);
 int index_storage_mailbox_delete_dir(struct mailbox *box, bool mailbox_deleted);
 int index_storage_mailbox_rename(struct mailbox *src, struct mailbox *dest);
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Wed Sep 26 00:35:10 2012 +0300
@@ -491,19 +491,8 @@
 	struct stat st;
 	int ret;
 
-	if (directory &&
-	    (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0)
-		return 0;
-
-	ret = maildir_check_tmp(box->storage, mailbox_get_path(box));
-	if (ret > 0) {
-		mail_storage_set_error(box->storage, MAIL_ERROR_EXISTS,
-				       "Mailbox already exists");
-		return -1;
-	}
-	if (ret < 0)
-		return -1;
-
+	if ((ret = index_storage_mailbox_create(box, directory)) <= 0)
+		return ret;
 	/* the maildir is created now. finish the creation as best as we can */
 	if (create_maildir_subdirs(box, FALSE) < 0)
 		ret = -1;
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Wed Sep 26 00:35:10 2012 +0300
@@ -534,9 +534,8 @@
 {
 	int fd, ret;
 
-	if (directory &&
-	    (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0)
-		return 0;
+	if ((ret = index_storage_mailbox_create(box, directory)) <= 0)
+		return ret;
 
 	if (box->inbox_any) {
 		if (create_inbox(box) < 0)
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/index/shared/shared-list.c
--- a/src/lib-storage/index/shared/shared-list.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/index/shared/shared-list.c	Wed Sep 26 00:35:10 2012 +0300
@@ -207,21 +207,6 @@
 }
 
 static int
-shared_list_create_mailbox_dir(struct mailbox_list *list, const char *name,
-			       enum mailbox_dir_create_type type)
-{
-	struct mail_namespace *ns = list->ns;
-	int ret;
-
-	if (shared_storage_get_namespace(&ns, &name) < 0)
-		return -1;
-	ret = ns->list->v.create_mailbox_dir(ns->list, name, type);
-	if (ret < 0)
-		shared_list_copy_error(list, ns);
-	return ret;
-}
-
-static int
 shared_list_delete_mailbox(struct mailbox_list *list, const char *name)
 {
 	struct mail_namespace *ns = list->ns;
@@ -322,7 +307,6 @@
 		NULL,
 		shared_list_subscriptions_refresh,
 		shared_list_set_subscribed,
-		shared_list_create_mailbox_dir,
 		shared_list_delete_mailbox,
 		shared_list_delete_dir,
 		shared_list_delete_symlink,
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-fs.c	Wed Sep 26 00:35:10 2012 +0300
@@ -163,61 +163,6 @@
 				       name, set);
 }
 
-static int mailbox_is_selectable(struct mailbox_list *list, const char *name)
-{
-	enum mailbox_info_flags flags;
-
-	if (mailbox_list_mailbox(list, name, &flags) < 0)
-		return -1;
-
-	return (flags & (MAILBOX_NOSELECT | MAILBOX_NONEXISTENT)) == 0 ? 1 : 0;
-}
-
-static int
-fs_list_create_mailbox_dir(struct mailbox_list *list, const char *name,
-			   enum mailbox_dir_create_type type)
-{
-	struct mailbox_permissions perm;
-	const char *path, *p;
-	bool directory, create_parent_dir;
-	int ret;
-
-	directory = type != MAILBOX_DIR_CREATE_TYPE_MAILBOX;
-	path = mailbox_list_get_path(list, name,
-				     directory ? MAILBOX_LIST_PATH_TYPE_DIR :
-				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	create_parent_dir = !directory &&
-		(list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0;
-	if (create_parent_dir) {
-		/* we only need to make sure that the parent directory exists */
-		p = strrchr(path, '/');
-		if (p == NULL)
-			return 0;
-		path = t_strdup_until(path, p);
-	}
-
-	mailbox_list_get_permissions(list, name, &perm);
-	if (mkdir_parents_chgrp(path, perm.dir_create_mode,
-				perm.file_create_gid,
-				perm.file_create_gid_origin) == 0)
-		return 0;
-	else if (errno == EEXIST) {
-		if (create_parent_dir)
-			return 0;
-		if (!directory && *list->set.mailbox_dir_name == '\0') {
-			if ((ret = mailbox_is_selectable(list, name)) <= 0)
-				return ret;
-		}
-		mailbox_list_set_error(list, MAIL_ERROR_EXISTS,
-				       "Mailbox already exists");
-	} else if (errno == ENOTDIR) {
-		mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
-			"Mailbox doesn't allow inferior mailboxes");
-	} else if (!mailbox_list_set_error_from_errno(list)) {
-		mailbox_list_set_critical(list, "mkdir(%s) failed: %m", path);
-	}
-	return -1;
-}
 
 static const char *mailbox_list_fs_get_trash_dir(struct mailbox_list *list)
 {
@@ -523,7 +468,6 @@
 		NULL,
 		mailbox_list_subscriptions_refresh,
 		fs_list_set_subscribed,
-		fs_list_create_mailbox_dir,
 		fs_list_delete_mailbox,
 		fs_list_delete_dir,
 		mailbox_list_delete_symlink_default,
diff -r f5514e09fd1e -r 6e90fc8dfa25 src/lib-storage/list/mailbox-list-index.c
--- a/src/lib-storage/list/mailbox-list-index.c	Wed Sep 26 00:25:21 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-index.c	Wed Sep 26 00:35:10 2012 +0300
@@ -342,17 +342,6 @@
 }
 
 static int
-mailbox_list_index_create_mailbox_dir(struct mailbox_list *list,
-				      const char *name,
-				      enum mailbox_dir_create_type type)
-{
-	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list);
-
-	mailbox_list_index_refresh_later(list);
-	return ilist->module_ctx.super.create_mailbox_dir(list, name, type);


More information about the dovecot-cvs mailing list