]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Connect to server immediately at startup and lookup hierarchy separator.
authorTimo Sirainen <tss@iki.fi>
Wed, 7 Sep 2011 07:38:01 +0000 (10:38 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 7 Sep 2011 07:38:01 +0000 (10:38 +0300)
If connecting to server fails, this makes it fail earlier. Also we don't
have to worry about what to do later if hierarchy separator lookup fails.

src/lib-storage/index/imapc/imapc-list.c
src/lib-storage/index/imapc/imapc-list.h
src/lib-storage/index/imapc/imapc-storage.c

index 097d586a7e2ba37ae6465e7073e2de0fb2c02ace..48d87b825b49dbb88d8c76e664736c56238d89fa 100644 (file)
@@ -165,20 +165,10 @@ imapc_is_valid_create_name(struct mailbox_list *list ATTR_UNUSED,
 static char imapc_list_get_hierarchy_sep(struct mailbox_list *_list)
 {
        struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
-       struct imapc_simple_context ctx;
 
-       if (list->sep == '\0') {
-               imapc_simple_context_init(&ctx, list->storage);
-               imapc_client_cmdf(list->storage->client,
-                                 imapc_list_simple_callback, &ctx,
-                                 "LIST \"\" \"\"");
-               imapc_simple_run(&ctx);
-
-               if (ctx.ret < 0) {
-                       list->broken = TRUE;
-                       return '/';
-               }
-       }
+       /* storage should have looked this up when it was created */
+       i_assert(list->sep != '\0');
+
        return list->sep;
 }
 
index 90cc35beeb04f53102e30da77c1d44c3117ac158..98f0792e21a23bbf72089798a39db1b69c781c83 100644 (file)
@@ -17,9 +17,6 @@ struct imapc_mailbox_list {
 
        unsigned int iter_count;
 
-       /* we've returned wrong separator. all mailbox list operations must
-          fail from now on. */
-       unsigned int broken:1;
        unsigned int refreshed_subscriptions:1;
        unsigned int refreshed_mailboxes:1;
        unsigned int index_list_failed:1;
index e1555a4cc233fe32d4d9a30c8402c5e2cc89c55e..76461a5e2cb56bcaebcfb61c53c0003212d994a6 100644 (file)
@@ -202,6 +202,30 @@ static void imapc_storage_untagged_cb(const struct imapc_untagged_reply *reply,
        }
 }
 
+static int
+imapc_storage_get_hierarchy_sep(struct imapc_storage *storage,
+                               const char **error_r)
+{
+       struct imapc_simple_context sctx;
+
+       imapc_simple_context_init(&sctx, storage);
+       imapc_client_cmdf(storage->client, imapc_simple_callback, &sctx,
+                         "LIST \"\" \"\"");
+       imapc_simple_run(&sctx);
+
+       if (sctx.ret < 0) {
+               *error_r = t_strdup_printf("LIST failed: %s",
+                       mail_storage_get_last_error(&storage->storage, NULL));
+               return -1;
+       }
+
+       if (storage->list->sep == '\0') {
+               *error_r = "LIST didn't return hierarchy separator";
+               return -1;
+       }
+       return sctx.ret;
+}
+
 static int
 imapc_storage_create(struct mail_storage *_storage,
                     struct mail_namespace *ns,
@@ -253,6 +277,11 @@ imapc_storage_create(struct mail_storage *_storage,
        imapc_list_register_callbacks(storage->list);
        imapc_storage_register_untagged(storage, "STATUS",
                                        imapc_untagged_status);
+       /* connect to imap server and get the hierarchy separator. */
+       if (imapc_storage_get_hierarchy_sep(storage, error_r) < 0) {
+               imapc_client_deinit(&storage->client);
+               return -1;
+       }
        return 0;
 }