dovecot-2.0: mbox: Added support for mailbox directory GUIDs.

dovecot at dovecot.org dovecot at dovecot.org
Fri Oct 30 00:21:38 EET 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/db1a9e0853f5
changeset: 10234:db1a9e0853f5
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Oct 29 18:21:34 2009 -0400
description:
mbox: Added support for mailbox directory GUIDs.

diffstat:

9 files changed, 66 insertions(+), 28 deletions(-)
src/lib-storage/index/index-storage.c       |   23 +++++++-------
src/lib-storage/index/index-storage.h       |    3 +
src/lib-storage/index/mbox/mbox-storage.c   |   15 +++++++++
src/lib-storage/index/mbox/mbox-storage.h   |    1 
src/lib-storage/index/shared/shared-list.c  |    3 +
src/lib-storage/list/mailbox-list-fs.c      |    1 
src/lib-storage/list/mailbox-list-maildir.c |    2 +
src/lib-storage/mailbox-list-private.h      |    4 ++
src/lib-storage/mailbox-list.c              |   42 ++++++++++++++++-----------

diffs (259 lines):

diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/index/index-storage.c	Thu Oct 29 18:21:34 2009 -0400
@@ -71,7 +71,8 @@ static void index_list_free(struct index
 	i_free(list);
 }
 
