Asterisk Logger. More...
#include "asterisk.h"
#include <syslog.h>
#include "asterisk/_private.h"
#include "asterisk/paths.h"
#include "asterisk/logger.h"
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/config.h"
#include "asterisk/term.h"
#include "asterisk/cli.h"
#include "asterisk/utils.h"
#include "asterisk/manager.h"
#include "asterisk/threadstorage.h"
#include "asterisk/strings.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include <signal.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <execinfo.h>
Go to the source code of this file.
Data Structures | |
struct | logchannel |
struct | logchannels |
struct | logmsg |
struct | logmsgs |
struct | verb |
struct | verbosers |
Defines | |
#define | FORMATL "%-35.35s %-8.8s %-9.9s " |
#define | LOG_BUF_INIT_SIZE 256 |
#define | MAX_BACKTRACE_FRAMES 20 |
#define | VERBOSE_BUF_INIT_SIZE 256 |
Enumerations | |
enum | logmsgtypes { LOGMSG_NORMAL = 0, LOGMSG_VERBOSE } |
enum | logtypes { LOGTYPE_SYSLOG, LOGTYPE_FILE, LOGTYPE_CONSOLE } |
enum | rotatestrategy { SEQUENTIAL = 1 << 0, ROTATE = 1 << 1, TIMESTAMP = 1 << 2 } |
Functions | |
void | __ast_verbose (const char *file, int line, const char *func, const char *fmt,...) |
This works like ast_log, but prints verbose messages to the console depending on verbosity level set. ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing"); This will print the message to the console if the verbose level is set to a level >= 3 Note the abscence of a comma after the VERBOSE_PREFIX_3. This is important. VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined. | |
void | __ast_verbose_ap (const char *file, int line, const char *func, const char *fmt, va_list ap) |
static void | __init_log_buf (void) |
static void | __init_verbose_buf (void) |
static void | _handle_SIGXFSZ (int sig) |
void | ast_backtrace (void) |
struct ast_bt * | ast_bt_create (void) |
void * | ast_bt_destroy (struct ast_bt *bt) |
int | ast_bt_get_addresses (struct ast_bt *bt) |
char ** | ast_bt_get_symbols (void **addresses, size_t num_frames) |
void | ast_child_verbose (int level, const char *fmt,...) |
void | ast_log (int level, const char *file, int line, const char *function, const char *fmt,...) |
send log messages to syslog and/or the console | |
static void | ast_log_vsyslog (struct logmsg *msg) |
int | ast_logger_register_level (const char *name) |
Register a new logger level. | |
void | ast_logger_unregister_level (const char *name) |
Unregister a previously registered logger level. | |
void | ast_queue_log (const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...) |
int | ast_register_verbose (void(*v)(const char *string)) |
int | ast_unregister_verbose (void(*v)(const char *string)) |
void | ast_verbose (const char *fmt,...) |
void | close_logger (void) |
static char * | handle_logger_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_rotate (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_set_level (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_show_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
CLI command to show logging system configuration. | |
int | init_logger (void) |
static void | init_logger_chain (int locked) |
static void | logger_print_normal (struct logmsg *logmsg) |
Print a normal log message to the channels. | |
static void | logger_queue_init (void) |
static int | logger_queue_restart (int queue_rotate) |
static int | logger_queue_rt_start (void) |
int | logger_reload (void) |
Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload). | |
static void * | logger_thread (void *data) |
Actual logging thread. | |
static unsigned int | make_components (const char *s, int lineno) |
static struct logchannel * | make_logchannel (const char *channel, const char *components, int lineno) |
static int | reload_logger (int rotate) |
static int | rotate_file (const char *filename) |
static void | update_logchannels (void) |
Variables | |
static struct ast_cli_entry | cli_logger [] |
static int | close_logger_thread = 0 |
static const int | colors [NUMLOGLEVELS] |
Colors used in the console for logging. | |
static char | dateformat [256] = "%b %e %T" |
static char | exec_after_rotate [256] = "" |
static int | filesize_reload_needed |
static unsigned int | global_logmask = 0xFFFF |
static struct sigaction | handle_SIGXFSZ |
static char | hostname [MAXHOSTNAMELEN] |
static char * | levels [NUMLOGLEVELS] |
Logging channels used in the Asterisk logging system. | |
static struct ast_threadstorage | log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , } |
static ast_cond_t | logcond |
struct { | |
unsigned int queue_adaptive_realtime:1 | |
unsigned int queue_log:1 | |
unsigned int queue_log_to_file:1 | |
} | logfiles |
static int | logger_initialized |
static pthread_t | logthread = AST_PTHREADT_NULL |
static FILE * | qlog |
static char | queue_log_name [256] = QUEUELOG |
static int | queuelog_init |
static struct ast_threadstorage | verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } |
Asterisk Logger.
Logging routines
Definition in file logger.c.
#define FORMATL "%-35.35s %-8.8s %-9.9s " |
Referenced by handle_logger_show_channels().
#define VERBOSE_BUF_INIT_SIZE 256 |
Definition at line 207 of file logger.c.
Referenced by __ast_verbose_ap().
enum logmsgtypes |
Definition at line 122 of file logger.c.
00122 { 00123 LOGMSG_NORMAL = 0, 00124 LOGMSG_VERBOSE, 00125 };
enum logtypes |
Definition at line 93 of file logger.c.
00093 { 00094 LOGTYPE_SYSLOG, 00095 LOGTYPE_FILE, 00096 LOGTYPE_CONSOLE, 00097 };
enum rotatestrategy |
Definition at line 79 of file logger.c.
00079 { 00080 SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */ 00081 ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */ 00082 TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */ 00083 } rotatestrategy = SEQUENTIAL;
void __ast_verbose | ( | const char * | file, | |
int | line, | |||
const char * | func, | |||
const char * | fmt, | |||
... | ||||
) |
This works like ast_log, but prints verbose messages to the console depending on verbosity level set. ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing"); This will print the message to the console if the verbose level is set to a level >= 3 Note the abscence of a comma after the VERBOSE_PREFIX_3. This is important. VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined.
Send a verbose message (based on verbose level)
Definition at line 1556 of file logger.c.
References __ast_verbose_ap().
01557 { 01558 va_list ap; 01559 01560 va_start(ap, fmt); 01561 __ast_verbose_ap(file, line, func, fmt, ap); 01562 va_end(ap); 01563 }
void __ast_verbose_ap | ( | const char * | file, | |
int | line, | |||
const char * | func, | |||
const char * | fmt, | |||
va_list | ap | |||
) |
Definition at line 1520 of file logger.c.
References __LOG_VERBOSE, ast_alloca, AST_DYNSTR_BUILD_FAILED, ast_localtime(), ast_log(), ast_opt_timestamp, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_tvnow(), verbose_buf, and VERBOSE_BUF_INIT_SIZE.
Referenced by __ast_verbose(), and ast_verbose().
01521 { 01522 struct ast_str *buf = NULL; 01523 int res = 0; 01524 01525 if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) 01526 return; 01527 01528 if (ast_opt_timestamp) { 01529 struct timeval now; 01530 struct ast_tm tm; 01531 char date[40]; 01532 char *datefmt; 01533 01534 now = ast_tvnow(); 01535 ast_localtime(&now, &tm, NULL); 01536 ast_strftime(date, sizeof(date), dateformat, &tm); 01537 datefmt = ast_alloca(strlen(date) + 3 + strlen(fmt) + 1); 01538 sprintf(datefmt, "%c[%s] %s", 127, date, fmt); 01539 fmt = datefmt; 01540 } else { 01541 char *tmp = ast_alloca(strlen(fmt) + 2); 01542 sprintf(tmp, "%c%s", 127, fmt); 01543 fmt = tmp; 01544 } 01545 01546 /* Build string */ 01547 res = ast_str_set_va(&buf, 0, fmt, ap); 01548 01549 /* If the build failed then we can drop this allocated message */ 01550 if (res == AST_DYNSTR_BUILD_FAILED) 01551 return; 01552 01553 ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf)); 01554 }
static void _handle_SIGXFSZ | ( | int | sig | ) | [static] |
Definition at line 941 of file logger.c.
00942 { 00943 /* Indicate need to reload */ 00944 filesize_reload_needed = 1; 00945 }
void ast_backtrace | ( | void | ) |
Definition at line 1492 of file logger.c.
References ast_bt::addresses, ast_bt_create(), ast_bt_destroy(), ast_bt_get_symbols(), ast_debug, ast_log(), ast_std_free(), LOG_DEBUG, LOG_WARNING, and ast_bt::num_frames.
01493 { 01494 #ifdef HAVE_BKTR 01495 struct ast_bt *bt; 01496 int i = 0; 01497 char **strings; 01498 01499 if (!(bt = ast_bt_create())) { 01500 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n"); 01501 return; 01502 } 01503 01504 if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) { 01505 ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' '); 01506 for (i = 3; i < bt->num_frames - 2; i++) { 01507 ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]); 01508 } 01509 01510 ast_std_free(strings); 01511 } else { 01512 ast_debug(1, "Could not allocate memory for backtrace\n"); 01513 } 01514 ast_bt_destroy(bt); 01515 #else 01516 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n"); 01517 #endif /* defined(HAVE_BKTR) */ 01518 }
struct ast_bt* ast_bt_create | ( | void | ) | [read] |
Definition at line 1304 of file logger.c.
References ast_bt::alloced, ast_bt_get_addresses(), ast_calloc, ast_log(), and LOG_ERROR.
Referenced by ast_backtrace().
01305 { 01306 struct ast_bt *bt = ast_calloc(1, sizeof(*bt)); 01307 if (!bt) { 01308 ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n"); 01309 return NULL; 01310 } 01311 01312 bt->alloced = 1; 01313 01314 ast_bt_get_addresses(bt); 01315 01316 return bt; 01317 }
void* ast_bt_destroy | ( | struct ast_bt * | bt | ) |
Definition at line 1326 of file logger.c.
References ast_bt::alloced, and ast_free.
Referenced by ast_backtrace().
int ast_bt_get_addresses | ( | struct ast_bt * | bt | ) |
Definition at line 1319 of file logger.c.
References ast_bt::addresses, AST_MAX_BT_FRAMES, and ast_bt::num_frames.
Referenced by __ast_pthread_mutex_lock(), __ast_pthread_mutex_trylock(), __ast_rwlock_rdlock(), __ast_rwlock_timedrdlock(), __ast_rwlock_timedwrlock(), __ast_rwlock_tryrdlock(), __ast_rwlock_trywrlock(), __ast_rwlock_wrlock(), and ast_bt_create().
01320 { 01321 bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES); 01322 01323 return 0; 01324 }
char** ast_bt_get_symbols | ( | void ** | addresses, | |
size_t | num_frames | |||
) |
Definition at line 1335 of file logger.c.
References ast_calloc, ast_free, ast_log(), ast_malloc, ast_std_calloc(), ast_std_free(), ast_std_realloc(), ast_strlen_zero(), ast_utils_which(), LOG_DEBUG, and S_OR.
Referenced by ao2_bt(), and ast_backtrace().
01336 { 01337 char **strings; 01338 #if defined(BETTER_BACKTRACES) 01339 int stackfr; 01340 bfd *bfdobj; /* bfd.h */ 01341 Dl_info dli; /* dlfcn.h */ 01342 long allocsize; 01343 asymbol **syms = NULL; /* bfd.h */ 01344 bfd_vma offset; /* bfd.h */ 01345 const char *lastslash; 01346 asection *section; 01347 const char *file, *func; 01348 unsigned int line; 01349 char address_str[128]; 01350 char msg[1024]; 01351 size_t strings_size; 01352 size_t *eachlen; 01353 #endif 01354 01355 #if defined(BETTER_BACKTRACES) 01356 strings_size = num_frames * sizeof(*strings); 01357 01358 eachlen = ast_calloc(num_frames, sizeof(*eachlen)); 01359 strings = ast_std_calloc(num_frames, sizeof(*strings)); 01360 if (!eachlen || !strings) { 01361 ast_free(eachlen); 01362 ast_std_free(strings); 01363 return NULL; 01364 } 01365 01366 for (stackfr = 0; stackfr < num_frames; stackfr++) { 01367 int found = 0, symbolcount; 01368 01369 msg[0] = '\0'; 01370 01371 if (!dladdr(addresses[stackfr], &dli)) { 01372 continue; 01373 } 01374 01375 if (strcmp(dli.dli_fname, "asterisk") == 0) { 01376 char asteriskpath[256]; 01377 01378 if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) { 01379 /* This will fail to find symbols */ 01380 ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n"); 01381 dli.dli_fname = "asterisk"; 01382 } 01383 } 01384 01385 lastslash = strrchr(dli.dli_fname, '/'); 01386 if ((bfdobj = bfd_openr(dli.dli_fname, NULL)) && 01387 bfd_check_format(bfdobj, bfd_object) && 01388 (allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 && 01389 (syms = ast_malloc(allocsize)) && 01390 (symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) { 01391 01392 if (bfdobj->flags & DYNAMIC) { 01393 offset = addresses[stackfr] - dli.dli_fbase; 01394 } else { 01395 offset = addresses[stackfr] - (void *) 0; 01396 } 01397 01398 for (section = bfdobj->sections; section; section = section->next) { 01399 if (!bfd_get_section_flags(bfdobj, section) & SEC_ALLOC || 01400 section->vma > offset || 01401 section->size + section->vma < offset) { 01402 continue; 01403 } 01404 01405 if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) { 01406 continue; 01407 } 01408 01409 /* file can possibly be null even with a success result from bfd_find_nearest_line */ 01410 file = file ? file : ""; 01411 01412 /* Stack trace output */ 01413 found++; 01414 if ((lastslash = strrchr(file, '/'))) { 01415 const char *prevslash; 01416 01417 for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--) { 01418 } 01419 if (prevslash >= file) { 01420 lastslash = prevslash; 01421 } 01422 } 01423 if (dli.dli_saddr == NULL) { 01424 address_str[0] = '\0'; 01425 } else { 01426 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01427 dli.dli_saddr, 01428 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01429 } 01430 snprintf(msg, sizeof(msg), "%s:%u %s()%s", 01431 lastslash ? lastslash + 1 : file, line, 01432 S_OR(func, "???"), 01433 address_str); 01434 01435 break; /* out of section iteration */ 01436 } 01437 } 01438 if (bfdobj) { 01439 bfd_close(bfdobj); 01440 ast_free(syms); 01441 } 01442 01443 /* Default output, if we cannot find the information within BFD */ 01444 if (!found) { 01445 if (dli.dli_saddr == NULL) { 01446 address_str[0] = '\0'; 01447 } else { 01448 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01449 dli.dli_saddr, 01450 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01451 } 01452 snprintf(msg, sizeof(msg), "%s %s()%s", 01453 lastslash ? lastslash + 1 : dli.dli_fname, 01454 S_OR(dli.dli_sname, "<unknown>"), 01455 address_str); 01456 } 01457 01458 if (!ast_strlen_zero(msg)) { 01459 char **tmp; 01460 01461 eachlen[stackfr] = strlen(msg) + 1; 01462 if (!(tmp = ast_std_realloc(strings, strings_size + eachlen[stackfr]))) { 01463 ast_std_free(strings); 01464 strings = NULL; 01465 break; /* out of stack frame iteration */ 01466 } 01467 strings = tmp; 01468 strings[stackfr] = (char *) strings + strings_size; 01469 strcpy(strings[stackfr], msg);/* Safe since we just allocated the room. */ 01470 strings_size += eachlen[stackfr]; 01471 } 01472 } 01473 01474 if (strings) { 01475 /* Recalculate the offset pointers because of the reallocs. */ 01476 strings[0] = (char *) strings + num_frames * sizeof(*strings); 01477 for (stackfr = 1; stackfr < num_frames; stackfr++) { 01478 strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1]; 01479 } 01480 } 01481 ast_free(eachlen); 01482 01483 #else /* !defined(BETTER_BACKTRACES) */ 01484 01485 strings = backtrace_symbols(addresses, num_frames); 01486 #endif /* defined(BETTER_BACKTRACES) */ 01487 return strings; 01488 }
void ast_child_verbose | ( | int | level, | |
const char * | fmt, | |||
... | ||||
) |
Definition at line 430 of file logger.c.
References ast_free, ast_malloc, and option_verbose.
Referenced by launch_script().
00431 { 00432 char *msg = NULL, *emsg = NULL, *sptr, *eptr; 00433 va_list ap, aq; 00434 int size; 00435 00436 /* Don't bother, if the level isn't that high */ 00437 if (option_verbose < level) { 00438 return; 00439 } 00440 00441 va_start(ap, fmt); 00442 va_copy(aq, ap); 00443 if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) { 00444 va_end(ap); 00445 va_end(aq); 00446 return; 00447 } 00448 va_end(ap); 00449 00450 if (!(msg = ast_malloc(size + 1))) { 00451 va_end(aq); 00452 return; 00453 } 00454 00455 vsnprintf(msg, size + 1, fmt, aq); 00456 va_end(aq); 00457 00458 if (!(emsg = ast_malloc(size * 2 + 1))) { 00459 ast_free(msg); 00460 return; 00461 } 00462 00463 for (sptr = msg, eptr = emsg; ; sptr++) { 00464 if (*sptr == '"') { 00465 *eptr++ = '\\'; 00466 } 00467 *eptr++ = *sptr; 00468 if (*sptr == '\0') { 00469 break; 00470 } 00471 } 00472 ast_free(msg); 00473 00474 fprintf(stdout, "verbose \"%s\" %d\n", emsg, level); 00475 fflush(stdout); 00476 ast_free(emsg); 00477 }
void ast_log | ( | int | level, | |
const char * | file, | |||
int | line, | |||
const char * | function, | |||
const char * | fmt, | |||
... | ||||
) |
send log messages to syslog and/or the console
Used for sending a log message This is the standard logger function. Probably the only way you will invoke it would be something like this: ast_log(AST_LOG_WHATEVER, "Problem with the %s Captain. We should get some more. Will %d be enough?\n", "flux capacitor", 10); where WHATEVER is one of ERROR, DEBUG, EVENT, NOTICE, or WARNING depending on which log you wish to output to. These are implemented as macros, that will provide the function with the needed arguments.
Definition at line 1207 of file logger.c.
References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc_with_stringfields, ast_cond_signal, AST_DYNSTR_BUILD_FAILED, ast_free, ast_get_tid(), AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), AST_PTHREADT_NULL, AST_RWLIST_EMPTY, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_string_field_set, ast_tvnow(), close_logger_thread, logmsg::level, levels, logmsg::line, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, LOGMSG_VERBOSE, logthread, option_debug, option_verbose, logmsg::process_id, term_filter_escapes(), and logmsg::type.
Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __analog_handle_event(), __analog_ss_thread(), __ast_answer(), __ast_bridge_technology_register(), __ast_channel_alloc_ap(), __ast_channel_masquerade(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_data_register(), __ast_data_unregister(), __ast_dsp_call_progress(), __ast_format_register(), __ast_http_load(), __ast_mm_init_phase_2(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_register_translator(), __ast_request_and_dial(), __ast_smoother_feed(), __ast_string_field_init(), __ast_udptl_reload(), __ast_verbose_ap(), __attempt_transmit(), __auto_congest(), __dahdi_exception(), __find_callno(), __iax2_poke_noanswer(), __init_manager(), __mgcp_xmit(), __oh323_destroy(), __oh323_new(), __oh323_rtp_create(), __oh323_update_info(), __set_address_from_contact(), __sip_autodestruct(), __sip_pretend_ack(), __sip_reliable_xmit(), __sip_xmit(), __ssl_setup(), __transmit_response(), __unload_module(), _analog_get_index(), _ast_odbc_request_obj2(), _ast_sockaddr_from_sin(), _ast_sockaddr_port(), _ast_sockaddr_set_port(), _ast_sockaddr_to_sin(), _dahdi_get_index(), _dsp_init(), _enum_array_map(), _extension_match_core(), _get_mohbyname(), _lookup_timer(), _macro_exec(), _moh_register(), _sip_show_peers(), _sip_tcp_helper_thread(), _while_exec(), accept_thread(), access_counter_file(), acf_cc_read(), acf_cc_write(), acf_channel_read(), acf_curl_helper(), acf_curlopt_helper(), acf_curlopt_write(), acf_cut_exec(), acf_cut_exec2(), acf_faxopt_read(), acf_faxopt_write(), acf_fetch(), acf_iaxvar_read(), acf_iaxvar_write(), acf_if(), acf_isexten_exec(), acf_jabberreceive_read(), acf_jabberstatus_read(), acf_mailbox_exists(), acf_meetme_info(), acf_odbc_read(), acf_odbc_write(), acf_sort_exec(), acf_sprintf(), acf_strftime(), acf_strptime(), acf_transaction_write(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_hangup(), actual_load_config(), add_agent(), add_agi_cmd(), add_calltoken_ignore(), add_cc_call_info_to_response(), add_cfg_entry(), add_codec_to_answer(), add_content(), add_email_attachment(), add_event_to_list(), add_exten_to_pattern_tree(), add_extensions(), add_features_datastore(), add_header(), add_ie(), add_in_calls(), add_line(), add_out_calls(), add_priority(), add_publish_event(), add_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_subscribe_event(), add_to_agi(), add_user_extension(), admin_exec(), adsi_begin(), adsi_careful_send(), adsi_get_cpeid(), adsi_get_cpeinfo(), adsi_load_session(), adsi_process(), adsi_prog(), adsi_transmit_message_full(), advanced_options(), ael2_print(), aes_helper(), agent_answer(), agent_call(), agent_fixup(), agent_get_base_channel(), agent_new(), agent_read(), agentmonitoroutgoing_exec(), agi_exec_full(), aji_act_hook(), aji_client_connect(), aji_client_info_handler(), aji_create_buddy(), aji_create_client(), aji_delete_node_list(), aji_devstate_cb(), aji_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_message(), aji_handle_presence(), aji_handle_pubsub_error(), aji_handle_pubsub_event(), aji_handle_subscribe(), aji_initialize(), aji_join_exec(), aji_leave_exec(), aji_load_config(), aji_mwi_cb(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), aji_send_raw_chat(), aji_sendgroup_exec(), aji_set_group_presence(), aji_set_presence(), aji_start_sasl(), aji_status_exec(), alarmreceiver_exec(), alloc_expr_node(), alloc_resampler(), alloc_sub(), alsa_card_init(), alsa_indicate(), alsa_new(), alsa_read(), alsa_request(), alsa_write(), analog_answer(), analog_attempt_transfer(), analog_call(), analog_exception(), analog_handle_init_event(), analog_hangup(), analog_request(), analog_ss_thread(), analogsub_to_dahdisub(), announce_thread(), answer_call(), anti_injection(), aoc_append_ie(), aoc_parse_ie(), app_exec(), append_ie(), append_mailbox(), apply_general_options(), apply_option(), apply_options_full(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_adsi_install_funcs(), ast_agi_register(), ast_agi_send(), ast_agi_unregister(), ast_ais_clm_load_module(), ast_ais_clm_unload_module(), ast_ais_evt_load_module(), ast_ais_evt_unload_module(), ast_aji_create_chat(), ast_aji_invite_chat(), ast_alaw_init(), ast_aoc_create(), ast_aoc_decode(), ast_aoc_encode(), ast_app_dtget(), ast_app_exec_macro(), ast_app_exec_sub(), ast_app_expand_sub_args(), ast_app_group_match_get_count(), ast_append_ha(), ast_apply_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_end_dtmf(), ast_bridge_timelimit(), ast_bt_create(), ast_bt_get_symbols(), ast_calendar_register(), ast_call_forward(), ast_careful_fwrite(), ast_carefulwrite(), ast_cc_get_param(), ast_cc_set_param(), ast_cdr_alloc(), ast_cdr_end(), ast_cdr_engine_init(), ast_cdr_merge(), ast_cdr_register(), ast_cdr_serialize_variables(), ast_cdr_setvar(), ast_cdr_submit_batch(), ast_cel_check_retire_linkedid(), ast_cel_fill_record(), ast_cel_get_ama_flag_name(), ast_cel_linkedid_ref(), ast_channel_audiohook_count_by_source(), ast_channel_audiohook_count_by_source_running(), ast_channel_bridge(), ast_channel_destructor(), ast_channel_log(), ast_channel_make_compatible_helper(), ast_channel_queryoption(), ast_channel_register(), ast_channel_setoption(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_check_signature(), ast_check_signature_bin(), ast_check_timing2(), ast_cli_perms_init(), ast_codec_get_len(), ast_codec_get_samples(), ast_codec_pref_getsize(), ast_config_engine_register(), ast_config_internal_load(), ast_config_text_file_save(), ast_connected_line_build_data(), ast_connected_line_parse_data(), ast_context_find_or_create(), ast_context_remove_extension_callerid2(), ast_context_verify_includes(), ast_data_get(), ast_data_retrieve(), ast_db_gettree(), ast_db_put(), ast_decrypt_bin(), ast_device_state_engine_init(), ast_do_masquerade(), ast_do_pickup(), ast_dsp_busydetect(), ast_dsp_call_progress(), ast_dsp_noise(), ast_dsp_process(), ast_dsp_silence(), ast_dtmf_stream(), ast_enable_distributed_devstate(), ast_enable_packet_fragmentation(), ast_encrypt_bin(), ast_event_cb(), ast_event_check_subscriber(), ast_event_get_cached(), ast_event_get_ie_pltype(), ast_event_get_ie_type_name(), ast_event_get_type_name(), ast_event_new(), ast_event_queue(), ast_event_queue_and_cache(), ast_event_subscribe_new(), ast_extension_close(), ast_fax_log(), ast_fax_state_to_str(), ast_filehelper(), ast_find_ourip(), ast_format_str_reduce(), ast_format_unregister(), ast_framehook_attach(), ast_func_read(), ast_func_read2(), ast_func_write(), ast_get_encoded_char(), ast_get_enum(), ast_get_group(), ast_handle_cc_control_frame(), ast_hangup(), ast_heap_create(), ast_http_get_post_vars(), ast_http_send(), ast_iax2_new(), ast_include_new(), ast_indicate_data(), ast_io_remove(), ast_ivr_menu_run_internal(), ast_jb_put(), ast_linear_stream(), ast_lock_path_flock(), ast_lock_path_lockfile(), ast_logger_register_level(), ast_makesocket(), ast_manager_register_struct(), ast_module_reload(), ast_moh_files_next(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), ast_netsock_bindaddr(), ast_netsock_set_qos(), ast_odbc_direct_execute(), ast_odbc_find_table(), ast_odbc_prepare_and_execute(), ast_odbc_sanity_check(), ast_odbc_smart_execute(), ast_openstream_full(), ast_openvstream(), ast_ouraddrfor(), ast_parse_allow_disallow(), ast_parse_digest(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_run_app(), ast_pbx_run_args(), ast_pbx_start(), ast_pickup_call(), ast_pktccops_gate_alloc(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_queue_cc_frame(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), ast_redirecting_build_data(), ast_redirecting_parse_data(), ast_register_application2(), ast_register_feature(), ast_register_switch(), ast_remotecontrol(), ast_request(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_engine_register2(), ast_rtp_glue_register2(), ast_rtp_instance_bridge(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), ast_rtp_instance_make_compatible(), ast_rtp_instance_new(), ast_rtp_new(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_write(), ast_safe_fork(), ast_safe_system(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_es(), ast_say_date_with_format_fr(), ast_say_date_with_format_gr(), ast_say_date_with_format_he(), ast_say_date_with_format_it(), ast_say_date_with_format_nl(), ast_say_date_with_format_pl(), ast_say_date_with_format_pt(), ast_say_date_with_format_th(), ast_say_date_with_format_vi(), ast_say_date_with_format_zh(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_se(), ast_say_number_full_ur(), ast_say_number_full_zh(), ast_sched_del(), ast_sched_runq(), ast_sched_thread_create(), ast_search_dns(), ast_security_event_report(), ast_set_cc_offer_timer(), ast_set_cc_recall_timer(), ast_set_ccbs_available_timer(), ast_set_ccnr_available_timer(), ast_set_owners_and_peers(), ast_set_priority(), ast_set_qos(), ast_sign_bin(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_sockaddr_hash(), ast_sockaddr_parse(), ast_sockaddr_resolve(), ast_sockaddr_split_hostport(), ast_sockaddr_stringify_fmt(), ast_speech_register(), ast_srtp_add_stream(), ast_srtp_change_source(), ast_srtp_policy_alloc(), ast_srtp_protect(), ast_srtp_unprotect(), ast_stopstream(), ast_str_substitute_variables_full(), ast_streamfile(), ast_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_close_session_file(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_thread_inhibit_escalations(), ast_tls_read_conf(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_udptl_bridge(), ast_udptl_new_with_bindaddr(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), astobj2_init(), async_wait(), asyncgoto_exec(), attempt_thread(), attempt_transfer(), au_seek(), au_trunc(), audiohook_read_frame_both(), auth_credentials(), auth_exec(), auth_http_callback(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), background_detect_exec(), balance_stack(), base64_helper(), base_encode(), blacklist_read(), blr_ebl(), blr_txt(), bridge_array_add(), bridge_call_thread(), bridge_call_thread_launch(), bridge_exec(), bridge_make_compatible(), bridge_p2p_rtp_write(), build_alias(), build_calendar(), build_callno_limits(), build_cc_interfaces_chanvar(), build_channels(), build_conf(), build_device(), build_event_channel(), build_gateway(), build_mapping(), build_parkinglot(), build_peer(), build_route(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), bump_gains(), cache_get_callno_locked(), calc_cost(), calc_metric(), calculate_far_max_ifp(), calculate_local_max_datagram(), caldav_add_event(), caldav_get_events_between(), caldav_load_calendar(), caldav_request(), caldav_write_event(), calendar_busy_exec(), calendar_devstate_change(), calendar_event_notify(), calendar_event_read(), calendar_join_attendees(), calendar_query_exec(), calendar_query_result_exec(), calendar_write_exec(), callerid_feed(), callerid_feed_jp(), callerid_get_dtmf(), callerid_read(), callerid_write(), callerpres_read(), callerpres_write(), can_ring_entry(), canary_thread(), canmatch(), careful_write(), cb_events(), cc_available(), cc_caller_requested(), cc_handle_publish_error(), cccancel_exec(), cdata(), cdr_handler(), cdr_merge_vars(), chan_misdn_log(), chan_ringing(), chanavail_exec(), channel_admin_exec(), channel_spy(), channel_to_session(), chanspy_exec(), check_abstract_reference(), check_access(), check_app_args(), check_auth(), check_break(), check_compat(), check_context_names(), check_continue(), check_day(), check_dow(), check_event_type(), check_expr2_input(), check_for_conference(), check_goto(), check_header(), check_header_fmt(), check_includes(), check_key(), check_label(), check_macro_returns(), check_month(), check_password(), check_post(), check_pval_item(), check_rtp_timeout(), check_srcaddr(), check_switch_expr(), check_timerange(), check_user_full(), check_vars(), check_via(), cleanup_connection(), clear_caller(), clear_dialed_interfaces(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), cli_fax_show_session(), cli_fax_show_sessions(), close_call(), close_client(), close_lib(), close_mailbox(), close_mansession_file(), commit_exec(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), confbridge_exec(), config_curl(), config_device(), config_function_read(), config_handler(), config_ldap(), config_line(), config_load(), config_module(), config_odbc(), config_parse_variables(), config_pgsql(), config_text_file_load(), connectedline_read(), connectedline_write(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), cops_connect(), cops_gate_cmd(), cops_sendmsg(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), count_lines(), create_addr(), create_dirpath(), create_dynamic_parkinglot(), create_jb(), create_match_char_tree(), create_new_socket(), create_queue_member(), create_video_frame(), create_vmaccount(), crement_function_read(), crypto_load(), csv_log(), csv_quote(), custom_log(), custom_prepare(), cut_internal(), dahdi_answer(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_func_write(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_open(), dahdi_read(), dahdi_request(), dahdi_restart(), dahdi_ring_phone(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_show_channel(), dahdi_status_data_provider_get(), dahdi_test_timer(), dahdi_timer_set_rate(), dahdi_train_ec(), dahdi_translate(), dahdi_version_data_provider_get(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dahdiscan_exec(), data_channels_provider_handler(), data_result_generate(), data_result_generate_node(), data_search_generate(), data_structure_compatible(), db_get_common(), dbinit(), deadagi_exec(), dec_init(), del_exec(), delete_old_messages(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_pval_item(), destroy_session(), destroy_trans(), determine_starting_point(), device2chan(), device_state_cb(), devstate_cache_cb(), devstate_change_collector_cb(), devstate_write(), dial_exec_full(), dial_handle_playtones(), dialgroup_read(), dialgroup_write(), dialog_ref_debug(), dictate_exec(), digitcollect(), digitdirect(), directory_exec(), disa_exec(), disable_jack_hook(), disable_t38(), dispatch_thread_handler(), display_last_error(), display_nat_warning(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_forward(), do_magic_pickup(), do_message(), do_monitor(), do_notify(), do_pktccops(), do_register(), do_reload(), do_say(), do_waiting(), dump_queue(), dump_queue_members(), dundi_answer_entity(), dundi_answer_query(), dundi_discover(), dundi_encrypt(), dundi_error_output(), dundi_exec(), dundi_helper(), dundi_lookup_internal(), dundi_precache_full(), dundi_precache_internal(), dundi_prop_precache(), dundi_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), duplicate_pseudo(), eagi_exec(), ebl_callback(), enable_jack_hook(), encode_open_type(), endelm(), enum_callback(), enum_query_read(), enum_result_read(), event_channel_destroy(), evt_event_deliver_cb(), ewscal_load_calendar(), exchangecal_get_events_between(), exchangecal_load_calendar(), exchangecal_request(), exchangecal_write_event(), exec(), exec_exec(), execif_exec(), exists(), expand_gosub_args(), ext_cmp_pattern_pos(), extension_matches(), extenspy_exec(), external_rtp_create(), extstate_read(), fax_generator_generate(), fax_rate_str_to_int(), fax_session_new(), fax_session_reserve(), fbuf_append(), feature_exec_app(), feature_request_and_dial(), festival_exec(), fetch_icalendar(), ffmpeg_decode(), ffmpeg_encode(), file2format(), file_read(), file_write(), filename_parse(), filestream_close(), filter(), finalize_content(), find_account(), find_cache(), find_call_locked(), find_conf(), find_conf_realtime(), find_desc(), find_details(), find_engine(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), find_or_create_details(), find_pval_goto_item(), find_queue_by_name_rt(), find_sdp(), find_speeddial_by_instance(), find_subchannel_and_lock(), find_subchannel_by_instance_reference(), find_subchannel_by_name(), find_subchannel_by_reference(), find_table(), find_transaction(), find_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), fn_wrapper(), forkcdr_exec(), forward_message(), frame_trace_helper(), framein(), func_args(), func_channel_read(), func_channel_write(), func_channel_write_real(), func_channels_read(), func_check_sipdomain(), func_header_read(), func_inheritance_write(), func_mchan_read(), func_mchan_write(), func_mute_write(), function_agent(), function_db_delete(), function_db_exists(), function_db_read(), function_db_write(), function_enum(), function_eval(), function_eval2(), function_fieldnum_helper(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g719read(), g719seek(), g719trunc(), g719write(), g723_len(), g723_read(), g723_trunc(), g723_write(), g726_read(), g726_write(), g729_read(), g729_trunc(), g729_write(), generic_execute(), generic_fax_exec(), generic_http_callback(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_calleridname(), get_canmatch_exten(), get_comma(), get_crypto_attrib(), get_destination(), get_domain(), get_ewscal_ids_for(), get_in_brackets_const(), get_in_brackets_full(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_member_penalty(), get_name_and_number(), get_params(), get_pattern_node(), get_range(), get_rdnis(), get_refer_info(), get_timerange(), get_to_address(), get_token(), get_unused_callno(), getdisplaybyname(), getflagbyname(), getkeybyname(), getstatebyname(), getsubbyname(), gosub_exec(), gosub_run(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_function_read(), group_function_write(), gsm_read(), gsm_seek(), gsm_tell(), gsm_trunc(), gsm_write(), gsmtolin_framein(), gtalk_alloc(), gtalk_call(), gtalk_create_candidates(), gtalk_create_member(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_invite(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_ringing_ack(), gtalk_sendhtml(), gtalk_sendtext(), gtalk_show_channels(), gtalk_update_externip(), gtalk_update_stun(), gtalk_write(), h261_decap(), h263_decap(), h263_encap(), h263_open(), h263_read(), h263_trunc(), h263_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), h264_trunc(), h264_write(), handle_alarms(), handle_call_token(), handle_callforward_button(), handle_capabilities_res_message(), handle_cc_subscribe(), handle_clear_alarms(), handle_cli_h323_cycle_gk(), handle_cli_indication_add(), handle_cli_indication_remove(), handle_command_response(), handle_common_options(), handle_devstate_change(), handle_enbloc_call_message(), handle_error(), handle_exec(), handle_getoption(), handle_gosub(), handle_hd_hf(), handle_incoming(), handle_init_event(), handle_input(), handle_invite_replaces(), handle_jack_audio(), handle_keypad_button_message(), handle_message(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_playtones(), handle_recordfile(), handle_register_message(), handle_request(), handle_request_bye(), handle_request_info(), handle_request_invite(), handle_request_invite_st(), handle_request_notify(), handle_request_options(), handle_request_publish(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_info(), handle_response_invite(), handle_response_message(), handle_response_notify(), handle_response_peerpoke(), handle_response_publish(), handle_response_refer(), handle_response_register(), handle_response_subscribe(), handle_response_update(), handle_soft_key_event_message(), handle_stimulus_message(), handle_t38_options(), handle_tcptls_connection(), handle_transfer_button(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hash_read(), hashkeys_read(), hashkeys_read2(), hint_read(), http_post_callback(), httpd_helper_thread(), iax2_ack_registry(), iax2_bridge(), iax2_call(), iax2_canmatch(), iax2_devicestate(), iax2_do_register(), iax2_dup_variable_datastore(), iax2_exec(), iax2_exists(), iax2_fixup(), iax2_hangup(), iax2_matchmore(), iax2_poke_peer(), iax2_prov_app(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_provision_version(), iax_template_parse(), ical_load_calendar(), icalendar_add_event(), icalendar_update_events(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), ilbc_trunc(), ilbc_write(), ilbctolin_framein(), import_ch(), in_band_indication(), increase_call_count(), init_acf_query(), init_app_class(), init_jack_data(), init_req(), init_resp(), init_timing_thread(), initialize_cc_max_requests(), initialize_udptl(), inotify_daemon(), inprocess_count(), insert_penaltychange(), inspect_module(), internal_ao2_ref(), INTERNAL_OBJ(), invent_message(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jack_hook_callback(), jack_hook_write(), jb_error_output(), jb_get_and_deliver(), jb_warning_output(), jingle_alloc(), jingle_call(), jingle_create_candidates(), jingle_create_member(), jingle_digit(), jingle_free_pvt(), jingle_handle_dtmf(), jingle_hangup_farend(), jingle_indicate(), jingle_is_answered(), jingle_load_config(), jingle_new(), jingle_newcall(), jingle_parser(), jingle_request(), jingle_sendhtml(), jingle_sendtext(), jingle_show_channels(), jingle_write(), join_conference_bridge(), join_queue(), jpeg_read_image(), jpeg_write_image(), key_call(), Keyfavorite(), kqueue_timer_open(), launch_asyncagi(), launch_ha_netscript(), launch_monitor_thread(), launch_netscript(), launch_script(), launch_service(), ldap_loadentry(), ldap_reconnect(), leave_voicemail(), linear_alloc(), linear_generator(), linear_release(), lintogsm_framein(), lintolpc10_framein(), lintoulaw(), listener(), listfilter(), load_column_config(), load_config(), load_config_meetme(), load_dynamic_module(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_pktccops_config(), load_resource(), load_resource_list(), load_tech_calendars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_cleanup(), local_ast_moh_start(), local_call(), local_devicestate(), local_fixup(), local_new(), local_read(), local_setoption(), local_write(), log_exec(), log_jack_status(), logger_queue_init(), logger_queue_restart(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manage_parked_call(), manage_parkinglot(), manager_log(), manager_modulecheck(), manager_show_dialplan_helper(), manager_sipnotify(), map_video_codec(), masq_park_call(), matchmore(), math(), md5(), measurenoise(), meetme_menu_admin_extended(), meetmemute(), memcpy_decrypt(), memcpy_encrypt(), message_template_build(), message_template_parse_emailbody(), message_template_parse_filebody(), mgcp_call(), mgcp_fixup(), mgcp_indicate(), mgcp_new(), mgcp_reload(), mgcp_request(), mgcp_rtp_read(), mgcp_senddigit_begin(), mgcp_senddigit_end(), mgcp_ss(), mgcp_write(), mgcpsock_read(), milliwatt_generate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_delete_exec(), minivm_greet_exec(), minivm_mwi_exec(), minivm_notify_exec(), minivm_record_exec(), misdn_answer(), misdn_bridge(), misdn_call(), misdn_cfg_get(), misdn_cfg_get_config_string(), misdn_cfg_init(), misdn_cfg_is_msn_valid(), misdn_cfg_update_ptp(), misdn_check_l2l1(), misdn_digit_end(), misdn_facility_exec(), misdn_hangup(), misdn_indication(), misdn_new(), misdn_request(), misdn_send_text(), misdn_set_opt_exec(), misdn_write(), mixmonitor_exec(), mixmonitor_thread(), mkif(), mkintf(), moh_alloc(), moh_class_destructor(), moh_files_alloc(), moh_files_generator(), moh_files_release(), moh_generate(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), mssql_connect(), multicast_rtp_write(), multicast_send_control_packet(), multiplexed_bridge_create(), multiplexed_nudge(), multiplexed_thread_function(), mute_add_audiohook(), mute_fragment(), mwi_send_init(), mwi_send_process_buffer(), mwi_send_process_event(), mwi_sub_event_cb(), mwi_thread(), mwi_unsub_event_cb(), my_all_subchannels_hungup(), my_callwait(), my_dial_digits(), my_distinctive_ring(), my_dsp_set_digitmode(), my_get_callerid(), my_handle_dtmf(), my_handle_notify_message(), my_is_dialing(), my_is_off_hook(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), my_start_cid_detect(), my_wink(), nbs_alloc(), nbs_call(), nbs_hangup(), nbs_new(), nbs_request(), nbs_xwrite(), NBScat_exec(), NBScatplay(), netconsole(), new_find_extension(), notify_new_message(), odbc_load_module(), odbc_log(), odbc_obj_connect(), odbc_obj_disconnect(), odbc_register_class(), odbc_release_obj2(), ogg_vorbis_open(), ogg_vorbis_read(), ogg_vorbis_rewrite(), ogg_vorbis_seek(), ogg_vorbis_trunc(), ogg_vorbis_write(), oh323_alloc(), oh323_call(), oh323_digit_begin(), oh323_digit_end(), oh323_fixup(), oh323_hangup(), oh323_indicate(), oh323_read(), oh323_request(), oh323_rtp_read(), oh323_set_rtp_peer(), oh323_write(), old_milliwatt_exec(), onevent(), op_colon(), op_div(), op_eq(), op_eqtilde(), op_func(), op_minus(), op_negate(), op_plus(), op_rem(), op_times(), open_mailbox(), open_stream(), OpenHistory(), originate_exec(), osp_auth(), osp_check_destination(), osp_create_callid(), osp_create_provider(), osp_create_transaction(), osp_create_uuid(), osp_load(), osp_lookup(), osp_next(), osp_uuid2str(), osp_validate_token(), osplookup_exec(), ospnext_exec(), oss_indicate(), oss_new(), oss_request(), page_exec(), park_call_exec(), park_call_full(), park_space_reserve(), parkandannounce_exec(), parked_call_exec(), parkinglot_activate(), parkinglot_activate_cb(), parkinglot_config_read(), parkinglot_is_marked_cb(), parse(), parse_apps(), parse_args(), parse_buffers_policy(), parse_config(), parse_empty_options(), parse_events(), parse_gain_value(), parse_ie(), parse_minse(), parse_moved_contact(), parse_naptr(), parse_options(), parse_register_contact(), parse_request(), parse_session_expires(), parse_srv(), parse_tag(), parse_tone_zone(), parse_via(), ParseBookmark(), parsing(), party_id_build_data(), party_id_write(), party_name_build_data(), party_name_write(), party_number_build_data(), party_number_write(), party_subaddress_build_data(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_hangup(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_saydate(), pbx_builtin_saynumber(), pbx_builtin_saytime(), pbx_builtin_serialize_variables(), pbx_builtin_setvar(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_exec(), pbx_extension_helper(), pbx_find_extension(), pbx_live_dangerously(), pbx_load_config(), pbx_load_module(), pbx_load_users(), pbx_parseable_goto(), pbx_substitute_variables_helper_full(), pcm_read(), pcm_seek(), pcm_trunc(), pcm_write(), peek_read(), peer_iphash_cb(), peer_set_srcaddr(), peercnt_add(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_by_exten(), pickup_by_group(), pickup_exec(), pickupchan_exec(), pitchshift_helper(), pktccops_add_ippool(), play_message(), play_message_category(), play_message_datetime(), play_message_on_chan(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), policy_set_suite(), pop_exec(), post_raw(), powerof(), pp_each_extension_helper(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_applicationmap_line(), process_ast_dsp(), process_cn_rfc3389(), process_config(), process_crypto(), process_dahdi(), process_dtmf_rfc2833(), process_echocancel(), process_message_callback(), process_opcode(), process_output(), process_request(), process_returncode(), process_sdp(), process_sdp_a_audio(), process_sdp_c(), process_sdp_o(), process_text_line(), process_via(), profile_set_param(), progress(), proxy_from_config(), proxy_update(), pthread_timer_set_rate(), purge_old_messages(), pvalCheckType(), pvalGlobalsAddStatement(), pvalTopLevAddObject(), pw_cb(), ql_exec(), queue_exec(), queue_file(), queue_function_exists(), queue_function_memberpenalty_read(), queue_function_memberpenalty_write(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), queue_function_queuememberpaused(), queue_function_queuememberstatus(), queue_function_queuewaitingcount(), queue_function_var(), queue_reload_request(), queue_set_param(), queue_transfer_fixup(), queue_voice_frame(), quote(), radius_log(), rcv_mac_addr(), rcvfax_exec(), read_agent_config(), read_config(), read_config_maps(), read_exec(), read_password_from_file(), readexten_exec(), readfile_exec(), readmimefile(), realtime_curl(), realtime_destroy_handler(), realtime_directory(), realtime_exec(), realtime_handler(), realtime_ldap_base_ap(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_odbc(), realtime_peer(), realtime_peer_by_addr(), realtime_peer_get_sippeer_helper(), realtime_pgsql(), realtime_require_handler(), realtime_store_handler(), realtime_update2_handler(), realtime_update_handler(), realtime_user(), realtimefield_read(), receive_digit(), receive_message(), receivefax_exec(), receivefax_t38_init(), record_exec(), redirecting_read(), redirecting_write(), refresh_list(), reg_source_db(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_config(), reload_firmware(), reload_followme(), reload_module(), reload_queue_members(), reload_queue_rules(), reload_queues(), reload_single_member(), reload_single_queue(), remote_bridge_loop(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), replace(), replace_callno(), reply_digest(), require_curl(), require_odbc(), require_pgsql(), res_srtp_init(), res_srtp_new(), resample_frame(), reset_conf(), resolve_first(), respprep(), restart_monitor(), restart_pktc_thread(), restore_conference(), restore_gains(), retrans_pkt(), retrydial_exec(), return_exec(), revert_fax_buffers(), ring_entry(), rollback_exec(), rotate_file(), rqm_exec(), rt_handle_member_record(), rtp_reload(), run_agi(), run_externnotify(), run_ras(), s_streamwait3(), safe_append(), save_conference(), save_to_folder(), say_date(), say_date_with_format(), say_datetime(), say_datetime_from_now(), say_init_mode(), say_number_full(), say_time(), saycountedadj_exec(), saycountednoun_exec(), scan_service(), scan_thread(), schedule(), scheduled_destroy(), sdp_crypto_activate(), sdp_crypto_offer(), sdp_crypto_process(), sdp_crypto_setup(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_ews_request_and_parse(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendfax_exec(), sendfax_t38_init(), sendimage_exec(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_crypto_policy(), set_destination(), set_fax_t38_caps(), set_format(), set_full_cmd(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_moh_exec(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setflag(), setformat(), setup_dahdi_int(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_srtp(), setup_stunaddr(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), shift_pop(), show_chanstats_cb(), show_dialplan_helper(), showdisplay(), showkeys(), signal_pipe(), sip_acf_channel_read(), sip_addheader(), sip_call(), sip_cc_monitor_suspend(), sip_check_authtimeout(), sip_cli_notify(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_park_thread(), sip_parse_host(), sip_parse_register_line(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_read(), sip_reg_timeout(), sip_register(), sip_reload(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_setoption(), sip_sipredirect(), sip_st_alloc(), sip_subscribe_mwi(), sip_tcptls_read(), sip_tcptls_write(), sip_threadinfo_create(), sip_write(), sipsock_read(), siren14read(), siren14seek(), siren14trunc(), siren14write(), siren7read(), siren7seek(), siren7trunc(), siren7write(), skel_exec(), skinny_call(), skinny_fixup(), skinny_hangup(), skinny_hold(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), skinny_transfer(), skinny_unhold(), skinny_write(), sla_add_trunk_to_station(), sla_build_station(), sla_build_trunk(), sla_load_config(), sla_queue_event_conf(), sla_state(), sla_station_exec(), sla_trunk_exec(), slinear_read(), slinear_seek(), slinear_trunc(), slinear_write(), smdi_load(), smdi_msg_read(), smdi_msg_retrieve_read(), smdi_read(), smdi_toggle_mwi(), smoother_frame_feed(), sms_exec(), sms_generate(), sms_handleincoming(), sms_log(), sms_messagerx2(), sms_process(), sms_readfile(), sms_writefile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), softmix_bridge_thread(), soundcard_init(), soundcard_writeframe(), span_message(), spandsp_fax_new(), spandsp_fax_read(), spandsp_fax_start(), spandsp_fax_write(), spandsp_log(), spandsp_modems(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite_log(), srv_datastore_setup(), srv_query_read(), srv_result_read(), ssl_lock(), ssl_verify(), stackpeek_read(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_poll_thread(), start_rtp(), start_session_timer(), start_spying(), start_stream(), startelm(), starttimer(), store_boost(), store_by_peercallno(), store_by_transfercallno(), store_config(), store_config_core(), store_curl(), store_digit(), store_mixer(), store_odbc(), store_pgsql(), store_tone_zone_ring_cadence(), str_to_agent_policy(), str_to_monitor_policy(), stun_monitor_request(), stun_start_monitor(), stun_stop_monitor(), subscribe_event_destroy(), subscript(), substitute_escapes(), swap_subs(), sysinfo_helper(), syslog_log(), system_exec_helper(), t38_tx_packet_handler(), tcptls_stream_close(), tdd_feed(), tdd_new(), tds_error_handler(), tds_load_module(), tds_log(), tds_message_handler(), testclient_exec(), testserver_exec(), thread_inhibits_escalations(), timed_read(), timeout_read(), timeout_write(), timerfd_timer_ack(), timerfd_timer_close(), timerfd_timer_disable_continuous(), timerfd_timer_enable_continuous(), timerfd_timer_get_event(), timerfd_timer_open(), timerfd_timer_set_rate(), timezone_add(), timing_read(), to_number(), to_string(), tonepair_alloc(), tonepair_generator(), tps_processing_function(), tps_taskprocessor_destroy(), tps_taskprocessor_pop(), transfer_exec(), TransferCallStep1(), transmit(), transmit_audio(), transmit_cc_notify(), transmit_invite(), transmit_refer(), transmit_register(), transmit_request_with_auth(), transmit_response(), transmit_response_using_temp(), transmit_response_with_auth(), transmit_response_with_sdp(), transmit_response_with_t38_sdp(), transmit_state_notify(), transmit_t38(), try_calling(), try_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), tvfix(), txt_callback(), unalloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), unistim_request(), unistim_rtp_read(), unistim_senddigit_end(), unistim_sendtext(), unistim_set_rtp_peer(), unistim_ss(), unistim_write(), unistimsock_read(), unload_module(), unlock_read(), unref_mansession(), unregister_exten(), unshift_push(), unsignal_pipe(), update2_curl(), update2_ldap(), update2_odbc(), update2_pgsql(), update2_prepare(), update_call_counter(), update_common_options(), update_config(), update_curl(), update_header(), update_key(), update_ldap(), update_modem_bits(), update_odbc(), update_pgsql(), update_registry(), update_scoreboard(), update_stats(), upqm_exec(), usage_context_add_ramp(), usage_context_add_spaces(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_check_password_shell(), vm_exec(), vm_execmain(), vm_intro(), vm_newuser(), vm_options(), vmsayname_exec(), volume_write(), vox_read(), vox_seek(), vox_trunc(), vox_write(), wait_file(), wait_file2(), wait_for_answer(), wait_for_output(), wait_for_winner(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_trunc(), wav_write(), write_cdr(), write_header(), write_history(), write_password_to_file(), write_stream(), writefile(), xmldoc_build_field(), xmldoc_get_syntax_fun(), xmldoc_string_cleanup(), xmldoc_string_wrap(), yyerror(), and yyparse().
01208 { 01209 struct logmsg *logmsg = NULL; 01210 struct ast_str *buf = NULL; 01211 struct ast_tm tm; 01212 struct timeval now = ast_tvnow(); 01213 int res = 0; 01214 va_list ap; 01215 char datestring[256]; 01216 01217 if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) 01218 return; 01219 01220 if (level != __LOG_VERBOSE && AST_RWLIST_EMPTY(&logchannels)) { 01221 /* 01222 * we don't have the logger chain configured yet, 01223 * so just log to stdout 01224 */ 01225 int result; 01226 va_start(ap, fmt); 01227 result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */ 01228 va_end(ap); 01229 if (result != AST_DYNSTR_BUILD_FAILED) { 01230 term_filter_escapes(ast_str_buffer(buf)); 01231 fputs(ast_str_buffer(buf), stdout); 01232 } 01233 return; 01234 } 01235 01236 /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug 01237 are non-zero; LOG_DEBUG messages can still be displayed if option_debug 01238 is zero, if option_verbose is non-zero (this allows for 'level zero' 01239 LOG_DEBUG messages to be displayed, if the logmask on any channel 01240 allows it) 01241 */ 01242 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) 01243 return; 01244 01245 /* Ignore anything that never gets logged anywhere */ 01246 if (level != __LOG_VERBOSE && !(global_logmask & (1 << level))) 01247 return; 01248 01249 /* Build string */ 01250 va_start(ap, fmt); 01251 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); 01252 va_end(ap); 01253 01254 /* If the build failed, then abort and free this structure */ 01255 if (res == AST_DYNSTR_BUILD_FAILED) 01256 return; 01257 01258 /* Create a new logging message */ 01259 if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128))) 01260 return; 01261 01262 /* Copy string over */ 01263 ast_string_field_set(logmsg, message, ast_str_buffer(buf)); 01264 01265 /* Set type */ 01266 if (level == __LOG_VERBOSE) { 01267 logmsg->type = LOGMSG_VERBOSE; 01268 } else { 01269 logmsg->type = LOGMSG_NORMAL; 01270 } 01271 01272 /* Create our date/time */ 01273 ast_localtime(&now, &tm, NULL); 01274 ast_strftime(datestring, sizeof(datestring), dateformat, &tm); 01275 ast_string_field_set(logmsg, date, datestring); 01276 01277 /* Copy over data */ 01278 logmsg->level = level; 01279 logmsg->line = line; 01280 ast_string_field_set(logmsg, level_name, levels[level]); 01281 ast_string_field_set(logmsg, file, file); 01282 ast_string_field_set(logmsg, function, function); 01283 logmsg->process_id = (long) ast_get_tid(); 01284 01285 /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */ 01286 if (logthread != AST_PTHREADT_NULL) { 01287 AST_LIST_LOCK(&logmsgs); 01288 if (close_logger_thread) { 01289 /* Logger is either closing or closed. We cannot log this message. */ 01290 ast_free(logmsg); 01291 } else { 01292 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01293 ast_cond_signal(&logcond); 01294 } 01295 AST_LIST_UNLOCK(&logmsgs); 01296 } else { 01297 logger_print_normal(logmsg); 01298 ast_free(logmsg); 01299 } 01300 }
static void ast_log_vsyslog | ( | struct logmsg * | msg | ) | [static] |
Definition at line 952 of file logger.c.
References ast_syslog_priority_from_loglevel(), logmsg::file, logmsg::function, logmsg::level, levels, logmsg::line, logmsg::message, logmsg::process_id, and term_strip().
Referenced by logger_print_normal().
00953 { 00954 char buf[BUFSIZ]; 00955 int syslog_level = ast_syslog_priority_from_loglevel(msg->level); 00956 00957 if (syslog_level < 0) { 00958 /* we are locked here, so cannot ast_log() */ 00959 fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level); 00960 return; 00961 } 00962 00963 snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s", 00964 levels[msg->level], msg->process_id, msg->file, msg->line, msg->function, msg->message); 00965 00966 term_strip(buf, buf, strlen(buf) + 1); 00967 syslog(syslog_level, "%s", buf); 00968 }
int ast_logger_register_level | ( | const char * | name | ) |
Register a new logger level.
name | The name of the level to be registered |
-1 | if an error occurs | |
non-zero | level to be used with ast_log for sending messages to this level |
Definition at line 1627 of file logger.c.
References ARRAY_LEN, ast_debug, ast_log(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strdup, available(), levels, LOG_WARNING, and update_logchannels().
Referenced by ast_cc_init(), and load_module().
01628 { 01629 unsigned int level; 01630 unsigned int available = 0; 01631 01632 AST_RWLIST_WRLOCK(&logchannels); 01633 01634 for (level = 0; level < ARRAY_LEN(levels); level++) { 01635 if ((level >= 16) && !available && !levels[level]) { 01636 available = level; 01637 continue; 01638 } 01639 01640 if (levels[level] && !strcasecmp(levels[level], name)) { 01641 ast_log(LOG_WARNING, 01642 "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n", 01643 name); 01644 AST_RWLIST_UNLOCK(&logchannels); 01645 01646 return -1; 01647 } 01648 } 01649 01650 if (!available) { 01651 ast_log(LOG_WARNING, 01652 "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n", 01653 name); 01654 AST_RWLIST_UNLOCK(&logchannels); 01655 01656 return -1; 01657 } 01658 01659 levels[available] = ast_strdup(name); 01660 01661 AST_RWLIST_UNLOCK(&logchannels); 01662 01663 ast_debug(1, "Registered dynamic logger level '%s' with index %u.\n", name, available); 01664 01665 update_logchannels(); 01666 01667 return available; 01668 }
void ast_logger_unregister_level | ( | const char * | name | ) |
Unregister a previously registered logger level.
name | The name of the level to be unregistered |
Definition at line 1670 of file logger.c.
References ARRAY_LEN, ast_debug, ast_free, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, levels, and update_logchannels().
Referenced by cc_shutdown(), load_module(), and unload_module().
01671 { 01672 unsigned int found = 0; 01673 unsigned int x; 01674 01675 AST_RWLIST_WRLOCK(&logchannels); 01676 01677 for (x = 16; x < ARRAY_LEN(levels); x++) { 01678 if (!levels[x]) { 01679 continue; 01680 } 01681 01682 if (strcasecmp(levels[x], name)) { 01683 continue; 01684 } 01685 01686 found = 1; 01687 break; 01688 } 01689 01690 if (found) { 01691 /* take this level out of the global_logmask, to ensure that no new log messages 01692 * will be queued for it 01693 */ 01694 01695 global_logmask &= ~(1 << x); 01696 01697 ast_free(levels[x]); 01698 levels[x] = NULL; 01699 AST_RWLIST_UNLOCK(&logchannels); 01700 01701 ast_debug(1, "Unregistered dynamic logger level '%s' with index %u.\n", name, x); 01702 01703 update_logchannels(); 01704 } else { 01705 AST_RWLIST_UNLOCK(&logchannels); 01706 } 01707 }
void ast_queue_log | ( | const char * | queuename, | |
const char * | callid, | |||
const char * | agent, | |||
const char * | event, | |||
const char * | fmt, | |||
... | ||||
) |
Definition at line 479 of file logger.c.
References args, AST_APP_ARG, ast_check_realtime(), AST_DECLARE_APP_ARGS, ast_localtime(), AST_NONSTANDARD_APP_ARGS, ast_queue_log(), ast_realtime_require_field(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_store_realtime(), ast_strftime(), ast_tvnow(), logfiles, logger_queue_init(), qlog, RQ_CHAR, S_OR, and SENTINEL.
Referenced by aqm_exec(), ast_queue_log(), find_queue_by_name_rt(), handle_queue_add_member(), handle_queue_remove_member(), login_exec(), manager_add_queue_member(), manager_queue_log_custom(), manager_remove_queue_member(), ql_exec(), queue_exec(), queue_transfer_fixup(), reload_logger(), rna(), rqm_exec(), rt_handle_member_record(), set_member_paused(), set_member_penalty(), try_calling(), update_realtime_members(), and wait_our_turn().
00480 { 00481 va_list ap; 00482 struct timeval tv; 00483 struct ast_tm tm; 00484 char qlog_msg[8192]; 00485 int qlog_len; 00486 char time_str[30]; 00487 00488 if (!logger_initialized) { 00489 /* You are too early. We are not open yet! */ 00490 return; 00491 } 00492 if (!queuelog_init) { 00493 AST_RWLIST_WRLOCK(&logchannels); 00494 if (!queuelog_init) { 00495 /* 00496 * We have delayed initializing the queue logging system so 00497 * preloaded realtime modules can get up. We must initialize 00498 * now since someone is trying to log something. 00499 */ 00500 logger_queue_init(); 00501 queuelog_init = 1; 00502 AST_RWLIST_UNLOCK(&logchannels); 00503 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); 00504 } else { 00505 AST_RWLIST_UNLOCK(&logchannels); 00506 } 00507 } 00508 00509 if (ast_check_realtime("queue_log")) { 00510 tv = ast_tvnow(); 00511 ast_localtime(&tv, &tm, NULL); 00512 ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm); 00513 va_start(ap, fmt); 00514 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap); 00515 va_end(ap); 00516 if (logfiles.queue_adaptive_realtime) { 00517 AST_DECLARE_APP_ARGS(args, 00518 AST_APP_ARG(data)[5]; 00519 ); 00520 AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|'); 00521 /* Ensure fields are large enough to receive data */ 00522 ast_realtime_require_field("queue_log", 00523 "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")), 00524 "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")), 00525 "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")), 00526 "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")), 00527 "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")), 00528 SENTINEL); 00529 00530 /* Store the log */ 00531 ast_store_realtime("queue_log", "time", time_str, 00532 "callid", callid, 00533 "queuename", queuename, 00534 "agent", agent, 00535 "event", event, 00536 "data1", S_OR(args.data[0], ""), 00537 "data2", S_OR(args.data[1], ""), 00538 "data3", S_OR(args.data[2], ""), 00539 "data4", S_OR(args.data[3], ""), 00540 "data5", S_OR(args.data[4], ""), 00541 SENTINEL); 00542 } else { 00543 ast_store_realtime("queue_log", "time", time_str, 00544 "callid", callid, 00545 "queuename", queuename, 00546 "agent", agent, 00547 "event", event, 00548 "data", qlog_msg, 00549 SENTINEL); 00550 } 00551 00552 if (!logfiles.queue_log_to_file) { 00553 return; 00554 } 00555 } 00556 00557 if (qlog) { 00558 va_start(ap, fmt); 00559 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); 00560 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap); 00561 va_end(ap); 00562 AST_RWLIST_RDLOCK(&logchannels); 00563 if (qlog) { 00564 fprintf(qlog, "%s\n", qlog_msg); 00565 fflush(qlog); 00566 } 00567 AST_RWLIST_UNLOCK(&logchannels); 00568 } 00569 }
int ast_register_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1577 of file logger.c.
References ast_malloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb::verboser.
Referenced by ast_makesocket(), and print_intro_message().
01578 { 01579 struct verb *verb; 01580 01581 if (!(verb = ast_malloc(sizeof(*verb)))) 01582 return -1; 01583 01584 verb->verboser = v; 01585 01586 AST_RWLIST_WRLOCK(&verbosers); 01587 AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); 01588 AST_RWLIST_UNLOCK(&verbosers); 01589 01590 return 0; 01591 }
int ast_unregister_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1593 of file logger.c.
References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb::verboser.
01594 { 01595 struct verb *cur; 01596 01597 AST_RWLIST_WRLOCK(&verbosers); 01598 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { 01599 if (cur->verboser == v) { 01600 AST_RWLIST_REMOVE_CURRENT(list); 01601 ast_free(cur); 01602 break; 01603 } 01604 } 01605 AST_RWLIST_TRAVERSE_SAFE_END; 01606 AST_RWLIST_UNLOCK(&verbosers); 01607 01608 return cur ? 0 : -1; 01609 }
void ast_verbose | ( | const char * | fmt, | |
... | ||||
) |
Definition at line 1568 of file logger.c.
References __ast_verbose_ap().
01569 { 01570 va_list ap; 01571 01572 va_start(ap, fmt); 01573 __ast_verbose_ap("", 0, "", fmt, ap); 01574 va_end(ap); 01575 }
void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1160 of file logger.c.
References ARRAY_LEN, ast_cli_unregister_multiple(), ast_cond_signal, ast_free, AST_LIST_LOCK, AST_LIST_REMOVE_HEAD, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, cli_logger, close_logger_thread, f, logchannel::fileptr, logchannel::list, logcond, logthread, and qlog.
Referenced by really_quit().
01161 { 01162 struct logchannel *f = NULL; 01163 struct verb *cur = NULL; 01164 01165 ast_cli_unregister_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01166 01167 logger_initialized = 0; 01168 01169 /* Stop logger thread */ 01170 AST_LIST_LOCK(&logmsgs); 01171 close_logger_thread = 1; 01172 ast_cond_signal(&logcond); 01173 AST_LIST_UNLOCK(&logmsgs); 01174 01175 if (logthread != AST_PTHREADT_NULL) 01176 pthread_join(logthread, NULL); 01177 01178 AST_RWLIST_WRLOCK(&verbosers); 01179 while ((cur = AST_LIST_REMOVE_HEAD(&verbosers, list))) { 01180 ast_free(cur); 01181 } 01182 AST_RWLIST_UNLOCK(&verbosers); 01183 01184 AST_RWLIST_WRLOCK(&logchannels); 01185 01186 if (qlog) { 01187 fclose(qlog); 01188 qlog = NULL; 01189 } 01190 01191 while ((f = AST_LIST_REMOVE_HEAD(&logchannels, list))) { 01192 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01193 fclose(f->fileptr); 01194 f->fileptr = NULL; 01195 } 01196 ast_free(f); 01197 } 01198 01199 closelog(); /* syslog */ 01200 01201 AST_RWLIST_UNLOCK(&logchannels); 01202 }
static char* handle_logger_reload | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 808 of file logger.c.
References ast_cli(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, reload_logger(), and ast_cli_entry::usage.
00809 { 00810 switch (cmd) { 00811 case CLI_INIT: 00812 e->command = "logger reload"; 00813 e->usage = 00814 "Usage: logger reload\n" 00815 " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n"; 00816 return NULL; 00817 case CLI_GENERATE: 00818 return NULL; 00819 } 00820 if (reload_logger(0)) { 00821 ast_cli(a->fd, "Failed to reload the logger\n"); 00822 return CLI_FAILURE; 00823 } 00824 return CLI_SUCCESS; 00825 }
static char* handle_logger_rotate | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 827 of file logger.c.
References ast_cli(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, reload_logger(), and ast_cli_entry::usage.
00828 { 00829 switch (cmd) { 00830 case CLI_INIT: 00831 e->command = "logger rotate"; 00832 e->usage = 00833 "Usage: logger rotate\n" 00834 " Rotates and Reopens the log files.\n"; 00835 return NULL; 00836 case CLI_GENERATE: 00837 return NULL; 00838 } 00839 if (reload_logger(1)) { 00840 ast_cli(a->fd, "Failed to reload the logger and rotate log files\n"); 00841 return CLI_FAILURE; 00842 } 00843 return CLI_SUCCESS; 00844 }
static char* handle_logger_set_level | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 846 of file logger.c.
References ast_cli_args::argc, ast_cli_args::argv, ARRAY_LEN, ast_cli(), ast_console_toggle_loglevel(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, levels, and ast_cli_entry::usage.
00847 { 00848 int x; 00849 int state; 00850 int level = -1; 00851 00852 switch (cmd) { 00853 case CLI_INIT: 00854 e->command = "logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}"; 00855 e->usage = 00856 "Usage: logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n" 00857 " Set a specific log level to enabled/disabled for this console.\n"; 00858 return NULL; 00859 case CLI_GENERATE: 00860 return NULL; 00861 } 00862 00863 if (a->argc < 5) 00864 return CLI_SHOWUSAGE; 00865 00866 AST_RWLIST_WRLOCK(&logchannels); 00867 00868 for (x = 0; x < ARRAY_LEN(levels); x++) { 00869 if (levels[x] && !strcasecmp(a->argv[3], levels[x])) { 00870 level = x; 00871 break; 00872 } 00873 } 00874 00875 AST_RWLIST_UNLOCK(&logchannels); 00876 00877 state = ast_true(a->argv[4]) ? 1 : 0; 00878 00879 if (level != -1) { 00880 ast_console_toggle_loglevel(a->fd, level, state); 00881 ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off"); 00882 } else 00883 return CLI_SHOWUSAGE; 00884 00885 return CLI_SUCCESS; 00886 }
static char* handle_logger_show_channels | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
CLI command to show logging system configuration.
Definition at line 889 of file logger.c.
References ARRAY_LEN, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, logchannel::disabled, ast_cli_args::fd, logchannel::filename, FORMATL, levels, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, logchannel::type, and ast_cli_entry::usage.
00890 { 00891 #define FORMATL "%-35.35s %-8.8s %-9.9s " 00892 struct logchannel *chan; 00893 switch (cmd) { 00894 case CLI_INIT: 00895 e->command = "logger show channels"; 00896 e->usage = 00897 "Usage: logger show channels\n" 00898 " List configured logger channels.\n"; 00899 return NULL; 00900 case CLI_GENERATE: 00901 return NULL; 00902 } 00903 ast_cli(a->fd, FORMATL, "Channel", "Type", "Status"); 00904 ast_cli(a->fd, "Configuration\n"); 00905 ast_cli(a->fd, FORMATL, "-------", "----", "------"); 00906 ast_cli(a->fd, "-------------\n"); 00907 AST_RWLIST_RDLOCK(&logchannels); 00908 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00909 unsigned int level; 00910 00911 ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), 00912 chan->disabled ? "Disabled" : "Enabled"); 00913 ast_cli(a->fd, " - "); 00914 for (level = 0; level < ARRAY_LEN(levels); level++) { 00915 if ((chan->logmask & (1 << level)) && levels[level]) { 00916 ast_cli(a->fd, "%s ", levels[level]); 00917 } 00918 } 00919 ast_cli(a->fd, "\n"); 00920 } 00921 AST_RWLIST_UNLOCK(&logchannels); 00922 ast_cli(a->fd, "\n"); 00923 00924 return CLI_SUCCESS; 00925 }
int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 1127 of file logger.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_cond_destroy, ast_cond_init, ast_config_AST_LOG_DIR, ast_mkdir(), ast_mutex_destroy, ast_mutex_init, ast_pthread_create, cli_logger, handle_SIGXFSZ, init_logger_chain(), logcond, logger_thread(), and logthread.
Referenced by main().
01128 { 01129 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01130 sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL); 01131 01132 /* Re-initialize the logmsgs mutex. The recursive mutex can be accessed prior 01133 * to Asterisk being forked into the background, which can cause the thread 01134 * ID tracked by the underlying pthread mutex to be different than the ID of 01135 * the thread that unlocks the mutex. Since init_logger is called after the 01136 * fork, it is safe to initialize the mutex here for future accesses. 01137 */ 01138 ast_mutex_destroy(&logmsgs.lock); 01139 ast_mutex_init(&logmsgs.lock); 01140 ast_cond_init(&logcond, NULL); 01141 01142 /* start logger thread */ 01143 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01144 ast_cond_destroy(&logcond); 01145 return -1; 01146 } 01147 01148 /* register the logger cli commands */ 01149 ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01150 01151 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01152 01153 /* create log channels */ 01154 init_logger_chain(0 /* locked */); 01155 logger_initialized = 1; 01156 01157 return 0; 01158 }
static void init_logger_chain | ( | int | locked | ) | [static] |
Definition at line 307 of file logger.c.
References __LOG_ERROR, __LOG_NOTICE, __LOG_WARNING, ast_calloc, ast_config_destroy(), ast_config_load2(), ast_console_puts_mutable(), ast_copy_string(), ast_free, AST_RWLIST_INSERT_HEAD, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), ast_variable_browse(), ast_variable_retrieve(), CONFIG_STATUS_FILEINVALID, errno, ast_variable::lineno, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ast_variable::name, ast_variable::next, qlog, ROTATE, SEQUENTIAL, TIMESTAMP, logchannel::type, ast_variable::value, and var.
Referenced by init_logger(), and reload_logger().
00308 { 00309 struct logchannel *chan; 00310 struct ast_config *cfg; 00311 struct ast_variable *var; 00312 const char *s; 00313 struct ast_flags config_flags = { 0 }; 00314 00315 if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) { 00316 return; 00317 } 00318 00319 /* delete our list of log channels */ 00320 if (!locked) { 00321 AST_RWLIST_WRLOCK(&logchannels); 00322 } 00323 while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) { 00324 ast_free(chan); 00325 } 00326 global_logmask = 0; 00327 if (!locked) { 00328 AST_RWLIST_UNLOCK(&logchannels); 00329 } 00330 00331 errno = 0; 00332 /* close syslog */ 00333 closelog(); 00334 00335 /* If no config file, we're fine, set default options. */ 00336 if (!cfg) { 00337 if (errno) { 00338 fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno)); 00339 } else { 00340 fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n"); 00341 } 00342 if (!(chan = ast_calloc(1, sizeof(*chan)))) { 00343 return; 00344 } 00345 chan->type = LOGTYPE_CONSOLE; 00346 chan->logmask = __LOG_WARNING | __LOG_NOTICE | __LOG_ERROR; 00347 if (!locked) { 00348 AST_RWLIST_WRLOCK(&logchannels); 00349 } 00350 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00351 global_logmask |= chan->logmask; 00352 if (!locked) { 00353 AST_RWLIST_UNLOCK(&logchannels); 00354 } 00355 return; 00356 } 00357 00358 if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) { 00359 if (ast_true(s)) { 00360 if (gethostname(hostname, sizeof(hostname) - 1)) { 00361 ast_copy_string(hostname, "unknown", sizeof(hostname)); 00362 fprintf(stderr, "What box has no hostname???\n"); 00363 } 00364 } else 00365 hostname[0] = '\0'; 00366 } else 00367 hostname[0] = '\0'; 00368 if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) 00369 ast_copy_string(dateformat, s, sizeof(dateformat)); 00370 else 00371 ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat)); 00372 if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) { 00373 logfiles.queue_log = ast_true(s); 00374 } 00375 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) { 00376 logfiles.queue_log_to_file = ast_true(s); 00377 } 00378 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) { 00379 ast_copy_string(queue_log_name, s, sizeof(queue_log_name)); 00380 } 00381 if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) { 00382 ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate)); 00383 } 00384 if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) { 00385 if (strcasecmp(s, "timestamp") == 0) { 00386 rotatestrategy = TIMESTAMP; 00387 } else if (strcasecmp(s, "rotate") == 0) { 00388 rotatestrategy = ROTATE; 00389 } else if (strcasecmp(s, "sequential") == 0) { 00390 rotatestrategy = SEQUENTIAL; 00391 } else { 00392 fprintf(stderr, "Unknown rotatestrategy: %s\n", s); 00393 } 00394 } else { 00395 if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) { 00396 rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL; 00397 fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n"); 00398 } 00399 } 00400 00401 if (!locked) { 00402 AST_RWLIST_WRLOCK(&logchannels); 00403 } 00404 var = ast_variable_browse(cfg, "logfiles"); 00405 for (; var; var = var->next) { 00406 if (!(chan = make_logchannel(var->name, var->value, var->lineno))) { 00407 /* Print error message directly to the consoles since the lock is held 00408 * and we don't want to unlock with the list partially built */ 00409 ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR); 00410 ast_console_puts_mutable(var->name, __LOG_ERROR); 00411 ast_console_puts_mutable("'\n", __LOG_ERROR); 00412 continue; 00413 } 00414 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00415 global_logmask |= chan->logmask; 00416 } 00417 00418 if (qlog) { 00419 fclose(qlog); 00420 qlog = NULL; 00421 } 00422 00423 if (!locked) { 00424 AST_RWLIST_UNLOCK(&logchannels); 00425 } 00426 00427 ast_config_destroy(cfg); 00428 }
static void logger_print_normal | ( | struct logmsg * | logmsg | ) | [static] |
Print a normal log message to the channels.
Definition at line 971 of file logger.c.
References __LOG_VERBOSE, ast_console_puts_mutable(), ast_log_vsyslog(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdupa, ast_string_field_set, ast_strlen_zero(), ast_verb, COLOR_BRWHITE, colors, logmsg::date, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, logmsg::file, logchannel::filename, logchannel::fileptr, logmsg::function, logmsg::level, logmsg::level_name, logmsg::line, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::message, logmsg::process_id, reload_logger(), term_color(), term_strip(), logchannel::type, and verb::verboser.
Referenced by ast_log(), and logger_thread().
00972 { 00973 struct logchannel *chan = NULL; 00974 char buf[BUFSIZ]; 00975 struct verb *v = NULL; 00976 00977 if (logmsg->level == __LOG_VERBOSE) { 00978 char *tmpmsg = ast_strdupa(logmsg->message + 1); 00979 /* Iterate through the list of verbosers and pass them the log message string */ 00980 AST_RWLIST_RDLOCK(&verbosers); 00981 AST_RWLIST_TRAVERSE(&verbosers, v, list) 00982 v->verboser(logmsg->message); 00983 AST_RWLIST_UNLOCK(&verbosers); 00984 ast_string_field_set(logmsg, message, tmpmsg); 00985 } 00986 00987 AST_RWLIST_RDLOCK(&logchannels); 00988 00989 if (!AST_RWLIST_EMPTY(&logchannels)) { 00990 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00991 /* If the channel is disabled, then move on to the next one */ 00992 if (chan->disabled) 00993 continue; 00994 /* Check syslog channels */ 00995 if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) { 00996 ast_log_vsyslog(logmsg); 00997 /* Console channels */ 00998 } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) { 00999 char linestr[128]; 01000 char tmp1[80], tmp2[80], tmp3[80], tmp4[80]; 01001 01002 /* If the level is verbose, then skip it */ 01003 if (logmsg->level == __LOG_VERBOSE) 01004 continue; 01005 01006 /* Turn the numerical line number into a string */ 01007 snprintf(linestr, sizeof(linestr), "%d", logmsg->line); 01008 /* Build string to print out */ 01009 snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s", 01010 logmsg->date, 01011 term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)), 01012 logmsg->process_id, 01013 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)), 01014 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), 01015 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)), 01016 logmsg->message); 01017 /* Print out */ 01018 ast_console_puts_mutable(buf, logmsg->level); 01019 /* File channels */ 01020 } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) { 01021 int res = 0; 01022 01023 /* If no file pointer exists, skip it */ 01024 if (!chan->fileptr) { 01025 continue; 01026 } 01027 01028 /* Print out to the file */ 01029 res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s", 01030 logmsg->date, logmsg->level_name, logmsg->process_id, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ)); 01031 if (res <= 0 && !ast_strlen_zero(logmsg->message)) { 01032 fprintf(stderr, "**** Asterisk Logging Error: ***********\n"); 01033 if (errno == ENOMEM || errno == ENOSPC) 01034 fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename); 01035 else 01036 fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno)); 01037 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno)); 01038 chan->disabled = 1; 01039 } else if (res > 0) { 01040 fflush(chan->fileptr); 01041 } 01042 } 01043 } 01044 } else if (logmsg->level != __LOG_VERBOSE) { 01045 fputs(logmsg->message, stdout); 01046 } 01047 01048 AST_RWLIST_UNLOCK(&logchannels); 01049 01050 /* If we need to reload because of the file size, then do so */ 01051 if (filesize_reload_needed) { 01052 reload_logger(-1); 01053 ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 01054 } 01055 01056 return; 01057 }
static void logger_queue_init | ( | void | ) | [static] |
Definition at line 1103 of file logger.c.
References ast_config_AST_LOG_DIR, ast_log(), ast_unload_realtime(), errno, LOG_ERROR, logfiles, logger_queue_rt_start(), and qlog.
Referenced by ast_queue_log().
01104 { 01105 ast_unload_realtime("queue_log"); 01106 if (logfiles.queue_log) { 01107 char qfname[PATH_MAX]; 01108 01109 if (logger_queue_rt_start()) { 01110 return; 01111 } 01112 01113 /* Open the log file. */ 01114 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, 01115 queue_log_name); 01116 if (qlog) { 01117 /* Just in case it was already open. */ 01118 fclose(qlog); 01119 } 01120 qlog = fopen(qfname, "a"); 01121 if (!qlog) { 01122 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 01123 } 01124 } 01125 }
static int logger_queue_restart | ( | int | queue_rotate | ) | [static] |
Definition at line 707 of file logger.c.
References ast_config_AST_LOG_DIR, ast_log(), errno, LOG_ERROR, logger_queue_rt_start(), qlog, and rotate_file().
Referenced by reload_logger().
00708 { 00709 int res = 0; 00710 char qfname[PATH_MAX]; 00711 00712 if (logger_queue_rt_start()) { 00713 return res; 00714 } 00715 00716 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00717 if (qlog) { 00718 /* Just in case it was still open. */ 00719 fclose(qlog); 00720 qlog = NULL; 00721 } 00722 if (queue_rotate) { 00723 rotate_file(qfname); 00724 } 00725 00726 /* Open the log file. */ 00727 qlog = fopen(qfname, "a"); 00728 if (!qlog) { 00729 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 00730 res = -1; 00731 } 00732 return res; 00733 }
static int logger_queue_rt_start | ( | void | ) | [static] |
Definition at line 672 of file logger.c.
References ast_check_realtime(), ast_realtime_require_field(), logfiles, RQ_CHAR, RQ_DATETIME, and SENTINEL.
Referenced by logger_queue_init(), and logger_queue_restart().
00673 { 00674 if (ast_check_realtime("queue_log")) { 00675 if (!ast_realtime_require_field("queue_log", 00676 "time", RQ_DATETIME, 26, 00677 "data1", RQ_CHAR, 20, 00678 "data2", RQ_CHAR, 20, 00679 "data3", RQ_CHAR, 20, 00680 "data4", RQ_CHAR, 20, 00681 "data5", RQ_CHAR, 20, 00682 SENTINEL)) { 00683 logfiles.queue_adaptive_realtime = 1; 00684 } else { 00685 logfiles.queue_adaptive_realtime = 0; 00686 } 00687 00688 if (!logfiles.queue_log_to_file) { 00689 /* Don't open the log file. */ 00690 return 1; 00691 } 00692 } 00693 return 0; 00694 }
int logger_reload | ( | void | ) |
Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload).
Reload logger without rotating log files.
Definition at line 800 of file logger.c.
References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.
00801 { 00802 if (reload_logger(0)) { 00803 return RESULT_FAILURE; 00804 } 00805 return RESULT_SUCCESS; 00806 }
static void* logger_thread | ( | void * | data | ) | [static] |
Actual logging thread.
Definition at line 1060 of file logger.c.
References ast_cond_wait, ast_free, AST_LIST_EMPTY, AST_LIST_FIRST, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_LOCK, AST_LIST_NEXT, AST_LIST_UNLOCK, close_logger_thread, logchannel::list, logcond, logger_print_normal(), and logchannel::next.
Referenced by init_logger().
01061 { 01062 struct logmsg *next = NULL, *msg = NULL; 01063 01064 for (;;) { 01065 /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */ 01066 AST_LIST_LOCK(&logmsgs); 01067 if (AST_LIST_EMPTY(&logmsgs)) { 01068 if (close_logger_thread) { 01069 AST_LIST_UNLOCK(&logmsgs); 01070 break; 01071 } else { 01072 ast_cond_wait(&logcond, &logmsgs.lock); 01073 } 01074 } 01075 next = AST_LIST_FIRST(&logmsgs); 01076 AST_LIST_HEAD_INIT_NOLOCK(&logmsgs); 01077 AST_LIST_UNLOCK(&logmsgs); 01078 01079 /* Otherwise go through and process each message in the order added */ 01080 while ((msg = next)) { 01081 /* Get the next entry now so that we can free our current structure later */ 01082 next = AST_LIST_NEXT(msg, list); 01083 01084 /* Depending on the type, send it to the proper function */ 01085 logger_print_normal(msg); 01086 01087 /* Free the data since we are done */ 01088 ast_free(msg); 01089 } 01090 } 01091 01092 return NULL; 01093 }
static unsigned int make_components | ( | const char * | s, | |
int | lineno | |||
) | [static] |
Definition at line 214 of file logger.c.
References ARRAY_LEN, ast_skip_blanks(), ast_strdupa, and levels.
Referenced by make_logchannel(), and update_logchannels().
00215 { 00216 char *w; 00217 unsigned int res = 0; 00218 char *stringp = ast_strdupa(s); 00219 unsigned int x; 00220 00221 while ((w = strsep(&stringp, ","))) { 00222 w = ast_skip_blanks(w); 00223 00224 if (!strcmp(w, "*")) { 00225 res = 0xFFFFFFFF; 00226 break; 00227 } else for (x = 0; x < ARRAY_LEN(levels); x++) { 00228 if (levels[x] && !strcasecmp(w, levels[x])) { 00229 res |= (1 << x); 00230 break; 00231 } 00232 } 00233 } 00234 00235 return res; 00236 }
static struct logchannel* make_logchannel | ( | const char * | channel, | |
const char * | components, | |||
int | lineno | |||
) | [static, read] |
Definition at line 238 of file logger.c.
References __LOG_ERROR, ast_calloc, ast_config_AST_LOG_DIR, ast_console_puts_mutable(), ast_copy_string(), ast_free, ast_strlen_zero(), ast_syslog_facility(), logchannel::components, errno, logchannel::facility, logchannel::filename, logchannel::fileptr, logchannel::lineno, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, make_components(), and logchannel::type.
Referenced by init_logger_chain().
00239 { 00240 struct logchannel *chan; 00241 char *facility; 00242 00243 if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1))) 00244 return NULL; 00245 00246 strcpy(chan->components, components); 00247 chan->lineno = lineno; 00248 00249 if (!strcasecmp(channel, "console")) { 00250 chan->type = LOGTYPE_CONSOLE; 00251 } else if (!strncasecmp(channel, "syslog", 6)) { 00252 /* 00253 * syntax is: 00254 * syslog.facility => level,level,level 00255 */ 00256 facility = strchr(channel, '.'); 00257 if (!facility++ || !facility) { 00258 facility = "local0"; 00259 } 00260 00261 chan->facility = ast_syslog_facility(facility); 00262 00263 if (chan->facility < 0) { 00264 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n"); 00265 ast_free(chan); 00266 return NULL; 00267 } 00268 00269 chan->type = LOGTYPE_SYSLOG; 00270 ast_copy_string(chan->filename, channel, sizeof(chan->filename)); 00271 openlog("asterisk", LOG_PID, chan->facility); 00272 } else { 00273 const char *log_dir_prefix = ""; 00274 const char *log_dir_separator = ""; 00275 00276 if (channel[0] != '/') { 00277 log_dir_prefix = ast_config_AST_LOG_DIR; 00278 log_dir_separator = "/"; 00279 } 00280 00281 if (!ast_strlen_zero(hostname)) { 00282 snprintf(chan->filename, sizeof(chan->filename), "%s%s%s.%s", 00283 log_dir_prefix, log_dir_separator, channel, hostname); 00284 } else { 00285 snprintf(chan->filename, sizeof(chan->filename), "%s%s%s", 00286 log_dir_prefix, log_dir_separator, channel); 00287 } 00288 00289 if (!(chan->fileptr = fopen(chan->filename, "a"))) { 00290 /* Can't do real logging here since we're called with a lock 00291 * so log to any attached consoles */ 00292 ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR); 00293 ast_console_puts_mutable(chan->filename, __LOG_ERROR); 00294 ast_console_puts_mutable("': ", __LOG_ERROR); 00295 ast_console_puts_mutable(strerror(errno), __LOG_ERROR); 00296 ast_console_puts_mutable("'\n", __LOG_ERROR); 00297 ast_free(chan); 00298 return NULL; 00299 } 00300 chan->type = LOGTYPE_FILE; 00301 } 00302 chan->logmask = make_components(chan->components, lineno); 00303 00304 return chan; 00305 }
static int reload_logger | ( | int | rotate | ) | [static] |
Definition at line 735 of file logger.c.
References ast_config_AST_LOG_DIR, ast_mkdir(), ast_queue_log(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_unload_realtime(), ast_verb, logchannel::disabled, EVENT_FLAG_SYSTEM, f, logchannel::filename, logchannel::fileptr, init_logger_chain(), logchannel::list, logfiles, logger_queue_restart(), manager_event, qlog, and rotate_file().
Referenced by handle_logger_reload(), handle_logger_rotate(), logger_print_normal(), and logger_reload().
00736 { 00737 int queue_rotate = rotate; 00738 struct logchannel *f; 00739 int res = 0; 00740 00741 AST_RWLIST_WRLOCK(&logchannels); 00742 00743 if (qlog) { 00744 if (rotate < 0) { 00745 /* Check filesize - this one typically doesn't need an auto-rotate */ 00746 if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */ 00747 fclose(qlog); 00748 qlog = NULL; 00749 } else { 00750 queue_rotate = 0; 00751 } 00752 } else { 00753 fclose(qlog); 00754 qlog = NULL; 00755 } 00756 } else { 00757 queue_rotate = 0; 00758 } 00759 00760 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 00761 00762 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 00763 if (f->disabled) { 00764 f->disabled = 0; /* Re-enable logging at reload */ 00765 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename); 00766 } 00767 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00768 int rotate_this = 0; 00769 if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */ 00770 /* Be more proactive about rotating massive log files */ 00771 rotate_this = 1; 00772 } 00773 fclose(f->fileptr); /* Close file */ 00774 f->fileptr = NULL; 00775 if (rotate || rotate_this) { 00776 rotate_file(f->filename); 00777 } 00778 } 00779 } 00780 00781 filesize_reload_needed = 0; 00782 00783 init_logger_chain(1 /* locked */); 00784 00785 ast_unload_realtime("queue_log"); 00786 if (logfiles.queue_log) { 00787 res = logger_queue_restart(queue_rotate); 00788 AST_RWLIST_UNLOCK(&logchannels); 00789 ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); 00790 ast_verb(1, "Asterisk Queue Logger restarted\n"); 00791 } else { 00792 AST_RWLIST_UNLOCK(&logchannels); 00793 } 00794 00795 return res; 00796 }
static int rotate_file | ( | const char * | filename | ) | [static] |
Definition at line 571 of file logger.c.
References ARRAY_LEN, ast_channel_unref, ast_dummy_channel_alloc, ast_log(), ast_safe_system(), ast_strlen_zero(), LOG_WARNING, pbx_builtin_setvar_helper(), pbx_substitute_variables_helper(), ROTATE, SEQUENTIAL, and TIMESTAMP.
Referenced by logger_queue_restart(), and reload_logger().
00572 { 00573 char old[PATH_MAX]; 00574 char new[PATH_MAX]; 00575 int x, y, which, found, res = 0, fd; 00576 char *suffixes[4] = { "", ".gz", ".bz2", ".Z" }; 00577 00578 switch (rotatestrategy) { 00579 case SEQUENTIAL: 00580 for (x = 0; ; x++) { 00581 snprintf(new, sizeof(new), "%s.%d", filename, x); 00582 fd = open(new, O_RDONLY); 00583 if (fd > -1) 00584 close(fd); 00585 else 00586 break; 00587 } 00588 if (rename(filename, new)) { 00589 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00590 res = -1; 00591 } else { 00592 filename = new; 00593 } 00594 break; 00595 case TIMESTAMP: 00596 snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL)); 00597 if (rename(filename, new)) { 00598 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00599 res = -1; 00600 } else { 00601 filename = new; 00602 } 00603 break; 00604 case ROTATE: 00605 /* Find the next empty slot, including a possible suffix */ 00606 for (x = 0; ; x++) { 00607 found = 0; 00608 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00609 snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]); 00610 fd = open(new, O_RDONLY); 00611 if (fd > -1) { 00612 close(fd); 00613 found = 1; 00614 break; 00615 } 00616 } 00617 if (!found) { 00618 break; 00619 } 00620 } 00621 00622 /* Found an empty slot */ 00623 for (y = x; y > 0; y--) { 00624 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00625 snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]); 00626 fd = open(old, O_RDONLY); 00627 if (fd > -1) { 00628 /* Found the right suffix */ 00629 close(fd); 00630 snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]); 00631 if (rename(old, new)) { 00632 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00633 res = -1; 00634 } 00635 break; 00636 } 00637 } 00638 } 00639 00640 /* Finally, rename the current file */ 00641 snprintf(new, sizeof(new), "%s.0", filename); 00642 if (rename(filename, new)) { 00643 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00644 res = -1; 00645 } else { 00646 filename = new; 00647 } 00648 } 00649 00650 if (!ast_strlen_zero(exec_after_rotate)) { 00651 struct ast_channel *c = ast_dummy_channel_alloc(); 00652 char buf[512]; 00653 00654 pbx_builtin_setvar_helper(c, "filename", filename); 00655 pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf)); 00656 if (c) { 00657 c = ast_channel_unref(c); 00658 } 00659 if (ast_safe_system(buf) == -1) { 00660 ast_log(LOG_WARNING, "error executing '%s'\n", buf); 00661 } 00662 } 00663 return res; 00664 }
static void update_logchannels | ( | void | ) | [static] |
Definition at line 1611 of file logger.c.
References AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::components, logchannel::lineno, logchannel::list, logchannel::logmask, and make_components().
Referenced by ast_logger_register_level(), and ast_logger_unregister_level().
01612 { 01613 struct logchannel *cur; 01614 01615 AST_RWLIST_WRLOCK(&logchannels); 01616 01617 global_logmask = 0; 01618 01619 AST_RWLIST_TRAVERSE(&logchannels, cur, list) { 01620 cur->logmask = make_components(cur->components, cur->lineno); 01621 global_logmask |= cur->logmask; 01622 } 01623 01624 AST_RWLIST_UNLOCK(&logchannels); 01625 }
struct ast_cli_entry cli_logger[] [static] |
Definition at line 934 of file logger.c.
Referenced by close_logger(), and init_logger().
int close_logger_thread = 0 [static] |
Definition at line 145 of file logger.c.
Referenced by ast_log(), close_logger(), and logger_thread().
const int colors[NUMLOGLEVELS] [static] |
Colors used in the console for logging.
Definition at line 171 of file logger.c.
Referenced by logger_print_normal().
char dateformat[256] = "%b %e %T" [static] |
Definition at line 69 of file logger.c.
Referenced by build_device().
char exec_after_rotate[256] = "" [static] |
int filesize_reload_needed [static] |
unsigned int global_logmask = 0xFFFF [static] |
struct sigaction handle_SIGXFSZ [static] |
{ .sa_handler = _handle_SIGXFSZ, .sa_flags = SA_RESTART, }
Definition at line 947 of file logger.c.
Referenced by init_logger().
char hostname[MAXHOSTNAMELEN] [static] |
Definition at line 91 of file logger.c.
Referenced by app_exec(), ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), main(), netconsole(), set_destination(), sip_parse_register_line(), sip_subscribe_mwi(), and tds_load_module().
char* levels[NUMLOGLEVELS] [static] |
Logging channels used in the Asterisk logging system.
The first 16 levels are reserved for system usage, and the remaining levels are reserved for usage by dynamic levels registered via ast_logger_register_level.
Definition at line 160 of file logger.c.
Referenced by ast_log(), ast_log_vsyslog(), ast_logger_register_level(), ast_logger_unregister_level(), ast_network_puts_mutable(), handle_logger_set_level(), handle_logger_show_channels(), and make_components().
struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , } [static] |
ast_cond_t logcond [static] |
Definition at line 144 of file logger.c.
Referenced by ast_log(), close_logger(), init_logger(), and logger_thread().
struct { ... } logfiles [static] |
Referenced by ast_queue_log(), init_logger_chain(), logger_queue_init(), logger_queue_rt_start(), and reload_logger().
int logger_initialized [static] |
pthread_t logthread = AST_PTHREADT_NULL [static] |
Definition at line 143 of file logger.c.
Referenced by ast_log(), close_logger(), and init_logger().
FILE* qlog [static] |
Definition at line 147 of file logger.c.
Referenced by ast_queue_log(), close_logger(), init_logger_chain(), logger_queue_init(), logger_queue_restart(), and reload_logger().
unsigned int queue_adaptive_realtime |
char queue_log_name[256] = QUEUELOG [static] |
unsigned int queue_log_to_file |
int queuelog_init [static] |
struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } [static] |
Definition at line 206 of file logger.c.
Referenced by __ast_verbose_ap().