# HG changeset patch # User Timo Sirainen # Date 1486650892 -7200 # Node ID cbb4cb127366b5c09a88bc4d1aeeeea1bf25a5f7 # Parent 8ebf69bd381b8f1369577bcb0e4256b8ca897176 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. diff -r 8ebf69bd381b -r cbb4cb127366 src/lib-storage/list/mailbox-list-index-backend.c --- 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; } diff -r 8ebf69bd381b -r cbb4cb127366 src/lib-storage/list/mailbox-list-index-status.c --- 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) diff -r 8ebf69bd381b -r cbb4cb127366 src/lib-storage/list/mailbox-list-index.c --- 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 = { diff -r 8ebf69bd381b -r cbb4cb127366 src/lib-storage/list/mailbox-list-index.h --- 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