Browse Source

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

box (Thomas Roessler <roessler@does-not-exist.org>)
0.9
Michael Elkins 24 years ago
parent
commit
a954aeec96
  1. 1
      main.c
  2. 48
      sync.c

1
main.c

@ -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

48
sync.c

@ -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;
} }
/* 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 (;;) for (;;)
{ {
/* create new file */ /* 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++, 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) perror ("open");
break; break;
} }
sleep (2); sleep (2);
} }
if (fd < 0)
if (cur->flags) continue;
{
/* 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" : "");
}
/* 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
*/ */

Loading…
Cancel
Save