|
@@ -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);
|
|
|
-}
|