@ -1872,8 +1872,8 @@ static int can_safely_quit(shutdown_nice_t niceness, int restart)
time_t s , e ;
/* Begin shutdown routine, hanging up active channels */
ast_begin_shutdown ( 1 ) ;
if ( option_verbose & & ast_opt_console) {
ast_verb ose ( " Beginning asterisk %s.... \n " , restart ? " restart " : " shutdown " ) ;
if ( ast_opt_console) {
ast_verb ( 0 , " Beginning asterisk %s.... \n " , restart ? " restart " : " shutdown " ) ;
}
time ( & s ) ;
for ( ; ; ) {
@ -1889,7 +1889,7 @@ static int can_safely_quit(shutdown_nice_t niceness, int restart)
if ( niceness ! = SHUTDOWN_REALLY_NICE ) {
ast_begin_shutdown ( 0 ) ;
}
if ( option_verbose & & ast_opt_console) {
if ( ast_opt_console) {
ast_verb ( 0 , " Waiting for inactivity to perform %s... \n " , restart ? " restart " : " halt " ) ;
}
for ( ; ; ) {
@ -1905,7 +1905,7 @@ static int can_safely_quit(shutdown_nice_t niceness, int restart)
*/
ast_mutex_lock ( & safe_system_lock ) ;
if ( shuttingdown ! = niceness ) {
if ( shuttingdown = = NOT_SHUTTING_DOWN & & option_verbose & & ast_opt_console) {
if ( shuttingdown = = NOT_SHUTTING_DOWN & & ast_opt_console) {
ast_verb ( 0 , " Asterisk %s cancelled. \n " , restart ? " restart " : " shutdown " ) ;
}
ast_mutex_unlock ( & safe_system_lock ) ;
@ -2030,49 +2030,124 @@ static void __remote_quit_handler(int num)
sig_flags . need_quit = 1 ;
}
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 level )
{
const char * c ;
const char * cmp ;
switch ( level ) {
case 0 : * outbuf = ' \0 ' ;
return s ;
case 1 : cmp = VERBOSE_PREFIX_1 ;
break ;
case 2 : cmp = VERBOSE_PREFIX_2 ;
break ;
case 3 : cmp = VERBOSE_PREFIX_3 ;
break ;
default : cmp = VERBOSE_PREFIX_4 ;
break ;
}
if ( ! strncmp ( s , cmp , strlen ( cmp ) ) ) {
c = s + strlen ( cmp ) ;
term_color ( outbuf , cmp , COLOR_GRAY , 0 , maxout ) ;
return c ;
s + = strlen ( cmp ) ;
}
return NULL ;
term_color ( outbuf , cmp , COLOR_GRAY , 0 , maxout ) ;
return s ;
}
struct console_state_data {
int newline ;
char verbose_line_level ;
} ;
static int console_state_init ( void * ptr )
{
struct console_state_data * state = ptr ;
state - > newline = 1 ;
state - > verbose_line_level = 0 ;
return 0 ;
}
AST_THREADSTORAGE_CUSTOM ( console_state , console_state_init , ast_free_ptr ) ;
/* These gymnastics are due to platforms which designate char as unsigned by
* default . Level is the negative character - - offset by 1 , because \ 0 is the
* EOS delimiter . */
# define VERBOSE_MAGIC2LEVEL(x) (((char) -*(signed char *) (x)) - 1)
# define VERBOSE_HASMAGIC(x) (*(signed char *) (x) < 0)
static void console_verboser ( const char * s )
static int console_log_verbose ( const char * s )
{
char tmp [ 80 ] ;
const char * c = NULL ;
char level = 0 ;
/* verbose level of 0 evaluates to a magic of -1, 1 to -2, etc...
search up to - 7 ( level = 6 ) as this is currently the largest
level used */
static const char find_set [ 9 ] = { - 1 , - 2 , - 3 , - 4 , - 5 , - 6 , - 7 , ' \n ' } ;
if ( VERBOSE_HASMAGIC ( s ) ) {
level = VERBOSE_MAGIC2LEVEL ( s ) ;
s + + ;
if ( level > option_verbose ) {
return ;
struct console_state_data * state =
ast_threadstorage_get ( & console_state , sizeof ( * state ) ) ;
char prefix [ 80 ] ;
const char * c = s ;
int res = 0 ;
do {
if ( VERBOSE_HASMAGIC ( s ) ) {
/* if it has one always use the given line's level,
otherwise we ' ll use the last line ' s level */
state - > verbose_line_level = VERBOSE_MAGIC2LEVEL ( s ) ;
/* move past magic */
s + + ;
}
}
if ( ( c = fix_header ( tmp , sizeof ( tmp ) , s , VERBOSE_PREFIX_4 ) ) | |
( c = fix_header ( tmp , sizeof ( tmp ) , s , VERBOSE_PREFIX_3 ) ) | |
( c = fix_header ( tmp , sizeof ( tmp ) , s , VERBOSE_PREFIX_2 ) ) | |
( c = fix_header ( tmp , sizeof ( tmp ) , s , VERBOSE_PREFIX_1 ) ) ) {
fputs ( tmp , stdout ) ;
fputs ( c , stdout ) ;
} else {
fputs ( s , stdout ) ;
c = fix_header ( prefix , sizeof ( prefix ) , s ,
state - > verbose_line_level ) ;
if ( ! state - > newline ) {
/* don't use the prefix if line continuation */
* prefix = ' \0 ' ;
}
/* for a given line separate on verbose magic and newlines */
if ( ! ( s = strpbrk ( c , find_set ) ) ) {
s = strchr ( c , ' \0 ' ) ;
} else if ( * s = = ' \n ' ) {
+ + s ;
}
/* check if we should write this line after calculating begin/end
so we process the case of a higher level line embedded within
two lower level lines */
if ( state - > verbose_line_level > option_verbose ) {
continue ;
}
state - > newline = * ( s - 1 ) = = ' \n ' ;
if ( ! ast_strlen_zero ( prefix ) ) {
fputs ( prefix , stdout ) ;
}
fwrite ( c , sizeof ( char ) , s - c , stdout ) ;
if ( ! res ) {
/* if at least some info has been written
we ' ll want to return true */
res = 1 ;
}
c = s ;
} while ( * s ) ;
if ( res ) {
fflush ( stdout ) ;
}
fflush ( stdout ) ;
return res ;
}
static void console_verboser ( const char * s )
{
if ( ! console_log_verbose ( s ) ) {
return ;
}
/* Wake up a poll()ing console */
if ( ast_opt_console & & consolethread ! = AST_PTHREADT_NULL ) {
@ -2480,23 +2555,6 @@ static struct ast_cli_entry cli_asterisk[] = {
# endif /* ! LOW_MEMORY */
} ;
struct el_read_char_state_struct {
unsigned int line_full : 1 ;
unsigned int prev_line_full : 1 ;
char prev_line_verbosity ;
} ;
static int el_read_char_state_init ( void * ptr )
{
struct el_read_char_state_struct * state = ptr ;
state - > line_full = 1 ;
state - > prev_line_full = 1 ;
state - > prev_line_verbosity = 0 ;
return 0 ;
}
AST_THREADSTORAGE_CUSTOM ( el_read_char_state , el_read_char_state_init , ast_free_ptr ) ;
static int ast_el_read_char ( EditLine * editline , char * cp )
{
int num_read = 0 ;
@ -2506,7 +2564,6 @@ static int ast_el_read_char(EditLine *editline, char *cp)
int max ;
# define EL_BUF_SIZE 512
char buf [ EL_BUF_SIZE ] ;
struct el_read_char_state_struct * state = ast_threadstorage_get ( & el_read_char_state , sizeof ( * state ) ) ;
for ( ; ; ) {
max = 1 ;
@ -2536,8 +2593,6 @@ static int ast_el_read_char(EditLine *editline, char *cp)
}
}
if ( fds [ 0 ] . revents ) {
char level = 0 ;
char * curline = buf , * nextline ;
res = read ( ast_consock , buf , sizeof ( buf ) - 1 ) ;
/* if the remote side disappears exit */
if ( res < 1 ) {
@ -2577,33 +2632,7 @@ static int ast_el_read_char(EditLine *editline, char *cp)
}
}
do {
state - > prev_line_full = state - > line_full ;
if ( ( nextline = strchr ( curline , ' \n ' ) ) ) {
state - > line_full = 1 ;
nextline + + ;
} else {
state - > line_full = 0 ;
nextline = strchr ( curline , ' \0 ' ) ;
}
if ( state - > prev_line_full & & VERBOSE_HASMAGIC ( curline ) ) {
level = VERBOSE_MAGIC2LEVEL ( curline ) ;
curline + + ;
} else if ( state - > prev_line_full & & ! VERBOSE_HASMAGIC ( curline ) ) {
/* Non-verbose output */
level = 0 ;
} else {
level = state - > prev_line_verbosity ;
}
if ( ( ! state - > prev_line_full & & state - > prev_line_verbosity < = option_verbose ) | | ( state - > prev_line_full & & level < = option_verbose ) ) {
if ( write ( STDOUT_FILENO , curline , nextline - curline ) < 0 ) {
}
}
state - > prev_line_verbosity = level ;
curline = nextline ;
} while ( ! ast_strlen_zero ( curline ) ) ;
console_log_verbose ( buf ) ;
if ( ( res < EL_BUF_SIZE - 1 ) & & ( ( buf [ res - 1 ] = = ' \n ' ) | | ( buf [ res - 2 ] = = ' \n ' ) ) ) {
* cp = CC_REFRESH ;
@ -3627,7 +3656,7 @@ static void env_init(void)
static void print_intro_message ( const char * runuser , const char * rungroup )
{
if ( ast_opt_console | | option_verbose | | ( ast_opt_remote & & ! ast_opt_exec ) ) {
if ( ast_opt_console | | option_verbose | | ( ast_opt_remote & & ! ast_opt_exec ) ) {
if ( ast_register_verbose ( console_verboser ) ) {
fprintf ( stderr , " Unable to register console verboser? \n " ) ;
return ;
@ -4121,8 +4150,8 @@ int main(int argc, char *argv[])
print_intro_message ( runuser , rungroup ) ;
if ( ast_opt_console & & ! option_verbose ) {
ast_verb ose ( " [ Initializing Custom Configuration Options ] \n " ) ;
if ( ast_opt_console ) {
ast_verb ( 0 , " [ Initializing Custom Configuration Options ] \n " ) ;
}
/* custom config setup */
register_config_cli ( ) ;