#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 | GETTID() getpid() |
#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) |
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,...) |
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. | |
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 logger without rotating log files. | |
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 , } |
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 |
enum logmsgtypes |
Definition at line 131 of file logger.c.
00131 { 00132 LOGMSG_NORMAL = 0, 00133 LOGMSG_VERBOSE, 00134 };
enum logtypes |
Definition at line 102 of file logger.c.
00102 { 00103 LOGTYPE_SYSLOG, 00104 LOGTYPE_FILE, 00105 LOGTYPE_CONSOLE, 00106 };
enum rotatestrategy |
Definition at line 88 of file logger.c.
00088 { 00089 SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */ 00090 ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */ 00091 TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */ 00092 } 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 1535 of file logger.c.
References __ast_verbose_ap().
01536 { 01537 va_list ap; 01538 01539 va_start(ap, fmt); 01540 __ast_verbose_ap(file, line, func, fmt, ap); 01541 va_end(ap); 01542 }
void __ast_verbose_ap | ( | const char * | file, | |
int | line, | |||
const char * | func, | |||
const char * | fmt, | |||
va_list | ap | |||
) |
Definition at line 1499 of file logger.c.
References __LOG_VERBOSE, 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().
01500 { 01501 struct ast_str *buf = NULL; 01502 int res = 0; 01503 01504 if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) 01505 return; 01506 01507 if (ast_opt_timestamp) { 01508 struct timeval now; 01509 struct ast_tm tm; 01510 char date[40]; 01511 char *datefmt; 01512 01513 now = ast_tvnow(); 01514 ast_localtime(&now, &tm, NULL); 01515 ast_strftime(date, sizeof(date), dateformat, &tm); 01516 datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1); 01517 sprintf(datefmt, "%c[%s] %s", 127, date, fmt); 01518 fmt = datefmt; 01519 } else { 01520 char *tmp = alloca(strlen(fmt) + 2); 01521 sprintf(tmp, "%c%s", 127, fmt); 01522 fmt = tmp; 01523 } 01524 01525 /* Build string */ 01526 res = ast_str_set_va(&buf, 0, fmt, ap); 01527 01528 /* If the build failed then we can drop this allocated message */ 01529 if (res == AST_DYNSTR_BUILD_FAILED) 01530 return; 01531 01532 ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf)); 01533 }
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 1469 of file logger.c.
References ast_bt::addresses, ast_bt_create(), ast_bt_destroy(), ast_bt_get_symbols(), ast_debug, ast_log(), free, LOG_DEBUG, LOG_WARNING, and ast_bt::num_frames.
01470 { 01471 #ifdef HAVE_BKTR 01472 struct ast_bt *bt; 01473 int i = 0; 01474 char **strings; 01475 01476 if (!(bt = ast_bt_create())) { 01477 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n"); 01478 return; 01479 } 01480 01481 if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) { 01482 ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' '); 01483 for (i = 3; i < bt->num_frames - 2; i++) { 01484 ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]); 01485 } 01486 01487 /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */ 01488 #undef free 01489 free(strings); 01490 } else { 01491 ast_debug(1, "Could not allocate memory for backtrace\n"); 01492 } 01493 ast_bt_destroy(bt); 01494 #else 01495 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n"); 01496 #endif /* defined(HAVE_BKTR) */ 01497 }
struct ast_bt* ast_bt_create | ( | void | ) |
Definition at line 1289 of file logger.c.
References ast_bt_get_addresses(), ast_calloc, ast_log(), and LOG_ERROR.
Referenced by ast_backtrace().
01290 { 01291 struct ast_bt *bt = ast_calloc(1, sizeof(*bt)); 01292 if (!bt) { 01293 ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n"); 01294 return NULL; 01295 } 01296 01297 bt->alloced = 1; 01298 01299 ast_bt_get_addresses(bt); 01300 01301 return bt; 01302 }
void* ast_bt_destroy | ( | struct ast_bt * | bt | ) |
Definition at line 1311 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 1304 of file logger.c.
References ast_bt::addresses, AST_MAX_BT_FRAMES, and ast_bt::num_frames.
Referenced by __ast_cond_timedwait(), __ast_cond_wait(), __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().
01305 { 01306 bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES); 01307 01308 return 0; 01309 }
char** ast_bt_get_symbols | ( | void ** | addresses, | |
size_t | num_frames | |||
) |
Definition at line 1320 of file logger.c.
References ast_calloc, ast_log(), ast_malloc, ast_utils_which(), LOG_DEBUG, and S_OR.
Referenced by ao2_bt(), and ast_backtrace().
01321 { 01322 char **strings = NULL; 01323 #if defined(BETTER_BACKTRACES) 01324 int stackfr; 01325 bfd *bfdobj; /* bfd.h */ 01326 Dl_info dli; /* dlfcn.h */ 01327 long allocsize; 01328 asymbol **syms = NULL; /* bfd.h */ 01329 bfd_vma offset; /* bfd.h */ 01330 const char *lastslash; 01331 asection *section; 01332 const char *file, *func; 01333 unsigned int line; 01334 char address_str[128]; 01335 char msg[1024]; 01336 size_t strings_size; 01337 size_t *eachlen; 01338 #endif 01339 01340 #if defined(BETTER_BACKTRACES) 01341 strings_size = num_frames * sizeof(*strings); 01342 eachlen = ast_calloc(num_frames, sizeof(*eachlen)); 01343 01344 if (!(strings = ast_calloc(num_frames, sizeof(*strings)))) { 01345 return NULL; 01346 } 01347 01348 for (stackfr = 0; stackfr < num_frames; stackfr++) { 01349 int found = 0, symbolcount; 01350 01351 msg[0] = '\0'; 01352 01353 if (!dladdr(addresses[stackfr], &dli)) { 01354 continue; 01355 } 01356 01357 if (strcmp(dli.dli_fname, "asterisk") == 0) { 01358 char asteriskpath[256]; 01359 if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) { 01360 /* This will fail to find symbols */ 01361 ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n"); 01362 dli.dli_fname = "asterisk"; 01363 } 01364 } 01365 01366 lastslash = strrchr(dli.dli_fname, '/'); 01367 if ( (bfdobj = bfd_openr(dli.dli_fname, NULL)) && 01368 bfd_check_format(bfdobj, bfd_object) && 01369 (allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 && 01370 (syms = ast_malloc(allocsize)) && 01371 (symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) { 01372 01373 if (bfdobj->flags & DYNAMIC) { 01374 offset = addresses[stackfr] - dli.dli_fbase; 01375 } else { 01376 offset = addresses[stackfr] - (void *) 0; 01377 } 01378 01379 for (section = bfdobj->sections; section; section = section->next) { 01380 if ( !bfd_get_section_flags(bfdobj, section) & SEC_ALLOC || 01381 section->vma > offset || 01382 section->size + section->vma < offset) { 01383 continue; 01384 } 01385 01386 if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) { 01387 continue; 01388 } 01389 01390 /* file can possibly be null even with a success result from bfd_find_nearest_line */ 01391 file = file ? file : ""; 01392 01393 /* Stack trace output */ 01394 found++; 01395 if ((lastslash = strrchr(file, '/'))) { 01396 const char *prevslash; 01397 for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--); 01398 if (prevslash >= file) { 01399 lastslash = prevslash; 01400 } 01401 } 01402 if (dli.dli_saddr == NULL) { 01403 address_str[0] = '\0'; 01404 } else { 01405 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01406 dli.dli_saddr, 01407 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01408 } 01409 snprintf(msg, sizeof(msg), "%s:%u %s()%s", 01410 lastslash ? lastslash + 1 : file, line, 01411 S_OR(func, "???"), 01412 address_str); 01413 01414 break; /* out of section iteration */ 01415 } 01416 } 01417 if (bfdobj) { 01418 bfd_close(bfdobj); 01419 if (syms) { 01420 ast_free(syms); 01421 } 01422 } 01423 01424 /* Default output, if we cannot find the information within BFD */ 01425 if (!found) { 01426 if (dli.dli_saddr == NULL) { 01427 address_str[0] = '\0'; 01428 } else { 01429 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01430 dli.dli_saddr, 01431 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01432 } 01433 snprintf(msg, sizeof(msg), "%s %s()%s", 01434 lastslash ? lastslash + 1 : dli.dli_fname, 01435 S_OR(dli.dli_sname, "<unknown>"), 01436 address_str); 01437 } 01438 01439 if (!ast_strlen_zero(msg)) { 01440 char **tmp; 01441 eachlen[stackfr] = strlen(msg); 01442 if (!(tmp = ast_realloc(strings, strings_size + eachlen[stackfr] + 1))) { 01443 ast_free(strings); 01444 strings = NULL; 01445 break; /* out of stack frame iteration */ 01446 } 01447 strings = tmp; 01448 strings[stackfr] = (char *) strings + strings_size; 01449 ast_copy_string(strings[stackfr], msg, eachlen[stackfr] + 1); 01450 strings_size += eachlen[stackfr] + 1; 01451 } 01452 } 01453 01454 if (strings) { 01455 /* Recalculate the offset pointers */ 01456 strings[0] = (char *) strings + num_frames * sizeof(*strings); 01457 for (stackfr = 1; stackfr < num_frames; stackfr++) { 01458 strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1] + 1; 01459 } 01460 } 01461 #else /* !defined(BETTER_BACKTRACES) */ 01462 strings = backtrace_symbols(addresses, num_frames); 01463 #endif /* defined(BETTER_BACKTRACES) */ 01464 return strings; 01465 }
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, | |||
... | ||||
) |
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.
level | Type of log event | |
file | Will be provided by the AST_LOG_* macro | |
line | Will be provided by the AST_LOG_* macro | |
function | Will be provided by the AST_LOG_* macro | |
fmt | This is what is important. The format is the same as your favorite breed of printf. You know how that works, right? :-) |
Definition at line 1192 of file logger.c.
References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc_with_stringfields, ast_cond_signal, AST_DYNSTR_BUILD_FAILED, ast_free, 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, GETTID, levels, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, LOGMSG_VERBOSE, logthread, option_debug, option_verbose, and term_filter_escapes().
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_format_register(), __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(), __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(), _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_channel_read(), acf_curl_helper(), acf_curlopt_helper(), acf_curlopt_write(), acf_cut_exec(), acf_cut_exec2(), acf_faxopt_read(), acf_faxopt_write(), 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_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_indicate(), agent_new(), agent_read(), agent_request(), agent_set_base_channel(), 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_group_match_get_count(), ast_app_run_macro(), 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_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_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_get(), 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_el_read_char(), 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_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_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_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_tls_read_conf(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_tryconnect(), 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_wait_for_output(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_thread(), attempt_transfer(), au_seek(), au_trunc(), audiohook_read_frame_both(), auth_credentials(), auth_exec(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), background_detect_exec(), base64_helper(), base_encode(), blr_ebl(), blr_txt(), board_setup(), 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_filename(), 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(), canary_thread(), canmatch(), careful_write(), cb_events(), cc_available(), cc_caller_requested(), cc_esc_publish_handler(), 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_access(), check_app_args(), 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_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_mailbox(), 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_span_helper(), 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_accept_r2_call_exec(), dahdi_answer(), dahdi_ast_cause_to_r2_cause(), 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_r2_disconnect_call(), dahdi_r2_get_channel_category(), dahdi_r2_get_link(), dahdi_r2_on_call_accepted(), dahdi_r2_on_call_init(), dahdi_r2_on_call_offered(), dahdi_r2_on_line_blocked(), dahdi_r2_on_line_idle(), dahdi_r2_on_os_error(), dahdi_r2_on_protocol_error(), dahdi_r2_set_context(), dahdi_r2_write_log(), dahdi_read(), dahdi_request(), dahdi_ring_phone(), dahdi_send_callrerouting_facility_exec(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), 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(), 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_idle_thread(), 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_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(), eventhandler(), 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(), ext_cmp1(), 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_desc(), find_details(), 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(), framein(), func_args(), func_channel_read(), func_channel_write_real(), func_channels_read(), func_check_sipdomain(), func_header_read(), func_inheritance_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_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_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(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_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(), gui_init(), 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_mousedown(), 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_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(), hint_read(), iax2_ack_registry(), 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(), keypad_cfg_read(), keypad_pick_up(), keypad_setup(), keypad_toggle(), kp_match_area(), 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_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(), meetmemute(), memcpy_decrypt(), memcpy_encrypt(), message_template_build(), message_template_parse_emailbody(), message_template_parse_filebody(), mfcr2_monitor(), 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(), 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_dchan_exception(), my_handle_dtmf(), my_handle_notify_message(), my_is_dialing(), my_is_off_hook(), my_new_pri_ast_channel(), my_pri_dial_digits(), my_pri_ss7_open_media(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), my_start_cid_detect(), my_wink(), my_x_handler(), 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(), 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(), ospauth_exec(), ospfinished_exec(), 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_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_saynumber(), pbx_builtin_serialize_variables(), pbx_builtin_setvar(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_exec(), pbx_extension_helper(), pbx_find_extension(), 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(), pidf_validate_presence(), pidf_validate_tuple(), 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(), prepare_pri(), pri_active_dchan_index(), pri_check_restart(), pri_create_spanmap(), pri_create_trunkgroup(), pri_dchannel(), pri_find_fixup_principle(), pri_fixup_principle(), pri_resolve_span(), pri_send_callrerouting_facility_exec(), pri_ss_thread(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_applicationmap_line(), process_ast_dsp(), process_cn_rfc3389(), 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_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(), read_pipe(), readexten_exec(), readfile_exec(), readmimefile(), realtime_curl(), realtime_destroy_handler(), realtime_directory(), 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_by_addr(), realtime_peer_get_sippeer_helper(), realtime_pgsql(), realtime_require_handler(), realtime_store_handler(), realtime_update2_handler(), realtime_update_handler(), 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(), restart_session_timer(), restore_conference(), restore_gains(), retrans_pkt(), retrydial_exec(), return_exec(), revert_fax_buffers(), 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(), sdl_setup(), sdp_crypto_activate(), 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(), sig_pri_call(), sig_pri_digit_begin(), sig_pri_get_orig_dialstring(), sig_pri_handle_hold(), sig_pri_handle_retrieve(), sig_pri_handle_subcmds(), sig_pri_hangup(), sig_pri_indicate(), sig_pri_make_cc_dialstring(), sig_pri_request(), sig_pri_send_aoce_termination_request(), sig_pri_start_pri(), 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_parse_host(), sip_parse_register_line(), sip_pidf_validate(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_read(), sip_reg_timeout(), sip_register(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_setoption(), sip_sipredirect(), sip_st_alloc(), sip_subscribe_mwi(), 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_messagerx2(), sms_process(), sms_readfile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), soundcard_init(), soundcard_writeframe(), span_message(), spandsp_fax_new(), 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_close(), 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(), stop_session_timer(), 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(), switch_video_out(), sysinfo_helper(), syslog_log(), system_exec_helper(), t38_tx_packet_handler(), tdd_feed(), tdd_new(), tds_error_handler(), tds_load_module(), tds_log(), tds_message_handler(), testclient_exec(), testserver_exec(), 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(), 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_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), turn_on_off(), 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_ss(), unistim_write(), unistimsock_read(), unload_module(), unlock_read(), unref_mansession(), unregister_exten(), unshift_push(), 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(), uridecode(), uriencode(), 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_winner(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_trunc(), wav_write(), write_byte(), 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().
01193 { 01194 struct logmsg *logmsg = NULL; 01195 struct ast_str *buf = NULL; 01196 struct ast_tm tm; 01197 struct timeval now = ast_tvnow(); 01198 int res = 0; 01199 va_list ap; 01200 char datestring[256]; 01201 01202 if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) 01203 return; 01204 01205 if (level != __LOG_VERBOSE && AST_RWLIST_EMPTY(&logchannels)) { 01206 /* 01207 * we don't have the logger chain configured yet, 01208 * so just log to stdout 01209 */ 01210 int result; 01211 va_start(ap, fmt); 01212 result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */ 01213 va_end(ap); 01214 if (result != AST_DYNSTR_BUILD_FAILED) { 01215 term_filter_escapes(ast_str_buffer(buf)); 01216 fputs(ast_str_buffer(buf), stdout); 01217 } 01218 return; 01219 } 01220 01221 /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug 01222 are non-zero; LOG_DEBUG messages can still be displayed if option_debug 01223 is zero, if option_verbose is non-zero (this allows for 'level zero' 01224 LOG_DEBUG messages to be displayed, if the logmask on any channel 01225 allows it) 01226 */ 01227 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) 01228 return; 01229 01230 /* Ignore anything that never gets logged anywhere */ 01231 if (level != __LOG_VERBOSE && !(global_logmask & (1 << level))) 01232 return; 01233 01234 /* Build string */ 01235 va_start(ap, fmt); 01236 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); 01237 va_end(ap); 01238 01239 /* If the build failed, then abort and free this structure */ 01240 if (res == AST_DYNSTR_BUILD_FAILED) 01241 return; 01242 01243 /* Create a new logging message */ 01244 if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128))) 01245 return; 01246 01247 /* Copy string over */ 01248 ast_string_field_set(logmsg, message, ast_str_buffer(buf)); 01249 01250 /* Set type */ 01251 if (level == __LOG_VERBOSE) { 01252 logmsg->type = LOGMSG_VERBOSE; 01253 } else { 01254 logmsg->type = LOGMSG_NORMAL; 01255 } 01256 01257 /* Create our date/time */ 01258 ast_localtime(&now, &tm, NULL); 01259 ast_strftime(datestring, sizeof(datestring), dateformat, &tm); 01260 ast_string_field_set(logmsg, date, datestring); 01261 01262 /* Copy over data */ 01263 logmsg->level = level; 01264 logmsg->line = line; 01265 ast_string_field_set(logmsg, level_name, levels[level]); 01266 ast_string_field_set(logmsg, file, file); 01267 ast_string_field_set(logmsg, function, function); 01268 logmsg->process_id = (long) GETTID(); 01269 01270 /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */ 01271 if (logthread != AST_PTHREADT_NULL) { 01272 AST_LIST_LOCK(&logmsgs); 01273 if (close_logger_thread) { 01274 /* Logger is either closing or closed. We cannot log this message. */ 01275 ast_free(logmsg); 01276 } else { 01277 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01278 ast_cond_signal(&logcond); 01279 } 01280 AST_LIST_UNLOCK(&logmsgs); 01281 } else { 01282 logger_print_normal(logmsg); 01283 ast_free(logmsg); 01284 } 01285 }
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 1606 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().
01607 { 01608 unsigned int level; 01609 unsigned int available = 0; 01610 01611 AST_RWLIST_WRLOCK(&logchannels); 01612 01613 for (level = 0; level < ARRAY_LEN(levels); level++) { 01614 if ((level >= 16) && !available && !levels[level]) { 01615 available = level; 01616 continue; 01617 } 01618 01619 if (levels[level] && !strcasecmp(levels[level], name)) { 01620 ast_log(LOG_WARNING, 01621 "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n", 01622 name); 01623 AST_RWLIST_UNLOCK(&logchannels); 01624 01625 return -1; 01626 } 01627 } 01628 01629 if (!available) { 01630 ast_log(LOG_WARNING, 01631 "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n", 01632 name); 01633 AST_RWLIST_UNLOCK(&logchannels); 01634 01635 return -1; 01636 } 01637 01638 levels[available] = ast_strdup(name); 01639 01640 AST_RWLIST_UNLOCK(&logchannels); 01641 01642 ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available); 01643 01644 update_logchannels(); 01645 01646 return available; 01647 }
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 1649 of file logger.c.
References ARRAY_LEN, ast_debug, ast_free, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, levels, and update_logchannels().
Referenced by load_module(), and unload_module().
01650 { 01651 unsigned int found = 0; 01652 unsigned int x; 01653 01654 AST_RWLIST_WRLOCK(&logchannels); 01655 01656 for (x = 16; x < ARRAY_LEN(levels); x++) { 01657 if (!levels[x]) { 01658 continue; 01659 } 01660 01661 if (strcasecmp(levels[x], name)) { 01662 continue; 01663 } 01664 01665 found = 1; 01666 break; 01667 } 01668 01669 if (found) { 01670 /* take this level out of the global_logmask, to ensure that no new log messages 01671 * will be queued for it 01672 */ 01673 01674 global_logmask &= ~(1 << x); 01675 01676 ast_free(levels[x]); 01677 levels[x] = NULL; 01678 AST_RWLIST_UNLOCK(&logchannels); 01679 01680 ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x); 01681 01682 update_logchannels(); 01683 } else { 01684 AST_RWLIST_UNLOCK(&logchannels); 01685 } 01686 }
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(), 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(), 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 1556 of file logger.c.
References ast_malloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and verb::list.
Referenced by ast_makesocket(), and main().
01557 { 01558 struct verb *verb; 01559 01560 if (!(verb = ast_malloc(sizeof(*verb)))) 01561 return -1; 01562 01563 verb->verboser = v; 01564 01565 AST_RWLIST_WRLOCK(&verbosers); 01566 AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); 01567 AST_RWLIST_UNLOCK(&verbosers); 01568 01569 return 0; 01570 }
int ast_unregister_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1572 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, verb::list, and verb::verboser.
01573 { 01574 struct verb *cur; 01575 01576 AST_RWLIST_WRLOCK(&verbosers); 01577 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { 01578 if (cur->verboser == v) { 01579 AST_RWLIST_REMOVE_CURRENT(list); 01580 ast_free(cur); 01581 break; 01582 } 01583 } 01584 AST_RWLIST_TRAVERSE_SAFE_END; 01585 AST_RWLIST_UNLOCK(&verbosers); 01586 01587 return cur ? 0 : -1; 01588 }
void ast_verbose | ( | const char * | fmt, | |
... | ||||
) |
Definition at line 1547 of file logger.c.
References __ast_verbose_ap().
01548 { 01549 va_list ap; 01550 01551 va_start(ap, fmt); 01552 __ast_verbose_ap("", 0, "", fmt, ap); 01553 va_end(ap); 01554 }
void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1155 of file logger.c.
References ast_cond_signal, AST_LIST_LOCK, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, close_logger_thread, f, logchannel::list, logcond, logthread, and qlog.
Referenced by really_quit().
01156 { 01157 struct logchannel *f = NULL; 01158 01159 logger_initialized = 0; 01160 01161 /* Stop logger thread */ 01162 AST_LIST_LOCK(&logmsgs); 01163 close_logger_thread = 1; 01164 ast_cond_signal(&logcond); 01165 AST_LIST_UNLOCK(&logmsgs); 01166 01167 if (logthread != AST_PTHREADT_NULL) 01168 pthread_join(logthread, NULL); 01169 01170 AST_RWLIST_WRLOCK(&logchannels); 01171 01172 if (qlog) { 01173 fclose(qlog); 01174 qlog = NULL; 01175 } 01176 01177 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 01178 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01179 fclose(f->fileptr); 01180 f->fileptr = NULL; 01181 } 01182 } 01183 01184 closelog(); /* syslog */ 01185 01186 AST_RWLIST_UNLOCK(&logchannels); 01187 }
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 1131 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_pthread_create, cli_logger, init_logger_chain(), logcond, logger_thread(), and logthread.
Referenced by main().
01132 { 01133 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01134 sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL); 01135 01136 /* start logger thread */ 01137 ast_cond_init(&logcond, NULL); 01138 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01139 ast_cond_destroy(&logcond); 01140 return -1; 01141 } 01142 01143 /* register the logger cli commands */ 01144 ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01145 01146 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01147 01148 /* create log channels */ 01149 init_logger_chain(0 /* locked */); 01150 logger_initialized = 1; 01151 01152 return 0; 01153 }
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_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, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ROTATE, SEQUENTIAL, TIMESTAMP, 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 1107 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().
01108 { 01109 ast_unload_realtime("queue_log"); 01110 if (logfiles.queue_log) { 01111 char qfname[PATH_MAX]; 01112 01113 if (logger_queue_rt_start()) { 01114 return; 01115 } 01116 01117 /* Open the log file. */ 01118 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, 01119 queue_log_name); 01120 if (qlog) { 01121 /* Just in case it was already open. */ 01122 fclose(qlog); 01123 } 01124 qlog = fopen(qfname, "a"); 01125 if (!qlog) { 01126 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 01127 } 01128 } 01129 }
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 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, logmsgs::lock, 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 /* If we should stop, then stop */ 01092 if (close_logger_thread) 01093 break; 01094 } 01095 01096 return NULL; 01097 }
static unsigned int make_components | ( | const char * | s, | |
int | lineno | |||
) | [static] |
Definition at line 223 of file logger.c.
References ARRAY_LEN, ast_skip_blanks(), ast_strdupa, levels, and strsep().
Referenced by make_logchannel(), and update_logchannels().
00224 { 00225 char *w; 00226 unsigned int res = 0; 00227 char *stringp = ast_strdupa(s); 00228 unsigned int x; 00229 00230 while ((w = strsep(&stringp, ","))) { 00231 w = ast_skip_blanks(w); 00232 00233 if (!strcmp(w, "*")) { 00234 res = 0xFFFFFFFF; 00235 break; 00236 } else for (x = 0; x < ARRAY_LEN(levels); x++) { 00237 if (levels[x] && !strcasecmp(w, levels[x])) { 00238 res |= (1 << x); 00239 break; 00240 } 00241 } 00242 } 00243 00244 return res; 00245 }
static struct logchannel* make_logchannel | ( | const char * | channel, | |
const char * | components, | |||
int | lineno | |||
) | [static] |
Definition at line 247 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(), errno, logchannel::facility, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, and make_components().
Referenced by init_logger_chain().
00248 { 00249 struct logchannel *chan; 00250 char *facility; 00251 00252 if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1))) 00253 return NULL; 00254 00255 strcpy(chan->components, components); 00256 chan->lineno = lineno; 00257 00258 if (!strcasecmp(channel, "console")) { 00259 chan->type = LOGTYPE_CONSOLE; 00260 } else if (!strncasecmp(channel, "syslog", 6)) { 00261 /* 00262 * syntax is: 00263 * syslog.facility => level,level,level 00264 */ 00265 facility = strchr(channel, '.'); 00266 if (!facility++ || !facility) { 00267 facility = "local0"; 00268 } 00269 00270 chan->facility = ast_syslog_facility(facility); 00271 00272 if (chan->facility < 0) { 00273 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n"); 00274 ast_free(chan); 00275 return NULL; 00276 } 00277 00278 chan->type = LOGTYPE_SYSLOG; 00279 ast_copy_string(chan->filename, channel, sizeof(chan->filename)); 00280 openlog("asterisk", LOG_PID, chan->facility); 00281 } else { 00282 if (!ast_strlen_zero(hostname)) { 00283 snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s", 00284 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname); 00285 } else { 00286 snprintf(chan->filename, sizeof(chan->filename), "%s/%s", 00287 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel); 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, EVENT_FLAG_SYSTEM, f, 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 1590 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().
01591 { 01592 struct logchannel *cur; 01593 01594 AST_RWLIST_WRLOCK(&logchannels); 01595 01596 global_logmask = 0; 01597 01598 AST_RWLIST_TRAVERSE(&logchannels, cur, list) { 01599 cur->logmask = make_components(cur->components, cur->lineno); 01600 global_logmask |= cur->logmask; 01601 } 01602 01603 AST_RWLIST_UNLOCK(&logchannels); 01604 }
struct ast_cli_entry cli_logger[] [static] |
int close_logger_thread = 0 [static] |
Definition at line 154 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 180 of file logger.c.
Referenced by logger_print_normal().
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] |
Initial value:
{ .sa_handler = _handle_SIGXFSZ, .sa_flags = SA_RESTART, }
char hostname[MAXHOSTNAMELEN] [static] |
Definition at line 100 of file logger.c.
Referenced by app_exec(), ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), 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 169 of file logger.c.
Referenced by ast_console_toggle_loglevel(), 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 153 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 152 of file logger.c.
Referenced by ast_log(), close_logger(), and init_logger().
FILE* qlog [static] |
Definition at line 156 of file logger.c.
Referenced by ast_queue_log(), close_logger(), 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] |