str_append(location, PKG_RUNDIR"/user-not-found");
}
+static void drop_unusable_shared_namespaces(struct mail_user *user)
+{
+#define NS_UNUSABLE_FLAGS (NAMESPACE_FLAG_AUTOCREATED | )
+ struct mail_namespace *ns, *next;
+
+ for (ns = user->namespaces; ns != NULL; ns = next) {
+ next = ns->next;
+
+ if ((ns->flags & NAMESPACE_FLAG_USABLE) == 0 &&
+ (ns->flags & NAMESPACE_FLAG_AUTOCREATED) != 0)
+ mail_namespace_destroy(ns);
+ }
+}
+
int shared_storage_get_namespace(struct mail_storage *_storage,
const char **_name,
struct mail_namespace **ns_r)
ns->prefix, error);
return -1;
}
- /* FIXME: we could remove namespaces here that don't have usable
- mailboxes. otherwise the memory usage could just keep growing. */
+ drop_unusable_shared_namespaces(user);
mail_user_add_namespace(user, ns);
*_name = mail_namespace_fix_sep(ns, name);
mailbox_open(ns->storage, name, NULL, flags);
if (box == NULL)
shared_mailbox_copy_error(storage, ns);
+ else
+ ns->flags |= NAMESPACE_FLAG_USABLE;
return box;
}
/* Namespace is created for internal use only. */
NAMESPACE_FLAG_INTERNAL = 0x1000,
/* Namespace was created automatically (for shared mailboxes) */
- NAMESPACE_FLAG_AUTOCREATED = 0x2000
+ NAMESPACE_FLAG_AUTOCREATED = 0x2000,
+ /* Namespace has at least some usable mailboxes. Autocreated namespaces
+ that don't have usable mailboxes may be removed automatically. */
+ NAMESPACE_FLAG_USABLE = 0x4000
};
struct mail_namespace {
const struct mailbox_info *
mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx)
{
- return ctx->list->v.iter_next(ctx);
+ const struct mailbox_info *info;
+
+ info = ctx->list->v.iter_next(ctx);
+ if (info != NULL)
+ ctx->list->ns->flags |= NAMESPACE_FLAG_USABLE;
+ return info;
}
int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx)