static void mailbox_list_try_delete(struct mailbox_list *list, const char *name, enum mailbox_list_path_type type) { const char *mailbox_path, *path; mailbox_path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_MAILBOX); path = mailbox_list_get_path(list, name, type); if (path == NULL || *path == '\0' || strcmp(path, mailbox_path) == 0) return; if (*list->set.maildir_name == '\0' && (list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) == 0) { /* this directory may contain also child mailboxes' data. we don't want to delete that. */ bool rmdir_path = *list->set.maildir_name != '\0'; if (mailbox_list_delete_mailbox_nonrecursive(list, name, path, rmdir_path) < 0) return; } else { if (mailbox_list_delete_trash(path) < 0 && errno != ENOENT && errno != ENOTEMPTY) { mailbox_list_set_critical(list, "unlink_directory(%s) failed: %m", path); } } /* avoid leaving empty directories lying around */ mailbox_list_delete_until_root(list, path, type); }
static int maildir_list_delete_maildir(struct mailbox_list *list, const char *name) { const char *path, *trash_dir; int ret = 0; trash_dir = mailbox_list_maildir_get_trash_dir(list); ret = mailbox_list_delete_maildir_via_trash(list, name, trash_dir); if (ret < 0) return -1; if (ret == 0) { /* we could actually use just unlink_directory() but error handling is easier this way :) */ if (mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_MAILBOX, &path) <= 0) i_unreached(); if (mailbox_list_delete_mailbox_nonrecursive(list, name, path, TRUE) < 0) return -1; } return 0; }