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