isync: add recursive imap patch
svn path=/nixpkgs/trunk/; revision=28438
This commit is contained in:
parent
5db26b465e
commit
b97136492e
2 changed files with 115 additions and 0 deletions
|
@ -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 = {
|
||||
|
|
114
pkgs/tools/networking/isync/isync-recursice-imap.patch
Normal file
114
pkgs/tools/networking/isync/isync-recursice-imap.patch
Normal file
|
@ -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)
|
Loading…
Reference in a new issue