Mercurial > dovecot > original-hg > dovecot-1.2
changeset 9073:90915833f106 HEAD
Mailbox renaming with LAYOUT=fs wasn't renaming control dirs if they were used.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 22 May 2009 13:07:36 -0400 |
parents | 43f15920dbaa |
children | 995d501d8f41 |
files | src/lib-storage/list/mailbox-list-fs.c |
diffstat | 1 files changed, 24 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-fs.c Thu May 21 12:59:17 2009 -0400 +++ b/src/lib-storage/list/mailbox-list-fs.c Fri May 22 13:07:36 2009 -0400 @@ -279,10 +279,30 @@ return mailbox_list_delete_index_control(list, name); } +static int rename_dir(struct mailbox_list *list, + enum mailbox_list_path_type type, + const char *oldname, const char *newname) +{ + const char *oldpath, *newpath; + + oldpath = mailbox_list_get_path(list, oldname, type); + newpath = mailbox_list_get_path(list, newname, type); + + if (strcmp(oldpath, newpath) == 0) + return 0; + + if (rename(oldpath, newpath) < 0 && errno != ENOENT) { + mailbox_list_set_critical(list, "rename(%s, %s) failed: %m", + oldpath, newpath); + return -1; + } + return 0; +} + static int fs_list_rename_mailbox(struct mailbox_list *list, const char *oldname, const char *newname) { - const char *oldpath, *newpath, *old_indexdir, *new_indexdir, *p; + const char *oldpath, *newpath, *p; struct stat st; mode_t mode; gid_t gid; @@ -344,20 +364,9 @@ return -1; } - /* we need to rename the index directory as well */ - old_indexdir = mailbox_list_get_path(list, oldname, - MAILBOX_LIST_PATH_TYPE_INDEX); - new_indexdir = mailbox_list_get_path(list, newname, - MAILBOX_LIST_PATH_TYPE_INDEX); - if (*old_indexdir != '\0') { - if (rename(old_indexdir, new_indexdir) < 0 && - errno != ENOENT) { - mailbox_list_set_critical(list, - "rename(%s, %s) failed: %m", - old_indexdir, new_indexdir); - } - } - + (void)rename_dir(list, MAILBOX_LIST_PATH_TYPE_CONTROL, + oldname, newname); + (void)rename_dir(list, MAILBOX_LIST_PATH_TYPE_INDEX, oldname, newname); return 0; }