diff -rupN ../isync-1.0.4_original/./src/drv_imap.c ./src/drv_imap.c --- ../isync-1.0.4_original/./src/drv_imap.c 2007-09-22 01:44:12.000000000 -0700 +++ ./src/drv_imap.c 2009-04-22 15:28:58.000000000 -0700 @@ -1678,7 +1678,7 @@ imap_list( store_t *gctx, string_list_t int ret; imap->boxes = 0; - if ((ret = imap_exec_b( ctx, 0, "LIST \"\" \"%s%%\"", ctx->prefix )) != DRV_OK) + if ((ret = imap_exec_b( ctx, 0, "LIST \"\" \"%s*\"", ctx->prefix )) != DRV_OK) return ret; *retb = imap->boxes; return DRV_OK; diff -rupN ../isync-1.0.4_original/./src/drv_maildir.c ./src/drv_maildir.c --- ../isync-1.0.4_original/./src/drv_maildir.c 2008-02-23 01:02:21.000000000 -0800 +++ ./src/drv_maildir.c 2009-04-22 15:34:05.000000000 -0700 @@ -24,6 +24,7 @@ #include "isync.h" +#include #include #include #include @@ -46,6 +47,56 @@ #include #endif /* USE_DB */ +static void encode_maildir_box(const char* in, char* out, size_t size) +{ + const char* p; + char c; + size_t out_chars; + + for (p = in, out_chars = 0; (c = *p); ++p, ++out, ++out_chars) { + assert(out_chars < size); + if (c == '/') { + assert(out_chars < size - 1); + *(out++) = '~'; + *out = '-'; + ++out_chars; + } + else if (c == '~') { + assert(out_chars < size - 1); + *(out++) = '~'; + *out = '~'; + ++out_chars; + } + else { + *out = c; + } + } + assert(out_chars < size); + *out = 0; +} + +static void decode_maildir_box(const char* in, char* out, size_t size) +{ + const char* p; + char c; + size_t out_chars; + + for (p = in, out_chars = 0; (c = *p); ++p, ++out, ++out_chars) { + assert(out_chars < size); + if (c == '~') { + assert(out_chars < size - 1); + c = *(++p); + *out = (c == '-' ? '/' : '~'); + ++out_chars; + } + else { + *out = c; + } + } + assert(out_chars < size); + *out = 0; +} + typedef struct maildir_store_conf { store_conf_t gen; char *inbox; @@ -164,14 +215,17 @@ maildir_list( store_t *gctx, string_list const char *inbox = ((maildir_store_conf_t *)gctx->conf)->inbox; int bl; struct stat st; - char buf[PATH_MAX]; + char buf[PATH_MAX], box[PATH_MAX]; if (*de->d_name == '.') continue; bl = nfsnprintf( buf, sizeof(buf), "%s%s/cur", gctx->conf->path, de->d_name ); if (stat( buf, &st ) || !S_ISDIR(st.st_mode)) continue; - add_string_list( retb, !memcmp( buf, inbox, bl - 4 ) && !inbox[bl - 4] ? "INBOX" : de->d_name ); + + decode_maildir_box(de->d_name, box, PATH_MAX); + add_string_list( retb, + !memcmp( buf, inbox, bl - 4 ) && !inbox[bl - 4] ? "INBOX" : box ); } closedir (dir); @@ -717,8 +771,11 @@ maildir_prepare( store_t *gctx, int opts #endif /* USE_DB */ if (!strcmp( gctx->name, "INBOX" )) gctx->path = nfstrdup( ((maildir_store_conf_t *)gctx->conf)->inbox ); - else - nfasprintf( &gctx->path, "%s%s", gctx->conf->path, gctx->name ); + else { + char box[_POSIX_PATH_MAX]; + encode_maildir_box(gctx->name, box, _POSIX_PATH_MAX); + nfasprintf( &gctx->path, "%s%s", gctx->conf->path, box ); + } if (opts & OPEN_SETFLAGS) opts |= OPEN_OLD; if (opts & OPEN_EXPUNGE)