]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
plugins: acl - Use pointer for virtual functions
authorAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 10 Nov 2023 12:26:49 +0000 (14:26 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
src/plugins/acl/acl-api-private.h
src/plugins/acl/acl-api.c
src/plugins/acl/acl-backend-vfile-update.c
src/plugins/acl/acl-backend-vfile.c
src/plugins/acl/acl-backend.c
src/plugins/mail-crypt/mail-crypt-acl-plugin.c

index 0fe3d3f94b91acadd4ff152b2bd403e141fcd7e6..3087ea2ae4cb5de1b980446a9980cbe53a136753 100644 (file)
@@ -56,7 +56,7 @@ struct acl_backend {
        struct acl_mask *default_aclmask;
        const char *const *default_rights;
 
-       struct acl_backend_vfuncs v;
+       const struct acl_backend_vfuncs *v;
 
        bool owner:1;
        bool globals_only:1;
index 684ae5989aa6c9deea9b42a2e11389af09bbd4ca..6fe51560c0cc665e4c08e1466b9fb79e9b8dd2d0 100644 (file)
@@ -34,13 +34,13 @@ static const struct acl_letter_map acl_letter_map[] = {
 struct acl_object *acl_object_init_from_name(struct acl_backend *backend,
                                             const char *name)
 {
-       return backend->v.object_init(backend, name);
+       return backend->v->object_init(backend, name);
 }
 
 struct acl_object *acl_object_init_from_parent(struct acl_backend *backend,
                                               const char *child_name)
 {
-       return backend->v.object_init_parent(backend, child_name);
+       return backend->v->object_init_parent(backend, child_name);
 }
 
 void acl_object_deinit(struct acl_object **_aclobj)
@@ -50,7 +50,7 @@ void acl_object_deinit(struct acl_object **_aclobj)
        if (aclobj == NULL)
                return;
        *_aclobj = NULL;
-       aclobj->backend->v.object_deinit(aclobj);
+       aclobj->backend->v->object_deinit(aclobj);
 }
 
 int acl_object_have_right(struct acl_object *aclobj, unsigned int right_idx)
@@ -59,7 +59,7 @@ int acl_object_have_right(struct acl_object *aclobj, unsigned int right_idx)
        const struct acl_mask *have_mask;
        unsigned int read_idx;
 
-       if (backend->v.object_refresh_cache(aclobj) < 0)
+       if (backend->v->object_refresh_cache(aclobj) < 0)
                return -1;
 
        have_mask = acl_cache_get_my_rights(backend->cache, aclobj->name);
@@ -122,7 +122,7 @@ static int acl_object_get_my_rights_real(struct acl_object *aclobj, pool_t pool,
        struct acl_backend *backend = aclobj->backend;
        const struct acl_mask *mask;
 
-       if (backend->v.object_refresh_cache(aclobj) < 0)
+       if (backend->v->object_refresh_cache(aclobj) < 0)
                return -1;
 
        mask = acl_cache_get_my_rights(backend->cache, aclobj->name);
@@ -157,18 +157,18 @@ const char *const *acl_object_get_default_rights(struct acl_object *aclobj)
 
 int acl_object_last_changed(struct acl_object *aclobj, time_t *last_changed_r)
 {
-       return aclobj->backend->v.last_changed(aclobj, last_changed_r);
+       return aclobj->backend->v->last_changed(aclobj, last_changed_r);
 }
 
 int acl_object_update(struct acl_object *aclobj,
                      const struct acl_rights_update *update)
 {
-       return aclobj->backend->v.object_update(aclobj, update);
+       return aclobj->backend->v->object_update(aclobj, update);
 }
 
 struct acl_object_list_iter *acl_object_list_init(struct acl_object *aclobj)
 {
-       return aclobj->backend->v.object_list_init(aclobj);
+       return aclobj->backend->v->object_list_init(aclobj);
 }
 
 bool acl_object_list_next(struct acl_object_list_iter *iter,
@@ -177,7 +177,7 @@ bool acl_object_list_next(struct acl_object_list_iter *iter,
        if (iter->failed)
                return FALSE;
 
-       return iter->aclobj->backend->v.object_list_next(iter, rights_r);
+       return iter->aclobj->backend->v->object_list_next(iter, rights_r);
 }
 
 int acl_object_list_deinit(struct acl_object_list_iter **_iter)
@@ -185,7 +185,7 @@ int acl_object_list_deinit(struct acl_object_list_iter **_iter)
        struct acl_object_list_iter *iter = *_iter;
 
        *_iter = NULL;
-       return iter->aclobj->backend->v.object_list_deinit(iter);
+       return iter->aclobj->backend->v->object_list_deinit(iter);
 }
 
 struct acl_object_list_iter *
@@ -207,7 +207,7 @@ acl_default_object_list_init(struct acl_object *aclobj)
                acl_cache_flush(aclobj->backend->cache, aclobj->name);
        }
 
-       if (aclobj->backend->v.object_refresh_cache(aclobj) < 0)
+       if (aclobj->backend->v->object_refresh_cache(aclobj) < 0)
                iter->failed = TRUE;
 
        aclobj_rights = array_get(&aclobj->rights, &iter->count);
@@ -249,13 +249,13 @@ int acl_default_object_list_deinit(struct acl_object_list_iter *iter)
 struct acl_mailbox_list_context *
 acl_backend_nonowner_lookups_iter_init(struct acl_backend *backend)
 {
-       return backend->v.nonowner_lookups_iter_init(backend);
+       return backend->v->nonowner_lookups_iter_init(backend);
 }
 
 bool acl_backend_nonowner_lookups_iter_next(struct acl_mailbox_list_context *ctx,
                                           const char **name_r)
 {
-       return ctx->backend->v.nonowner_lookups_iter_next(ctx, name_r);
+       return ctx->backend->v->nonowner_lookups_iter_next(ctx, name_r);
 }
 
 int acl_backend_nonowner_lookups_iter_deinit(struct acl_mailbox_list_context **_ctx)
@@ -263,12 +263,12 @@ int acl_backend_nonowner_lookups_iter_deinit(struct acl_mailbox_list_context **_
        struct acl_mailbox_list_context *ctx = *_ctx;
 
        *_ctx = NULL;
-       return ctx->backend->v.nonowner_lookups_iter_deinit(ctx);
+       return ctx->backend->v->nonowner_lookups_iter_deinit(ctx);
 }
 
 int acl_backend_nonowner_lookups_rebuild(struct acl_backend *backend)
 {
-       return backend->v.nonowner_lookups_rebuild(backend);
+       return backend->v->nonowner_lookups_rebuild(backend);
 }
 
 void acl_rights_write_id(string_t *dest, const struct acl_rights *right)
index 6ba408c79b17d75943c7231ae9641bd9ed8307af..1c81a4f8fe528faf144641a858598f13c5219d79 100644 (file)
@@ -51,7 +51,7 @@ static int acl_backend_vfile_update_begin(struct acl_object_vfile *aclobj,
        /* locked successfully, re-read the existing file to make sure we
           don't lose any changes. */
        acl_cache_flush(_aclobj->backend->cache, _aclobj->name);
-       if (_aclobj->backend->v.object_refresh_cache(_aclobj) < 0) {
+       if (_aclobj->backend->v->object_refresh_cache(_aclobj) < 0) {
                file_dotlock_delete(dotlock_r);
                return -1;
        }
index 1f98d78ce2c1ad7f4cb9161098820fce6341a9fc..1d7af57b63eaf655a9d51e4d9346daeb020c93a7 100644 (file)
@@ -561,7 +561,7 @@ static int acl_backend_vfile_object_last_changed(struct acl_object *_aclobj,
        return 0;
 }
 
-struct acl_backend_vfuncs acl_backend_vfile = {
+const struct acl_backend_vfuncs acl_backend_vfile = {
        .alloc = acl_backend_vfile_alloc,
        .init = acl_backend_vfile_init,
        .deinit = acl_backend_vfile_deinit,
index 377cb6ba1d98dbc1a8716bdc0e3614acf17f721f..c507b2d4740bb318e6af0c829a15a54a2ad1a0ec 100644 (file)
@@ -11,7 +11,7 @@
 #include "acl-api-private.h"
 
 
-extern struct acl_backend_vfuncs acl_backend_vfile;
+extern const struct acl_backend_vfuncs acl_backend_vfile;
 
 struct event_category event_category_acl = {
        .name = "acl",
@@ -61,7 +61,7 @@ acl_backend_init(const char *data, struct mailbox_list *list,
        backend->event = event_create(user->event);
        event_add_category(backend->event, &event_category_acl);
 
-       backend->v = acl_backend_vfile;
+       backend->v = &acl_backend_vfile;
        backend->list = list;
        backend->username = p_strdup(backend->pool, acl_username);
        backend->owner = owner;
@@ -81,7 +81,7 @@ acl_backend_init(const char *data, struct mailbox_list *list,
        }
 
        T_BEGIN {
-               if (acl_backend_vfile.init(backend, data) < 0)
+               if (backend->v->init(backend, data) < 0)
                        i_fatal("acl: backend vfile init failed with data: %s",
                                data);
        } T_END;
@@ -105,7 +105,7 @@ void acl_backend_deinit(struct acl_backend **_backend)
        acl_object_deinit(&backend->default_aclobj);
        acl_cache_deinit(&backend->cache);
        event_unref(&backend->event);
-       backend->v.deinit(backend);
+       backend->v->deinit(backend);
 }
 
 const char *acl_backend_get_acl_username(struct acl_backend *backend)
@@ -192,7 +192,7 @@ int acl_backend_get_default_rights(struct acl_backend *backend,
 {
        struct acl_object *aclobj = acl_backend_get_default_object(backend);
 
-       if (backend->v.object_refresh_cache(aclobj) < 0)
+       if (backend->v->object_refresh_cache(aclobj) < 0)
                return -1;
 
        *mask_r = acl_cache_get_my_rights(backend->cache, aclobj->name);
index e0d33c5a068280e8062e1de7e6e6ae6f4849cd38..b5b9c9eff2ca9d69c7a82441c9538ca580a4a77f 100644 (file)
@@ -23,7 +23,8 @@
 
 struct mail_crypt_acl_mailbox_list {
        union mailbox_list_module_context module_ctx;
-       struct acl_backend_vfuncs acl_vprev;
+       const struct acl_backend_vfuncs *acl_vprev;
+       struct acl_backend_vfuncs v;
 };
 
 static MODULE_CONTEXT_DEFINE_INIT(mail_crypt_acl_mailbox_list_module,
@@ -246,7 +247,7 @@ static int mail_crypt_acl_object_update(struct acl_object *aclobj,
        bool have_rights;
        int ret = 0;
 
-       if (mlist->acl_vprev.object_update(aclobj, update) < 0)
+       if (mlist->acl_vprev->object_update(aclobj, update) < 0)
                return -1;
 
        if (settings_get(event, &crypt_acl_setting_parser_info, 0,
@@ -371,7 +372,9 @@ mail_crypt_acl_mail_namespace_storage_added(struct mail_namespace *ns)
           ACL core code would need some changing to make it work correctly. */
        backend = alist->rights.backend;
        mlist->acl_vprev = backend->v;
-       backend->v.object_update = mail_crypt_acl_object_update;
+       mlist->v = *backend->v;
+       mlist->v.object_update = mail_crypt_acl_object_update;
+       backend->v = &mlist->v;
 }
 
 static void mail_crypt_acl_mailbox_list_deinit(struct mailbox_list *list)