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;
 }