]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Avoid using mail_namespace.storage directly.
authorTimo Sirainen <tss@iki.fi>
Thu, 6 Jun 2013 08:40:27 +0000 (11:40 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 6 Jun 2013 08:40:27 +0000 (11:40 +0300)
src/doveadm/doveadm-mail-altmove.c
src/doveadm/doveadm-mail.c
src/lib-storage/index/shared/shared-list.c
src/lib-storage/index/shared/shared-storage.c
src/lib-storage/mail-storage.c
src/lib-storage/mailbox-list.c
src/plugins/acl/acl-backend-vfile.c
src/plugins/acl/acl-shared-storage.c

index a7d9843907d32bb7482035a7642db128f13a05b0..5e1b86406e25efeb88f9cabd2178a2516e4983e9 100644 (file)
@@ -40,12 +40,13 @@ cmd_altmove_box(struct doveadm_mail_cmd_context *ctx,
 }
 
 static int
-ns_purge(struct doveadm_mail_cmd_context *ctx, struct mail_namespace *ns)
+ns_purge(struct doveadm_mail_cmd_context *ctx, struct mail_namespace *ns,
+        struct mail_storage *storage)
 {
-       if (mail_storage_purge(ns->storage) < 0) {
+       if (mail_storage_purge(storage) < 0) {
                i_error("Purging namespace '%s' failed: %s", ns->prefix,
-                       mail_storage_get_last_error(ns->storage, NULL));
-               doveadm_mail_failed_storage(ctx, ns->storage);
+                       mail_storage_get_last_error(storage, NULL));
+               doveadm_mail_failed_storage(ctx, storage);
                return -1;
        }
        return 0;
@@ -62,7 +63,7 @@ cmd_altmove_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
        const struct mailbox_info *info;
        struct mail_namespace *ns, *prev_ns = NULL;
        ARRAY(struct mail_storage *) purged_storages;
-       struct mail_storage *const *storages;
+       struct mail_storage *const *storages, *ns_storage, *prev_storage = NULL;
        unsigned int i, count;
        int ret = 0;
 
@@ -70,13 +71,15 @@ cmd_altmove_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
        iter = doveadm_mailbox_list_iter_init(_ctx, user, _ctx->search_args,
                                              iter_flags);
        while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) T_BEGIN {
-               if (info->ns != prev_ns) {
-                       if (prev_ns != NULL) {
-                               if (ns_purge(_ctx, prev_ns) < 0)
+               ns_storage = mail_namespace_get_default_storage(info->ns);
+               if (ns_storage != prev_storage) {
+                       if (prev_storage != NULL) {
+                               if (ns_purge(_ctx, prev_ns, prev_storage) < 0)
                                        ret = -1;
                                array_append(&purged_storages,
-                                            &prev_ns->storage, 1);
+                                            &prev_storage, 1);
                        }
+                       prev_storage = ns_storage;
                        prev_ns = info->ns;
                }
                if (cmd_altmove_box(_ctx, info, _ctx->search_args, ctx->reverse) < 0)
@@ -85,10 +88,10 @@ cmd_altmove_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
        if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
                ret = -1;
 
-       if (prev_ns != NULL) {
-               if (ns_purge(_ctx, prev_ns) < 0)
+       if (prev_storage != NULL) {
+               if (ns_purge(_ctx, prev_ns, prev_storage) < 0)
                        ret = -1;
-               array_append(&purged_storages, &prev_ns->storage, 1);
+               array_append(&purged_storages, &prev_storage, 1);
        }
 
        /* make sure all private storages have been purged */
@@ -97,14 +100,15 @@ cmd_altmove_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
                if (ns->type != MAIL_NAMESPACE_TYPE_PRIVATE)
                        continue;
 
+               ns_storage = mail_namespace_get_default_storage(ns);
                for (i = 0; i < count; i++) {
-                       if (ns->storage == storages[i])
+                       if (ns_storage == storages[i])
                                break;
                }
                if (i == count) {
-                       if (ns_purge(_ctx, ns) < 0)
+                       if (ns_purge(_ctx, ns, ns_storage) < 0)
                                ret = -1;
-                       array_append(&purged_storages, &ns->storage, 1);
+                       array_append(&purged_storages, &ns_storage, 1);
                        storages = array_get(&purged_storages, &count);
                }
        }
index 695885be2f41c6be7dcef1c41faee7865df51f56..d0358936e125e84ccf4627a57c5583521fdd470d 100644 (file)
@@ -107,6 +107,7 @@ static int
 cmd_purge_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
 {
        struct mail_namespace *ns;
+       struct mail_storage *storage;
        int ret = 0;
 
        for (ns = user->namespaces; ns != NULL; ns = ns->next) {
@@ -114,10 +115,11 @@ cmd_purge_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
                    ns->alias_for != NULL)
                        continue;
 
-               if (mail_storage_purge(ns->storage) < 0) {
+               storage = mail_namespace_get_default_storage(ns);
+               if (mail_storage_purge(storage) < 0) {
                        i_error("Purging namespace '%s' failed: %s", ns->prefix,
-                               mail_storage_get_last_error(ns->storage, NULL));
-                       doveadm_mail_failed_storage(ctx, ns->storage);
+                               mail_storage_get_last_error(storage, NULL));
+                       doveadm_mail_failed_storage(ctx, storage);
                        ret = -1;
                }
        }
index d7806fa3701828e053f492ec18c6067ef05d7da0..a218d7832455d605cc1ed2e8857b74ae336e6d3d 100644 (file)
@@ -51,8 +51,7 @@ shared_get_storage(struct mailbox_list **list, const char *vname,
                        return -1;
        }
        *list = ns->list;
-       *storage_r = ns->storage;
-       return 0;
+       return mailbox_list_get_storage(list, vname, storage_r);
 }
 
 static char shared_list_get_hierarchy_sep(struct mailbox_list *list ATTR_UNUSED)
@@ -66,7 +65,8 @@ shared_list_get_path(struct mailbox_list *list, const char *name,
 {
        struct mail_namespace *ns = list->ns;
 
-       if (list->ns->storage == NULL || name == NULL ||
+       if (mail_namespace_get_default_storage(list->ns) == NULL ||
+           name == NULL ||
            shared_storage_get_namespace(&ns, &name) < 0) {
                /* we don't have a directory we can use. */
                *path_r = NULL;
index e17d912eb91bf440830c4e0876e914b7e42f90bc..a6a76f32641089bca4a3f968a8b9b3b54127dd45 100644 (file)
@@ -346,7 +346,8 @@ int shared_storage_get_namespace(struct mail_namespace **_ns,
        *_ns = new_ns;
        if (_storage->class_flags == 0) {
                /* flags are unset if we were using "auto" storage */
-               _storage->class_flags = new_ns->storage->class_flags;
+               _storage->class_flags =
+                       mail_namespace_get_default_storage(new_ns)->class_flags;
        }
 
        mail_user_add_namespace(user, &new_ns);
index 9ecbd47b1270046b9ad0aca170448fa84038622a..f52b3530419a4f5818233c20c78ad88dd7735918 100644 (file)
@@ -655,8 +655,8 @@ struct mailbox *mailbox_alloc(struct mailbox_list *list, const char *vname,
        }
 
        if (mailbox_list_get_storage(&new_list, vname, &storage) < 0) {
-               /* just use the first storage. FIXME: does this break? */
-               storage = list->ns->storage;
+               /* just use the default storage. FIXME: does this break? */
+               storage = mail_namespace_get_default_storage(list->ns);
        }
 
        T_BEGIN {
index a4b06b1245751c3c1e375fc153f21eed5a670a82..29e878db20b1202debec61485c4ce25647904dd9 100644 (file)
@@ -776,7 +776,7 @@ int mailbox_list_get_storage(struct mailbox_list **list, const char *vname,
        if ((*list)->v.get_storage != NULL)
                return (*list)->v.get_storage(list, vname, storage_r);
        else {
-               *storage_r = (*list)->ns->storage;
+               *storage_r = mail_namespace_get_default_storage((*list)->ns);
                return 0;
        }
 }
@@ -784,7 +784,7 @@ int mailbox_list_get_storage(struct mailbox_list **list, const char *vname,
 void mailbox_list_get_default_storage(struct mailbox_list *list,
                                      struct mail_storage **storage)
 {
-       *storage = list->ns->storage;
+       *storage = mail_namespace_get_default_storage(list->ns);
 }
 
 char mailbox_list_get_hierarchy_sep(struct mailbox_list *list)
index ce8f2aeb46c35cc57ed8970199381e4420ea0718..54426d852c26c19710abedcb98335dd69f490608 100644 (file)
@@ -127,35 +127,43 @@ static void acl_backend_vfile_deinit(struct acl_backend *_backend)
 }
 
 static const char *
-acl_backend_vfile_get_local_dir(struct acl_backend *backend, const char *name)
+acl_backend_vfile_get_local_dir(struct acl_backend *backend,
+                               const char *name)
 {
        struct mail_namespace *ns = mailbox_list_get_namespace(backend->list);
+       struct mailbox_list *list = ns->list;
+       struct mail_storage *storage;
        enum mailbox_list_path_type type;
-       const char *dir, *inbox, *error;
+       const char *dir, *inbox, *vname, *error;
 
        if (*name == '\0')
                name = NULL;
-       else if (!mailbox_list_is_valid_name(ns->list, name, &error))
+       else if (!mailbox_list_is_valid_name(list, name, &error))
                return NULL;
 
        /* 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. */
-       type = mail_storage_is_mailbox_file(ns->storage) ||
-               (ns->storage->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0 ?
+       vname = mailbox_list_get_vname(backend->list, name);
+       if (mailbox_list_get_storage(&list, vname, &storage) < 0)
+               return NULL;
+       i_assert(list == ns->list);
+
+       type = mail_storage_is_mailbox_file(storage) ||
+               (storage->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0 ?
                MAILBOX_LIST_PATH_TYPE_CONTROL : MAILBOX_LIST_PATH_TYPE_MAILBOX;
        if (name == NULL) {
-               if (!mailbox_list_get_root_path(ns->list, type, &dir))
+               if (!mailbox_list_get_root_path(list, type, &dir))
                        return FALSE;
        } else {
-               if (mailbox_list_get_path(ns->list, name, type, &dir) <= 0)
+               if (mailbox_list_get_path(list, name, type, &dir) <= 0)
                        return NULL;
        }
 
        /* verify that the directory isn't same as INBOX's directory.
           this is mainly for Maildir. */
        if (name == NULL &&
-           mailbox_list_get_path(ns->list, "INBOX",
+           mailbox_list_get_path(list, "INBOX",
                                  MAILBOX_LIST_PATH_TYPE_MAILBOX, &inbox) > 0 &&
            strcmp(inbox, dir) == 0) {
                /* can't have default ACLs with this setup */
@@ -177,15 +185,17 @@ acl_backend_vfile_object_init(struct acl_backend *_backend,
        aclobj->aclobj.backend = _backend;
        aclobj->aclobj.name = i_strdup(name);
 
-       if (backend->global_dir != NULL) T_BEGIN {
-               vname = mailbox_list_get_vname(backend->backend.list, name);
-               aclobj->global_path = i_strconcat(backend->global_dir, "/",
-                                                 vname, NULL);
-       } T_END;
+       T_BEGIN {
+               if (backend->global_dir != NULL) {
+                       vname = mailbox_list_get_vname(backend->backend.list, name);
+                       aclobj->global_path =
+                               i_strconcat(backend->global_dir, "/", vname, NULL);
+               }
 
-       dir = acl_backend_vfile_get_local_dir(_backend, name);
-       aclobj->local_path = dir == NULL ? NULL :
-               i_strconcat(dir, "/"ACL_FILENAME, NULL);
+               dir = acl_backend_vfile_get_local_dir(_backend, name);
+               aclobj->local_path = dir == NULL ? NULL :
+                       i_strconcat(dir, "/"ACL_FILENAME, NULL);
+       } T_END;
        return &aclobj->aclobj;
 }
 
index 30c5493e3a91a70076ece8b216578abe8d61bff2..a673718df59ec348f09e9cbcba7e0ef43fa62a93 100644 (file)
@@ -84,7 +84,7 @@ int acl_shared_namespaces_add(struct mail_namespace *ns)
 {
        struct acl_user *auser = ACL_USER_CONTEXT(ns->user);
        struct acl_mailbox_list *alist = ACL_LIST_CONTEXT(ns->list);
-       struct mail_storage *storage = ns->storage;
+       struct mail_storage *storage = mail_namespace_get_default_storage(ns);
        struct acl_lookup_dict_iter *iter;
        const char *name;