Przeglądaj źródła

don't bother renaming the message file if we are about to unlink() it

Michael Elkins 23 lat temu
rodzic
commit
d00a65bebd
1 zmienionych plików z 35 dodań i 28 usunięć
  1. 35 28
      sync.c

+ 35 - 28
sync.c

@@ -200,36 +200,43 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
 		mbox->deleted++;
 	    cur->flags |= (tmp->flags & ~(D_RECENT | D_DRAFT));
 
-	    /* generate old path */
-	    snprintf (path, sizeof (path), "%s/%s/%s",
-		      mbox->path, cur->new ? "new" : "cur", cur->file);
-
-	    /* truncate old flags (if present) */
-	    p = strchr (cur->file, ':');
-	    if (p)
-		*p = 0;
-
-	    /* generate new path - always put this in the cur/ directory
-	     * because its no longer new
+	    /* don't bother renaming the file if we are just going to
+	     * remove it later.
 	     */
-	    snprintf (newpath, sizeof (newpath), "%s/cur/%s:2,%s%s%s%s",
-		      mbox->path,
-		      cur->file, (cur->flags & D_FLAGGED) ? "F" : "",
-		      (cur->flags & D_ANSWERED) ? "R" : "",
-		      (cur->flags & D_SEEN) ? "S" : "",
-		      (cur->flags & D_DELETED) ? "T" : "");
-
-	    if (rename (path, newpath))
-	    {
-		perror ("rename");
-		return -1;
-	    }
-	    else
+	    if ((cur->flags & D_DELETED) == 0 || (flags & SYNC_EXPUNGE) == 0)
 	    {
-		/* update the filename in the msg struct */
-		p = strrchr (newpath, '/');
-		free (cur->file);
-		cur->file = strdup (p + 1);
+		    /* generate old path */
+		    snprintf (path, sizeof (path), "%s/%s/%s",
+				    mbox->path, cur->new ? "new" : "cur", cur->file);
+
+		    /* truncate old flags (if present) */
+		    p = strchr (cur->file, ':');
+		    if (p)
+			    *p = 0;
+
+		    /* generate new path - always put this in the cur/ directory
+		     * because its no longer new
+		     */
+		    snprintf (newpath, sizeof (newpath), "%s/cur/%s:2,%s%s%s%s",
+				    mbox->path,
+				    cur->file, (cur->flags & D_FLAGGED) ? "F" : "",
+				    (cur->flags & D_ANSWERED) ? "R" : "",
+				    (cur->flags & D_SEEN) ? "S" : "",
+				    (cur->flags & D_DELETED) ? "T" : "");
+
+		    if (rename (path, newpath))
+		    {
+			    perror ("rename");
+			    return -1;
+		    }
+		    else
+		    {
+			    /* update the filename in the msg struct */
+			    p = strrchr (newpath, '/');
+			    free (cur->file);
+			    cur->file = strdup (p + 1);
+			    cur->new = 0; /* not any more */
+		    }
 	    }
 	}
     }