dovecot-2.0: lib-storage: Added mailbox_list_delete_dir() to (tr...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Jan 1 00:19:17 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/3c12d0376cef
changeset: 10544:3c12d0376cef
user: Timo Sirainen <tss at iki.fi>
date: Thu Dec 31 17:18:00 2009 -0500
description:
lib-storage: Added mailbox_list_delete_dir() to (try to) delete a \noselect mailbox.
diffstat:
6 files changed, 77 insertions(+)
src/lib-storage/index/shared/shared-list.c | 15 +++++++++++++++
src/lib-storage/list/mailbox-list-fs.c | 27 +++++++++++++++++++++++++++
src/lib-storage/list/mailbox-list-maildir.c | 22 ++++++++++++++++++++++
src/lib-storage/mailbox-list-private.h | 1 +
src/lib-storage/mailbox-list.c | 10 ++++++++++
src/lib-storage/mailbox-list.h | 2 ++
diffs (172 lines):
diff -r f20bced53213 -r 3c12d0376cef src/lib-storage/index/shared/shared-list.c
--- a/src/lib-storage/index/shared/shared-list.c Thu Dec 31 13:46:24 2009 -0500
+++ b/src/lib-storage/index/shared/shared-list.c Thu Dec 31 17:18:00 2009 -0500
@@ -239,6 +239,20 @@ shared_list_delete_mailbox(struct mailbo
if (shared_storage_get_namespace(&ns, &name) < 0)
return -1;
ret = mailbox_list_delete_mailbox(ns->list, name);
+ if (ret < 0)
+ shared_list_copy_error(list, ns);
+ return ret;
+}
+
+static int
+shared_list_delete_dir(struct mailbox_list *list, const char *name)
+{
+ struct mail_namespace *ns = list->ns;
+ int ret;
+
+ if (shared_storage_get_namespace(&ns, &name) < 0)
+ return -1;
+ ret = mailbox_list_delete_dir(ns->list, name);
if (ret < 0)
shared_list_copy_error(list, ns);
return ret;
@@ -324,6 +338,7 @@ struct mailbox_list shared_mailbox_list
NULL,
shared_list_set_subscribed,
shared_list_delete_mailbox,
+ shared_list_delete_dir,
shared_list_rename_mailbox,
shared_list_rename_mailbox_pre
}
diff -r f20bced53213 -r 3c12d0376cef src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c Thu Dec 31 13:46:24 2009 -0500
+++ b/src/lib-storage/list/mailbox-list-fs.c Thu Dec 31 17:18:00 2009 -0500
@@ -3,6 +3,7 @@
#include "lib.h"
#include "hostpid.h"
#include "mkdir-parents.h"
+#include "mailbox-log.h"
#include "subscription-file.h"
#include "mail-storage.h"
#include "mailbox-list-fs.h"
@@ -280,6 +281,31 @@ static int fs_list_delete_mailbox(struct
return mailbox_list_delete_index_control(list, name);
}
+static int fs_list_delete_dir(struct mailbox_list *list, const char *name)
+{
+ const char *path;
+ uint8_t dir_sha128[MAIL_GUID_128_SIZE];
+
+ path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
+ if (rmdir(path) == 0) {
+ mailbox_name_get_sha128(name, dir_sha128);
+ mailbox_list_add_change(list, MAILBOX_LOG_RECORD_DELETE_DIR,
+ dir_sha128);
+ return 0;
+ }
+
+ if (errno == ENOENT) {
+ mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND,
+ T_MAIL_ERR_MAILBOX_NOT_FOUND(name));
+ } else if (errno == ENOTEMPTY) {
+ mailbox_list_set_error(list, MAIL_ERROR_EXISTS,
+ "Mailbox exists");
+ } else {
+ mailbox_list_set_critical(list, "rmdir(%s) failed: %m", path);
+ }
+ return -1;
+}
+
static int rename_dir(struct mailbox_list *oldlist, const char *oldname,
struct mailbox_list *newlist, const char *newname,
enum mailbox_list_path_type type, bool rmdir_parent)
@@ -436,6 +462,7 @@ struct mailbox_list fs_mailbox_list = {
NULL,
fs_list_set_subscribed,
fs_list_delete_mailbox,
+ fs_list_delete_dir,
fs_list_rename_mailbox,
NULL
}
diff -r f20bced53213 -r 3c12d0376cef src/lib-storage/list/mailbox-list-maildir.c
--- a/src/lib-storage/list/mailbox-list-maildir.c Thu Dec 31 13:46:24 2009 -0500
+++ b/src/lib-storage/list/mailbox-list-maildir.c Thu Dec 31 17:18:00 2009 -0500
@@ -385,6 +385,26 @@ maildir_list_delete_mailbox(struct mailb
{
/* let the backend handle the rest */
return mailbox_list_delete_index_control(list, name);
+}
+
+static int maildir_list_delete_dir(struct mailbox_list *list, const char *name)
+{
+ const char *path;
+ struct stat st;
+
+ /* with maildir++ there aren't any non-selectable mailboxes.
+ we'll always fail. */
+ path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
+ if (stat(path, &st) == 0) {
+ mailbox_list_set_error(list, MAIL_ERROR_EXISTS,
+ "Mailbox exists");
+ } else if (errno == ENOENT) {
+ mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND,
+ T_MAIL_ERR_MAILBOX_NOT_FOUND(name));
+ } else {
+ mailbox_list_set_critical(list, "stat(%s) failed: %m", path);
+ }
+ return -1;
}
static int
@@ -461,6 +481,7 @@ struct mailbox_list maildir_mailbox_list
NULL,
maildir_list_set_subscribed,
maildir_list_delete_mailbox,
+ maildir_list_delete_dir,
maildir_list_rename_mailbox,
NULL
}
@@ -489,6 +510,7 @@ struct mailbox_list imapdir_mailbox_list
NULL,
maildir_list_set_subscribed,
maildir_list_delete_mailbox,
+ maildir_list_delete_dir,
maildir_list_rename_mailbox,
NULL
}
diff -r f20bced53213 -r 3c12d0376cef src/lib-storage/mailbox-list-private.h
--- a/src/lib-storage/mailbox-list-private.h Thu Dec 31 13:46:24 2009 -0500
+++ b/src/lib-storage/mailbox-list-private.h Thu Dec 31 17:18:00 2009 -0500
@@ -58,6 +58,7 @@ struct mailbox_list_vfuncs {
int (*set_subscribed)(struct mailbox_list *list,
const char *name, bool set);
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,
struct mailbox_list *newlist, const char *newname,
bool rename_children);
diff -r f20bced53213 -r 3c12d0376cef src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c Thu Dec 31 13:46:24 2009 -0500
+++ b/src/lib-storage/mailbox-list.c Thu Dec 31 17:18:00 2009 -0500
@@ -744,6 +744,16 @@ int mailbox_list_delete_mailbox(struct m
return -1;
}
return list->v.delete_mailbox(list, name);
+}
+
+int mailbox_list_delete_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.delete_dir(list, name);
}
static bool nullequals(const void *p1, const void *p2)
diff -r f20bced53213 -r 3c12d0376cef src/lib-storage/mailbox-list.h
--- a/src/lib-storage/mailbox-list.h Thu Dec 31 13:46:24 2009 -0500
+++ b/src/lib-storage/mailbox-list.h Thu Dec 31 17:18:00 2009 -0500
@@ -243,6 +243,8 @@ int mailbox_list_set_subscribed(struct m
/* Delete the given mailbox. If it has children, they aren't deleted. */
int mailbox_list_delete_mailbox(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);
/* Rename mailbox. Renaming across different mailbox lists is possible only
between private namespaces and storages of the same type. If the rename
fails, the error is set to oldlist. */
More information about the dovecot-cvs
mailing list