isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit b3d09b17238584eb3ec8819ad2ce7b6452905b46
parent bbbe88e07d09c28e549c40fbcde24a1ef04a6aa0
Author: Michael Elkins <me@mutt.org>
Date:   Thu, 21 Dec 2000 18:16:44 +0000

added BUGS section to manpage detailing the fact that we break the
maildir(5) spec by parsing the filename

change message delivery to use the method described in maildir(5)

Diffstat:
Misync.1 | 8++++++++
Msync.c | 35+++++++++++++++++++++++++++--------
2 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/isync.1 b/isync.1 @@ -190,6 +190,14 @@ will then use the global value by default. .B ~/.isyncrc Default configuration file .. +.SH BUGS +maildir(5) states that readers should not attempt to parse the filename of a +a message other than the :info field. However, since +.B isync +relies on using the message UIDs that info must be inserted into the +filename in a way which will be interoperable with existing readers. So +the UID is placed in the filename of the messages in the local maildir +mailbox rather than the :info field. .SH SEE ALSO mutt(1), maildir(5) .P diff --git a/sync.c b/sync.c @@ -25,6 +25,8 @@ #include <time.h> #include <fcntl.h> #include <string.h> +#include <sys/stat.h> +#include <errno.h> #include "isync.h" static unsigned int MaildirCount = 0; @@ -48,6 +50,7 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags) char *p; int fd; int ret; + struct stat sb; for (cur = mbox->msgs; cur; cur = cur->next) { @@ -104,10 +107,22 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags) continue; } - /* create new file */ - snprintf (path, sizeof (path), "%s/tmp/%s.%ld_%d.%d.UID%d", - mbox->path, Hostname, time (0), MaildirCount++, - getpid (), cur->uid); + for (;;) + { + /* create new file */ + snprintf (path, sizeof (path), "%s/tmp/%s.%ld_%d.%d.UID%d", + mbox->path, Hostname, time (0), MaildirCount++, + getpid (), cur->uid); + + if (stat (path, &sb)) + { + if (errno == ENOENT) + break; + } + + sleep (2); + } + if (cur->flags) { @@ -146,11 +161,15 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags) // printf ("moving %s to %s\n", path, newpath); - if (rename (path, newpath)) - perror ("rename"); + /* its ok if this fails, the next time we sync the message + * will get pulled down + */ + if (link (path, newpath)) + perror ("link"); } - else - unlink(path); + + /* always remove the temp file */ + unlink (path); } } puts ("");