Selaa lähdekoodia

merge maildir_sync() and maildir_close(). the maxuid in a maildir still
needs to be updated in --fast mode, and the sync code already checks to see
if any changes were made to the mailbox.

Michael Elkins 23 vuotta sitten
vanhempi
sitoutus
bb62e2c18d
3 muutettua tiedostoa jossa 57 lisäystä ja 66 poistoa
  1. 1 2
      isync.h
  2. 50 54
      maildir.c
  3. 6 10
      main.c

+ 1 - 2
isync.h

@@ -183,9 +183,8 @@ int imap_append_message (imap_t *, int, message_t *);
 
 mailbox_t *maildir_open (const char *, int fast);
 int maildir_expunge (mailbox_t *, int);
-int maildir_sync (mailbox_t *);
 int maildir_set_uidvalidity (mailbox_t *, unsigned int uidvalidity);
-void maildir_close (mailbox_t *);
+int maildir_close (mailbox_t *);
 
 message_t * find_msg (message_t * list, unsigned int uid);
 void free_message (message_t *);

+ 50 - 54
maildir.c

@@ -343,8 +343,47 @@ update_maxuid (mailbox_t * mbox)
     return ret;
 }
 
+#define _24_HOURS (3600 * 24)
+
+static void
+maildir_clean_tmp (const char *mbox)
+{
+    char path[_POSIX_PATH_MAX];
+    DIR *dirp;
+    struct dirent *entry;
+    struct stat info;
+    time_t now;
+
+    snprintf (path, sizeof (path), "%s/tmp", mbox);
+    dirp = opendir (path);
+    if (dirp == NULL)
+    {
+	fprintf (stderr, "maildir_clean_tmp: opendir: %s: %s (errno %d)\n", path, strerror (errno), errno);
+	return;
+    }
+    /* assuming this scan will take less than a second, we only need to
+     * check the time once before the following loop.
+     */
+    time (&now);
+    while ((entry = readdir (dirp)))
+    {
+	snprintf (path, sizeof (path), "%s/tmp/%s", mbox, entry->d_name);
+	if (stat (path, &info))
+	    fprintf (stderr, "maildir_clean_tmp: stat: %s: %s (errno %d)\n", path, strerror (errno), errno);
+	else if (S_ISREG (info.st_mode) && now - info.st_ctime >= _24_HOURS)
+	{
+	    /* this should happen infrequently enough that it won't be
+	     * bothersome to the user to display when it occurs.
+	     */
+	    printf ("Warning: removing stale file %s\n", path);
+	    if (unlink (path))
+		fprintf (stderr, "maildir_clean_tmp: unlink: %s: %s (errno %d)\n", path, strerror (errno), errno);
+	}
+    }
+}
+
 int
-maildir_sync (mailbox_t * mbox)
+maildir_close (mailbox_t * mbox)
 {
     message_t *cur = mbox->msgs;
     char path[_POSIX_PATH_MAX];
@@ -386,6 +425,16 @@ maildir_sync (mailbox_t * mbox)
     if (mbox->maxuidchanged)
 	ret = update_maxuid (mbox);
 
+    /* per the maildir(5) specification, delivery agents are supposed to
+     * set a 24-hour timer on items placed in the `tmp' directory.
+     */
+    maildir_clean_tmp (mbox->path);
+
+    free (mbox->path);
+    free_message (mbox->msgs);
+    memset (mbox, 0xff, sizeof (mailbox_t));
+    free (mbox);
+
     return ret;
 }
 
@@ -427,56 +476,3 @@ maildir_set_uidvalidity (mailbox_t * mbox, unsigned int uidvalidity)
 
     return (ret);
 }
-
-#define _24_HOURS (3600 * 24)
-
-static void
-maildir_clean_tmp (const char *mbox)
-{
-    char path[_POSIX_PATH_MAX];
-    DIR *dirp;
-    struct dirent *entry;
-    struct stat info;
-    time_t now;
-
-    snprintf (path, sizeof (path), "%s/tmp", mbox);
-    dirp = opendir (path);
-    if (dirp == NULL)
-    {
-	fprintf (stderr, "maildir_clean_tmp: opendir: %s: %s (errno %d)\n", path, strerror (errno), errno);
-	return;
-    }
-    /* assuming this scan will take less than a second, we only need to
-     * check the time once before the following loop.
-     */
-    time (&now);
-    while ((entry = readdir (dirp)))
-    {
-	snprintf (path, sizeof (path), "%s/tmp/%s", mbox, entry->d_name);
-	if (stat (path, &info))
-	    fprintf (stderr, "maildir_clean_tmp: stat: %s: %s (errno %d)\n", path, strerror (errno), errno);
-	else if (S_ISREG (info.st_mode) && now - info.st_ctime >= _24_HOURS)
-	{
-	    /* this should happen infrequently enough that it won't be
-	     * bothersome to the user to display when it occurs.
-	     */
-	    printf ("Warning: removing stale file %s\n", path);
-	    if (unlink (path))
-		fprintf (stderr, "maildir_clean_tmp: unlink: %s: %s (errno %d)\n", path, strerror (errno), errno);
-	}
-    }
-}
-
-void
-maildir_close (mailbox_t * mbox)
-{
-    /* per the maildir(5) specification, delivery agents are supposed to
-     * set a 24-hour timer on items placed in the `tmp' directory.
-     */
-    maildir_clean_tmp (mbox->path);
-
-    free (mbox->path);
-    free_message (mbox->msgs);
-    memset (mbox, 0xff, sizeof (mailbox_t));
-    free (mbox);
-}

+ 6 - 10
main.c

@@ -316,18 +316,14 @@ main (int argc, char **argv)
 	     */
 	    else if (delete)
 		maildir_expunge (mail, 1);
-
-	    /* write changed flags back to the mailbox */
-	    if (mail->changed)
-	    {
-		if (!quiet)
-		    printf ("Committing changes to %s\n", mail->path);
-		if (maildir_sync (mail))
-		    exit (1);
-	    }
 	}
 
-	maildir_close (mail);
+	/* write changed flags back to the mailbox */
+	if (!quiet)
+	    printf ("Committing changes to %s\n", mail->path);
+
+	if (maildir_close (mail))
+	    exit (1);
 
 cleanup:
 	if (all)