From 48a5fd9e19e68aaaac81d100789c7b11230d26d3 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 29 Dec 2023 16:27:19 -0500 Subject: [PATCH] lib-storage: Add mail_storage_service_user_dup() --- src/lib-storage/mail-storage-service.c | 22 ++++++++++++++++++++++ src/lib-storage/mail-storage-service.h | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 4756393001..8377e1f25b 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -1502,6 +1502,28 @@ void mail_storage_service_user_unref(struct mail_storage_service_user **_user) pool_unref(&user->pool); } +struct mail_storage_service_user * +mail_storage_service_user_dup(const struct mail_storage_service_user *user) +{ + struct mail_storage_service_user *dest = + p_memdup(user->pool, user, sizeof(*user)); + pool_ref(dest->pool); + dest->refcount = 1; + + dest->set_instance = settings_instance_dup(user->set_instance); + dest->event = event_create(event_get_parent(user->event)); + event_set_ptr(dest->event, SETTINGS_EVENT_INSTANCE, dest->set_instance); + + dest->ioloop_ctx = io_loop_context_new(current_ioloop); + io_loop_context_add_callbacks(dest->ioloop_ctx, + mail_storage_service_io_activate_user_cb, + mail_storage_service_io_deactivate_user_cb, + dest); + io_loop_context_switch(dest->ioloop_ctx); + pool_ref(dest->user_set->pool); + return dest; +} + const char *const * mail_storage_service_user_get_userdb_fields(struct mail_storage_service_user *user) { diff --git a/src/lib-storage/mail-storage-service.h b/src/lib-storage/mail-storage-service.h index f835b4c5f4..30c0abdb0e 100644 --- a/src/lib-storage/mail-storage-service.h +++ b/src/lib-storage/mail-storage-service.h @@ -128,6 +128,10 @@ int mail_storage_service_lookup_next(struct mail_storage_service_ctx *ctx, const char **error_r); void mail_storage_service_user_ref(struct mail_storage_service_user *user); void mail_storage_service_user_unref(struct mail_storage_service_user **user); +/* Duplicate service user. It still uses the same memory pool as the original + user. */ +struct mail_storage_service_user * +mail_storage_service_user_dup(const struct mail_storage_service_user *user); /* Return userdb fields for the user. */ const char *const * mail_storage_service_user_get_userdb_fields(struct mail_storage_service_user *user); -- 2.47.3