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)
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)
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);
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);
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,
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)
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 *
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);
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)
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)
#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",
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;
}
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;
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)
{
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);
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,
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,
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)