Mercurial > dovecot > core-2.2
changeset 13649:64ca27392217
lib-storage: Added MAILBOX_LIST_FLAG_OPTIONAL_BOXES flag.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 04 Nov 2011 20:36:06 +0200 |
parents | 926a7ceeaa10 |
children | a79c256b361e |
files | src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/mailbox-list.h |
diffstat | 3 files changed, 45 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-fs.c Fri Nov 04 20:11:39 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-fs.c Fri Nov 04 20:36:06 2011 +0200 @@ -316,46 +316,54 @@ return t_strdup_printf("%s/"MAILBOX_LIST_FS_TRASH_DIR_NAME, root_dir); } -static int fs_list_delete_mailbox(struct mailbox_list *list, const char *name) +static int +fs_list_delete_maildir(struct mailbox_list *list, const char *name) { const char *path, *trash_dir; - int ret = 0; - - if ((list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0) { - if (mailbox_list_delete_mailbox_file(list, name) < 0) - return -1; - ret = 1; - } + bool rmdir_path; + int ret; if (*list->set.maildir_name != '\0' && - *list->set.mailbox_dir_name != '\0' && ret == 0) { + *list->set.mailbox_dir_name != '\0') { trash_dir = mailbox_list_fs_get_trash_dir(list); ret = mailbox_list_delete_maildir_via_trash(list, name, trash_dir); if (ret < 0) return -1; - /* try to delete the parent directory */ - path = mailbox_list_get_path(list, name, - MAILBOX_LIST_PATH_TYPE_DIR); - if (rmdir(path) < 0 && errno != ENOENT && - errno != ENOTEMPTY && errno != EEXIST) { - mailbox_list_set_critical(list, "rmdir(%s) failed: %m", - path); + if (ret > 0) { + /* try to delete the parent directory */ + path = mailbox_list_get_path(list, name, + MAILBOX_LIST_PATH_TYPE_DIR); + if (rmdir(path) < 0 && errno != ENOENT && + errno != ENOTEMPTY && errno != EEXIST) { + mailbox_list_set_critical(list, + "rmdir(%s) failed: %m", path); + } + return 0; } } - if (ret == 0) { - bool rmdir_path = *list->set.maildir_name != '\0'; + rmdir_path = *list->set.maildir_name != '\0'; + path = mailbox_list_get_path(list, name, + MAILBOX_LIST_PATH_TYPE_MAILBOX); + return mailbox_list_delete_mailbox_nonrecursive(list, name, path, + rmdir_path); +} - path = mailbox_list_get_path(list, name, - MAILBOX_LIST_PATH_TYPE_MAILBOX); - if (mailbox_list_delete_mailbox_nonrecursive(list, name, path, - rmdir_path) < 0) - return -1; +static int fs_list_delete_mailbox(struct mailbox_list *list, const char *name) +{ + int ret; + + if ((list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0) { + ret = mailbox_list_delete_mailbox_file(list, name); + } else { + ret = fs_list_delete_maildir(list, name); } - mailbox_list_delete_finish(list, name); - return 0; + + if (ret == 0 || (list->flags & MAILBOX_LIST_FLAG_OPTIONAL_BOXES) != 0) + mailbox_list_delete_finish(list, name); + return ret; } static int fs_list_rmdir(struct mailbox_list *list, const char *name,
--- a/src/lib-storage/list/mailbox-list-maildir.c Fri Nov 04 20:11:39 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-maildir.c Fri Nov 04 20:36:06 2011 +0200 @@ -402,16 +402,17 @@ static int maildir_list_delete_mailbox(struct mailbox_list *list, const char *name) { + int ret; + if ((list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0) { - if (mailbox_list_delete_mailbox_file(list, name) < 0) - return -1; + ret = mailbox_list_delete_mailbox_file(list, name); } else { - if (maildir_list_delete_maildir(list, name) < 0) - return -1; + ret = maildir_list_delete_maildir(list, name); } - mailbox_list_delete_finish(list, name); - return 0; + if (ret == 0 || (list->flags & MAILBOX_LIST_FLAG_OPTIONAL_BOXES) != 0) + mailbox_list_delete_finish(list, name); + return ret; } static int maildir_list_delete_dir(struct mailbox_list *list, const char *name)
--- a/src/lib-storage/mailbox-list.h Fri Nov 04 20:11:39 2011 +0200 +++ b/src/lib-storage/mailbox-list.h Fri Nov 04 20:36:06 2011 +0200 @@ -32,7 +32,11 @@ MAILBOX_LIST_FLAG_MAILBOX_FILES = 0x01, /* Namespace already has a mailbox list, don't assign this mailbox list to it. */ - MAILBOX_LIST_FLAG_SECONDARY = 0x02 + MAILBOX_LIST_FLAG_SECONDARY = 0x02, + /* Don't assume that just because a mailbox directory doesn't exist + its index/control directories don't exist (e.g. this is index-only + mailbox list) */ + MAILBOX_LIST_FLAG_OPTIONAL_BOXES = 0x04 }; enum mailbox_info_flags {