changeset 11752:6571b3a9c44f HEAD

lib-storage: Make sure index directory is created early enough for mailbox.log For example if subscriptions were added before any mailbox was opened, the index dir may not have been created yet.
author Timo Sirainen <tss@iki.fi>
date Wed, 07 Jul 2010 16:03:42 +0100
parents 668e810e6578
children bff3789b8953
files src/lib-storage/index/index-storage.c src/lib-storage/index/index-storage.h src/lib-storage/mailbox-list-private.h src/lib-storage/mailbox-list.c
diffstat 4 files changed, 46 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-storage.c	Wed Jul 07 15:52:16 2010 +0100
+++ b/src/lib-storage/index/index-storage.c	Wed Jul 07 16:03:42 2010 +0100
@@ -26,41 +26,6 @@
 struct index_storage_module index_storage_module =
 	MODULE_CONTEXT_INIT(&mail_storage_module_register);
 
-int index_list_create_missing_index_dir(struct mailbox_list *list,
-					const char *name)
-{
-	const char *root_dir, *index_dir, *parent_dir, *p, *origin;
-	mode_t mode;
-	gid_t gid;
-	unsigned int n = 0;
-
-	root_dir = mailbox_list_get_path(list, name,
-					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	index_dir = mailbox_list_get_path(list, name,
-					  MAILBOX_LIST_PATH_TYPE_INDEX);
-	if (*index_dir == '\0' || strcmp(index_dir, root_dir) == 0)
-		return 0;
-
-	mailbox_list_get_dir_permissions(list, name, &mode, &gid, &origin);
-	while (mkdir_chgrp(index_dir, mode, gid, origin) < 0) {
-		if (errno == EEXIST)
-			break;
-
-		p = strrchr(index_dir, '/');
-		if (errno != ENOENT || p == NULL || ++n == 2) {
-			mailbox_list_set_critical(list,
-				"mkdir(%s) failed: %m", index_dir);
-			return -1;
-		}
-		/* create the parent directory first */
-		parent_dir = t_strdup_until(index_dir, p);
-		if (mailbox_list_mkdir(list, parent_dir,
-				       MAILBOX_LIST_PATH_TYPE_INDEX) < 0)
-			return -1;
-	}
-	return 0;
-}
-
 static struct mail_index *
 index_storage_alloc(struct mailbox_list *list, const char *name,
 		    enum mailbox_flags flags, const char *prefix)
@@ -204,7 +169,7 @@
 		}
 	}
 
-	if (index_list_create_missing_index_dir(box->list, box->name) < 0) {
+	if (mailbox_list_create_missing_index_dir(box->list, box->name) < 0) {
 		mail_storage_set_internal_error(box->storage);
 		return -1;
 	}
--- a/src/lib-storage/index/index-storage.h	Wed Jul 07 15:52:16 2010 +0100
+++ b/src/lib-storage/index/index-storage.h	Wed Jul 07 16:03:42 2010 +0100
@@ -170,7 +170,4 @@
 bool index_keyword_array_cmp(const ARRAY_TYPE(keyword_indexes) *k1,
 			     const ARRAY_TYPE(keyword_indexes) *k2);
 
-int index_list_create_missing_index_dir(struct mailbox_list *list,
-					const char *name);
-
 #endif
--- a/src/lib-storage/mailbox-list-private.h	Wed Jul 07 15:52:16 2010 +0100
+++ b/src/lib-storage/mailbox-list-private.h	Wed Jul 07 16:03:42 2010 +0100
@@ -111,6 +111,8 @@
 	bool temporary_error;
 
 	ARRAY_DEFINE(module_contexts, union mailbox_list_module_context *);
+
+	unsigned int index_root_dir_created:1;
 };
 
 struct mailbox_list_iterate_context {
@@ -158,6 +160,8 @@
 enum mailbox_list_file_type mailbox_list_get_file_type(const struct dirent *d);
 bool mailbox_list_try_get_absolute_path(struct mailbox_list *list,
 					const char **name);
+int mailbox_list_create_missing_index_dir(struct mailbox_list *list,
+					  const char *name);
 
 void mailbox_list_add_change(struct mailbox_list *list,
 			     enum mailbox_log_record_type type,
--- a/src/lib-storage/mailbox-list.c	Wed Jul 07 15:52:16 2010 +0100
+++ b/src/lib-storage/mailbox-list.c	Wed Jul 07 16:03:42 2010 +0100
@@ -1141,6 +1141,11 @@
 	    mail_guid_128_is_empty(mailbox_guid))
 		return;
 
+	if (!list->index_root_dir_created) {
+		if (mailbox_list_create_missing_index_dir(list, NULL) < 0)
+			return;
+	}
+
 	stamp = list->changelog_timestamp != (time_t)-1 ?
 		list->changelog_timestamp : ioloop_time;
 
@@ -1404,6 +1409,42 @@
 	return 0;
 }
 
+int mailbox_list_create_missing_index_dir(struct mailbox_list *list,
+					  const char *name)
+{
+	const char *root_dir, *index_dir, *parent_dir, *p, *origin;
+	mode_t mode;
+	gid_t gid;
+	unsigned int n = 0;
+
+	list->index_root_dir_created = TRUE;
+	root_dir = mailbox_list_get_path(list, name,
+					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	index_dir = mailbox_list_get_path(list, name,
+					  MAILBOX_LIST_PATH_TYPE_INDEX);
+	if (*index_dir == '\0' || strcmp(index_dir, root_dir) == 0)
+		return 0;
+
+	mailbox_list_get_dir_permissions(list, name, &mode, &gid, &origin);
+	while (mkdir_chgrp(index_dir, mode, gid, origin) < 0) {
+		if (errno == EEXIST)
+			break;
+
+		p = strrchr(index_dir, '/');
+		if (errno != ENOENT || p == NULL || ++n == 2) {
+			mailbox_list_set_critical(list,
+				"mkdir(%s) failed: %m", index_dir);
+			return -1;
+		}
+		/* create the parent directory first */
+		parent_dir = t_strdup_until(index_dir, p);
+		if (mailbox_list_mkdir(list, parent_dir,
+				       MAILBOX_LIST_PATH_TYPE_INDEX) < 0)
+			return -1;
+	}
+	return 0;
+}
+
 const char *mailbox_list_get_last_error(struct mailbox_list *list,
 					enum mail_error *error_r)
 {