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.
This commit is contained in:
Michael Elkins 2001-11-12 23:03:33 +00:00
parent 49b36e7869
commit bb62e2c18d
3 changed files with 57 additions and 66 deletions

View File

@ -183,9 +183,8 @@ int imap_append_message (imap_t *, int, message_t *);
mailbox_t *maildir_open (const char *, int fast); mailbox_t *maildir_open (const char *, int fast);
int maildir_expunge (mailbox_t *, int); int maildir_expunge (mailbox_t *, int);
int maildir_sync (mailbox_t *);
int maildir_set_uidvalidity (mailbox_t *, unsigned int uidvalidity); 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); message_t * find_msg (message_t * list, unsigned int uid);
void free_message (message_t *); void free_message (message_t *);

104
maildir.c
View File

@ -343,8 +343,47 @@ update_maxuid (mailbox_t * mbox)
return ret; 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 int
maildir_sync (mailbox_t * mbox) maildir_close (mailbox_t * mbox)
{ {
message_t *cur = mbox->msgs; message_t *cur = mbox->msgs;
char path[_POSIX_PATH_MAX]; char path[_POSIX_PATH_MAX];
@ -386,6 +425,16 @@ maildir_sync (mailbox_t * mbox)
if (mbox->maxuidchanged) if (mbox->maxuidchanged)
ret = update_maxuid (mbox); 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; return ret;
} }
@ -427,56 +476,3 @@ maildir_set_uidvalidity (mailbox_t * mbox, unsigned int uidvalidity)
return (ret); 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);
}

10
main.c
View File

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