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
					
				
					 6 changed files with 33 additions and 19 deletions
				
			
		
							
								
								
									
										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…
	
	Add table
		
		Reference in a new issue