dovecot-2.0: lib-storage: Added mailbox_list_create_dir()

dovecot at dovecot.org dovecot at dovecot.org
Tue Sep 14 18:20:57 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/ba924e3ee4ae
changeset: 12114:ba924e3ee4ae
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Sep 14 16:18:13 2010 +0100
description:
lib-storage: Added mailbox_list_create_dir()

diffstat:

 src/lib-storage/index/shared/shared-list.c  |   4 ++--
 src/lib-storage/list/mailbox-list-fs.c      |   5 +++--
 src/lib-storage/list/mailbox-list-maildir.c |  12 +++++++++---
 src/lib-storage/list/mailbox-list-none.c    |   2 +-
 src/lib-storage/mail-storage.c              |   7 +++++--
 src/lib-storage/mailbox-list-private.h      |  10 +++++++++-
 src/lib-storage/mailbox-list.c              |  11 +++++++++++
 src/lib-storage/mailbox-list.h              |   3 +++
 src/plugins/acl/acl-mailbox-list.c          |   5 ++---
 9 files changed, 45 insertions(+), 14 deletions(-)

diffs (196 lines):

diff -r 2e1226259979 -r ba924e3ee4ae src/lib-storage/index/shared/shared-list.c
--- a/src/lib-storage/index/shared/shared-list.c	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/lib-storage/index/shared/shared-list.c	Tue Sep 14 16:18:13 2010 +0100
@@ -232,14 +232,14 @@
 
 static int
 shared_list_create_mailbox_dir(struct mailbox_list *list, const char *name,
-			       bool directory)
+			       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, directory);
+	ret = ns->list->v.create_mailbox_dir(ns->list, name, type);
 	if (ret < 0)
 		shared_list_copy_error(list, ns);
 	return ret;
