struct acl_mailbox_list_context *
(*nonowner_lookups_iter_init)(struct acl_backend *backend);
- int (*nonowner_lookups_iter_next)(struct acl_mailbox_list_context *ctx,
+ bool (*nonowner_lookups_iter_next)(struct acl_mailbox_list_context *ctx,
const char **name_r);
- void (*nonowner_lookups_iter_deinit)
+ int (*nonowner_lookups_iter_deinit)
(struct acl_mailbox_list_context *ctx);
int (*nonowner_lookups_rebuild)(struct acl_backend *backend);
struct acl_object_list_iter *
(*object_list_init)(struct acl_object *aclobj);
- int (*object_list_next)(struct acl_object_list_iter *iter,
+ bool (*object_list_next)(struct acl_object_list_iter *iter,
struct acl_rights *rights_r);
- void (*object_list_deinit)(struct acl_object_list_iter *iter);
+ int (*object_list_deinit)(struct acl_object_list_iter *iter);
};
struct acl_backend {
struct acl_mailbox_list_context {
struct acl_backend *backend;
+
+ bool empty:1;
+ bool failed:1;
+ const char *error;
};
struct acl_object {
struct acl_rights *rights;
unsigned int idx, count;
+
+ bool empty:1;
bool failed:1;
+ const char *error;
};
extern const char *const all_mailbox_rights[];
struct acl_object_list_iter *
acl_default_object_list_init(struct acl_object *aclobj);
-int acl_default_object_list_next(struct acl_object_list_iter *iter,
- struct acl_rights *rights_r);
-void acl_default_object_list_deinit(struct acl_object_list_iter *iter);
+bool acl_default_object_list_next(struct acl_object_list_iter *iter,
+ struct acl_rights *rights_r);
+int acl_default_object_list_deinit(struct acl_object_list_iter *iter);
const char *const *
acl_backend_mask_get_names(struct acl_backend *backend,
return aclobj->backend->v.object_list_init(aclobj);
}
-int acl_object_list_next(struct acl_object_list_iter *iter,
+bool acl_object_list_next(struct acl_object_list_iter *iter,
struct acl_rights *rights_r)
{
if (iter->failed)
- return -1;
+ return FALSE;
return iter->aclobj->backend->v.object_list_next(iter, rights_r);
}
-void acl_object_list_deinit(struct acl_object_list_iter **_iter)
+int acl_object_list_deinit(struct acl_object_list_iter **_iter)
{
struct acl_object_list_iter *iter = *_iter;
*_iter = NULL;
- iter->aclobj->backend->v.object_list_deinit(iter);
+ return iter->aclobj->backend->v.object_list_deinit(iter);
}
struct acl_object_list_iter *
iter->rights = p_new(pool, struct acl_rights, iter->count);
for (i = 0; i < iter->count; i++)
acl_rights_dup(&aclobj_rights[i], pool, &iter->rights[i]);
- }
+ } else
+ iter->empty = TRUE;
return iter;
}
-int acl_default_object_list_next(struct acl_object_list_iter *iter,
+bool acl_default_object_list_next(struct acl_object_list_iter *iter,
struct acl_rights *rights_r)
{
if (iter->failed)
- return -1;
+ return FALSE;
if (iter->idx == iter->count)
- return 0;
+ return FALSE;
*rights_r = iter->rights[iter->idx++];
- return 1;
+ return TRUE;
}
-void acl_default_object_list_deinit(struct acl_object_list_iter *iter)
+int acl_default_object_list_deinit(struct acl_object_list_iter *iter)
{
+ int ret = 0;
+ if (iter->failed)
+ ret = -1;
+ else if (iter->empty)
+ ret = 0;
+ else
+ ret = 1;
+
pool_unref(&iter->pool);
+ return ret;
}
struct acl_mailbox_list_context *
return backend->v.nonowner_lookups_iter_init(backend);
}
-int acl_backend_nonowner_lookups_iter_next(struct acl_mailbox_list_context *ctx,
+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);
}
-void
-acl_backend_nonowner_lookups_iter_deinit(struct acl_mailbox_list_context **_ctx)
+int acl_backend_nonowner_lookups_iter_deinit(struct acl_mailbox_list_context **_ctx)
{
struct acl_mailbox_list_context *ctx = *_ctx;
*_ctx = NULL;
- 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)
/* List mailboxes that have lookup right to some non-owners. */
struct acl_mailbox_list_context *
acl_backend_nonowner_lookups_iter_init(struct acl_backend *backend);
-int acl_backend_nonowner_lookups_iter_next(struct acl_mailbox_list_context *ctx,
+bool acl_backend_nonowner_lookups_iter_next(struct acl_mailbox_list_context *ctx,
const char **name_r);
-void
+int
acl_backend_nonowner_lookups_iter_deinit(struct acl_mailbox_list_context **ctx);
+
/* Force a rebuild for nonowner lookups index */
int acl_backend_nonowner_lookups_rebuild(struct acl_backend *backend);
/* List all identifiers. */
struct acl_object_list_iter *acl_object_list_init(struct acl_object *aclobj);
-int acl_object_list_next(struct acl_object_list_iter *iter,
+bool acl_object_list_next(struct acl_object_list_iter *iter,
struct acl_rights *rights_r);
-void acl_object_list_deinit(struct acl_object_list_iter **iter);
+int acl_object_list_deinit(struct acl_object_list_iter **iter);
/* Returns the canonical ID for the right. */
const char *acl_rights_get_id(const struct acl_rights *right);
}
iter = acl_object_list_init(aclobj);
- while ((ret = acl_object_list_next(iter, &rights)) > 0) {
+ while (acl_object_list_next(iter, &rights)) {
if (!rights.global &&
rights.id_type == wanted_rights.id_type &&
null_strcmp(rights.identifier, wanted_rights.identifier) == 0) {
break;
}
}
- if (ret < 0)
+ if ((ret = acl_object_list_deinit(&iter)) < 0)
mail_storage_set_internal_error(box->storage);
- acl_object_list_deinit(&iter);
return ret;
}
acl_attribute_iter_next_acl(struct acl_mailbox_attribute_iter *aiter)
{
struct acl_rights rights;
- int ret;
- while ((ret = acl_object_list_next(aiter->acl_iter, &rights)) > 0) {
+ while (acl_object_list_next(aiter->acl_iter, &rights)) {
if (rights.global)
continue;
str_truncate(aiter->acl_name, strlen(MAILBOX_ATTRIBUTE_PREFIX_ACL));
acl_rights_write_id(aiter->acl_name, &rights);
return str_c(aiter->acl_name);
}
- if (ret < 0) {
+ if (acl_object_list_deinit(&aiter->acl_iter) < 0) {
mail_storage_set_internal_error(aiter->iter.box->storage);
aiter->failed = TRUE;
return NULL;
}
- acl_object_list_deinit(&aiter->acl_iter);
return NULL;
}
return &ctx->ctx;
}
-int acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *_ctx,
+bool acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *_ctx,
const char **name_r)
{
struct acl_mailbox_list_context_vfile *ctx =
const struct acl_backend_vfile_acllist *acllist;
unsigned int count;
+ if (_ctx->failed)
+ return FALSE;
+
acllist = array_get(&backend->acllist, &count);
+ if (count == 0)
+ _ctx->empty = TRUE;
if (ctx->idx == count)
- return 0;
+ return FALSE;
*name_r = acllist[ctx->idx++].name;
- return 1;
+ return TRUE;
}
-void
+int
acl_backend_vfile_nonowner_iter_deinit(struct acl_mailbox_list_context *ctx)
{
struct acl_backend_vfile *backend =
(struct acl_backend_vfile *)ctx->backend;
+ int ret;
backend->iterating_acllist = FALSE;
+ if (ctx->failed)
+ ret = -1;
+ else if (ctx->empty)
+ ret = 0;
+ else
+ ret = 1;
i_free(ctx);
+ return ret;
}
int acl_backend_vfile_nonowner_lookups_rebuild(struct acl_backend *_backend)
struct acl_mailbox_list_context *
acl_backend_vfile_nonowner_iter_init(struct acl_backend *backend);
-int acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *ctx,
+bool acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *ctx,
const char **name_r);
-void
+int
acl_backend_vfile_nonowner_iter_deinit(struct acl_mailbox_list_context *ctx);
int acl_backend_vfile_nonowner_lookups_rebuild(struct acl_backend *backend);
backend = acl_mailbox_list_get_backend(box->list);
iter = acl_object_list_init(aclobj);
- while ((ret = acl_object_list_next(iter, &rights)) > 0) T_BEGIN {
+ while (acl_object_list_next(iter, &rights)) T_BEGIN {
if (!ctx->get_match_me ||
acl_backend_rights_match_me(backend, &rights))
cmd_acl_get_right(&rights);
} T_END;
- acl_object_list_deinit(&iter);
- if (ret < 0) {
+ if ((ret = acl_object_list_deinit(&iter))<0) {
i_error("ACL iteration failed");
doveadm_mail_failed_error(&ctx->ctx, MAIL_ERROR_TEMP);
}
}
iter = acl_backend_nonowner_lookups_iter_init(backend);
- while ((ret = acl_backend_nonowner_lookups_iter_next(iter, &name)) > 0) {
+ while (acl_backend_nonowner_lookups_iter_next(iter, &name)) {
if (strcmp(name, box->name) == 0)
break;
}
- acl_backend_nonowner_lookups_iter_deinit(&iter);
- if (ret < 0)
+ if ((ret = acl_backend_nonowner_lookups_iter_deinit(&iter))<0)
i_fatal("ACL non-owner iteration failed");
if (ret == 0) {
i_error("Mailbox not found from dovecot-acl-list, rebuilding");