updated URL for project
fixed segmentation fault caused by double free() when an error occurred during the IMAP transmission. fixed bug where isync could not handle a 0 value UIDVALIDITY
This commit is contained in:
parent
7741548ff8
commit
f6c037c854
3
README
3
README
|
@ -5,7 +5,7 @@
|
||||||
|_|___/\__, |_| |_|\___|
|
|_|___/\__, |_| |_|\___|
|
||||||
|___/
|
|___/
|
||||||
isync - IMAP4 to maildir mailbox synchronization program
|
isync - IMAP4 to maildir mailbox synchronization program
|
||||||
http://www.sigpipe.org:8080/isync/
|
http://www.cs.hmc.edu/~me/isync/
|
||||||
|
|
||||||
Author: Michael Elkins <me@mutt.org>
|
Author: Michael Elkins <me@mutt.org>
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ maintained, and all flags are synchronized.
|
||||||
* Microsoft Exchange 2000 IMAP4rev1 server version 6.0.4417.0
|
* Microsoft Exchange 2000 IMAP4rev1 server version 6.0.4417.0
|
||||||
* Courier-IMAP 1.2.3
|
* Courier-IMAP 1.2.3
|
||||||
* WU-IMAP 2000
|
* WU-IMAP 2000
|
||||||
|
* Domino IMAP4 Server Release 5.0.8
|
||||||
|
|
||||||
* Platforms
|
* Platforms
|
||||||
|
|
||||||
|
|
4
isync.1
4
isync.1
|
@ -16,7 +16,7 @@
|
||||||
\" along with this program; if not, write to the Free Software
|
\" along with this program; if not, write to the Free Software
|
||||||
\" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
\" 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
|
.SH NAME
|
||||||
isync - synchronize IMAP4 and maildir mailboxes
|
isync - synchronize IMAP4 and maildir mailboxes
|
||||||
|
@ -337,7 +337,7 @@ mutt(1), maildir(5)
|
||||||
Up to date information on
|
Up to date information on
|
||||||
.B isync
|
.B isync
|
||||||
can be found at
|
can be found at
|
||||||
http://www.sigpipe.org:8080/isync/.
|
http://www.cs.hmc.edu/~me/isync/.
|
||||||
..
|
..
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Written by Michael R. Elkins <me@mutt.org>.
|
Written by Michael R. Elkins <me@mutt.org>.
|
||||||
|
|
2
isync.h
2
isync.h
|
@ -91,6 +91,8 @@ struct mailbox
|
||||||
unsigned int deleted; /* # of deleted messages */
|
unsigned int deleted; /* # of deleted messages */
|
||||||
unsigned int uidvalidity;
|
unsigned int uidvalidity;
|
||||||
unsigned int maxuid; /* largest uid we know about */
|
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 */
|
/* message dispositions */
|
||||||
|
|
38
maildir.c
38
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];
|
char full[_POSIX_PATH_MAX];
|
||||||
int fd;
|
int fd;
|
||||||
int ret = 0;
|
int ret = -1;
|
||||||
int len;
|
int len;
|
||||||
char buf[64];
|
char buf[64], *ptr;
|
||||||
unsigned int uid = 0;
|
|
||||||
|
|
||||||
snprintf (full, sizeof (full), "%s/%s", path, file);
|
snprintf (full, sizeof (full), "%s/%s", path, file);
|
||||||
fd = open (full, O_RDONLY);
|
fd = open (full, O_RDONLY);
|
||||||
|
@ -103,18 +109,20 @@ read_uid (const char *path, const char *file)
|
||||||
}
|
}
|
||||||
len = read (fd, buf, sizeof (buf) - 1);
|
len = read (fd, buf, sizeof (buf) - 1);
|
||||||
if (len == -1)
|
if (len == -1)
|
||||||
{
|
|
||||||
perror ("read");
|
perror ("read");
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
buf[len] = 0;
|
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);
|
close (fd);
|
||||||
return ret ? (unsigned int) ret : uid;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: this is NOT NFS safe */
|
/* NOTE: this is NOT NFS safe */
|
||||||
|
@ -233,12 +241,14 @@ maildir_open (const char *path, int flags)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/* check for the uidvalidity value */
|
/* check for the uidvalidity value */
|
||||||
m->uidvalidity = read_uid (m->path, "isyncuidvalidity");
|
i = read_uid (m->path, "isyncuidvalidity", &m->uidvalidity);
|
||||||
if (m->uidvalidity == (unsigned int) -1)
|
if (i == -1)
|
||||||
goto err;
|
goto err;
|
||||||
|
else if (i > 0)
|
||||||
|
m->uidseen = 1;
|
||||||
|
|
||||||
/* load the current maxuid */
|
/* 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;
|
goto err;
|
||||||
|
|
||||||
if (flags & OPEN_FAST)
|
if (flags & OPEN_FAST)
|
||||||
|
|
1
main.c
1
main.c
|
@ -312,6 +312,7 @@ main (int argc, char **argv)
|
||||||
imap_close (imap); /* Just to be safe. Don't really know
|
imap_close (imap); /* Just to be safe. Don't really know
|
||||||
* what the problem was.
|
* what the problem was.
|
||||||
*/
|
*/
|
||||||
|
imap = NULL; /* context no longer valid */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
sync.c
2
sync.c
|
@ -71,7 +71,7 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
|
||||||
int upload = 0;
|
int upload = 0;
|
||||||
unsigned int msg_count;
|
unsigned int msg_count;
|
||||||
|
|
||||||
if (mbox->uidvalidity > 0)
|
if (mbox->uidseen)
|
||||||
{
|
{
|
||||||
if (mbox->uidvalidity != imap->uidvalidity)
|
if (mbox->uidvalidity != imap->uidvalidity)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user