mailbox-list-iter.c revision b5c6ce2ab8dc1a5817e8adc989d21a9f603a6673
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen/* Copyright (c) 2006-2017 Dovecot authors, see the included COPYING file */
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen /* list contains the mailbox */
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen /* list contains children of the mailbox */
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen /* list contains parents of the mailbox */
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo SirainenARRAY_DEFINE_TYPE(mailbox_settings, struct mailbox_settings *);
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainenstruct mailbox_list_autocreate_iterate_context {
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen unsigned int idx;
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen struct mailbox_list_iterate_context *backend_ctx;
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen const struct mailbox_info *pending_backend_info;
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainenstatic bool ns_match_next(struct ns_list_iterate_context *ctx,
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen struct mail_namespace *ns, const char *pattern);
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainenstatic int mailbox_list_match_anything(struct ns_list_iterate_context *ctx,
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen const char *prefix);
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainenstatic struct mailbox_list_iterate_context mailbox_list_iter_failed;
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainenmailbox_list_iter_init(struct mailbox_list *list, const char *pattern,
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen return mailbox_list_iter_init_multiple(list, patterns, flags);
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainenint mailbox_list_iter_subscriptions_refresh(struct mailbox_list *list)
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen if ((ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) == 0) {
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen /* no subscriptions in this namespace. find where they are. */
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen ns = mail_namespace_find_subscribable(ns->user->namespaces,
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen /* no subscriptions. avoid crashes by initializing
def516ea503a60f20d510c14d5070b7ff5bbddf4Timo Sirainen a subscriptions tree. */
static struct mailbox_settings *
return in_set;
return out_set;
unsigned int i, count;
if (count == 0)
for (i = 0; i < count; i++) {
struct mailbox_list_iterate_context *
const char *const *patterns,
MAILBOX_LIST_ITER_RETURN_SUBSCRIBED)) != 0) {
return &mailbox_list_iter_failed;
return ctx;
return FALSE;
return FALSE;
return TRUE;
switch (result) {
case IMAP_MATCH_YES:
case IMAP_MATCH_CHILDREN:
return TRUE;
case IMAP_MATCH_NO:
case IMAP_MATCH_PARENT:
return FALSE;
switch (result) {
case IMAP_MATCH_YES:
return TRUE;
case IMAP_MATCH_CHILDREN: {
T_BEGIN {
} T_END;
return TRUE;
case IMAP_MATCH_NO:
case IMAP_MATCH_PARENT:
return FALSE;
return TRUE;
return FALSE;
const char *prefix_without_sep;
len--;
NAMESPACE_FLAG_LIST_CHILDREN)) == 0) {
return FALSE;
return FALSE;
return FALSE;
T_BEGIN {
} T_END;
const char *prefix_without_sep;
NAMESPACE_FLAG_LIST_CHILDREN)) == 0) {
return FALSE;
T_BEGIN {
} T_END;
if (ret)
return ret;
int ret;
return ret;
const char *prefix)
int ret;
if (ret != 0)
return ret;
const char *pattern;
int ret;
return ret;
if (ret == 0)
return ret;
return TRUE;
return TRUE;
return FALSE;
return TRUE;
int ret;
return FALSE;
MAILBOX_LIST_ITER_SELECT_SUBSCRIBED)) != 0) {
return FALSE;
if (has_children)
else if (ret == 0) {
return FALSE;
return TRUE;
const char *prefix;
int ret;
MAILBOX_NOCHILDREN)) != 0)
if (ret > 0)
else if (ret == 0)
const char *errstr;
bool has_children;
return TRUE;
return TRUE;
return TRUE;
return FALSE;
has_children)) {
return TRUE;
return FALSE;
return FALSE;
return TRUE;
return FALSE;
static const struct mailbox_info *
return info;
int ret;
return ret;
unsigned int count)
const char **dup;
for (i = 0; i < count; i++) {
dup[i] = p;
return dup;
const char *const *patterns)
struct mailbox_list_iterate_context *
const char *const *patterns,
unsigned int i, count;
for (i = 0; i < count; i++)
static enum autocreate_match_result
unsigned int i, count;
for (i = 0; i < count; i++) {
if (only_subscribed &&
*idx_r = i;
return result;
const struct mailbox_info *
return _info;
unsigned int idx;
return info;
return TRUE;
return TRUE;
return FALSE;
static const struct mailbox_info *
return NULL;
const struct mailbox_info *
unsigned int count;
return NULL;
return NULL;
return TRUE;
const struct mailbox_info *
return NULL;
T_BEGIN {
} T_END;
return info;
const char *name)
if (created) {
if (create_flags != 0)
if (p == NULL)
const char *name)
T_BEGIN {
} T_END;