factor out maildir_clear_tmp()

This commit is contained in:
Oswald Buddenhagen 2014-12-29 02:00:18 +01:00
parent 926788f3ae
commit 5f4e3b285e

View File

@ -336,12 +336,42 @@ maildir_free_scan( msglist_t *msglist )
#define _24_HOURS (3600 * 24) #define _24_HOURS (3600 * 24)
static int static int
maildir_validate( const char *box, int create, maildir_store_t *ctx ) maildir_clear_tmp( char *buf, int bufsz, int bl )
{ {
DIR *dirp; DIR *dirp;
struct dirent *entry; struct dirent *entry;
char *p;
time_t now; time_t now;
struct stat st;
memcpy( buf + bl, "tmp/", 5 );
bl += 4;
if (!(dirp = opendir( buf ))) {
sys_error( "Maildir error: cannot list %s", buf );
return DRV_BOX_BAD;
}
time( &now );
while ((entry = readdir( dirp ))) {
nfsnprintf( buf + bl, bufsz - bl, "%s", entry->d_name );
if (stat( buf, &st )) {
if (errno != ENOENT)
sys_error( "Maildir error: cannot access %s", buf );
} else if (S_ISREG(st.st_mode) && now - st.st_ctime >= _24_HOURS) {
/* This should happen infrequently enough that it won't be
* bothersome to the user to display when it occurs.
*/
info( "Maildir notice: removing stale file %s\n", buf );
if (unlink( buf ) && errno != ENOENT)
sys_error( "Maildir error: cannot remove %s", buf );
}
}
closedir( dirp );
return DRV_OK;
}
static int
maildir_validate( const char *box, int create, maildir_store_t *ctx )
{
char *p;
int i, bl, ret; int i, bl, ret;
struct stat st; struct stat st;
char buf[_POSIX_PATH_MAX]; char buf[_POSIX_PATH_MAX];
@ -386,28 +416,8 @@ maildir_validate( const char *box, int create, maildir_store_t *ctx )
return DRV_BOX_BAD; return DRV_BOX_BAD;
} }
} }
memcpy( buf + bl, "tmp/", 5 ); if ((ret = maildir_clear_tmp( buf, sizeof(buf), bl )) != DRV_OK)
bl += 4; return ret;
if (!(dirp = opendir( buf ))) {
sys_error( "Maildir error: cannot list %s", buf );
return DRV_BOX_BAD;
}
time( &now );
while ((entry = readdir( dirp ))) {
nfsnprintf( buf + bl, sizeof(buf) - bl, "%s", entry->d_name );
if (stat( buf, &st )) {
if (errno != ENOENT)
sys_error( "Maildir error: cannot access %s", buf );
} else if (S_ISREG(st.st_mode) && now - st.st_ctime >= _24_HOURS) {
/* this should happen infrequently enough that it won't be
* bothersome to the user to display when it occurs.
*/
info( "Maildir notice: removing stale file %s\n", buf );
if (unlink( buf ) && errno != ENOENT)
sys_error( "Maildir error: cannot remove %s", buf );
}
}
closedir( dirp );
ctx->fresh = 0; ctx->fresh = 0;
} }
return DRV_OK; return DRV_OK;