Procházet zdrojové kódy

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

Michael Elkins před 24 roky
rodič
revize
a954aeec96
2 změnil soubory, kde provedl 22 přidání a 29 odebrání
  1. 0 1
      main.c
  2. 22 28
      sync.c

+ 0 - 1
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

+ 22 - 28
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
 		 */