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