From: Timo Sirainen Date: Wed, 7 Sep 2011 07:38:01 +0000 (+0300) Subject: imapc: Connect to server immediately at startup and lookup hierarchy separator. X-Git-Tag: 2.1.alpha2~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b720f55c568cce0a1c8c2be74e588b66bb467e82;p=thirdparty%2Fdovecot%2Fcore.git imapc: Connect to server immediately at startup and lookup hierarchy separator. 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. --- diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 097d586a7e..48d87b825b 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -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; } diff --git a/src/lib-storage/index/imapc/imapc-list.h b/src/lib-storage/index/imapc/imapc-list.h index 90cc35beeb..98f0792e21 100644 --- a/src/lib-storage/index/imapc/imapc-list.h +++ b/src/lib-storage/index/imapc/imapc-list.h @@ -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; diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index e1555a4cc2..76461a5e2c 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -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; }