]> git.pld-linux.org Git - packages/isync.git/commitdiff
- from http://www.chrisstreeter.com/wp-content/uploads/2009/04/recursive_imap_ubuntu...
authorElan Ruusamäe <glen@pld-linux.org>
Fri, 10 Sep 2010 17:50:47 +0000 (17:50 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
  in this blog http://www.chrisstreeter.com/archive/2009/04/305/gmail-imap-backup-with-mbsync-on-ubuntu

Changed files:
    recursive_imap_ubuntu.patch -> 1.1

recursive_imap_ubuntu.patch [new file with mode: 0644]

diff --git a/recursive_imap_ubuntu.patch b/recursive_imap_ubuntu.patch
new file mode 100644 (file)
index 0000000..db12069
--- /dev/null
@@ -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)
This page took 0.07618 seconds and 4 git commands to generate.