dovecot-2.0-sslstream: lib-storage: Added mailbox_list_delete_di...

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:57:19 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/3c12d0376cef
changeset: 10545: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