isync

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

commit a954aeec967ebbe9e01386d245a50b7b224e1488
parent 5c08b1c4bddbe18a722dc2338fc0021465f50c2b
Author: Michael Elkins <me@mutt.org>
Date:   Fri, 22 Dec 2000 15:48:04 +0000

fixed sync_mailbox() to correctly write new messages to the local maildir
box (Thomas Roessler <roessler@does-not-exist.org>)

Diffstat:
Mmain.c | 1-
Msync.c | 50++++++++++++++++++++++----------------------------
2 files changed, 22 insertions(+), 29 deletions(-)

diff --git a/main.c b/main.c @@ -26,7 +26,6 @@ #include <errno.h> #include <string.h> #include <ctype.h> -#include <termios.h> #include "isync.h" #if HAVE_GETOPT_LONG diff --git a/sync.c b/sync.c @@ -25,7 +25,6 @@ #include <time.h> #include <fcntl.h> #include <string.h> -#include <sys/stat.h> #include <errno.h> #include "isync.h" @@ -47,10 +46,10 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags, unsigned int max_size) message_t *tmp; char path[_POSIX_PATH_MAX]; char newpath[_POSIX_PATH_MAX]; + char suffix[_POSIX_PATH_MAX]; char *p; int fd; int ret; - struct stat sb; if (mbox->uidvalidity != (unsigned int) -1) { @@ -137,46 +136,43 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags, unsigned int max_size) continue; } + /* construct the flags part of the file name. */ + + *suffix = 0; + if (cur->flags) + { + snprintf (suffix, sizeof (suffix), ":2,%s%s%s%s", + (cur->flags & D_FLAGGED) ? "F" : "", + (cur->flags & D_ANSWERED) ? "R" : "", + (cur->flags & D_SEEN) ? "S" : "", + (cur->flags & D_DELETED) ? "T" : ""); + } + for (;;) { /* create new file */ - snprintf (path, sizeof (path), "%s/tmp/%s.%ld_%d.%d.UID%d", + snprintf (path, sizeof (path), "%s/tmp/%s.%ld_%d.%d.UID%d%s", mbox->path, Hostname, time (0), MaildirCount++, - getpid (), cur->uid); + getpid (), cur->uid, suffix); - if (stat (path, &sb)) + if ((fd = open (path, O_WRONLY | O_CREAT | O_EXCL, 0600)) > 0) + break; + if (errno != EEXIST) { - if (errno == ENOENT) - break; + perror ("open"); + break; } sleep (2); } - - if (cur->flags) - { - /* append flags */ - snprintf (path + strlen (path), sizeof (path) - strlen (path), - ":2,%s%s%s%s", - (cur->flags & D_FLAGGED) ? "F" : "", - (cur->flags & D_ANSWERED) ? "R" : "", - (cur->flags & D_SEEN) ? "S" : "", - (cur->flags & D_DELETED) ? "T" : ""); - } + if (fd < 0) + continue; /* give some visual feedback that something is happening */ fputs (".", stdout); fflush (stdout); -// printf("creating %s\n", path); - fd = open (path, O_WRONLY | O_CREAT | O_EXCL, 0600); - if (fd < 0) - { - perror ("open"); - continue; - } - ret = imap_fetch_message (imap, cur->uid, fd); if (close (fd)) @@ -188,8 +184,6 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags, unsigned int max_size) snprintf (newpath, sizeof (newpath), "%s/%s%s", mbox->path, (cur->flags & D_SEEN) ? "cur" : "new", p); - // printf ("moving %s to %s\n", path, newpath); - /* its ok if this fails, the next time we sync the message * will get pulled down */