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 | 50 ++++++++++++++++++++++---------------------------- 2 files changed, 22 insertions(+), 29 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; } + /* 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 */