@ -3812,6 +3812,54 @@ static void check_quota(struct vm_state *vms, char *mailbox) {
# endif /* IMAP_STORAGE */
static void cleanup_orphaned_lock_files ( const char * base )
{
DIR * dir ;
struct dirent * e ;
dir = opendir ( base ) ;
if ( ! dir ) {
/* Don't complain about this too loudly */
ast_debug ( 2 , " Unable to open `%s': %s \n " , base , strerror ( errno ) ) ;
return ;
}
while ( ( e = readdir ( dir ) ) ) {
char * fullpath ;
struct stat s ;
/* Always skip . and .. */
if ( ! strcmp ( e - > d_name , " . " ) | | ! strcmp ( e - > d_name , " .. " ) ) {
continue ;
}
/* Build up the full path (using dynamic memory because PATH_MAX is crap) */
if ( ast_asprintf ( & fullpath , " %s/%s " , base , e - > d_name ) = = - 1 ) {
break ;
}
if ( lstat ( fullpath , & s ) < 0 ) {
ast_free ( fullpath ) ;
continue ;
}
/* This is exposing an implementation detail of ast_lock_path, but it makes
* our life a bit easier */
if ( ! strcmp ( e - > d_name , " .lock " ) & & S_ISLNK ( s . st_mode ) ) {
if ( ! ast_unlock_path ( base ) ) {
ast_log ( AST_LOG_NOTICE , " Cleaned up orphaned lock file: %s/.lock \n " , base ) ;
}
} else if ( S_ISDIR ( s . st_mode ) ) {
/* If it is a directory, let's dive down */
cleanup_orphaned_lock_files ( fullpath ) ;
}
ast_free ( fullpath ) ;
}
closedir ( dir ) ;
}
/*! \brief Lock file path
* only return failure if ast_lock_path returns ' timeout ' ,
* not if the path does not exist or any other reason
@ -15355,6 +15403,9 @@ static int load_module(void)
/* compute the location of the voicemail spool directory */
snprintf ( VM_SPOOL_DIR , sizeof ( VM_SPOOL_DIR ) , " %s/voicemail/ " , ast_config_AST_SPOOL_DIR ) ;
/* Now that we have a spool directory, clean up old lock files */
cleanup_orphaned_lock_files ( VM_SPOOL_DIR ) ;
if ( ! ( mwi_subscription_tps = ast_taskprocessor_get ( " app_voicemail " , 0 ) ) ) {
ast_log ( AST_LOG_WARNING , " failed to reference mwi subscription taskprocessor. MWI will not work \n " ) ;
}