diff options
author | David Guibert <david.guibert@gmail.com> | 2011-08-09 20:09:17 +0000 |
---|---|---|
committer | David Guibert <david.guibert@gmail.com> | 2011-08-09 20:09:17 +0000 |
commit | b97136492e5cd6b1f4e8266cb8a3442cda18bd10 (patch) | |
tree | 3ed17e3774609620b79d383e99a1d90d11567df9 /pkgs/tools/networking/isync | |
parent | 5db26b465e63ebef22d0ba1512bc5998b0963436 (diff) |
isync: add recursive imap patch
svn path=/nixpkgs/trunk/; revision=28438
Diffstat (limited to 'pkgs/tools/networking/isync')
-rw-r--r-- | pkgs/tools/networking/isync/default.nix | 1 | ||||
-rw-r--r-- | pkgs/tools/networking/isync/isync-recursice-imap.patch | 114 |
2 files changed, 115 insertions, 0 deletions
diff --git a/pkgs/tools/networking/isync/default.nix b/pkgs/tools/networking/isync/default.nix index 03abdbcca6261..aca9b47195d31 100644 --- a/pkgs/tools/networking/isync/default.nix +++ b/pkgs/tools/networking/isync/default.nix @@ -8,6 +8,7 @@ stdenv.mkDerivation rec { sha256 = "1xmgzypl5a3i0fz1ca55vfbs5mv2l9icwf2gk8rvlbwrkn2wid68"; }; + patches = [ ./isync-recursice-imap.patch ]; # usefull patch to enable subfolders listing buildInputs = [ openssl pkgconfig db4 ]; meta = { diff --git a/pkgs/tools/networking/isync/isync-recursice-imap.patch b/pkgs/tools/networking/isync/isync-recursice-imap.patch new file mode 100644 index 0000000000000..db12069950fdb --- /dev/null +++ b/pkgs/tools/networking/isync/isync-recursice-imap.patch @@ -0,0 +1,114 @@ +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 <assert.h> + #include <limits.h> + #include <stdlib.h> + #include <string.h> +@@ -46,6 +47,56 @@ + #include <db.h> + #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) |