diff --git a/isync.1 b/isync.1 index 3fbcd44..a219329 100644 --- 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 index 9db1a6f..4eae1ed 100644 --- a/sync.c +++ b/sync.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #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 ("");