@ -750,14 +750,17 @@ static void *scan_thread(void *unused)
struct dirent * de ;
char fn [ 256 ] ;
int res ;
time_t last = 0 , next = 0 , now ;
int force_poll = 1 ;
time_t last = 0 ;
time_t next = 0 ;
time_t now ;
struct timespec ts = { . tv_sec = 1 } ;
while ( ! ast_fully_booted ) {
nanosleep ( & ts , NULL ) ;
}
for ( ; ; ) {
for ( ; ; ) {
/* Wait a sec */
nanosleep ( & ts , NULL ) ;
time ( & now ) ;
@ -768,34 +771,50 @@ static void *scan_thread(void *unused)
}
/* Make sure it is time for us to execute our check */
if ( ( st . st_mtime = = last ) & & ( next & & ( next > now ) ) )
if ( ! force_poll & & st . st_mtime = = last & & ( ! next | | now < next ) ) {
/*
* The directory timestamp did not change and any delayed
* call - file is not ready to be executed .
*/
continue ;
}
#if 0
printf ( " atime: %ld, mtime: %ld, ctime: %ld \n " , st . st_atime , st . st_mtime , st . st_ctime ) ;
printf ( " Ooh, something changed / timeout \n " ) ;
# endif
next = 0 ;
last = st . st_mtime ;
if ( ! ( dir = opendir ( qdir ) ) ) {
ast_log ( LOG_WARNING , " Unable to open directory %s: %s \n " , qdir , strerror ( errno ) ) ;
continue ;
}
/*
* Since the dir timestamp is available at one second
* resolution , we cannot know if it was updated within the same
* second after we scanned it . Therefore , we will force another
* scan if the dir was just modified .
*/
force_poll = ( st . st_mtime = = now ) ;
next = 0 ;
last = st . st_mtime ;
while ( ( de = readdir ( dir ) ) ) {
snprintf ( fn , sizeof ( fn ) , " %s/%s " , qdir , de - > d_name ) ;
if ( stat ( fn , & st ) ) {
ast_log ( LOG_WARNING , " Unable to stat %s: %s \n " , fn , strerror ( errno ) ) ;
continue ;
}
if ( ! S_ISREG ( st . st_mode ) )
if ( ! S_ISREG ( st . st_mode ) ) {
/* Not a regular file. */
continue ;
}
if ( st . st_mtime < = now ) {
res = scan_service ( fn , now ) ;
if ( res > 0 ) {
/* Update next service time */
if ( ! next | | ( res < next ) ) {
/* The call-file is delayed or to be retried later. */
if ( ! next | | res < next ) {
/* This delayed call file expires earlier. */
next = res ;
}
} else if ( res ) {
@ -805,9 +824,11 @@ static void *scan_thread(void *unused)
next = st . st_mtime ;
}
} else {
/* Update "next" update if necessary */
if ( ! next | | ( st . st_mtime < next ) )
/* The file's timestamp is in the future. */
if ( ! next | | st . st_mtime < next ) {
/* This call-file's timestamp expires earlier. */
next = st . st_mtime ;
}
}
}
closedir ( dir ) ;