From f31e8ece1285d5dd79e587b251450eead4e4e013 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 15 Feb 2010 04:08:46 +0200 Subject: [PATCH] lib-storage: Fixes to rename error handling. --HG-- branch : HEAD --- src/lib-storage/index/index-storage.c | 4 ++- src/lib-storage/list/mailbox-list-fs.c | 10 ------- src/lib-storage/mail-storage.c | 38 +++++++++++++++++++------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index f06f997644..3245ac64f4 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -490,8 +490,10 @@ int index_storage_mailbox_rename(struct mailbox *src, struct mailbox *dest, 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 */ diff --git a/src/lib-storage/list/mailbox-list-fs.c b/src/lib-storage/list/mailbox-list-fs.c index 33763b8092..8c6811ce01 100644 --- a/src/lib-storage/list/mailbox-list-fs.c +++ b/src/lib-storage/list/mailbox-list-fs.c @@ -571,16 +571,6 @@ static int fs_list_rename_mailbox(struct mailbox_list *oldlist, 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? diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index f589551221..c1d3476d71 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -666,35 +666,53 @@ int mailbox_delete(struct mailbox *box) 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; } -- 2.47.3