فهرست منبع

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 سال پیش
والد
کامیت
bb62e2c18d
3فایلهای تغییر یافته به همراه57 افزوده شده و 66 حذف شده
  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)