From: Aki Tuomi Date: Fri, 10 Nov 2023 12:26:49 +0000 (+0200) Subject: plugins: acl - Use pointer for virtual functions X-Git-Tag: 2.4.1~1170 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=808b2c276b256d393a134b99b5e0229d8ccebbac;p=thirdparty%2Fdovecot%2Fcore.git plugins: acl - Use pointer for virtual functions --- diff --git a/src/plugins/acl/acl-api-private.h b/src/plugins/acl/acl-api-private.h index 0fe3d3f94b..3087ea2ae4 100644 --- a/src/plugins/acl/acl-api-private.h +++ b/src/plugins/acl/acl-api-private.h @@ -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; diff --git a/src/plugins/acl/acl-api.c b/src/plugins/acl/acl-api.c index 684ae5989a..6fe51560c0 100644 --- a/src/plugins/acl/acl-api.c +++ b/src/plugins/acl/acl-api.c @@ -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) diff --git a/src/plugins/acl/acl-backend-vfile-update.c b/src/plugins/acl/acl-backend-vfile-update.c index 6ba408c79b..1c81a4f8fe 100644 --- a/src/plugins/acl/acl-backend-vfile-update.c +++ b/src/plugins/acl/acl-backend-vfile-update.c @@ -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; } diff --git a/src/plugins/acl/acl-backend-vfile.c b/src/plugins/acl/acl-backend-vfile.c index 1f98d78ce2..1d7af57b63 100644 --- a/src/plugins/acl/acl-backend-vfile.c +++ b/src/plugins/acl/acl-backend-vfile.c @@ -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, diff --git a/src/plugins/acl/acl-backend.c b/src/plugins/acl/acl-backend.c index 377cb6ba1d..c507b2d474 100644 --- a/src/plugins/acl/acl-backend.c +++ b/src/plugins/acl/acl-backend.c @@ -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); diff --git a/src/plugins/mail-crypt/mail-crypt-acl-plugin.c b/src/plugins/mail-crypt/mail-crypt-acl-plugin.c index e0d33c5a06..b5b9c9eff2 100644 --- a/src/plugins/mail-crypt/mail-crypt-acl-plugin.c +++ b/src/plugins/mail-crypt/mail-crypt-acl-plugin.c @@ -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)