summary refs log tree commit diff
path: root/pkgs/tools/networking/isync/isync-recursice-imap.patch
blob: db12069950fdb2eaab1e2aabba02512f45141e0e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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)