-static int create_missing_index_dir(struct mailbox *box)
+int index_list_create_missing_index_dir(struct mailbox_list *list,
+					const char *name)
 {
 	const char *root_dir, *index_dir, *p, *parent_dir;
 	const char *origin, *parent_origin;
@@ -79,34 +80,32 @@ static int create_missing_index_dir(stru
 	gid_t gid, parent_gid;
 	int n = 0;
 
-	root_dir = mailbox_list_get_path(box->list, box->name,
+	root_dir = mailbox_list_get_path(list, name,
 					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	index_dir = mailbox_list_get_path(box->list, box->name,
+	index_dir = mailbox_list_get_path(list, name,
 					  MAILBOX_LIST_PATH_TYPE_INDEX);
 	if (strcmp(index_dir, root_dir) == 0 || *index_dir == '\0')
 		return 0;
 
-	mailbox_list_get_dir_permissions(box->list, box->name, &mode,
-					 &gid, &origin);
+	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) {
-			mail_storage_set_critical(box->storage,
+			mailbox_list_set_critical(list,
 				"mkdir(%s) failed: %m", index_dir);
 			return -1;
 		}
 		/* create the parent directory first */
-		mailbox_list_get_dir_permissions(box->list, NULL,
-						 &parent_mode, &parent_gid,
-						 &parent_origin);
+		mailbox_list_get_dir_permissions(list, NULL, &parent_mode,
+						 &parent_gid, &parent_origin);
 		parent_dir = t_strdup_until(index_dir, p);
 		if (mkdir_parents_chgrp(parent_dir, parent_mode,
 					parent_gid, parent_origin) < 0 &&
 		    errno != EEXIST) {
-			mail_storage_set_critical(box->storage,
+			mailbox_list_set_critical(list,
 				"mkdir(%s) failed: %m", parent_dir);
 			return -1;
 		}
@@ -397,8 +396,10 @@ int index_storage_mailbox_open(struct ma
 		}
 	}
 
-	if (create_missing_index_dir(box) < 0)
+	if (index_list_create_missing_index_dir(box->list, box->name) < 0) {
+		mail_storage_set_internal_error(box->storage);
 		return -1;
+	}
 
 	index_dir = mailbox_list_get_path(box->list, box->name,
 					  MAILBOX_LIST_PATH_TYPE_INDEX);
diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/index/index-storage.h
--- a/src/lib-storage/index/index-storage.h	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/index/index-storage.h	Thu Oct 29 18:21:34 2009 -0400
@@ -172,4 +172,7 @@ bool index_keyword_array_cmp(const ARRAY
 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
diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Thu Oct 29 18:21:34 2009 -0400
@@ -822,6 +822,20 @@ static int mbox_list_delete_mailbox(stru
 	return 0;
 }
 
+static int mbox_get_guid(struct mailbox_list *list, const char *name,
+			 uint8_t mailbox_guid[MAIL_GUID_128_SIZE])
+{
+	const char *dir, *path;
+
+	memset(mailbox_guid, 0, MAIL_GUID_128_SIZE);
+	dir = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_INDEX);
+	if (index_list_create_missing_index_dir(list, name) < 0)
+		return -1;
+	path = t_strconcat(dir, "/"MBOX_DIR_GUID_FILE_NAME, NULL);
+
+	return mailbox_list_get_guid_path(list, path, mailbox_guid);
+}
+
 static void mbox_storage_add_list(struct mail_storage *storage,
 				  struct mailbox_list *list)
 {
@@ -840,6 +854,7 @@ static void mbox_storage_add_list(struct
 	list->v.delete_mailbox = mbox_list_delete_mailbox;
 	list->v.is_valid_existing_name = mbox_is_valid_existing_name;
 	list->v.is_valid_create_name = mbox_is_valid_create_name;
+	list->v.get_guid = mbox_get_guid;
 
 	MODULE_CONTEXT_SET(list, mbox_mailbox_list_module, mlist);
 }
diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/index/mbox/mbox-storage.h
--- a/src/lib-storage/index/mbox/mbox-storage.h	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/index/mbox/mbox-storage.h	Thu Oct 29 18:21:34 2009 -0400
@@ -14,6 +14,7 @@
 #define MBOX_SUBSCRIPTION_FILE_NAME ".subscriptions"
 #define MBOX_INDEX_PREFIX "dovecot.index"
 #define MBOX_INDEX_DIR_NAME ".imap"
+#define MBOX_DIR_GUID_FILE_NAME "dovecot-dir-guid"
 
 struct mbox_index_header {
 	uint64_t sync_size;
diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/index/shared/shared-list.c
--- a/src/lib-storage/index/shared/shared-list.c	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/index/shared/shared-list.c	Thu Oct 29 18:21:34 2009 -0400
@@ -325,6 +325,7 @@ struct mailbox_list shared_mailbox_list 
 		shared_list_set_subscribed,
 		shared_list_delete_mailbox,
 		shared_list_rename_mailbox,
-		shared_list_rename_mailbox_pre
+		shared_list_rename_mailbox_pre,
+		NULL
 	}
 };
diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/list/mailbox-list-fs.c	Thu Oct 29 18:21:34 2009 -0400
@@ -437,6 +437,7 @@ struct mailbox_list fs_mailbox_list = {
 		fs_list_set_subscribed,
 		fs_list_delete_mailbox,
 		fs_list_rename_mailbox,
+		NULL,
 		NULL
 	}
 };
diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/list/mailbox-list-maildir.c
--- a/src/lib-storage/list/mailbox-list-maildir.c	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/list/mailbox-list-maildir.c	Thu Oct 29 18:21:34 2009 -0400
@@ -462,6 +462,7 @@ struct mailbox_list maildir_mailbox_list
 		maildir_list_set_subscribed,
 		maildir_list_delete_mailbox,
 		maildir_list_rename_mailbox,
+		NULL,
 		NULL
 	}
 };
@@ -490,6 +491,7 @@ struct mailbox_list imapdir_mailbox_list
 		maildir_list_set_subscribed,
 		maildir_list_delete_mailbox,
 		maildir_list_rename_mailbox,
+		NULL,
 		NULL
 	}
 };
diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/mailbox-list-private.h
--- a/src/lib-storage/mailbox-list-private.h	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/mailbox-list-private.h	Thu Oct 29 18:21:34 2009 -0400
@@ -66,6 +66,8 @@ struct mailbox_list_vfuncs {
 				  const char *oldname,
 				  struct mailbox_list *newlist,
 				  const char *newname);
