Mercurial > dovecot > core-2.2
changeset 10234:db1a9e0853f5 HEAD
mbox: Added support for mailbox directory GUIDs.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 29 Oct 2009 18:21:34 -0400 |
parents | ded4cbe648fc |
children | 635fda7ed49c |
files | src/lib-storage/index/index-storage.c src/lib-storage/index/index-storage.h src/lib-storage/index/mbox/mbox-storage.c src/lib-storage/index/mbox/mbox-storage.h src/lib-storage/index/shared/shared-list.c src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/mailbox-list-private.h src/lib-storage/mailbox-list.c |
diffstat | 9 files changed, 66 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ 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 @@ 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 @@ } } - 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);
--- 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_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/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 @@ 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 @@ 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); }
--- 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;
--- 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 @@ shared_list_set_subscribed, shared_list_delete_mailbox, shared_list_rename_mailbox, - shared_list_rename_mailbox_pre + shared_list_rename_mailbox_pre, + NULL } };
--- 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 @@ fs_list_set_subscribed, fs_list_delete_mailbox, fs_list_rename_mailbox, + NULL, NULL } };
--- 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 @@ maildir_list_set_subscribed, maildir_list_delete_mailbox, maildir_list_rename_mailbox, + NULL, NULL } }; @@ -490,6 +491,7 @@ maildir_list_set_subscribed, maildir_list_delete_mailbox, maildir_list_rename_mailbox, + NULL, NULL } };
--- 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 @@ 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 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,
--- 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,24 +824,12 @@ } } -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) return -1; @@ -872,7 +860,8 @@ 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 @@ 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; }