if (ret <= 0)
return ret;
- if ((_list->flags & MAILBOX_LIST_FLAG_NO_MAIL_FILES) != 0) {
+ if ((_list->flags & (MAILBOX_LIST_FLAG_NO_MAIL_FILES |
+ MAILBOX_LIST_FLAG_NO_DELETES)) != 0) {
ret = 0;
} else if ((_list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0) {
ret = mailbox_list_delete_mailbox_file(_list, name, path);
path, TRUE);
}
- if (ret == 0 || (_list->props & MAILBOX_LIST_PROP_AUTOCREATE_DIRS) != 0)
+ if ((ret == 0 || (_list->props & MAILBOX_LIST_PROP_AUTOCREATE_DIRS) != 0) &&
+ (_list->flags & MAILBOX_LIST_FLAG_NO_DELETES) == 0)
index_list_delete_finish(_list, name);
if (ret == 0) {
if (index_list_delete_entry(list, name, TRUE) < 0)
MAIL_STORAGE_CLASS_FLAG_BINARY_DATA = 0x100,
/* Message GUIDs can only be 128bit (always set
mailbox_status.have_only_guid128) */
- MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUID128 = 0x200
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUID128 = 0x200,
+ /* Storage deletes all files internally - mailbox list's
+ delete_mailbox() shouldn't delete anything itself. */
+ MAIL_STORAGE_CLASS_FLAG_NO_LIST_DELETES = 0x400
};
struct mail_binary_cache {
list_flags |= MAILBOX_LIST_FLAG_MAILBOX_FILES;
if ((storage_class->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0)
list_flags |= MAILBOX_LIST_FLAG_NO_MAIL_FILES;
+ if ((storage_class->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_LIST_DELETES) != 0)
+ list_flags |= MAILBOX_LIST_FLAG_NO_DELETES;
if (mailbox_list_create(list_set.layout, ns, &list_set,
list_flags, &list, error_r) < 0) {
*error_r = t_strdup_printf("Mailbox list driver %s: %s",
mailbox list to it. */
MAILBOX_LIST_FLAG_SECONDARY = 0x02,
/* There are no mail files, only index and/or control files. */
- MAILBOX_LIST_FLAG_NO_MAIL_FILES = 0x04
+ MAILBOX_LIST_FLAG_NO_MAIL_FILES = 0x04,
+ /* LAYOUT=index: Don't delete any files in delete_mailbox(). */
+ MAILBOX_LIST_FLAG_NO_DELETES = 0x08
};
enum mailbox_info_flags {