packages: isync/recursive_imap_ubuntu.patch (NEW) - from http://www.chrisst...

glen glen at pld-linux.org
Fri Sep 10 19:50:52 CEST 2010


Author: glen                         Date: Fri Sep 10 17:50:52 2010 GMT
Module: packages                      Tag: HEAD
---- Log message:
- from http://www.chrisstreeter.com/wp-content/uploads/2009/04/recursive_imap_ubuntu.patch
  in this blog http://www.chrisstreeter.com/archive/2009/04/305/gmail-imap-backup-with-mbsync-on-ubuntu 

---- Files affected:
packages/isync:
   recursive_imap_ubuntu.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/isync/recursive_imap_ubuntu.patch
diff -u /dev/null packages/isync/recursive_imap_ubuntu.patch:1.1
--- /dev/null	Fri Sep 10 19:50:52 2010
+++ packages/isync/recursive_imap_ubuntu.patch	Fri Sep 10 19:50:47 2010
@@ -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)
================================================================


More information about the pld-cvs-commit mailing list