]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Add mail_storage_service_user_dup()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 29 Dec 2023 21:27:19 +0000 (16:27 -0500)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage-service.h

index 4756393001e0e61f1063b17e140c61d1b1217fac..8377e1f25b9a1fb60a3ba760f0f7337693a2ac08 100644 (file)
@@ -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)
 {
index f835b4c5f4f0f5692bb067fc24e9a3dc8270cc54..30c0abdb0e61d2eb281ddda81e1eb90c1288cc8c 100644 (file)
@@ -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);