Mercurial > dovecot > core-2.2
changeset 10721:ea8f213f0e19 HEAD
lib-storage: Fixes to rename error handling.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 15 Feb 2010 04:08:46 +0200 |
parents | 26b9138d561f |
children | 31aca1df525b |
files | src/lib-storage/index/index-storage.c src/lib-storage/list/mailbox-list-fs.c src/lib-storage/mail-storage.c |
diffstat | 3 files changed, 31 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/index-storage.c Mon Feb 15 03:07:19 2010 +0200 +++ b/src/lib-storage/index/index-storage.c Mon Feb 15 04:08:46 2010 +0200 @@ -490,8 +490,10 @@ if (src->list->v.rename_mailbox(src->list, src->name, dest->list, dest->name, - rename_children) < 0) + rename_children) < 0) { + mail_storage_copy_list_error(src->storage, src->list); return -1; + } /* we'll track mailbox names, instead of GUIDs. We may be renaming a non-selectable mailbox (directory), which doesn't even have a GUID */
--- a/src/lib-storage/list/mailbox-list-fs.c Mon Feb 15 03:07:19 2010 +0200 +++ b/src/lib-storage/list/mailbox-list-fs.c Mon Feb 15 04:08:46 2010 +0200 @@ -571,16 +571,6 @@ return -1; } - if ((alt_newpath != NULL && alt_oldpath == NULL) || - (alt_newpath == NULL && alt_oldpath != NULL)) { - /* both or neither source/dest must to have alt path defined. - otherwise we'd have to do the merging ourself, which would - be possible but a bit too much trouble for now */ - mailbox_list_set_error(oldlist, MAIL_ERROR_NOTPOSSIBLE, - "Can't rename mailboxes across specified storages."); - return -1; - } - if (alt_newpath != NULL) { if (stat(alt_newpath, &st) == 0) { /* race condition or a directory left there lying around?
--- a/src/lib-storage/mail-storage.c Mon Feb 15 03:07:19 2010 +0200 +++ b/src/lib-storage/mail-storage.c Mon Feb 15 04:08:46 2010 +0200 @@ -666,35 +666,53 @@ return ret; } +static bool +mail_storages_rename_compatible(struct mail_storage *storage1, + struct mail_storage *storage2) +{ + if (storage1 == storage2) + return TRUE; + + if (strcmp(storage1->name, storage2->name) != 0) + return FALSE; + if ((storage1->class_flags & MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT) != 0) + return FALSE; + return TRUE; +} + static bool nullequals(const void *p1, const void *p2) { return (p1 == NULL && p2 == NULL) || (p1 != NULL && p2 != NULL); } +static bool +mailbox_lists_rename_compatible(struct mailbox_list *list1, + struct mailbox_list *list2) +{ + return nullequals(list1->set.alt_dir, list2->set.alt_dir) && + nullequals(list1->set.index_dir, list2->set.index_dir) && + nullequals(list1->set.control_dir, list2->set.control_dir); +} + int mailbox_rename(struct mailbox *src, struct mailbox *dest, bool rename_children) { if (!mailbox_list_is_valid_existing_name(src->list, src->name) || *src->name == '\0' || !mailbox_list_is_valid_create_name(dest->list, dest->name)) { - mailbox_list_set_error(src->list, MAIL_ERROR_PARAMS, + mail_storage_set_error(src->storage, MAIL_ERROR_PARAMS, "Invalid mailbox name"); return -1; } - if (strcmp(src->storage->name, dest->storage->name) != 0) { - mailbox_list_set_error(src->list, MAIL_ERROR_NOTPOSSIBLE, - "Can't rename mailbox to another storage type."); - return -1; - } - if (!nullequals(src->list->set.index_dir, dest->list->set.index_dir) || - !nullequals(src->list->set.control_dir, dest->list->set.control_dir)) { - mailbox_list_set_error(src->list, MAIL_ERROR_NOTPOSSIBLE, + if (!mail_storages_rename_compatible(src->storage, dest->storage) || + !mailbox_lists_rename_compatible(src->list, dest->list)) { + mail_storage_set_error(src->storage, MAIL_ERROR_NOTPOSSIBLE, "Can't rename mailboxes across specified storages."); return -1; } if (src->list->ns->type != NAMESPACE_PRIVATE || dest->list->ns->type != NAMESPACE_PRIVATE) { - mailbox_list_set_error(src->list, MAIL_ERROR_NOTPOSSIBLE, + mail_storage_set_error(src->storage, MAIL_ERROR_NOTPOSSIBLE, "Renaming not supported across non-private namespaces."); return -1; }