diff --git a/README b/README index 845d07e..8ad4f86 100644 --- a/README +++ b/README @@ -5,7 +5,7 @@ |_|___/\__, |_| |_|\___| |___/ isync - IMAP4 to maildir mailbox synchronization program -http://www.sigpipe.org:8080/isync/ +http://www.cs.hmc.edu/~me/isync/ Author: Michael Elkins @@ -29,6 +29,7 @@ maintained, and all flags are synchronized. * Microsoft Exchange 2000 IMAP4rev1 server version 6.0.4417.0 * Courier-IMAP 1.2.3 * WU-IMAP 2000 + * Domino IMAP4 Server Release 5.0.8 * Platforms diff --git a/isync.1 b/isync.1 index b7ec84c..d3b38d7 100644 --- a/isync.1 +++ b/isync.1 @@ -16,7 +16,7 @@ \" along with this program; if not, write to the Free Software \" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA .. -.TH isync 1 "2002 Apr 19" +.TH isync 1 "2002 Jun 17" .. .SH NAME isync - synchronize IMAP4 and maildir mailboxes @@ -337,7 +337,7 @@ mutt(1), maildir(5) Up to date information on .B isync can be found at -http://www.sigpipe.org:8080/isync/. +http://www.cs.hmc.edu/~me/isync/. .. .SH AUTHOR Written by Michael R. Elkins . diff --git a/isync.h b/isync.h index 5d28049..3b1f8a9 100644 --- a/isync.h +++ b/isync.h @@ -91,6 +91,8 @@ struct mailbox unsigned int deleted; /* # of deleted messages */ unsigned int uidvalidity; unsigned int maxuid; /* largest uid we know about */ + unsigned int uidseen : 1; /* flag indicating whether or not we saw a + valid value for UIDVALIDITY */ }; /* message dispositions */ diff --git a/maildir.c b/maildir.c index d0ad29a..6528c3e 100644 --- a/maildir.c +++ b/maildir.c @@ -80,15 +80,21 @@ parse_info (message_t * m, char *s) } } -static unsigned int -read_uid (const char *path, const char *file) +/* + * There are three possible results of this function: + * >1 uid was already seen + * 0 uid was not yet seen + * -1 unable to read uid because of some other error + */ + +static int +read_uid (const char *path, const char *file, unsigned int *uid /* out */) { char full[_POSIX_PATH_MAX]; int fd; - int ret = 0; + int ret = -1; int len; - char buf[64]; - unsigned int uid = 0; + char buf[64], *ptr; snprintf (full, sizeof (full), "%s/%s", path, file); fd = open (full, O_RDONLY); @@ -103,18 +109,20 @@ read_uid (const char *path, const char *file) } len = read (fd, buf, sizeof (buf) - 1); if (len == -1) - { perror ("read"); - ret = -1; - } else { buf[len] = 0; - uid = atol (buf); + errno = 0; + *uid = strtoul (buf, &ptr, 10); + if (errno) + perror ("strtoul"); + else if (ptr && *ptr == '\n') + ret = 1; + /* else invalid value */ } close (fd); - return ret ? (unsigned int) ret : uid; - + return ret; } /* NOTE: this is NOT NFS safe */ @@ -233,12 +241,14 @@ maildir_open (const char *path, int flags) goto err; /* check for the uidvalidity value */ - m->uidvalidity = read_uid (m->path, "isyncuidvalidity"); - if (m->uidvalidity == (unsigned int) -1) - goto err; + i = read_uid (m->path, "isyncuidvalidity", &m->uidvalidity); + if (i == -1) + goto err; + else if (i > 0) + m->uidseen = 1; /* load the current maxuid */ - if ((m->maxuid = read_uid (m->path, "isyncmaxuid")) == (unsigned int) -1) + if (read_uid (m->path, "isyncmaxuid", &m->maxuid) == -1) goto err; if (flags & OPEN_FAST) diff --git a/main.c b/main.c index 9348432..683545a 100644 --- a/main.c +++ b/main.c @@ -312,6 +312,7 @@ main (int argc, char **argv) imap_close (imap); /* Just to be safe. Don't really know * what the problem was. */ + imap = NULL; /* context no longer valid */ break; } diff --git a/sync.c b/sync.c index 31349c3..91b23b0 100644 --- a/sync.c +++ b/sync.c @@ -71,7 +71,7 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags, int upload = 0; unsigned int msg_count; - if (mbox->uidvalidity > 0) + if (mbox->uidseen) { if (mbox->uidvalidity != imap->uidvalidity) {