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