Mercurial > dovecot > core-2.2
changeset 21538:cbb4cb127366
lib-storage: Fix mailbox list index hook usage
The previous method appeared to work, but not if the internal hooks were
used more than once.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Feb 2017 16:34:52 +0200 |
parents | 8ebf69bd381b |
children | eafb085567bb |
files | src/lib-storage/list/mailbox-list-index-backend.c src/lib-storage/list/mailbox-list-index-status.c src/lib-storage/list/mailbox-list-index.c src/lib-storage/list/mailbox-list-index.h |
diffstat | 4 files changed, 23 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-index-backend.c Tue Feb 14 10:42:26 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-index-backend.c Thu Feb 09 16:34:52 2017 +0200 @@ -849,12 +849,13 @@ } }; -void mailbox_list_index_backend_init_mailbox(struct mailbox *box) +void mailbox_list_index_backend_init_mailbox(struct mailbox *box, + struct mailbox_vfuncs *v) { if (strcmp(box->list->name, MAILBOX_LIST_NAME_INDEX) != 0) return; - box->v.create_box = index_list_mailbox_create; - box->v.update_box = index_list_mailbox_update; - box->v.exists = index_list_mailbox_exists; - box->v.open = index_list_mailbox_open; + v->create_box = index_list_mailbox_create; + v->update_box = index_list_mailbox_update; + v->exists = index_list_mailbox_exists; + v->open = index_list_mailbox_open; }
--- a/src/lib-storage/list/mailbox-list-index-status.c Tue Feb 14 10:42:26 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-index-status.c Thu Feb 09 16:34:52 2017 +0200 @@ -822,13 +822,13 @@ *flags |= MAILBOX_UNMARKED; } -void mailbox_list_index_status_init_mailbox(struct mailbox *box) +void mailbox_list_index_status_init_mailbox(struct mailbox_vfuncs *v) { - box->v.exists = index_list_exists; - box->v.get_status = index_list_get_status; - box->v.get_metadata = index_list_get_metadata; - box->v.sync_deinit = index_list_sync_deinit; - box->v.transaction_commit = index_list_transaction_commit; + v->exists = index_list_exists; + v->get_status = index_list_get_status; + v->get_metadata = index_list_get_metadata; + v->sync_deinit = index_list_sync_deinit; + v->transaction_commit = index_list_transaction_commit; } void mailbox_list_index_status_init_finish(struct mailbox_list *list)
--- a/src/lib-storage/list/mailbox-list-index.c Tue Feb 14 10:42:26 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-index.c Thu Feb 09 16:34:52 2017 +0200 @@ -810,6 +810,7 @@ static void mailbox_list_index_mailbox_allocated(struct mailbox *box) { + struct mailbox_vfuncs *v = box->vlast; struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); struct index_list_mailbox *ibox; @@ -817,15 +818,16 @@ return; ibox = p_new(box->pool, struct index_list_mailbox, 1); - ibox->module_ctx.super = box->v; + ibox->module_ctx.super = *v; + box->vlast = &ibox->module_ctx.super; MODULE_CONTEXT_SET(box, index_list_storage_module, ibox); /* for layout=index these get overridden */ - box->v.create_box = mailbox_list_index_create_mailbox; - box->v.update_box = mailbox_list_index_update_mailbox; + v->create_box = mailbox_list_index_create_mailbox; + v->update_box = mailbox_list_index_update_mailbox; - mailbox_list_index_status_init_mailbox(box); - mailbox_list_index_backend_init_mailbox(box); + mailbox_list_index_status_init_mailbox(v); + mailbox_list_index_backend_init_mailbox(box, v); } static struct mail_storage_hooks mailbox_list_index_hooks = {
--- a/src/lib-storage/list/mailbox-list-index.h Tue Feb 14 10:42:26 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-index.h Thu Feb 09 16:34:52 2017 +0200 @@ -36,6 +36,7 @@ struct mail_index_view; struct mailbox_index_vsize; +struct mailbox_vfuncs; /* stored in mail_index_record.flags: */ enum mailbox_list_index_flags { @@ -196,8 +197,9 @@ void (*callback)(void *context), void *context); -void mailbox_list_index_status_init_mailbox(struct mailbox *box); -void mailbox_list_index_backend_init_mailbox(struct mailbox *box); +void mailbox_list_index_status_init_mailbox(struct mailbox_vfuncs *v); +void mailbox_list_index_backend_init_mailbox(struct mailbox *box, + struct mailbox_vfuncs *v); void mailbox_list_index_status_init_finish(struct mailbox_list *list); #endif