}
static int
-shared_get_storage(struct mailbox_list **list, const char *vname,
+shared_get_storage(struct mailbox_list **list, const char **vname,
+ enum mailbox_list_get_storage_flags flags,
struct mail_storage **storage_r)
{
struct mail_namespace *ns = (*list)->ns;
const char *name;
- name = mailbox_list_get_storage_name(*list, vname);
+ name = mailbox_list_get_storage_name(*list, *vname);
if (*name == '\0' && (ns->flags & NAMESPACE_FLAG_AUTOCREATED) == 0) {
/* trying to access the shared/ prefix itself */
*storage_r = ns->storage;
if (shared_storage_get_namespace(&ns, &name) < 0)
return -1;
*list = ns->list;
- return mailbox_list_get_storage(list, vname, storage_r);
+ return mailbox_list_get_storage(list, vname, flags, storage_r);
}
static char shared_list_get_hierarchy_sep(struct mailbox_list *list ATTR_UNUSED)
bool rmdir_parent = FALSE;
oldvname = mailbox_list_get_vname(oldlist, oldname);
- if (mailbox_list_get_storage(&oldlist, oldvname, &oldstorage) < 0)
+ if (mailbox_list_get_storage(&oldlist, &oldvname, 0, &oldstorage) < 0)
return -1;
if (mailbox_list_get_path(oldlist, oldname,
struct mailbox_list *list = ns->list;
struct mail_storage *storage;
- if (mailbox_list_get_storage(&list, mailbox, &storage) < 0)
+ if (mailbox_list_get_storage(&list, &mailbox, 0, &storage) < 0)
return ns;
return mailbox_list_get_namespace(list);
}
T_BEGIN {
- if (mailbox_list_get_storage(&new_list, vname, &storage) < 0) {
+ enum mailbox_list_get_storage_flags storage_flags = 0;
+ if ((flags & MAILBOX_FLAG_SAVEONLY) != 0)
+ storage_flags |= MAILBOX_LIST_GET_STORAGE_FLAG_SAVEONLY;
+ if (mailbox_list_get_storage(&new_list, &vname,
+ storage_flags, &storage) < 0) {
/* do a delayed failure at mailbox_open() */
storage = mail_namespace_get_default_storage(list->ns);
errstr = mailbox_list_get_last_error(new_list, &open_error);
int (*init)(struct mailbox_list *list, const char **error_r);
void (*deinit)(struct mailbox_list *list);
- int (*get_storage)(struct mailbox_list **list, const char *vname,
+ int (*get_storage)(struct mailbox_list **list, const char **vname,
+ enum mailbox_list_get_storage_flags flags,
struct mail_storage **storage_r);
char (*get_hierarchy_sep)(struct mailbox_list *list);
return 0;
}
-int mailbox_list_get_storage(struct mailbox_list **list, const char *vname,
+int mailbox_list_get_storage(struct mailbox_list **list, const char **vname,
+ enum mailbox_list_get_storage_flags flags,
struct mail_storage **storage_r)
{
const struct mailbox_settings *set;
if ((*list)->v.get_storage != NULL)
- return (*list)->v.get_storage(list, vname, storage_r);
+ return (*list)->v.get_storage(list, vname, flags, storage_r);
- set = mailbox_settings_find((*list)->ns, vname);
+ set = mailbox_settings_find((*list)->ns, *vname);
if (set != NULL && set->driver != NULL && set->driver[0] != '\0') {
return mailbox_list_get_storage_driver(*list, set->driver,
storage_r);
MAILBOX_LIST_FILE_TYPE_OTHER
};
+enum mailbox_list_get_storage_flags {
+ MAILBOX_LIST_GET_STORAGE_FLAG_SAVEONLY = BIT(0),
+};
+
struct mailbox_list_settings {
const char *layout; /* FIXME: shouldn't be here */
const char *root_dir;
mailbox_list_get_namespace(const struct mailbox_list *list) ATTR_PURE;
struct mail_user *
mailbox_list_get_user(const struct mailbox_list *list) ATTR_PURE;
-int mailbox_list_get_storage(struct mailbox_list **list, const char *vname,
+/* Get a mail_storage for the given mailbox_list/vname combination. This might
+ result in mailbox_list and/or vname becoming changed. For example shared
+ folders will change the mailbox_list and saving to a virtual folder changes
+ both. */
+int mailbox_list_get_storage(struct mailbox_list **list, const char **vname,
+ enum mailbox_list_get_storage_flags flags,
struct mail_storage **storage_r);
void mailbox_list_get_default_storage(struct mailbox_list *list,
struct mail_storage **storage);
/* ACL files are very important. try to keep them among the main
mail files. that's not possible though with a) if the mailbox is
a file or b) if the mailbox path doesn't point to filesystem. */
- if (mailbox_list_get_storage(&list, vname, &storage) < 0)
+ if (mailbox_list_get_storage(&list, &vname, 0, &storage) < 0)
return NULL;
i_assert(list == ns->list);
root->initialized = TRUE;
list = root->imapc_ns->list;
- if (mailbox_list_get_storage(&list, "", &storage) == 0 &&
+ const char *vname = "";
+ if (mailbox_list_get_storage(&list, &vname, 0, &storage) == 0 &&
strcmp(storage->name, IMAPC_STORAGE_NAME) != 0) {
/* non-imapc namespace, skip */
if ((storage->class_flags &
}
list = root->maildirsize_ns->list;
- if (mailbox_list_get_storage(&list, "", &storage) == 0 &&
+ const char *vname = "";
+ if (mailbox_list_get_storage(&list, &vname, 0, &storage) == 0 &&
strcmp(storage->name, MAILDIR_STORAGE_NAME) != 0) {
/* non-maildir namespace, skip */
if ((storage->class_flags &
struct mail_storage *storage;
/* this check works as long as there is only one storage per list */
- if (mailbox_list_get_storage(&list, "", &storage) == 0 &&
+ const char *vname = "";
+ if (mailbox_list_get_storage(&list, &vname, 0, &storage) == 0 &&
(storage->class_flags & MAIL_STORAGE_CLASS_FLAG_NOQUOTA) != 0)
return FALSE;
if (root->quota->unwanted_ns == ns)