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:
parent
49b36e7869
commit
bb62e2c18d
3
isync.h
3
isync.h
|
@ -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
104
maildir.c
|
@ -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
10
main.c
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user