#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 [32] |
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 [32] |
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 127 of file logger.c.
00127 { 00128 LOGMSG_NORMAL = 0, 00129 LOGMSG_VERBOSE, 00130 };
enum logtypes |
Definition at line 98 of file logger.c.
00098 { 00099 LOGTYPE_SYSLOG, 00100 LOGTYPE_FILE, 00101 LOGTYPE_CONSOLE, 00102 };
enum rotatestrategy |
Definition at line 84 of file logger.c.
00084 { 00085 SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */ 00086 ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */ 00087 TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */ 00088 } 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 1526 of file logger.c.
References __ast_verbose_ap().
01527 { 01528 va_list ap; 01529 01530 va_start(ap, fmt); 01531 __ast_verbose_ap(file, line, func, fmt, ap); 01532 va_end(ap); 01533 }
void __ast_verbose_ap | ( | const char * | file, | |
int | line, | |||
const char * | func, | |||
const char * | fmt, | |||
va_list | ap | |||
) |
Definition at line 1490 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().
01491 { 01492 struct ast_str *buf = NULL; 01493 int res = 0; 01494 01495 if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) 01496 return; 01497 01498 if (ast_opt_timestamp) { 01499 struct timeval now; 01500 struct ast_tm tm; 01501 char date[40]; 01502 char *datefmt; 01503 01504 now = ast_tvnow(); 01505 ast_localtime(&now, &tm, NULL); 01506 ast_strftime(date, sizeof(date), dateformat, &tm); 01507 datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1); 01508 sprintf(datefmt, "%c[%s] %s", 127, date, fmt); 01509 fmt = datefmt; 01510 } else { 01511 char *tmp = alloca(strlen(fmt) + 2); 01512 sprintf(tmp, "%c%s", 127, fmt); 01513 fmt = tmp; 01514 } 01515 01516 /* Build string */ 01517 res = ast_str_set_va(&buf, 0, fmt, ap); 01518 01519 /* If the build failed then we can drop this allocated message */ 01520 if (res == AST_DYNSTR_BUILD_FAILED) 01521 return; 01522 01523 ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf)); 01524 }
static void _handle_SIGXFSZ | ( | int | sig | ) | [static] |
Definition at line 937 of file logger.c.
00938 { 00939 /* Indicate need to reload */ 00940 filesize_reload_needed = 1; 00941 }
void ast_backtrace | ( | void | ) |
Definition at line 1460 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.
01461 { 01462 #ifdef HAVE_BKTR 01463 struct ast_bt *bt; 01464 int i = 0; 01465 char **strings; 01466 01467 if (!(bt = ast_bt_create())) { 01468 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n"); 01469 return; 01470 } 01471 01472 if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) { 01473 ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' '); 01474 for (i = 3; i < bt->num_frames - 2; i++) { 01475 ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]); 01476 } 01477 01478 /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */ 01479 #undef free 01480 free(strings); 01481 } else { 01482 ast_debug(1, "Could not allocate memory for backtrace\n"); 01483 } 01484 ast_bt_destroy(bt); 01485 #else 01486 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n"); 01487 #endif /* defined(HAVE_BKTR) */ 01488 }
struct ast_bt* ast_bt_create | ( | void | ) |
Definition at line 1283 of file logger.c.
References ast_bt_get_addresses(), ast_calloc, ast_log(), and LOG_ERROR.
Referenced by ast_backtrace().
01284 { 01285 struct ast_bt *bt = ast_calloc(1, sizeof(*bt)); 01286 if (!bt) { 01287 ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n"); 01288 return NULL; 01289 } 01290 01291 bt->alloced = 1; 01292 01293 ast_bt_get_addresses(bt); 01294 01295 return bt; 01296 }
void* ast_bt_destroy | ( | struct ast_bt * | bt | ) |
Definition at line 1305 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 1298 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().
01299 { 01300 bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES); 01301 01302 return 0; 01303 }
char** ast_bt_get_symbols | ( | void ** | addresses, | |
size_t | num_frames | |||
) |
Definition at line 1314 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().
01315 { 01316 char **strings = NULL; 01317 #if defined(BETTER_BACKTRACES) 01318 int stackfr; 01319 bfd *bfdobj; /* bfd.h */ 01320 Dl_info dli; /* dlfcn.h */ 01321 long allocsize; 01322 asymbol **syms = NULL; /* bfd.h */ 01323 bfd_vma offset; /* bfd.h */ 01324 const char *lastslash; 01325 asection *section; 01326 const char *file, *func; 01327 unsigned int line; 01328 char address_str[128]; 01329 char msg[1024]; 01330 size_t strings_size; 01331 size_t *eachlen; 01332 #endif 01333 01334 #if defined(BETTER_BACKTRACES) 01335 strings_size = num_frames * sizeof(*strings); 01336 eachlen = ast_calloc(num_frames, sizeof(*eachlen)); 01337 01338 if (!(strings = ast_calloc(num_frames, sizeof(*strings)))) { 01339 return NULL; 01340 } 01341 01342 for (stackfr = 0; stackfr < num_frames; stackfr++) { 01343 int found = 0, symbolcount; 01344 01345 msg[0] = '\0'; 01346 01347 if (!dladdr(addresses[stackfr], &dli)) { 01348 continue; 01349 } 01350 01351 if (strcmp(dli.dli_fname, "asterisk") == 0) { 01352 char asteriskpath[256]; 01353 if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) { 01354 /* This will fail to find symbols */ 01355 ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n"); 01356 dli.dli_fname = "asterisk"; 01357 } 01358 } 01359 01360 lastslash = strrchr(dli.dli_fname, '/'); 01361 if ( (bfdobj = bfd_openr(dli.dli_fname, NULL)) && 01362 bfd_check_format(bfdobj, bfd_object) && 01363 (allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 && 01364 (syms = ast_malloc(allocsize)) && 01365 (symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) { 01366 01367 if (bfdobj->flags & DYNAMIC) { 01368 offset = addresses[stackfr] - dli.dli_fbase; 01369 } else { 01370 offset = addresses[stackfr] - (void *) 0; 01371 } 01372 01373 for (section = bfdobj->sections; section; section = section->next) { 01374 if ( !bfd_get_section_flags(bfdobj, section) & SEC_ALLOC || 01375 section->vma > offset || 01376 section->size + section->vma < offset) { 01377 continue; 01378 } 01379 01380 if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) { 01381 continue; 01382 } 01383 01384 /* Stack trace output */ 01385 found++; 01386 if ((lastslash = strrchr(file, '/'))) { 01387 const char *prevslash; 01388 for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--); 01389 if (prevslash >= file) { 01390 lastslash = prevslash; 01391 } 01392 } 01393 if (dli.dli_saddr == NULL) { 01394 address_str[0] = '\0'; 01395 } else { 01396 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01397 dli.dli_saddr, 01398 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01399 } 01400 snprintf(msg, sizeof(msg), "%s:%u %s()%s", 01401 lastslash ? lastslash + 1 : file, line, 01402 S_OR(func, "???"), 01403 address_str); 01404 01405 break; /* out of section iteration */ 01406 } 01407 } 01408 if (bfdobj) { 01409 bfd_close(bfdobj); 01410 if (syms) { 01411 ast_free(syms); 01412 } 01413 } 01414 01415 /* Default output, if we cannot find the information within BFD */ 01416 if (!found) { 01417 if (dli.dli_saddr == NULL) { 01418 address_str[0] = '\0'; 01419 } else { 01420 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01421 dli.dli_saddr, 01422 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01423 } 01424 snprintf(msg, sizeof(msg), "%s %s()%s", 01425 lastslash ? lastslash + 1 : dli.dli_fname, 01426 S_OR(dli.dli_sname, "<unknown>"), 01427 address_str); 01428 } 01429 01430 if (!ast_strlen_zero(msg)) { 01431 char **tmp; 01432 eachlen[stackfr] = strlen(msg); 01433 if (!(tmp = ast_realloc(strings, strings_size + eachlen[stackfr] + 1))) { 01434 ast_free(strings); 01435 strings = NULL; 01436 break; /* out of stack frame iteration */ 01437 } 01438 strings = tmp; 01439 strings[stackfr] = (char *) strings + strings_size; 01440 ast_copy_string(strings[stackfr], msg, eachlen[stackfr] + 1); 01441 strings_size += eachlen[stackfr] + 1; 01442 } 01443 } 01444 01445 if (strings) { 01446 /* Recalculate the offset pointers */ 01447 strings[0] = (char *) strings + num_frames * sizeof(*strings); 01448 for (stackfr = 1; stackfr < num_frames; stackfr++) { 01449 strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1] + 1; 01450 } 01451 } 01452 #else /* !defined(BETTER_BACKTRACES) */ 01453 strings = backtrace_symbols(addresses, num_frames); 01454 #endif /* defined(BETTER_BACKTRACES) */ 01455 return strings; 01456 }
void ast_child_verbose | ( | int | level, | |
const char * | fmt, | |||
... | ||||
) |
Definition at line 426 of file logger.c.
References ast_free, ast_malloc, and option_verbose.
Referenced by launch_script().
00427 { 00428 char *msg = NULL, *emsg = NULL, *sptr, *eptr; 00429 va_list ap, aq; 00430 int size; 00431 00432 /* Don't bother, if the level isn't that high */ 00433 if (option_verbose < level) { 00434 return; 00435 } 00436 00437 va_start(ap, fmt); 00438 va_copy(aq, ap); 00439 if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) { 00440 va_end(ap); 00441 va_end(aq); 00442 return; 00443 } 00444 va_end(ap); 00445 00446 if (!(msg = ast_malloc(size + 1))) { 00447 va_end(aq); 00448 return; 00449 } 00450 00451 vsnprintf(msg, size + 1, fmt, aq); 00452 va_end(aq); 00453 00454 if (!(emsg = ast_malloc(size * 2 + 1))) { 00455 ast_free(msg); 00456 return; 00457 } 00458 00459 for (sptr = msg, eptr = emsg; ; sptr++) { 00460 if (*sptr == '"') { 00461 *eptr++ = '\\'; 00462 } 00463 *eptr++ = *sptr; 00464 if (*sptr == '\0') { 00465 break; 00466 } 00467 } 00468 ast_free(msg); 00469 00470 fprintf(stdout, "verbose \"%s\" %d\n", emsg, level); 00471 fflush(stdout); 00472 ast_free(emsg); 00473 }
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 1189 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(), 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_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_datastores(), 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_process(), adsi_prog(), 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_get_cpeid(), ast_adsi_get_cpeinfo(), ast_adsi_load_session(), ast_adsi_transmit_message_full(), 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_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_fill_record(), ast_cel_get_ama_flag_name(), 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_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_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_waitfor_nandfds(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_reconnect(), attempt_thread(), attempt_transfer(), audiohook_read_frame_both(), auth_credentials(), auth_exec(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), background_detect_exec(), base64_helper(), base_encode(), birdbath(), blr_ebl(), blr_txt(), board_setup(), bridge_array_add(), bridge_call_thread(), 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_revert(), channel_spy(), channel_steer(), 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_freq_ic706(), 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_tx_freq(), 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(), collect_function_digits(), 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(), connect_link(), 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_ss7_error(), 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(), diskavail(), dispatch_thread_handler(), display_last_error(), display_nat_warning(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_dtmf_local(), do_forward(), do_idle_thread(), do_magic_pickup(), do_message(), do_monitor(), do_notify(), do_pktccops(), do_register(), do_reload(), do_say(), do_scheduler(), do_waiting(), donodelog(), 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(), filestream_close(), filter(), finalize_content(), find_account(), find_cache(), find_call_locked(), find_conf(), find_desc(), find_desc_usb(), 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(), flush_telem(), 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_autopatchup(), function_cop(), function_db_delete(), function_db_exists(), function_db_read(), function_db_write(), function_enum(), function_eval(), function_eval2(), function_fieldnum_helper(), function_ilink(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_remote(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g719read(), g719write(), g723_len(), g723_read(), g723_write(), g726_read(), g726_write(), g729_read(), 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_mem_set(), 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_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_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), 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_link_data(), handle_message(), handle_mousedown(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_orig(), handle_playtones(), handle_recordfile(), handle_register_message(), handle_remote_data(), handle_remote_dtmf_digit(), 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(), hidthread(), 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_template_parse(), ic706_pltocode(), ical_load_calendar(), icalendar_add_event(), icalendar_update_events(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), 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(), kickptt(), 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(), linkcount(), linkset_addsigchan(), 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_rpt_vars(), load_tech_calendars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_cleanup(), local_ast_moh_start(), local_call(), local_devicestate(), local_dtmf_helper(), 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(), 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_link_exception(), my_handle_notify_message(), my_is_dialing(), my_is_off_hook(), my_new_pri_ast_channel(), my_new_ss7_ast_channel(), my_pri_open_media(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), my_ss7_set_loopback(), 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_tell(), 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(), openserial(), 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_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_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(), radio_tune(), radius_log(), rbi_out(), rcv_mac_addr(), rcvfax_exec(), read_agent_config(), read_config(), read_config_maps(), read_exec(), read_password_from_file(), read_pipe(), read_samples(), 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_new(), resample_frame(), reset_conf(), resolve_first(), respprep(), restart_monitor(), restart_pktc_thread(), restart_session_timer(), restore_conference(), restore_gains(), retrans_pkt(), retreive_memory(), retrydial_exec(), return_exec(), revert_fax_buffers(), rollback_exec(), rotate_file(), rpt(), rpt_call(), rpt_do_lstats(), rpt_do_stats(), rpt_exec(), rpt_manager_do_stats(), rpt_master(), rpt_push_alt_macro(), rpt_tele_thread(), rpt_telemetry(), 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(), saycharstr(), saycountedadj_exec(), saycountednoun_exec(), sayfile(), saynum(), 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_usb_txt(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendfax_exec(), sendfax_t38_init(), sendimage_exec(), sendkenwood(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), serial_remote_io(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_crypto_policy(), set_ctcss_mode_ic706(), set_destination(), set_fax_t38_caps(), set_format(), set_freq_ic706(), set_full_cmd(), set_ic706(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_mode_ic706(), set_moh_exec(), set_offset_ic706(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setdtr(), setflag(), setformat(), setrem(), 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_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(), sig_ss7_add_sigchan(), sig_ss7_call(), sig_ss7_hangup(), 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(), siren14write(), siren7read(), siren7write(), skel_exec(), skinny_call(), skinny_fixup(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), skinny_transfer(), 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_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(), ss7_find_cic_gripe(), ss7_start_call(), ssl_close(), ssl_lock(), ssl_verify(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_rtp(), start_session_timer(), start_spying(), start_stream(), startelm(), starttimer(), statpost(), 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_rxcdtype(), store_rxdemod(), store_rxsdtype(), store_tone_zone_ring_cadence(), store_txmixa(), store_txmixb(), store_txtoctype(), 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(), telem_lookup(), 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(), usbradio_fixup(), usbradio_indicate(), usbradio_new(), usbradio_read(), usbradio_request(), usbradio_text(), usbradio_write(), 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_write(), wait_file(), wait_file2(), wait_for_winner(), wait_interval(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), 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(), xpmr_config(), yyerror(), and yyparse().
01190 { 01191 struct logmsg *logmsg = NULL; 01192 struct ast_str *buf = NULL; 01193 struct ast_tm tm; 01194 struct timeval now = ast_tvnow(); 01195 int res = 0; 01196 va_list ap; 01197 char datestring[256]; 01198 01199 if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) 01200 return; 01201 01202 if (level != __LOG_VERBOSE && AST_RWLIST_EMPTY(&logchannels)) { 01203 /* 01204 * we don't have the logger chain configured yet, 01205 * so just log to stdout 01206 */ 01207 int result; 01208 va_start(ap, fmt); 01209 result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */ 01210 va_end(ap); 01211 if (result != AST_DYNSTR_BUILD_FAILED) { 01212 term_filter_escapes(ast_str_buffer(buf)); 01213 fputs(ast_str_buffer(buf), stdout); 01214 } 01215 return; 01216 } 01217 01218 /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug 01219 are non-zero; LOG_DEBUG messages can still be displayed if option_debug 01220 is zero, if option_verbose is non-zero (this allows for 'level zero' 01221 LOG_DEBUG messages to be displayed, if the logmask on any channel 01222 allows it) 01223 */ 01224 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) 01225 return; 01226 01227 /* Ignore anything that never gets logged anywhere */ 01228 if (level != __LOG_VERBOSE && !(global_logmask & (1 << level))) 01229 return; 01230 01231 /* Build string */ 01232 va_start(ap, fmt); 01233 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); 01234 va_end(ap); 01235 01236 /* If the build failed, then abort and free this structure */ 01237 if (res == AST_DYNSTR_BUILD_FAILED) 01238 return; 01239 01240 /* Create a new logging message */ 01241 if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128))) 01242 return; 01243 01244 /* Copy string over */ 01245 ast_string_field_set(logmsg, message, ast_str_buffer(buf)); 01246 01247 /* Set type */ 01248 if (level == __LOG_VERBOSE) { 01249 logmsg->type = LOGMSG_VERBOSE; 01250 } else { 01251 logmsg->type = LOGMSG_NORMAL; 01252 } 01253 01254 /* Create our date/time */ 01255 ast_localtime(&now, &tm, NULL); 01256 ast_strftime(datestring, sizeof(datestring), dateformat, &tm); 01257 ast_string_field_set(logmsg, date, datestring); 01258 01259 /* Copy over data */ 01260 logmsg->level = level; 01261 logmsg->line = line; 01262 ast_string_field_set(logmsg, level_name, levels[level]); 01263 ast_string_field_set(logmsg, file, file); 01264 ast_string_field_set(logmsg, function, function); 01265 logmsg->process_id = (long) GETTID(); 01266 01267 /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */ 01268 if (logthread != AST_PTHREADT_NULL) { 01269 AST_LIST_LOCK(&logmsgs); 01270 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01271 ast_cond_signal(&logcond); 01272 AST_LIST_UNLOCK(&logmsgs); 01273 } else { 01274 logger_print_normal(logmsg); 01275 ast_free(logmsg); 01276 } 01277 01278 return; 01279 }
static void ast_log_vsyslog | ( | struct logmsg * | msg | ) | [static] |
Definition at line 948 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().
00949 { 00950 char buf[BUFSIZ]; 00951 int syslog_level = ast_syslog_priority_from_loglevel(msg->level); 00952 00953 if (syslog_level < 0) { 00954 /* we are locked here, so cannot ast_log() */ 00955 fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level); 00956 return; 00957 } 00958 00959 snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s", 00960 levels[msg->level], msg->process_id, msg->file, msg->line, msg->function, msg->message); 00961 00962 term_strip(buf, buf, strlen(buf) + 1); 00963 syslog(syslog_level, "%s", buf); 00964 }
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 1597 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().
01598 { 01599 unsigned int level; 01600 unsigned int available = 0; 01601 01602 AST_RWLIST_WRLOCK(&logchannels); 01603 01604 for (level = 0; level < ARRAY_LEN(levels); level++) { 01605 if ((level >= 16) && !available && !levels[level]) { 01606 available = level; 01607 continue; 01608 } 01609 01610 if (levels[level] && !strcasecmp(levels[level], name)) { 01611 ast_log(LOG_WARNING, 01612 "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n", 01613 name); 01614 AST_RWLIST_UNLOCK(&logchannels); 01615 01616 return -1; 01617 } 01618 } 01619 01620 if (!available) { 01621 ast_log(LOG_WARNING, 01622 "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n", 01623 name); 01624 AST_RWLIST_UNLOCK(&logchannels); 01625 01626 return -1; 01627 } 01628 01629 levels[available] = ast_strdup(name); 01630 01631 AST_RWLIST_UNLOCK(&logchannels); 01632 01633 ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available); 01634 01635 update_logchannels(); 01636 01637 return available; 01638 }
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 1640 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().
01641 { 01642 unsigned int found = 0; 01643 unsigned int x; 01644 01645 AST_RWLIST_WRLOCK(&logchannels); 01646 01647 for (x = 16; x < ARRAY_LEN(levels); x++) { 01648 if (!levels[x]) { 01649 continue; 01650 } 01651 01652 if (strcasecmp(levels[x], name)) { 01653 continue; 01654 } 01655 01656 found = 1; 01657 break; 01658 } 01659 01660 if (found) { 01661 /* take this level out of the global_logmask, to ensure that no new log messages 01662 * will be queued for it 01663 */ 01664 01665 global_logmask &= ~(1 << x); 01666 01667 ast_free(levels[x]); 01668 levels[x] = NULL; 01669 AST_RWLIST_UNLOCK(&logchannels); 01670 01671 ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x); 01672 01673 update_logchannels(); 01674 } else { 01675 AST_RWLIST_UNLOCK(&logchannels); 01676 } 01677 }
void ast_queue_log | ( | const char * | queuename, | |
const char * | callid, | |||
const char * | agent, | |||
const char * | event, | |||
const char * | fmt, | |||
... | ||||
) |
Definition at line 475 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().
00476 { 00477 va_list ap; 00478 struct timeval tv; 00479 struct ast_tm tm; 00480 char qlog_msg[8192]; 00481 int qlog_len; 00482 char time_str[30]; 00483 00484 if (!logger_initialized) { 00485 /* You are too early. We are not open yet! */ 00486 return; 00487 } 00488 if (!queuelog_init) { 00489 AST_RWLIST_WRLOCK(&logchannels); 00490 if (!queuelog_init) { 00491 /* 00492 * We have delayed initializing the queue logging system so 00493 * preloaded realtime modules can get up. We must initialize 00494 * now since someone is trying to log something. 00495 */ 00496 logger_queue_init(); 00497 queuelog_init = 1; 00498 AST_RWLIST_UNLOCK(&logchannels); 00499 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); 00500 } else { 00501 AST_RWLIST_UNLOCK(&logchannels); 00502 } 00503 } 00504 00505 if (ast_check_realtime("queue_log")) { 00506 tv = ast_tvnow(); 00507 ast_localtime(&tv, &tm, NULL); 00508 ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm); 00509 va_start(ap, fmt); 00510 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap); 00511 va_end(ap); 00512 if (logfiles.queue_adaptive_realtime) { 00513 AST_DECLARE_APP_ARGS(args, 00514 AST_APP_ARG(data)[5]; 00515 ); 00516 AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|'); 00517 /* Ensure fields are large enough to receive data */ 00518 ast_realtime_require_field("queue_log", 00519 "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")), 00520 "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")), 00521 "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")), 00522 "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")), 00523 "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")), 00524 SENTINEL); 00525 00526 /* Store the log */ 00527 ast_store_realtime("queue_log", "time", time_str, 00528 "callid", callid, 00529 "queuename", queuename, 00530 "agent", agent, 00531 "event", event, 00532 "data1", S_OR(args.data[0], ""), 00533 "data2", S_OR(args.data[1], ""), 00534 "data3", S_OR(args.data[2], ""), 00535 "data4", S_OR(args.data[3], ""), 00536 "data5", S_OR(args.data[4], ""), 00537 SENTINEL); 00538 } else { 00539 ast_store_realtime("queue_log", "time", time_str, 00540 "callid", callid, 00541 "queuename", queuename, 00542 "agent", agent, 00543 "event", event, 00544 "data", qlog_msg, 00545 SENTINEL); 00546 } 00547 00548 if (!logfiles.queue_log_to_file) { 00549 return; 00550 } 00551 } 00552 00553 if (qlog) { 00554 va_start(ap, fmt); 00555 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); 00556 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap); 00557 va_end(ap); 00558 AST_RWLIST_RDLOCK(&logchannels); 00559 if (qlog) { 00560 fprintf(qlog, "%s\n", qlog_msg); 00561 fflush(qlog); 00562 } 00563 AST_RWLIST_UNLOCK(&logchannels); 00564 } 00565 }
int ast_register_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1547 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().
01548 { 01549 struct verb *verb; 01550 01551 if (!(verb = ast_malloc(sizeof(*verb)))) 01552 return -1; 01553 01554 verb->verboser = v; 01555 01556 AST_RWLIST_WRLOCK(&verbosers); 01557 AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); 01558 AST_RWLIST_UNLOCK(&verbosers); 01559 01560 return 0; 01561 }
int ast_unregister_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1563 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.
01564 { 01565 struct verb *cur; 01566 01567 AST_RWLIST_WRLOCK(&verbosers); 01568 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { 01569 if (cur->verboser == v) { 01570 AST_RWLIST_REMOVE_CURRENT(list); 01571 ast_free(cur); 01572 break; 01573 } 01574 } 01575 AST_RWLIST_TRAVERSE_SAFE_END; 01576 AST_RWLIST_UNLOCK(&verbosers); 01577 01578 return cur ? 0 : -1; 01579 }
void ast_verbose | ( | const char * | fmt, | |
... | ||||
) |
Definition at line 1538 of file logger.c.
References __ast_verbose_ap().
01539 { 01540 va_list ap; 01541 01542 va_start(ap, fmt); 01543 __ast_verbose_ap("", 0, "", fmt, ap); 01544 va_end(ap); 01545 }
void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1150 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().
01151 { 01152 struct logchannel *f = NULL; 01153 01154 logger_initialized = 0; 01155 01156 /* Stop logger thread */ 01157 AST_LIST_LOCK(&logmsgs); 01158 close_logger_thread = 1; 01159 ast_cond_signal(&logcond); 01160 AST_LIST_UNLOCK(&logmsgs); 01161 01162 if (logthread != AST_PTHREADT_NULL) 01163 pthread_join(logthread, NULL); 01164 01165 AST_RWLIST_WRLOCK(&logchannels); 01166 01167 if (qlog) { 01168 fclose(qlog); 01169 qlog = NULL; 01170 } 01171 01172 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 01173 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01174 fclose(f->fileptr); 01175 f->fileptr = NULL; 01176 } 01177 } 01178 01179 closelog(); /* syslog */ 01180 01181 AST_RWLIST_UNLOCK(&logchannels); 01182 01183 return; 01184 }
static char* handle_logger_reload | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 804 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.
00805 { 00806 switch (cmd) { 00807 case CLI_INIT: 00808 e->command = "logger reload"; 00809 e->usage = 00810 "Usage: logger reload\n" 00811 " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n"; 00812 return NULL; 00813 case CLI_GENERATE: 00814 return NULL; 00815 } 00816 if (reload_logger(0)) { 00817 ast_cli(a->fd, "Failed to reload the logger\n"); 00818 return CLI_FAILURE; 00819 } 00820 return CLI_SUCCESS; 00821 }
static char* handle_logger_rotate | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 823 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.
00824 { 00825 switch (cmd) { 00826 case CLI_INIT: 00827 e->command = "logger rotate"; 00828 e->usage = 00829 "Usage: logger rotate\n" 00830 " Rotates and Reopens the log files.\n"; 00831 return NULL; 00832 case CLI_GENERATE: 00833 return NULL; 00834 } 00835 if (reload_logger(1)) { 00836 ast_cli(a->fd, "Failed to reload the logger and rotate log files\n"); 00837 return CLI_FAILURE; 00838 } 00839 return CLI_SUCCESS; 00840 }
static char* handle_logger_set_level | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 842 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.
00843 { 00844 int x; 00845 int state; 00846 int level = -1; 00847 00848 switch (cmd) { 00849 case CLI_INIT: 00850 e->command = "logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}"; 00851 e->usage = 00852 "Usage: logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n" 00853 " Set a specific log level to enabled/disabled for this console.\n"; 00854 return NULL; 00855 case CLI_GENERATE: 00856 return NULL; 00857 } 00858 00859 if (a->argc < 5) 00860 return CLI_SHOWUSAGE; 00861 00862 AST_RWLIST_WRLOCK(&logchannels); 00863 00864 for (x = 0; x < ARRAY_LEN(levels); x++) { 00865 if (levels[x] && !strcasecmp(a->argv[3], levels[x])) { 00866 level = x; 00867 break; 00868 } 00869 } 00870 00871 AST_RWLIST_UNLOCK(&logchannels); 00872 00873 state = ast_true(a->argv[4]) ? 1 : 0; 00874 00875 if (level != -1) { 00876 ast_console_toggle_loglevel(a->fd, level, state); 00877 ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off"); 00878 } else 00879 return CLI_SHOWUSAGE; 00880 00881 return CLI_SUCCESS; 00882 }
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 885 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.
00886 { 00887 #define FORMATL "%-35.35s %-8.8s %-9.9s " 00888 struct logchannel *chan; 00889 switch (cmd) { 00890 case CLI_INIT: 00891 e->command = "logger show channels"; 00892 e->usage = 00893 "Usage: logger show channels\n" 00894 " List configured logger channels.\n"; 00895 return NULL; 00896 case CLI_GENERATE: 00897 return NULL; 00898 } 00899 ast_cli(a->fd, FORMATL, "Channel", "Type", "Status"); 00900 ast_cli(a->fd, "Configuration\n"); 00901 ast_cli(a->fd, FORMATL, "-------", "----", "------"); 00902 ast_cli(a->fd, "-------------\n"); 00903 AST_RWLIST_RDLOCK(&logchannels); 00904 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00905 unsigned int level; 00906 00907 ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), 00908 chan->disabled ? "Disabled" : "Enabled"); 00909 ast_cli(a->fd, " - "); 00910 for (level = 0; level < ARRAY_LEN(levels); level++) { 00911 if ((chan->logmask & (1 << level)) && levels[level]) { 00912 ast_cli(a->fd, "%s ", levels[level]); 00913 } 00914 } 00915 ast_cli(a->fd, "\n"); 00916 } 00917 AST_RWLIST_UNLOCK(&logchannels); 00918 ast_cli(a->fd, "\n"); 00919 00920 return CLI_SUCCESS; 00921 }
int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 1126 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().
01127 { 01128 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01129 sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL); 01130 01131 /* start logger thread */ 01132 ast_cond_init(&logcond, NULL); 01133 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01134 ast_cond_destroy(&logcond); 01135 return -1; 01136 } 01137 01138 /* register the logger cli commands */ 01139 ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01140 01141 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01142 01143 /* create log channels */ 01144 init_logger_chain(0 /* locked */); 01145 logger_initialized = 1; 01146 01147 return 0; 01148 }
static void init_logger_chain | ( | int | locked | ) | [static] |
Definition at line 303 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_flags, 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().
00304 { 00305 struct logchannel *chan; 00306 struct ast_config *cfg; 00307 struct ast_variable *var; 00308 const char *s; 00309 struct ast_flags config_flags = { 0 }; 00310 00311 if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) { 00312 return; 00313 } 00314 00315 /* delete our list of log channels */ 00316 if (!locked) { 00317 AST_RWLIST_WRLOCK(&logchannels); 00318 } 00319 while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) { 00320 ast_free(chan); 00321 } 00322 global_logmask = 0; 00323 if (!locked) { 00324 AST_RWLIST_UNLOCK(&logchannels); 00325 } 00326 00327 errno = 0; 00328 /* close syslog */ 00329 closelog(); 00330 00331 /* If no config file, we're fine, set default options. */ 00332 if (!cfg) { 00333 if (errno) { 00334 fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno)); 00335 } else { 00336 fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n"); 00337 } 00338 if (!(chan = ast_calloc(1, sizeof(*chan)))) { 00339 return; 00340 } 00341 chan->type = LOGTYPE_CONSOLE; 00342 chan->logmask = __LOG_WARNING | __LOG_NOTICE | __LOG_ERROR; 00343 if (!locked) { 00344 AST_RWLIST_WRLOCK(&logchannels); 00345 } 00346 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00347 global_logmask |= chan->logmask; 00348 if (!locked) { 00349 AST_RWLIST_UNLOCK(&logchannels); 00350 } 00351 return; 00352 } 00353 00354 if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) { 00355 if (ast_true(s)) { 00356 if (gethostname(hostname, sizeof(hostname) - 1)) { 00357 ast_copy_string(hostname, "unknown", sizeof(hostname)); 00358 fprintf(stderr, "What box has no hostname???\n"); 00359 } 00360 } else 00361 hostname[0] = '\0'; 00362 } else 00363 hostname[0] = '\0'; 00364 if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) 00365 ast_copy_string(dateformat, s, sizeof(dateformat)); 00366 else 00367 ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat)); 00368 if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) { 00369 logfiles.queue_log = ast_true(s); 00370 } 00371 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) { 00372 logfiles.queue_log_to_file = ast_true(s); 00373 } 00374 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) { 00375 ast_copy_string(queue_log_name, s, sizeof(queue_log_name)); 00376 } 00377 if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) { 00378 ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate)); 00379 } 00380 if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) { 00381 if (strcasecmp(s, "timestamp") == 0) { 00382 rotatestrategy = TIMESTAMP; 00383 } else if (strcasecmp(s, "rotate") == 0) { 00384 rotatestrategy = ROTATE; 00385 } else if (strcasecmp(s, "sequential") == 0) { 00386 rotatestrategy = SEQUENTIAL; 00387 } else { 00388 fprintf(stderr, "Unknown rotatestrategy: %s\n", s); 00389 } 00390 } else { 00391 if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) { 00392 rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL; 00393 fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n"); 00394 } 00395 } 00396 00397 if (!locked) { 00398 AST_RWLIST_WRLOCK(&logchannels); 00399 } 00400 var = ast_variable_browse(cfg, "logfiles"); 00401 for (; var; var = var->next) { 00402 if (!(chan = make_logchannel(var->name, var->value, var->lineno))) { 00403 /* Print error message directly to the consoles since the lock is held 00404 * and we don't want to unlock with the list partially built */ 00405 ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR); 00406 ast_console_puts_mutable(var->name, __LOG_ERROR); 00407 ast_console_puts_mutable("'\n", __LOG_ERROR); 00408 continue; 00409 } 00410 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00411 global_logmask |= chan->logmask; 00412 } 00413 00414 if (qlog) { 00415 fclose(qlog); 00416 qlog = NULL; 00417 } 00418 00419 if (!locked) { 00420 AST_RWLIST_UNLOCK(&logchannels); 00421 } 00422 00423 ast_config_destroy(cfg); 00424 }
static void logger_print_normal | ( | struct logmsg * | logmsg | ) | [static] |
Print a normal log message to the channels.
Definition at line 967 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().
00968 { 00969 struct logchannel *chan = NULL; 00970 char buf[BUFSIZ]; 00971 struct verb *v = NULL; 00972 00973 if (logmsg->level == __LOG_VERBOSE) { 00974 char *tmpmsg = ast_strdupa(logmsg->message + 1); 00975 /* Iterate through the list of verbosers and pass them the log message string */ 00976 AST_RWLIST_RDLOCK(&verbosers); 00977 AST_RWLIST_TRAVERSE(&verbosers, v, list) 00978 v->verboser(logmsg->message); 00979 AST_RWLIST_UNLOCK(&verbosers); 00980 ast_string_field_set(logmsg, message, tmpmsg); 00981 } 00982 00983 AST_RWLIST_RDLOCK(&logchannels); 00984 00985 if (!AST_RWLIST_EMPTY(&logchannels)) { 00986 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00987 /* If the channel is disabled, then move on to the next one */ 00988 if (chan->disabled) 00989 continue; 00990 /* Check syslog channels */ 00991 if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) { 00992 ast_log_vsyslog(logmsg); 00993 /* Console channels */ 00994 } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) { 00995 char linestr[128]; 00996 char tmp1[80], tmp2[80], tmp3[80], tmp4[80]; 00997 00998 /* If the level is verbose, then skip it */ 00999 if (logmsg->level == __LOG_VERBOSE) 01000 continue; 01001 01002 /* Turn the numerical line number into a string */ 01003 snprintf(linestr, sizeof(linestr), "%d", logmsg->line); 01004 /* Build string to print out */ 01005 snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s", 01006 logmsg->date, 01007 term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)), 01008 logmsg->process_id, 01009 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)), 01010 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), 01011 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)), 01012 logmsg->message); 01013 /* Print out */ 01014 ast_console_puts_mutable(buf, logmsg->level); 01015 /* File channels */ 01016 } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) { 01017 int res = 0; 01018 01019 /* If no file pointer exists, skip it */ 01020 if (!chan->fileptr) { 01021 continue; 01022 } 01023 01024 /* Print out to the file */ 01025 res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s", 01026 logmsg->date, logmsg->level_name, logmsg->process_id, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ)); 01027 if (res <= 0 && !ast_strlen_zero(logmsg->message)) { 01028 fprintf(stderr, "**** Asterisk Logging Error: ***********\n"); 01029 if (errno == ENOMEM || errno == ENOSPC) 01030 fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename); 01031 else 01032 fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno)); 01033 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno)); 01034 chan->disabled = 1; 01035 } else if (res > 0) { 01036 fflush(chan->fileptr); 01037 } 01038 } 01039 } 01040 } else if (logmsg->level != __LOG_VERBOSE) { 01041 fputs(logmsg->message, stdout); 01042 } 01043 01044 AST_RWLIST_UNLOCK(&logchannels); 01045 01046 /* If we need to reload because of the file size, then do so */ 01047 if (filesize_reload_needed) { 01048 reload_logger(-1); 01049 ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 01050 } 01051 01052 return; 01053 }
static void logger_queue_init | ( | void | ) | [static] |
Definition at line 1102 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().
01103 { 01104 ast_unload_realtime("queue_log"); 01105 if (logfiles.queue_log) { 01106 char qfname[PATH_MAX]; 01107 01108 if (logger_queue_rt_start()) { 01109 return; 01110 } 01111 01112 /* Open the log file. */ 01113 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, 01114 queue_log_name); 01115 if (qlog) { 01116 /* Just in case it was already open. */ 01117 fclose(qlog); 01118 } 01119 qlog = fopen(qfname, "a"); 01120 if (!qlog) { 01121 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 01122 } 01123 } 01124 }
static int logger_queue_restart | ( | int | queue_rotate | ) | [static] |
Definition at line 703 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().
00704 { 00705 int res = 0; 00706 char qfname[PATH_MAX]; 00707 00708 if (logger_queue_rt_start()) { 00709 return res; 00710 } 00711 00712 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00713 if (qlog) { 00714 /* Just in case it was still open. */ 00715 fclose(qlog); 00716 qlog = NULL; 00717 } 00718 if (queue_rotate) { 00719 rotate_file(qfname); 00720 } 00721 00722 /* Open the log file. */ 00723 qlog = fopen(qfname, "a"); 00724 if (!qlog) { 00725 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 00726 res = -1; 00727 } 00728 return res; 00729 }
static int logger_queue_rt_start | ( | void | ) | [static] |
Definition at line 668 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().
00669 { 00670 if (ast_check_realtime("queue_log")) { 00671 if (!ast_realtime_require_field("queue_log", 00672 "time", RQ_DATETIME, 26, 00673 "data1", RQ_CHAR, 20, 00674 "data2", RQ_CHAR, 20, 00675 "data3", RQ_CHAR, 20, 00676 "data4", RQ_CHAR, 20, 00677 "data5", RQ_CHAR, 20, 00678 SENTINEL)) { 00679 logfiles.queue_adaptive_realtime = 1; 00680 } else { 00681 logfiles.queue_adaptive_realtime = 0; 00682 } 00683 00684 if (!logfiles.queue_log_to_file) { 00685 /* Don't open the log file. */ 00686 return 1; 00687 } 00688 } 00689 return 0; 00690 }
int logger_reload | ( | void | ) |
Reload logger without rotating log files.
Definition at line 796 of file logger.c.
References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.
00797 { 00798 if (reload_logger(0)) { 00799 return RESULT_FAILURE; 00800 } 00801 return RESULT_SUCCESS; 00802 }
static void* logger_thread | ( | void * | data | ) | [static] |
Actual logging thread.
Definition at line 1056 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().
01057 { 01058 struct logmsg *next = NULL, *msg = NULL; 01059 01060 for (;;) { 01061 /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */ 01062 AST_LIST_LOCK(&logmsgs); 01063 if (AST_LIST_EMPTY(&logmsgs)) { 01064 if (close_logger_thread) { 01065 break; 01066 } else { 01067 ast_cond_wait(&logcond, &logmsgs.lock); 01068 } 01069 } 01070 next = AST_LIST_FIRST(&logmsgs); 01071 AST_LIST_HEAD_INIT_NOLOCK(&logmsgs); 01072 AST_LIST_UNLOCK(&logmsgs); 01073 01074 /* Otherwise go through and process each message in the order added */ 01075 while ((msg = next)) { 01076 /* Get the next entry now so that we can free our current structure later */ 01077 next = AST_LIST_NEXT(msg, list); 01078 01079 /* Depending on the type, send it to the proper function */ 01080 logger_print_normal(msg); 01081 01082 /* Free the data since we are done */ 01083 ast_free(msg); 01084 } 01085 01086 /* If we should stop, then stop */ 01087 if (close_logger_thread) 01088 break; 01089 } 01090 01091 return NULL; 01092 }
static unsigned int make_components | ( | const char * | s, | |
int | lineno | |||
) | [static] |
Definition at line 219 of file logger.c.
References ARRAY_LEN, ast_skip_blanks(), ast_strdupa, levels, and strsep().
Referenced by make_logchannel(), and update_logchannels().
00220 { 00221 char *w; 00222 unsigned int res = 0; 00223 char *stringp = ast_strdupa(s); 00224 unsigned int x; 00225 00226 while ((w = strsep(&stringp, ","))) { 00227 w = ast_skip_blanks(w); 00228 00229 if (!strcmp(w, "*")) { 00230 res = 0xFFFFFFFF; 00231 break; 00232 } else for (x = 0; x < ARRAY_LEN(levels); x++) { 00233 if (levels[x] && !strcasecmp(w, levels[x])) { 00234 res |= (1 << x); 00235 break; 00236 } 00237 } 00238 } 00239 00240 return res; 00241 }
static struct logchannel* make_logchannel | ( | const char * | channel, | |
const char * | components, | |||
int | lineno | |||
) | [static] |
Definition at line 243 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().
00244 { 00245 struct logchannel *chan; 00246 char *facility; 00247 00248 if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1))) 00249 return NULL; 00250 00251 strcpy(chan->components, components); 00252 chan->lineno = lineno; 00253 00254 if (!strcasecmp(channel, "console")) { 00255 chan->type = LOGTYPE_CONSOLE; 00256 } else if (!strncasecmp(channel, "syslog", 6)) { 00257 /* 00258 * syntax is: 00259 * syslog.facility => level,level,level 00260 */ 00261 facility = strchr(channel, '.'); 00262 if (!facility++ || !facility) { 00263 facility = "local0"; 00264 } 00265 00266 chan->facility = ast_syslog_facility(facility); 00267 00268 if (chan->facility < 0) { 00269 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n"); 00270 ast_free(chan); 00271 return NULL; 00272 } 00273 00274 chan->type = LOGTYPE_SYSLOG; 00275 ast_copy_string(chan->filename, channel, sizeof(chan->filename)); 00276 openlog("asterisk", LOG_PID, chan->facility); 00277 } else { 00278 if (!ast_strlen_zero(hostname)) { 00279 snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s", 00280 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname); 00281 } else { 00282 snprintf(chan->filename, sizeof(chan->filename), "%s/%s", 00283 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel); 00284 } 00285 if (!(chan->fileptr = fopen(chan->filename, "a"))) { 00286 /* Can't do real logging here since we're called with a lock 00287 * so log to any attached consoles */ 00288 ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR); 00289 ast_console_puts_mutable(chan->filename, __LOG_ERROR); 00290 ast_console_puts_mutable("': ", __LOG_ERROR); 00291 ast_console_puts_mutable(strerror(errno), __LOG_ERROR); 00292 ast_console_puts_mutable("'\n", __LOG_ERROR); 00293 ast_free(chan); 00294 return NULL; 00295 } 00296 chan->type = LOGTYPE_FILE; 00297 } 00298 chan->logmask = make_components(chan->components, lineno); 00299 00300 return chan; 00301 }
static int reload_logger | ( | int | rotate | ) | [static] |
Definition at line 731 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().
00732 { 00733 int queue_rotate = rotate; 00734 struct logchannel *f; 00735 int res = 0; 00736 00737 AST_RWLIST_WRLOCK(&logchannels); 00738 00739 if (qlog) { 00740 if (rotate < 0) { 00741 /* Check filesize - this one typically doesn't need an auto-rotate */ 00742 if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */ 00743 fclose(qlog); 00744 qlog = NULL; 00745 } else { 00746 queue_rotate = 0; 00747 } 00748 } else { 00749 fclose(qlog); 00750 qlog = NULL; 00751 } 00752 } else { 00753 queue_rotate = 0; 00754 } 00755 00756 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 00757 00758 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 00759 if (f->disabled) { 00760 f->disabled = 0; /* Re-enable logging at reload */ 00761 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename); 00762 } 00763 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00764 int rotate_this = 0; 00765 if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */ 00766 /* Be more proactive about rotating massive log files */ 00767 rotate_this = 1; 00768 } 00769 fclose(f->fileptr); /* Close file */ 00770 f->fileptr = NULL; 00771 if (rotate || rotate_this) { 00772 rotate_file(f->filename); 00773 } 00774 } 00775 } 00776 00777 filesize_reload_needed = 0; 00778 00779 init_logger_chain(1 /* locked */); 00780 00781 ast_unload_realtime("queue_log"); 00782 if (logfiles.queue_log) { 00783 res = logger_queue_restart(queue_rotate); 00784 AST_RWLIST_UNLOCK(&logchannels); 00785 ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); 00786 ast_verb(1, "Asterisk Queue Logger restarted\n"); 00787 } else { 00788 AST_RWLIST_UNLOCK(&logchannels); 00789 } 00790 00791 return res; 00792 }
static int rotate_file | ( | const char * | filename | ) | [static] |
Definition at line 567 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().
00568 { 00569 char old[PATH_MAX]; 00570 char new[PATH_MAX]; 00571 int x, y, which, found, res = 0, fd; 00572 char *suffixes[4] = { "", ".gz", ".bz2", ".Z" }; 00573 00574 switch (rotatestrategy) { 00575 case SEQUENTIAL: 00576 for (x = 0; ; x++) { 00577 snprintf(new, sizeof(new), "%s.%d", filename, x); 00578 fd = open(new, O_RDONLY); 00579 if (fd > -1) 00580 close(fd); 00581 else 00582 break; 00583 } 00584 if (rename(filename, new)) { 00585 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00586 res = -1; 00587 } else { 00588 filename = new; 00589 } 00590 break; 00591 case TIMESTAMP: 00592 snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL)); 00593 if (rename(filename, new)) { 00594 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00595 res = -1; 00596 } else { 00597 filename = new; 00598 } 00599 break; 00600 case ROTATE: 00601 /* Find the next empty slot, including a possible suffix */ 00602 for (x = 0; ; x++) { 00603 found = 0; 00604 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00605 snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]); 00606 fd = open(new, O_RDONLY); 00607 if (fd > -1) { 00608 close(fd); 00609 found = 1; 00610 break; 00611 } 00612 } 00613 if (!found) { 00614 break; 00615 } 00616 } 00617 00618 /* Found an empty slot */ 00619 for (y = x; y > 0; y--) { 00620 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00621 snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]); 00622 fd = open(old, O_RDONLY); 00623 if (fd > -1) { 00624 /* Found the right suffix */ 00625 close(fd); 00626 snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]); 00627 if (rename(old, new)) { 00628 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00629 res = -1; 00630 } 00631 break; 00632 } 00633 } 00634 } 00635 00636 /* Finally, rename the current file */ 00637 snprintf(new, sizeof(new), "%s.0", filename); 00638 if (rename(filename, new)) { 00639 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00640 res = -1; 00641 } else { 00642 filename = new; 00643 } 00644 } 00645 00646 if (!ast_strlen_zero(exec_after_rotate)) { 00647 struct ast_channel *c = ast_dummy_channel_alloc(); 00648 char buf[512]; 00649 00650 pbx_builtin_setvar_helper(c, "filename", filename); 00651 pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf)); 00652 if (c) { 00653 c = ast_channel_unref(c); 00654 } 00655 if (ast_safe_system(buf) == -1) { 00656 ast_log(LOG_WARNING, "error executing '%s'\n", buf); 00657 } 00658 } 00659 return res; 00660 }
static void update_logchannels | ( | void | ) | [static] |
Definition at line 1581 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().
01582 { 01583 struct logchannel *cur; 01584 01585 AST_RWLIST_WRLOCK(&logchannels); 01586 01587 global_logmask = 0; 01588 01589 AST_RWLIST_TRAVERSE(&logchannels, cur, list) { 01590 cur->logmask = make_components(cur->components, cur->lineno); 01591 global_logmask |= cur->logmask; 01592 } 01593 01594 AST_RWLIST_UNLOCK(&logchannels); 01595 }
struct ast_cli_entry cli_logger[] [static] |
int close_logger_thread = 0 [static] |
const int colors[32] [static] |
Colors used in the console for logging.
Definition at line 176 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 96 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[32] [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 165 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 149 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 148 of file logger.c.
Referenced by ast_log(), close_logger(), and init_logger().
FILE* qlog [static] |
Definition at line 152 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] |