diff --git a/apps/app_dumpchan.c b/apps/app_dumpchan.c index 18dfb96d09..f1a66ffb08 100644 --- a/apps/app_dumpchan.c +++ b/apps/app_dumpchan.c @@ -183,17 +183,15 @@ static int dumpchan_exec(struct ast_channel *chan, const char *data) if (!ast_strlen_zero(data)) level = atoi(data); - if (option_verbose >= level) { - serialize_showchan(chan, info, sizeof(info)); - pbx_builtin_serialize_variables(chan, &vars); - ast_verbose("\n" - "Dumping Info For Channel: %s:\n" - "%s\n" - "Info:\n" - "%s\n" - "Variables:\n" - "%s%s\n", ast_channel_name(chan), line, info, ast_str_buffer(vars), line); - } + serialize_showchan(chan, info, sizeof(info)); + pbx_builtin_serialize_variables(chan, &vars); + ast_verb(level, "\n" + "Dumping Info For Channel: %s:\n" + "%s\n" + "Info:\n" + "%s\n" + "Variables:\n" + "%s%s\n", ast_channel_name(chan), line, info, ast_str_buffer(vars), line); return 0; } diff --git a/apps/app_verbose.c b/apps/app_verbose.c index b981fb9c86..394c489912 100644 --- a/apps/app_verbose.c +++ b/apps/app_verbose.c @@ -63,7 +63,7 @@ static char *app_log = "Log"; Level must be one of ERROR, WARNING, NOTICE, - DEBUG, VERBOSE or DTMF. + DEBUG, VERBOSE or DTMF. Output text message. @@ -100,24 +100,8 @@ static int verbose_exec(struct ast_channel *chan, const char *data) vsize = 0; ast_log(LOG_WARNING, "'%s' is not a verboser number\n", args.level); } - if (option_verbose >= vsize) { - switch (vsize) { - case 0: - ast_verb(0, "%s\n", args.msg); - break; - case 1: - ast_verb(1, "%s\n", args.msg); - break; - case 2: - ast_verb(2, "%s\n", args.msg); - break; - case 3: - ast_verb(3, "%s\n", args.msg); - break; - default: - ast_verb(4, "%s\n", args.msg); - } - } + + ast_verb(vsize, "%s\n", args.msg); return 0; } @@ -171,7 +155,7 @@ static int unload_module(void) res = ast_unregister_application(app_verbose); res |= ast_unregister_application(app_log); - return res; + return res; } static int load_module(void) diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 78c39849b2..85edd8e60a 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -11235,7 +11235,7 @@ static struct ast_custom_function misdn_cc_function = { static int unload_module(void) { /* First, take us out of the channel loop */ - ast_log(LOG_VERBOSE, "-- Unregistering mISDN Channel Driver --\n"); + ast_verb(0, "-- Unregistering mISDN Channel Driver --\n"); misdn_tasks_destroy(); diff --git a/main/asterisk.c b/main/asterisk.c index d425048f1b..7e5ddac581 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -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_verbose("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_verbose("[ Initializing Custom Configuration Options ]\n"); + if (ast_opt_console) { + ast_verb(0, "[ Initializing Custom Configuration Options ]\n"); } /* custom config setup */ register_config_cli(); diff --git a/main/logger.c b/main/logger.c index c374d2e574..06f8d45840 100644 --- a/main/logger.c +++ b/main/logger.c @@ -1552,7 +1552,11 @@ void ast_log(int level, const char *file, int line, const char *function, const callid = ast_read_threadstorage_callid(); va_start(ap, fmt); - ast_log_full(level, file, line, function, callid, fmt, ap); + if (level == __LOG_VERBOSE) { + __ast_verbose_ap(file, line, function, 0, callid, fmt, ap); + } else { + ast_log_full(level, file, line, function, callid, fmt, ap); + } va_end(ap); if (callid) { @@ -1826,4 +1830,3 @@ void ast_logger_unregister_level(const char *name) AST_RWLIST_UNLOCK(&logchannels); } } -