+	int (*get_guid)(struct mailbox_list *list, const char *name,
+			uint8_t mailbox_guid[MAIL_GUID_128_SIZE]);
 };
 
 struct mailbox_list_module_register {
@@ -152,6 +154,8 @@ void mailbox_list_add_change(struct mail
 void mailbox_list_add_change(struct mailbox_list *list,
 			     enum mailbox_log_record_type type,
 			     const uint8_t mailbox_guid[MAIL_GUID_128_SIZE]);
+int mailbox_list_get_guid_path(struct mailbox_list *list, const char *path,
+			       uint8_t mailbox_guid[MAIL_GUID_128_SIZE]);
 
 void mailbox_list_clear_error(struct mailbox_list *list);
 void mailbox_list_set_error(struct mailbox_list *list,
diff -r ded4cbe648fc -r db1a9e0853f5 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Thu Oct 29 18:19:18 2009 -0400
+++ b/src/lib-storage/mailbox-list.c	Thu Oct 29 18:21:34 2009 -0400
@@ -824,23 +824,11 @@ static int mailbox_list_read_guid(struct
 	}
 }
 
-static int
-mailbox_list_get_guid_real(struct mailbox_list *list, const char *name,
-			   uint8_t mailbox_guid[MAIL_GUID_128_SIZE])
+int mailbox_list_get_guid_path(struct mailbox_list *list, const char *path,
+			       uint8_t mailbox_guid[MAIL_GUID_128_SIZE])
 {
 	string_t *temp_path;
-	const char *dir, *path;
 	int fd, ret;
-
-	memset(mailbox_guid, 0, MAIL_GUID_128_SIZE);
-	if (list->set.dir_guid_fname == NULL) {
-		mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
-			"Storage doesn't support mailbox GUIDs");
-		return -1;
-	}
-
-	dir = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
-	path = t_strconcat(dir, "/", list->set.dir_guid_fname, NULL);
 
 	/* try reading the GUID from the file */
 	if ((ret = mailbox_list_read_guid(list, path, mailbox_guid)) < 0)
@@ -872,7 +860,8 @@ mailbox_list_get_guid_real(struct mailbo
 		if (ret == 0) {
 			/* broken? shouldn't really happen. we anyway deleted
 			   it already, so try again. */
-			return mailbox_list_get_guid(list, name, mailbox_guid);
+			return mailbox_list_get_guid_path(list, path,
+							  mailbox_guid);
 		}
 	} else {
 		mailbox_list_set_critical(list, "link(%s, %s) failed: %m",
@@ -883,13 +872,34 @@ mailbox_list_get_guid_real(struct mailbo
 	return ret < 0 ? -1 : 0;
 }
 
+static int
+mailbox_list_get_guid_default(struct mailbox_list *list, const char *name,
+			      uint8_t mailbox_guid[MAIL_GUID_128_SIZE])
+{
+	const char *dir, *path;
+
+	memset(mailbox_guid, 0, MAIL_GUID_128_SIZE);
+	if (list->set.dir_guid_fname == NULL) {
+		mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
+			"Storage doesn't support mailbox GUIDs");
+		return -1;
+	}
+
+	dir = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
+	path = t_strconcat(dir, "/", list->set.dir_guid_fname, NULL);
+
+	return mailbox_list_get_guid_path(list, path, mailbox_guid);
+}
+
 int mailbox_list_get_guid(struct mailbox_list *list, const char *name,
 			  uint8_t mailbox_guid[MAIL_GUID_128_SIZE])
 {
 	int ret;
 
 	T_BEGIN {
-		ret = mailbox_list_get_guid_real(list, name, mailbox_guid);
+		ret = list->v.get_guid != NULL ?
+			list->v.get_guid(list, name, mailbox_guid) :
+			mailbox_list_get_guid_default(list, name, mailbox_guid);
 	} T_END;
 	return ret;
 }


More information about the dovecot-cvs mailing list