diff -r 2e1226259979 -r ba924e3ee4ae src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/lib-storage/list/mailbox-list-fs.c	Tue Sep 14 16:18:13 2010 +0100
@@ -317,14 +317,15 @@
 
 static int
 fs_list_create_mailbox_dir(struct mailbox_list *list, const char *name,
-			   bool directory)
+			   enum mailbox_dir_create_type type)
 {
 	const char *path, *gid_origin, *p;
 	mode_t mode;
 	gid_t gid;
-	bool create_parent_dir;
+	bool directory, create_parent_dir;
 	int ret;
 
+	directory = type != MAILBOX_LIST_PATH_TYPE_MAILBOX;
 	path = mailbox_list_get_path(list, name,
 				     directory ? MAILBOX_LIST_PATH_TYPE_DIR :
 				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
diff -r 2e1226259979 -r ba924e3ee4ae src/lib-storage/list/mailbox-list-maildir.c
--- a/src/lib-storage/list/mailbox-list-maildir.c	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/lib-storage/list/mailbox-list-maildir.c	Tue Sep 14 16:18:13 2010 +0100
@@ -323,16 +323,22 @@
 
 static int
 maildir_list_create_mailbox_dir(struct mailbox_list *list, const char *name,
-				bool directory ATTR_UNUSED)
+				enum mailbox_dir_create_type type)
 {
 	const char *path, *root_dir, *gid_origin, *p;
 	mode_t mode;
 	gid_t gid;
 	bool create_parent_dir;
 
+	if (type == MAILBOX_DIR_CREATE_TYPE_ONLY_NOSELECT) {
+		mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
+				       "Can't create non-selectable mailbox");
+		return -1;
+	}
+
 	path = mailbox_list_get_path(list, name,
 				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	create_parent_dir = !directory &&
+	create_parent_dir = type == MAILBOX_DIR_CREATE_TYPE_MAILBOX &&
 		(list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0;
 	if (create_parent_dir) {
 		/* we only need to make sure that the parent directory exists */
@@ -351,7 +357,7 @@
 	} else if (errno == EEXIST) {
 		if (create_parent_dir)
 			return 0;
-		if (!directory) {
+		if (type == MAILBOX_DIR_CREATE_TYPE_MAILBOX) {
 			if (strcmp(path, root_dir) == 0) {
 				/* even though the root directory exists,
 				   the mailbox might not */
diff -r 2e1226259979 -r ba924e3ee4ae src/lib-storage/list/mailbox-list-none.c
--- a/src/lib-storage/list/mailbox-list-none.c	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/lib-storage/list/mailbox-list-none.c	Tue Sep 14 16:18:13 2010 +0100
@@ -84,7 +84,7 @@
 static int
 none_list_create_mailbox_dir(struct mailbox_list *list,
 			     const char *name ATTR_UNUSED,
-			     bool directory ATTR_UNUSED)
+			     enum mailbox_dir_create_type type ATTR_UNUSED)
 {
 	mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
 	return -1;
diff -r 2e1226259979 -r ba924e3ee4ae src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/lib-storage/mail-storage.c	Tue Sep 14 16:18:13 2010 +0100
@@ -643,14 +643,17 @@
 int mailbox_create(struct mailbox *box, const struct mailbox_update *update,
 		   bool directory)
 {
+	enum mailbox_dir_create_type type;
+
 	if (!mailbox_list_is_valid_create_name(box->list, box->name)) {
 		mail_storage_set_error(box->storage, MAIL_ERROR_PARAMS,
 				       "Invalid mailbox name");
 		return -1;
 	}
 
-	if (box->list->v.create_mailbox_dir(box->list, box->name,
-					    directory) < 0) {
+	type = directory ? MAILBOX_DIR_CREATE_TYPE_TRY_NOSELECT :
+		MAILBOX_DIR_CREATE_TYPE_MAILBOX;
+	if (box->list->v.create_mailbox_dir(box->list, box->name, type) < 0) {
 		mail_storage_copy_list_error(box->storage, box->list);
 		return -1;
 	}
diff -r 2e1226259979 -r ba924e3ee4ae src/lib-storage/mailbox-list-private.h
--- a/src/lib-storage/mailbox-list-private.h	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/lib-storage/mailbox-list-private.h	Tue Sep 14 16:18:13 2010 +0100
@@ -21,6 +21,14 @@
 	(((flags) & (MAILBOX_SELECT | MAILBOX_NOSELECT | \
 		     MAILBOX_NONEXISTENT)) != 0)
 
+enum mailbox_dir_create_type {
+	/* Creating a mailbox */
+	MAILBOX_DIR_CREATE_TYPE_MAILBOX,
+	/* Create a \Noselect or a mailbox */
+	MAILBOX_DIR_CREATE_TYPE_TRY_NOSELECT,
+	/* Create a \Noselect or fail */
+	MAILBOX_DIR_CREATE_TYPE_ONLY_NOSELECT
+};
 
 struct mailbox_list_vfuncs {
 	struct mailbox_list *(*alloc)(void);
@@ -65,7 +73,7 @@
 	int (*set_subscribed)(struct mailbox_list *list,
 			      const char *name, bool set);
 	int (*create_mailbox_dir)(struct mailbox_list *list, const char *name,
-				  bool directory);
+				  enum mailbox_dir_create_type type);
 	int (*delete_mailbox)(struct mailbox_list *list, const char *name);
 	int (*delete_dir)(struct mailbox_list *list, const char *name);
 	int (*rename_mailbox)(struct mailbox_list *oldlist, const char *oldname,
diff -r 2e1226259979 -r ba924e3ee4ae src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/lib-storage/mailbox-list.c	Tue Sep 14 16:18:13 2010 +0100
@@ -1160,6 +1160,17 @@
 	return 0;
 }
 
+int mailbox_list_create_dir(struct mailbox_list *list, const char *name)
+{
+	if (!mailbox_list_is_valid_existing_name(list, name) || *name == '\0') {
+		mailbox_list_set_error(list, MAIL_ERROR_PARAMS,
+				       "Invalid mailbox name");
+		return -1;
+	}
+	return list->v.create_mailbox_dir(list, name,
+					  MAILBOX_DIR_CREATE_TYPE_ONLY_NOSELECT);
+}
+
 int mailbox_list_delete_dir(struct mailbox_list *list, const char *name)
 {
 	if (!mailbox_list_is_valid_existing_name(list, name) || *name == '\0') {
diff -r 2e1226259979 -r ba924e3ee4ae src/lib-storage/mailbox-list.h
--- a/src/lib-storage/mailbox-list.h	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/lib-storage/mailbox-list.h	Tue Sep 14 16:18:13 2010 +0100
@@ -265,6 +265,9 @@
 int mailbox_list_set_subscribed(struct mailbox_list *list,
 				const char *name, bool set);
 
+/* Create a non-selectable mailbox. Fail with MAIL_ERROR_NOTPOSSIBLE if only
+   a selectable mailbox can be created. */
+int mailbox_list_create_dir(struct mailbox_list *list, const char *name);
 /* Delete a non-selectable mailbox. Fail if the mailbox is selectable. */
 int mailbox_list_delete_dir(struct mailbox_list *list, const char *name);
 
diff -r 2e1226259979 -r ba924e3ee4ae src/plugins/acl/acl-mailbox-list.c
--- a/src/plugins/acl/acl-mailbox-list.c	Tue Sep 14 15:22:37 2010 +0100
+++ b/src/plugins/acl/acl-mailbox-list.c	Tue Sep 14 16:18:13 2010 +0100
@@ -466,7 +466,7 @@
 
 static int
 acl_mailbox_list_create_dir(struct mailbox_list *list, const char *name,
-			    bool directory)
+			    enum mailbox_dir_create_type type)
 {
 	struct acl_mailbox_list *alist = ACL_LIST_CONTEXT(list);
 	int ret;
@@ -484,8 +484,7 @@
 				       MAIL_ERRSTR_NO_PERMISSION);
 		return -1;
 	}
-	return alist->module_ctx.super.
-		create_mailbox_dir(list, name, directory);
+	return alist->module_ctx.super.create_mailbox_dir(list, name, type);
 }
 
 static void acl_mailbox_list_init_shared(struct mailbox_list *list)


More information about the dovecot-cvs mailing list