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