]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: layout=fs now uses mailbox_exists() instead of requiring storage hooks.
authorTimo Sirainen <tss@iki.fi>
Sat, 12 Feb 2011 03:17:12 +0000 (05:17 +0200)
committerTimo Sirainen <tss@iki.fi>
Sat, 12 Feb 2011 03:17:12 +0000 (05:17 +0200)
src/lib-storage/index/index-storage.c
src/lib-storage/index/index-storage.h
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/list/mailbox-list-fs-iter.c
src/plugins/virtual/virtual-storage.c

index 54d73e990a13f8d1ada4cf6e33306255b85d39b5..aa12fe2eafaacd536e8849a083d4409ebec77800 100644 (file)
@@ -152,6 +152,12 @@ index_mailbox_alloc_index(struct mailbox *box)
 
 int index_storage_mailbox_exists(struct mailbox *box,
                                 enum mailbox_existence *existence_r)
+{
+       return index_storage_mailbox_exists_full(box, NULL, existence_r);
+}
+
+int index_storage_mailbox_exists_full(struct mailbox *box, const char *subdir,
+                                     enum mailbox_existence *existence_r)
 {
        struct stat st;
        const char *path, *path2;
@@ -166,6 +172,8 @@ int index_storage_mailbox_exists(struct mailbox *box,
        /* see if it's selectable */
        path = mailbox_list_get_path(box->list, box->name,
                                     MAILBOX_LIST_PATH_TYPE_MAILBOX);
+       if (subdir != NULL)
+               path = t_strconcat(path, "/", subdir, NULL);
        if (stat(path, &st) == 0) {
                *existence_r = MAILBOX_EXISTENCE_SELECT;
                return 0;
index 97d4c8473617fd6f63f6cd13dfca0df7c57553e3..5f1b7808188eee52702e0980f95b919c05132fd9 100644 (file)
@@ -65,6 +65,8 @@ void index_storage_mailbox_alloc(struct mailbox *box, const char *vname,
                                 const char *index_prefix);
 int index_storage_mailbox_exists(struct mailbox *box,
                                 enum mailbox_existence *existence_r);
+int index_storage_mailbox_exists_full(struct mailbox *box, const char *subdir,
+                                     enum mailbox_existence *existence_r);
 int index_storage_mailbox_open(struct mailbox *box, bool move_to_memory);
 int index_storage_mailbox_enable(struct mailbox *box,
                                 enum mailbox_feature feature);
index 2ebc65850700ed96c0081de210a83222c43d0a0c..dce98dd2f5408f91adfe06d18431e1813b362ada 100644 (file)
@@ -329,6 +329,12 @@ static bool maildir_storage_is_readonly(struct mailbox *box)
        return FALSE;
 }
 
+static int maildir_mailbox_exists(struct mailbox *box,
+                                 enum mailbox_existence *existence_r)
+{
+       return index_storage_mailbox_exists_full(box, "cur", existence_r);
+}
+
 static int maildir_mailbox_open(struct mailbox *box)
 {
        const char *box_path = mailbox_get_path(box);
@@ -528,46 +534,6 @@ maildir_is_internal_name(struct mailbox_list *list ATTR_UNUSED,
                strcmp(name, "tmp") == 0;
 }
 
-static int
-maildir_list_get_mailbox_flags(struct mailbox_list *list,
-                              const char *dir, const char *fname,
-                              enum mailbox_list_file_type type,
-                              struct stat *st_r,
-                              enum mailbox_info_flags *flags)
-{
-       struct maildir_mailbox_list_context *mlist = MAILDIR_LIST_CONTEXT(list);
-       struct stat st2;
-       const char *cur_path;
-       int ret;
-
-       ret = mlist->module_ctx.super.
-               get_mailbox_flags(list, dir, fname, type, st_r, flags);
-       if (ret <= 0 || MAILBOX_INFO_FLAGS_FINISHED(*flags))
-               return ret;
-
-       /* see if it's a selectable mailbox. after that we can figure out based
-          on the link count if we have child mailboxes or not. for a
-          selectable mailbox we have 3 more links (cur/, new/ and tmp/)
-          than non-selectable. */
-       cur_path = t_strconcat(dir, "/", fname, "/cur", NULL);
-       if ((ret = stat(cur_path, &st2)) < 0 || !S_ISDIR(st2.st_mode)) {
-               if (ret < 0 && errno == ENOENT)
-                       *flags |= MAILBOX_NONEXISTENT;
-               else
-                       *flags |= MAILBOX_NOSELECT;
-               if (st_r->st_nlink > 2)
-                       *flags |= MAILBOX_CHILDREN;
-               else
-                       *flags |= MAILBOX_NOCHILDREN;
-       } else {
-               if (st_r->st_nlink > 5)
-                       *flags |= MAILBOX_CHILDREN;
-               else
-                       *flags |= MAILBOX_NOCHILDREN;
-       }
-       return 1;
-}
-
 static void maildir_storage_add_list(struct mail_storage *storage,
                                     struct mailbox_list *list)
 {
@@ -578,7 +544,6 @@ static void maildir_storage_add_list(struct mail_storage *storage,
        mlist->set = mail_storage_get_driver_settings(storage);
 
        list->v.is_internal_name = maildir_is_internal_name;
-       list->v.get_mailbox_flags = maildir_list_get_mailbox_flags;
        MODULE_CONTEXT_SET(list, maildir_mailbox_list_module, mlist);
 }
 
@@ -653,7 +618,7 @@ struct mailbox maildir_mailbox = {
                maildir_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
-               index_storage_mailbox_exists,
+               maildir_mailbox_exists,
                maildir_mailbox_open,
                maildir_mailbox_close,
                index_storage_mailbox_free,
index ae7412370b15052721c18ff246f0f09f24a7ce28..827ff50bd180546c2fa8121761a6cd6cdb62ca42 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "array.h"
 #include "imap-match.h"
+#include "mail-storage.h"
 #include "mailbox-tree.h"
 #include "mailbox-list-subscriptions.h"
 #include "mailbox-list-fs.h"
@@ -559,6 +560,29 @@ list_file(struct fs_list_iterate_context *ctx,
        if (ret <= 0)
                return ret;
 
+       if (!MAILBOX_INFO_FLAGS_FINISHED(ctx->info.flags)) {
+               struct mailbox *box;
+               enum mailbox_existence existence;
+
+               box = mailbox_alloc(ctx->ctx.list, list_path,
+                                   MAILBOX_FLAG_KEEP_RECENT);
+               ret = mailbox_exists(box, &existence);
+               mailbox_free(&box);
+
+               if (ret < 0)
+                       return -1;
+               switch (existence) {
+               case MAILBOX_EXISTENCE_NONE:
+                       ctx->info.flags |= MAILBOX_NONEXISTENT;
+                       break;
+               case MAILBOX_EXISTENCE_NOSELECT:
+                       ctx->info.flags |= MAILBOX_NOSELECT;
+                       break;
+               case MAILBOX_EXISTENCE_SELECT:
+                       break;
+               }
+       }
+
        if (ctx->dir->delayed_send) {
                /* send the parent directory first, then handle this
                   file again if needed */
index 6e500a3361ae0b8cf71634d0e9603b19ceb12a85..5845b384ce968b1edcd2665ff018f59f3c4abd3f 100644 (file)
 #include <dirent.h>
 #include <sys/stat.h>
 
-#define VIRTUAL_LIST_CONTEXT(obj) \
-       MODULE_CONTEXT(obj, virtual_mailbox_list_module)
-
-struct virtual_mailbox_list {
-       union mailbox_list_module_context module_ctx;
-};
-
 extern struct mail_storage virtual_storage;
 extern struct mailbox virtual_mailbox;
 extern struct virtual_mailbox_vfuncs virtual_mailbox_vfuncs;
 
 struct virtual_storage_module virtual_storage_module =
        MODULE_CONTEXT_INIT(&mail_storage_module_register);
-static MODULE_CONTEXT_DEFINE_INIT(virtual_mailbox_list_module,
-                                 &mailbox_list_module_register);
 
 static bool ns_is_visible(struct mail_namespace *ns)
 {
@@ -273,6 +264,13 @@ static void virtual_mailbox_close_internal(struct virtual_mailbox *mbox)
        i_free_and_null(mbox->vseq_lookup_prev_mailbox);
 }
 
+static int virtual_mailbox_exists(struct mailbox *box,
+                                 enum mailbox_existence *existence_r)
+{
+       return index_storage_mailbox_exists_full(box, VIRTUAL_CONFIG_FNAME,
+                                                existence_r);
+}
+
 static int virtual_mailbox_open(struct mailbox *box)
 {
        struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
@@ -372,46 +370,6 @@ static void virtual_notify_changes(struct mailbox *box)
        }
 }
 
-static int
-virtual_list_get_mailbox_flags(struct mailbox_list *list,
-                              const char *dir, const char *fname,
-                              enum mailbox_list_file_type type,
-                              struct stat *st_r,
-                              enum mailbox_info_flags *flags)
-{
-       struct virtual_mailbox_list *mlist = VIRTUAL_LIST_CONTEXT(list);
-       struct stat st2;
-       const char *virtual_path;
-       int ret;
-
-       ret = mlist->module_ctx.super.
-               get_mailbox_flags(list, dir, fname, type, st_r, flags);
-       if (ret <= 0 || MAILBOX_INFO_FLAGS_FINISHED(*flags))
-               return ret;
-
-       /* see if it's a selectable mailbox */
-       virtual_path = t_strconcat(dir, "/", fname, "/"VIRTUAL_CONFIG_FNAME,
-                                  NULL);
-       if (stat(virtual_path, &st2) < 0)
-               *flags |= MAILBOX_NOSELECT;
-       return ret;
-}
-
-static void virtual_storage_add_list(struct mail_storage *storage ATTR_UNUSED,
-                                    struct mailbox_list *list)
-{
-       struct mailbox_list_vfuncs *v = list->vlast;
-       struct virtual_mailbox_list *mlist;
-
-       mlist = p_new(list->pool, struct virtual_mailbox_list, 1);
-       mlist->module_ctx.super = *v;
-       list->vlast = &mlist->module_ctx.super;
-
-       v->get_mailbox_flags = virtual_list_get_mailbox_flags;
-
-       MODULE_CONTEXT_SET(list, virtual_mailbox_list_module, mlist);
-}
-
 static int virtual_backend_uidmap_cmp(const uint32_t *uid,
                                      const struct virtual_backend_uidmap *map)
 {
@@ -500,7 +458,7 @@ struct mail_storage virtual_storage = {
                virtual_storage_alloc,
                NULL,
                NULL,
-               virtual_storage_add_list,
+               NULL,
                virtual_storage_get_list_settings,
                NULL,
                virtual_mailbox_alloc,
@@ -513,7 +471,7 @@ struct mailbox virtual_mailbox = {
                index_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
-               index_storage_mailbox_exists,
+               virtual_mailbox_exists,
                virtual_mailbox_open,
                virtual_mailbox_close,
                virtual_mailbox_free,