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