commit 016d6d64e678d19536b99ba88b60d8ff1c96fce9
parent 0dc9106dfaea1a1d2b134d807143169652c075cb
Author: Theodore Ts'o <tytso@users.sf.net>
Date: Sun, 11 Jan 2004 07:27:27 +0000
Add code patches that were present in isync-0.9.1-3 via the dpatch
mechanism.
Diffstat:
6 files changed, 241 insertions(+), 6 deletions(-)
diff --git a/debian/changelog b/debian/changelog
@@ -1,8 +1,8 @@
isync (0.9.2-1) unstable; urgency=low
- * New upstream release
+ * New upstream release.
- -- Oswald Buddenhagen <ossi@users.sf.net> Sun, 07 Dec 2003 16:13:00 +0100
+ -- Theodore Y. Ts'o <tytso@mit.edu> Sun, 11 Jan 2004 01:47:11 -0500
isync (0.9.1-3) unstable; urgency=low
diff --git a/debian/control b/debian/control
@@ -3,7 +3,7 @@ Section: mail
Priority: optional
Maintainer: Nicolas Boullis <nboullis@debian.org>
Standards-Version: 3.6.1
-Build-Depends: libssl-dev, debhelper (>= 4.1.16), dpkg-dev (>= 1.9.0), libdb4.0-dev
+Build-Depends: libssl-dev, debhelper (>= 4.1.16), dpkg-dev (>= 1.9.0), libdb4.0-dev, dpatch
Package: isync
Architecture: any
diff --git a/debian/patches/00list b/debian/patches/00list
@@ -0,0 +1,3 @@
+10-size-opt.dpatch
+20-cleanup.dpatch
+
diff --git a/debian/patches/10-size-opt.dpatch b/debian/patches/10-size-opt.dpatch
@@ -0,0 +1,81 @@
+#! /bin/sh -e
+## 10-size-opt.dpatch by Nicolas Boullis <nboullis@debian.org>
+##
+## DP: This patch from Nicolas Boullis <nboullis@debian.org> optimizes isync
+## DP: by not fetching the sizes of messages if they are unneeded (i.e., if
+## DP: MaxSize is not specified in the config file).
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+if [ $# -ne 1 ]; then
+ echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+ exit 1
+fi
+case "$1" in
+ -patch) patch $patch_opts -p1 < $0;;
+ -unpatch) patch $patch_opts -p1 -R < $0;;
+ *)
+ echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+ exit 1;;
+esac
+
+exit 0
+@DPATCH@
+
+===================================================================
+RCS file: isync-0.9.2/src/RCS/isync.h,v
+retrieving revision 1.1
+diff -u -r1.1 isync-0.9.2/src/isync.h
+--- isync-0.9.2/src/isync.h 2004/01/09 23:06:52 1.1
++++ isync-0.9.2/src/isync.h 2004/01/09 23:07:08
+@@ -205,7 +205,7 @@
+ int imap_set_flags (imap_t *, unsigned int, unsigned int);
+ int imap_expunge (imap_t *);
+ imap_t *imap_connect (config_t *);
+-imap_t *imap_open (config_t *, unsigned int, imap_t *, int);
++imap_t *imap_open (config_t *, unsigned int, imap_t *, int, int);
+ int imap_append_message (imap_t *, int, message_t *);
+ int imap_list (imap_t *);
+
+===================================================================
+RCS file: isync-0.9.2/src/RCS/imap.c,v
+retrieving revision 1.1
+diff -u -r1.1 isync-0.9.2/src/imap.c
+--- isync-0.9.2/src/imap.c 2004/01/09 23:08:20 1.1
++++ isync-0.9.2/src/imap.c 2004/01/09 23:09:54
+@@ -874,7 +874,8 @@
+ * mailbox.
+ */
+ imap_t *
+-imap_open (config_t * box, unsigned int minuid, imap_t * imap, int imap_create)
++imap_open (config_t * box, unsigned int minuid, imap_t * imap,
++ int imap_create, int get_size)
+ {
+ if (imap)
+ {
+@@ -940,7 +941,8 @@
+ imap->minuid = minuid;
+ if (imap->count > 0)
+ {
+- if (imap_exec (imap, "UID FETCH %d:* (FLAGS RFC822.SIZE)", minuid))
++ if (imap_exec (imap, "UID FETCH %d:* (FLAGS%s)", minuid,
++ get_size ? " RFC822.SIZE" : ""))
+ goto bail;
+ }
+
+===================================================================
+RCS file: isync-0.9.2/src/RCS/main.c,v
+retrieving revision 1.1
+diff -u -r1.1 isync-0.9.2/src/main.c
+--- isync-0.9.2/src/main.c 2004/01/09 23:08:20 1.1
++++ isync-0.9.2/src/main.c 2004/01/09 23:08:31
+@@ -396,7 +396,7 @@
+ break;
+ }
+
+- imap = imap_open (box, fast ? mail->maxuid + 1 : 1, imap, imap_create);
++ imap = imap_open (box, fast ? mail->maxuid + 1 : 1, imap, imap_create, box->max_size!=0);
+ if (!imap)
+ {
+ fprintf (stderr, "%s: skipping mailbox due to IMAP error\n",
diff --git a/debian/patches/20-cleanup.dpatch b/debian/patches/20-cleanup.dpatch
@@ -0,0 +1,146 @@
+#! /bin/sh -e
+## 20-cleanup.dpatch by Theodore Ts'o <tytso@mit.edu>
+##
+## DP: Make sure the database store and the imap database is closed
+## DP: if isync is aborted.
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+if [ $# -ne 1 ]; then
+ echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+ exit 1
+fi
+case "$1" in
+ -patch) patch $patch_opts -p1 < $0;;
+ -unpatch) patch $patch_opts -p1 -R < $0;;
+ *)
+ echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+ exit 1;;
+esac
+
+exit 0
+@DPATCH@
+
+Problem description:
+
+>> If isync dies in the middle of synchronization, or the network
+>> connection breaks while it is synchronizing a mailbox, new messages
+>> which are downloaded from the IMAP server do not have their UID saved
+>> to the maildir directory. This is REALLY, REALLY BAD, because it
+>> means that on the next isync, the downloaded messages are re-uploaded
+>> to the imap server, resulting in duplicate messages in the IMAP store.
+>>
+>> This takes means the network download takes longer, and if the network
+>> connection is unrealible, it means it's more likely the the IMAP
+>> connection will break, resulting in more duplicate messages being
+>> uploaded to the servers. (The first time, 14 messages were uploaded
+>> to the server. The second time I re-isynced, 65 messages were
+>> uploaded to the server, resulting in some 79 duplicate messages that I
+>> had to manually weed out. Grr, grr, grr, grr.)
+
+Problem solution:
+
+Actually, I managed to figure out the solution a while ago, and got
+hung up trying to figure out the right way to submit the patches back
+to upstream (there's no mailing list that I can find; so do you just
+communicate directly with the developers). Anyway, I got busy and I
+never had a chance to send the patches a while ago.
+
+This patch is not the best, but it does seem to work. Perhaps a
+better approach would be to use the more advanced API's available with
+berkdb, so you can actually force a sync to the db/dbm files after
+the mail message has been downloaded. Fundamentally, that's the
+problem. The id has been added to the db file, but the changes don't
+get forced out to disk, so in the case of an abnormal termination of
+the program, the id's never get written to disk.
+
+The patch enclosed below solves the problem by establishing a signal
+handler, which cleans up in the case of the user typing ^C (after the
+network connection has gone away, say because your GSM phone's GPRS
+connection has gotten flakey, for example). However, it doesn't solve
+the problem in case of an abrupt system crash. In order to address
+that problem, the overall program interfaces would have to be changed
+to use the newer berkdb interfaces directly, but that would mean
+dropping compatibility with the ancient dbm interface. Personally, I
+don't think that to be any great loss, but the changes would be much
+more invasive, and would require agreement with the upstream
+maintainer that this is the right way to go.
+
+Also, for bonus points, perhaps there should be an inactivity timer so
+that isync can automatically figure out when the network connection
+has gone away, and can do a clean shutdown and exit automatically,
+instead of requiring the user to type ^C.
+
+ - Ted
+
+
+Patched files: src/main.c
+===================================================================
+RCS file: isync-0.9.2/src/RCS/main.c,v
+retrieving revision 1.3
+diff -u -r1.3 isync-0.9.2/src/main.c
+--- isync-0.9.2/src/main.c 2004/01/10 01:13:38 1.3
++++ isync-0.9.2/src/main.c 2004/01/10 01:14:34
+@@ -35,6 +35,7 @@
+ #include <string.h>
+ #include <ctype.h>
+ #include <dirent.h>
++#include <signal.h>
+
+ int Quiet;
+
+@@ -92,6 +93,22 @@
+ unsigned int Tag = 0;
+ char Hostname[256];
+ int Verbose = 0;
++mailbox_t *CleanupMail = 0;
++imap_t *CleanupImap = 0;
++int CleanupValid = 0;
++
++static void signal_exit(int sig)
++{
++ info("Abort received\n");
++ if (CleanupValid) {
++ info("Aborting, cleaning up\n");
++ if (CleanupMail)
++ maildir_close (CleanupMail);
++ if (CleanupImap)
++ imap_close (CleanupImap);
++ }
++ exit (1);
++}
+
+ static void
+ version (void)
+@@ -319,6 +336,10 @@
+ usage (1);
+ }
+
++ signal(SIGTERM, signal_exit);
++ signal(SIGHUP, signal_exit);
++ signal(SIGINT, signal_exit);
++
+ gethostname (Hostname, sizeof (Hostname));
+
+ load_config (config, &o2o);
+@@ -410,6 +431,9 @@
+ ret = 1;
+ break;
+ }
++ CleanupValid = 1;
++ CleanupMail = mail;
++ CleanupImap = imap;
+
+ info ("Synchronizing\n");
+ i = (delete || box->delete) ? SYNC_DELETE : 0;
+@@ -460,6 +484,8 @@
+
+ } while (0);
+
++ CleanupValid = 0;
++
+ /* we never sync the same mailbox twice, so close it now */
+ if (mail)
+ maildir_close (mail);
+
diff --git a/debian/rules b/debian/rules
@@ -1,5 +1,7 @@
#!/usr/bin/make -f
+PACKAGE=isync
+
CFLAGS = -Wall -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
@@ -8,13 +10,14 @@ CFLAGS += -O2
endif
build: build-stamp
-build-stamp:
+build-stamp: patch-stamp
dh_testdir
./configure --prefix=/usr --mandir=/usr/share/man
$(MAKE) CFLAGS="$(CFLAGS)"
touch build-stamp
-clean:
+clean: clean1 unpatch
+clean1:
dh_testdir
dh_testroot
rm -f build-stamp
@@ -48,4 +51,6 @@ binary-arch: build install
dh_builddeb
binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install
+.PHONY: build clean binary-indep binary-arch binary install clean1
+
+include /usr/share/dpatch/dpatch.make