@ -233,7 +233,11 @@ static pthread_t consolethread = AST_PTHREADT_NULL;
static char randompool [ 256 ] ;
static char randompool [ 256 ] ;
static unsigned int need_reload ;
static int sig_alert_pipe [ 2 ] = { - 1 , - 1 } ;
static struct {
unsigned int need_reload : 1 ;
unsigned int need_quit : 1 ;
} sig_flags ;
# if !defined(LOW_MEMORY)
# if !defined(LOW_MEMORY)
struct file_version {
struct file_version {
@ -1038,11 +1042,14 @@ static void urg_handler(int num)
static void hup_handler ( int num )
static void hup_handler ( int num )
{
{
int a = 0 ;
if ( option_verbose > 1 )
if ( option_verbose > 1 )
printf ( " Received HUP signal -- Reloading configs \n " ) ;
printf ( " Received HUP signal -- Reloading configs \n " ) ;
if ( restartnow )
if ( restartnow )
execvp ( _argv [ 0 ] , _argv ) ;
execvp ( _argv [ 0 ] , _argv ) ;
need_reload = 1 ;
sig_flags . need_reload = 1 ;
if ( sig_alert_pipe [ 1 ] ! = - 1 )
write ( sig_alert_pipe [ 1 ] , & a , sizeof ( a ) ) ;
signal ( num , hup_handler ) ;
signal ( num , hup_handler ) ;
}
}
@ -1234,7 +1241,12 @@ static void quit_handler(int num, int nice, int safeshutdown, int restart)
static void __quit_handler ( int num )
static void __quit_handler ( int num )
{
{
quit_handler ( num , 0 , 1 , 0 ) ;
int a = 0 ;
sig_flags . need_quit = 1 ;
if ( sig_alert_pipe [ 1 ] ! = - 1 )
write ( sig_alert_pipe [ 1 ] , & a , sizeof ( a ) ) ;
/* There is no need to restore the signal handler here, since the app
* is going to exit */
}
}
static const char * fix_header ( char * outbuf , int maxout , const char * s , char * cmp )
static const char * fix_header ( char * outbuf , int maxout , const char * s , char * cmp )
@ -2202,11 +2214,6 @@ static void ast_remotecontrol(char * data)
}
}
}
}
}
}
if ( need_reload ) {
need_reload = 0 ;
ast_module_reload ( NULL ) ;
}
}
}
printf ( " \n Disconnected from Asterisk server \n " ) ;
printf ( " \n Disconnected from Asterisk server \n " ) ;
}
}
@ -2410,6 +2417,26 @@ static void ast_readconfig(void)
ast_config_destroy ( cfg ) ;
ast_config_destroy ( cfg ) ;
}
}
static void * monitor_sig_flags ( void * unused )
{
for ( ; ; ) {
struct pollfd p = { sig_alert_pipe [ 0 ] , POLLIN , 0 } ;
int a ;
poll ( & p , 1 , - 1 ) ;
if ( sig_flags . need_reload ) {
sig_flags . need_reload = 0 ;
ast_module_reload ( NULL ) ;
}
if ( sig_flags . need_quit ) {
sig_flags . need_quit = 0 ;
quit_handler ( 0 , 0 , 1 , 0 ) ;
}
read ( sig_alert_pipe [ 0 ] , & a , sizeof ( a ) ) ;
}
return NULL ;
}
int main ( int argc , char * argv [ ] )
int main ( int argc , char * argv [ ] )
{
{
int c ;
int c ;
@ -2819,6 +2846,9 @@ int main(int argc, char *argv[])
if ( ast_opt_no_fork )
if ( ast_opt_no_fork )
consolethread = pthread_self ( ) ;
consolethread = pthread_self ( ) ;
if ( pipe ( sig_alert_pipe ) )
sig_alert_pipe [ 0 ] = sig_alert_pipe [ 1 ] = - 1 ;
ast_set_flag ( & ast_options , AST_OPT_FLAG_FULLY_BOOTED ) ;
ast_set_flag ( & ast_options , AST_OPT_FLAG_FULLY_BOOTED ) ;
pthread_sigmask ( SIG_UNBLOCK , & sigs , NULL ) ;
pthread_sigmask ( SIG_UNBLOCK , & sigs , NULL ) ;
@ -2833,6 +2863,14 @@ int main(int argc, char *argv[])
/* Console stuff now... */
/* Console stuff now... */
/* Register our quit function */
/* Register our quit function */
char title [ 256 ] ;
char title [ 256 ] ;
pthread_attr_t attr ;
pthread_t dont_care ;
pthread_attr_init ( & attr ) ;
pthread_attr_setdetachstate ( & attr , PTHREAD_CREATE_DETACHED ) ;
ast_pthread_create ( & dont_care , & attr , monitor_sig_flags , NULL ) ;
pthread_attr_destroy ( & attr ) ;
set_icon ( " Asterisk " ) ;
set_icon ( " Asterisk " ) ;
snprintf ( title , sizeof ( title ) , " Asterisk Console on '%s' (pid %ld) " , hostname , ( long ) ast_mainpid ) ;
snprintf ( title , sizeof ( title ) , " Asterisk Console on '%s' (pid %ld) " , hostname , ( long ) ast_mainpid ) ;
set_title ( title ) ;
set_title ( title ) ;
@ -2856,22 +2894,10 @@ int main(int argc, char *argv[])
ast_log ( LOG_WARNING , " Failed to open /dev/null to recover from dead console. Bad things will happen! \n " ) ;
ast_log ( LOG_WARNING , " Failed to open /dev/null to recover from dead console. Bad things will happen! \n " ) ;
break ;
break ;
}
}
if ( need_reload ) {
need_reload = 0 ;
ast_module_reload ( NULL ) ;
}
}
}
}
}
/* Do nothing */
for ( ; ; ) { /* apparently needed for Mac OS X */
monitor_sig_flags ( NULL ) ;
struct pollfd p = { - 1 /* no descriptor */ , 0 , 0 } ;
poll ( & p , 0 , - 1 ) ;
/* SIGHUP will cause this to break out of poll() */
if ( need_reload ) {
need_reload = 0 ;
ast_module_reload ( NULL ) ;
}
}
return 0 ;
return 0 ;
}
}