From a954aeec967ebbe9e01386d245a50b7b224e1488 Mon Sep 17 00:00:00 2001 From: Michael Elkins Date: Fri, 22 Dec 2000 15:48:04 +0000 Subject: [PATCH] fixed sync_mailbox() to correctly write new messages to the local maildir box (Thomas Roessler ) --- main.c | 1 - sync.c | 56 +++++++++++++++++++++++++------------------------------- 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/main.c b/main.c index 96343f4..c98f3f9 100644 --- a/main.c +++ b/main.c @@ -26,7 +26,6 @@ #include #include #include -#include #include "isync.h" #if HAVE_GETOPT_LONG diff --git a/sync.c b/sync.c index 4cee760..2d9efae 100644 --- a/sync.c +++ b/sync.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #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; } - 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); - } - + /* construct the flags part of the file name. */ + *suffix = 0; if (cur->flags) { - /* append flags */ - snprintf (path + strlen (path), sizeof (path) - strlen (path), - ":2,%s%s%s%s", + 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%s", + mbox->path, Hostname, time (0), MaildirCount++, + getpid (), cur->uid, suffix); + + if ((fd = open (path, O_WRONLY | O_CREAT | O_EXCL, 0600)) > 0) + break; + if (errno != EEXIST) + { + perror ("open"); + break; + } + + sleep (2); + } + + 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 */