fixed sync_mailbox() to correctly write new messages to the local maildir

box (Thomas Roessler <roessler@does-not-exist.org>)
This commit is contained in:
Michael Elkins 2000-12-22 15:48:04 +00:00
parent 5c08b1c4bd
commit a954aeec96
2 changed files with 25 additions and 32 deletions

1
main.c
View File

@ -26,7 +26,6 @@
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include <termios.h>
#include "isync.h" #include "isync.h"
#if HAVE_GETOPT_LONG #if HAVE_GETOPT_LONG

56
sync.c
View File

@ -25,7 +25,6 @@
#include <time.h> #include <time.h>
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include "isync.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; message_t *tmp;
char path[_POSIX_PATH_MAX]; char path[_POSIX_PATH_MAX];
char newpath[_POSIX_PATH_MAX]; char newpath[_POSIX_PATH_MAX];
char suffix[_POSIX_PATH_MAX];
char *p; char *p;
int fd; int fd;
int ret; int ret;
struct stat sb;
if (mbox->uidvalidity != (unsigned int) -1) 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; continue;
} }
for (;;) /* construct the flags part of the file name. */
{
/* 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);
}
*suffix = 0;
if (cur->flags) if (cur->flags)
{ {
/* append flags */ snprintf (suffix, sizeof (suffix), ":2,%s%s%s%s",
snprintf (path + strlen (path), sizeof (path) - strlen (path),
":2,%s%s%s%s",
(cur->flags & D_FLAGGED) ? "F" : "", (cur->flags & D_FLAGGED) ? "F" : "",
(cur->flags & D_ANSWERED) ? "R" : "", (cur->flags & D_ANSWERED) ? "R" : "",
(cur->flags & D_SEEN) ? "S" : "", (cur->flags & D_SEEN) ? "S" : "",
(cur->flags & D_DELETED) ? "T" : ""); (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 */ /* give some visual feedback that something is happening */
fputs (".", stdout); fputs (".", stdout);
fflush (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); ret = imap_fetch_message (imap, cur->uid, fd);
if (close (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, snprintf (newpath, sizeof (newpath), "%s/%s%s", mbox->path,
(cur->flags & D_SEEN) ? "cur" : "new", p); (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 /* its ok if this fails, the next time we sync the message
* will get pulled down * will get pulled down
*/ */