#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 "asterisk/buildinfo.h"
#include "asterisk/ast_version.h"
#include <signal.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>

Go to the source code of this file.
Data Structures | |
| struct | logchannel |
| struct | logchannels |
| struct | logmsg |
| struct | logmsgs |
| struct | verb |
| struct | verbosers |
Defines | |
| #define | FORMATL "%-35.35s %-8.8s %-9.9s " |
| #define | LOG_BUF_INIT_SIZE 256 |
| #define | 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 | __fini_logchannels (void) |
| static void | __fini_verbosers (void) |
| static void | __init_log_buf (void) |
| static void | __init_logchannels (void) |
| static void | __init_verbose_buf (void) |
| static void | __init_verbosers (void) |
| static void | _handle_SIGXFSZ (int sig) |
| void | ast_backtrace (void) |
| void | ast_child_verbose (int level, const char *fmt,...) |
| void | ast_log (int level, const char *file, int line, const char *function, const char *fmt,...) |
| send log messages to syslog and/or the console | |
| static void | ast_log_vsyslog (struct logmsg *msg) |
| int | ast_logger_register_level (const char *name) |
| Register a new logger level. | |
| void | ast_logger_unregister_level (const char *name) |
| Unregister a previously registered logger level. | |
| void | ast_queue_log (const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...) |
| int | ast_register_verbose (void(*v)(const char *string)) |
| int | ast_unregister_verbose (void(*v)(const char *string)) |
| void | ast_verbose (const char *fmt,...) |
| void | close_logger (void) |
| static char * | handle_logger_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | handle_logger_rotate (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | handle_logger_set_level (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static char * | handle_logger_show_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| CLI command to show logging system configuration. | |
| int | init_logger (void) |
| static void | init_logger_chain (int locked, const char *altconf) |
| static void | logger_print_normal (struct logmsg *logmsg) |
| Print a normal log message to the channels. | |
| static void | logger_queue_init (void) |
| static int | logger_queue_restart (int queue_rotate) |
| static int | logger_queue_rt_start (void) |
| int | logger_reload (void) |
| Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload). | |
| static void * | logger_thread (void *data) |
| Actual logging thread. | |
| static unsigned int | make_components (const char *s, int lineno) |
| static struct logchannel * | make_logchannel (const char *channel, const char *components, int lineno) |
| static int | reload_logger (int rotate, const char *altconf) |
| 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 120 of file logger.c.
00120 { 00121 LOGMSG_NORMAL = 0, 00122 LOGMSG_VERBOSE, 00123 };
| enum logtypes |
Definition at line 91 of file logger.c.
00091 { 00092 LOGTYPE_SYSLOG, 00093 LOGTYPE_FILE, 00094 LOGTYPE_CONSOLE, 00095 };
| enum rotatestrategy |
Definition at line 77 of file logger.c.
00077 { 00078 SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */ 00079 ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */ 00080 TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */ 00081 } 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 1531 of file logger.c.
References __ast_verbose_ap().
01532 { 01533 va_list ap; 01534 01535 va_start(ap, fmt); 01536 __ast_verbose_ap(file, line, func, fmt, ap); 01537 va_end(ap); 01538 }
| void __ast_verbose_ap | ( | const char * | file, | |
| int | line, | |||
| const char * | func, | |||
| const char * | fmt, | |||
| va_list | ap | |||
| ) |
Definition at line 1495 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().
01496 { 01497 struct ast_str *buf = NULL; 01498 int res = 0; 01499 01500 if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) 01501 return; 01502 01503 if (ast_opt_timestamp) { 01504 struct timeval now; 01505 struct ast_tm tm; 01506 char date[40]; 01507 char *datefmt; 01508 01509 now = ast_tvnow(); 01510 ast_localtime(&now, &tm, NULL); 01511 ast_strftime(date, sizeof(date), dateformat, &tm); 01512 datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1); 01513 sprintf(datefmt, "%c[%s] %s", 127, date, fmt); 01514 fmt = datefmt; 01515 } else { 01516 char *tmp = alloca(strlen(fmt) + 2); 01517 sprintf(tmp, "%c%s", 127, fmt); 01518 fmt = tmp; 01519 } 01520 01521 /* Build string */ 01522 res = ast_str_set_va(&buf, 0, fmt, ap); 01523 01524 /* If the build failed then we can drop this allocated message */ 01525 if (res == AST_DYNSTR_BUILD_FAILED) 01526 return; 01527 01528 ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf)); 01529 }
| static void _handle_SIGXFSZ | ( | int | sig | ) | [static] |
Definition at line 942 of file logger.c.
00943 { 00944 /* Indicate need to reload */ 00945 filesize_reload_needed = 1; 00946 }
| void ast_backtrace | ( | void | ) |
Definition at line 1465 of file logger.c.
References ast_debug, ast_log(), free, and LOG_WARNING.
01466 { 01467 #ifdef HAVE_BKTR 01468 struct ast_bt *bt; 01469 int i = 0; 01470 char **strings; 01471 01472 if (!(bt = ast_bt_create())) { 01473 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n"); 01474 return; 01475 } 01476 01477 if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) { 01478 ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' '); 01479 for (i = 3; i < bt->num_frames - 2; i++) { 01480 ast_debug(1, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]); 01481 } 01482 01483 /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */ 01484 #undef free 01485 free(strings); 01486 } else { 01487 ast_debug(1, "Could not allocate memory for backtrace\n"); 01488 } 01489 ast_bt_destroy(bt); 01490 #else 01491 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n"); 01492 #endif /* defined(HAVE_BKTR) */ 01493 }
| void ast_child_verbose | ( | int | level, | |
| const char * | fmt, | |||
| ... | ||||
| ) |
Definition at line 431 of file logger.c.
References ast_free, ast_malloc, and option_verbose.
Referenced by launch_script().
00432 { 00433 char *msg = NULL, *emsg = NULL, *sptr, *eptr; 00434 va_list ap, aq; 00435 int size; 00436 00437 /* Don't bother, if the level isn't that high */ 00438 if (option_verbose < level) { 00439 return; 00440 } 00441 00442 va_start(ap, fmt); 00443 va_copy(aq, ap); 00444 if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) { 00445 va_end(ap); 00446 va_end(aq); 00447 return; 00448 } 00449 va_end(ap); 00450 00451 if (!(msg = ast_malloc(size + 1))) { 00452 va_end(aq); 00453 return; 00454 } 00455 00456 vsnprintf(msg, size + 1, fmt, aq); 00457 va_end(aq); 00458 00459 if (!(emsg = ast_malloc(size * 2 + 1))) { 00460 ast_free(msg); 00461 return; 00462 } 00463 00464 for (sptr = msg, eptr = emsg; ; sptr++) { 00465 if (*sptr == '"') { 00466 *eptr++ = '\\'; 00467 } 00468 *eptr++ = *sptr; 00469 if (*sptr == '\0') { 00470 break; 00471 } 00472 } 00473 ast_free(msg); 00474 00475 fprintf(stdout, "verbose \"%s\" %d\n", emsg, level); 00476 fflush(stdout); 00477 ast_free(emsg); 00478 }
| void ast_log | ( | int | level, | |
| const char * | file, | |||
| int | line, | |||
| const char * | function, | |||
| const char * | fmt, | |||
| ... | ||||
| ) |
send log messages to syslog and/or the console
Used for sending a log message This is the standard logger function. Probably the only way you will invoke it would be something like this: ast_log(AST_LOG_WHATEVER, "Problem with the %s Captain. We should get some more. Will %d be enough?\n", "flux capacitor", 10); where WHATEVER is one of ERROR, DEBUG, EVENT, NOTICE, or WARNING depending on which log you wish to output to. These are implemented as macros, that will provide the function with the needed arguments.
Definition at line 1194 of file logger.c.
References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc_with_stringfields, ast_cond_signal, AST_DYNSTR_BUILD_FAILED, ast_free, ast_get_tid(), AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), AST_PTHREADT_NULL, AST_RWLIST_EMPTY, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_string_field_set, ast_tvnow(), logmsg::level, levels, logmsg::line, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, LOGMSG_VERBOSE, logthread, logmsg::lwp, option_debug, option_verbose, term_filter_escapes(), and logmsg::type.
Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __analog_handle_event(), __analog_ss_thread(), __ast_answer(), __ast_bridge_technology_register(), __ast_channel_alloc_ap(), __ast_channel_masquerade(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_data_register(), __ast_data_unregister(), __ast_dsp_call_progress(), __ast_format_def_register(), __ast_http_load(), __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(), _dsp_init(), _enum_array_map(), _extension_match_core(), _lookup_timer(), _macro_exec(), _moh_register(), _pgsql_exec(), _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_sprintf(), acf_strftime(), acf_strptime(), acf_transaction_write(), acf_vm_info(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_hangup(), action_kick_last(), action_playback(), action_playback_and_continue(), 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_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_static_payload(), 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_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_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(), answer_call(), anti_injection(), aoc_append_ie(), aoc_parse_ie(), app_exec(), append_ie(), append_mailbox(), append_row_to_cfg(), apply_general_options(), apply_option(), apply_options_full(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_add_hint(), 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_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_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_timelimit(), ast_calendar_register(), ast_call_forward(), ast_careful_fwrite(), ast_carefulwrite(), ast_cc_get_param(), ast_cc_set_param(), ast_cdr_alloc(), ast_cdr_congestion(), 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_change_hint(), ast_channel_bridge(), ast_channel_by_exten_cb(), ast_channel_by_name_cb(), ast_channel_by_uniqueid_cb(), ast_channel_cmp_cb(), 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_del(), ast_db_deltree(), 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_call_progress(), ast_dsp_process(), ast_dsp_silence_noise_with_energy(), 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_find_ourip(), ast_format_attr_reg_interface(), ast_format_def_unregister(), ast_format_str_reduce(), 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_msg_tech_register(), ast_msg_tech_unregister(), 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_number_full_pt(), ast_sched_del(), ast_sched_runq(), ast_sched_start_thread(), 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_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_srtp_unprotect(), ast_stopstream(), ast_str_substitute_variables_full(), ast_streamfile(), ast_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_close_session_file(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_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_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(), auth_credentials(), auth_exec(), auth_http_callback(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), background_detect_exec(), base64_helper(), base_encode(), birdbath(), blr_ebl(), blr_txt(), 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_filename(), build_gateway(), build_mapping(), build_parkinglot(), build_peer(), build_route(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), bump_gains(), cache_get_callno_locked(), calc_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_handle_publish_error(), cccancel_exec(), cdata(), cdr_handler(), cdr_merge_vars(), celt_get_val(), celt_isset(), celt_set(), chan_misdn_log(), chan_ringing(), chanavail_exec(), channel_admin_exec(), channel_revert(), channel_spy(), channel_steer(), channel_to_session(), chanspy_exec(), check_abstract_reference(), check_access(), check_app_args(), check_auth(), check_break(), check_compat(), check_context_names(), check_continue(), check_day(), check_dow(), check_event_type(), check_expr2_input(), check_for_conference(), check_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_switch_expr(), check_timerange(), check_tx_freq(), check_user_full(), check_vars(), check_via(), cleanup_connection(), cleanup_module(), clear_caller(), clear_dialed_interfaces(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), cli_fax_show_session(), 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_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_rec_name(), conf_run(), conf_start_record(), 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(), corosync_show_members(), 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_celt_format(), custom_log(), custom_prepare(), custom_silk_format(), cut_internal(), dahdi_answer(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_func_write(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_open(), dahdi_read(), dahdi_request(), dahdi_restart(), dahdi_ring_phone(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_show_channel(), dahdi_status_data_provider_get(), dahdi_test_timer(), dahdi_timer_set_rate(), dahdi_train_ec(), dahdi_translate(), dahdi_version_data_provider_get(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dahdiscan_exec(), data_channels_provider_handler(), data_result_generate(), data_result_generate_node(), data_search_generate(), data_structure_compatible(), db_create_astdb(), db_execute_sql(), db_open(), deadagi_exec(), dec_init(), DEFINE_SQL_STATEMENT(), del_exec(), delete_old_messages(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_pval_item(), 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_magic_pickup(), do_message(), do_message_auth(), do_monitor(), do_notify(), do_pktccops(), do_register(), do_reload(), do_say(), do_scheduler(), do_waiting(), donodelog(), dump_queue(), dump_queue_members(), dumpsub(), dundi_answer_entity(), dundi_answer_query(), dundi_discover(), dundi_encrypt(), dundi_error_output(), dundi_exec(), dundi_helper(), dundi_lookup_internal(), dundi_precache_full(), dundi_precache_internal(), dundi_prop_precache(), dundi_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), duplicate_pseudo(), eagi_exec(), ebl_callback(), enable_jack_hook(), encode_open_type(), endelm(), enum_callback(), enum_query_read(), enum_result_read(), 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_detect_attach(), fax_detect_framehook(), fax_gateway_detect_t38(), fax_gateway_framehook(), fax_gateway_new(), fax_gateway_request_t38(), fax_gateway_start(), 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(), filehelper(), filename_parse(), filestream_close(), filter(), finalize_content(), find_account(), find_cache(), find_call_locked(), find_conf(), find_conf_realtime(), find_desc(), find_desc_usb(), find_details(), find_engine(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), find_or_create_details(), find_pval_goto_item(), find_queue_by_name_rt(), find_sdp(), find_speeddial_by_instance(), find_subchannel_and_lock(), find_subchannel_by_instance_reference(), find_subchannel_by_name(), find_subchannel_by_reference(), find_table(), find_transaction(), find_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), flush_telem(), fn_wrapper(), forkcdr_exec(), format_set_helper(), forward_message(), framein(), func_args(), func_channel_read(), func_channel_write_real(), func_channels_read(), func_check_sipdomain(), func_confbridge_info(), 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(), generate_computational_cost(), generic_execute(), generic_fax_exec(), generic_http_callback(), generic_prepare(), generic_read(), generic_write(), 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_sendhtml(), gtalk_sendtext(), gtalk_show_channels(), gtalk_update_externip(), gtalk_update_stun(), gtalk_write(), h261_decap(), h263_decap(), h263_encap(), h263_open(), h263_read(), h263_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), h264_write(), handle_alarms(), handle_call_token(), handle_capabilities_res_message(), handle_cc_subscribe(), handle_clear_alarms(), handle_cli_database_show(), handle_cli_database_showkey(), 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_missing_column(), handle_offhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_orig(), handle_playtones(), handle_recordfile(), 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(), http_post_callback(), iax2_ack_registry(), iax2_bridge(), iax2_call(), iax2_canmatch(), iax2_devicestate(), iax2_do_register(), iax2_dup_variable_datastore(), iax2_exec(), iax2_exists(), iax2_fixup(), iax2_hangup(), iax2_matchmore(), iax2_poke_peer(), iax2_prov_app(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_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_devstate_map(), initialize_cc_max_requests(), initialize_udptl(), 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_framedata_init(), 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(), kickptt(), 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(), lintogsm_framein(), lintolpc10_framein(), lintoulaw(), listener(), listfilter(), load_column_config(), load_config(), load_config_meetme(), load_format_config(), load_general_config(), 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_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(), 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_save_prep(), mkif(), mkintf(), moh_alloc(), moh_class_destructor(), moh_files_alloc(), moh_files_generator(), moh_files_release(), moh_generate(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), msg_data_func_read(), msg_func_read(), msg_func_write(), msg_send_cb(), msg_send_exec(), 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_dtmf(), my_handle_notify_message(), my_is_off_hook(), my_send_callerid(), my_set_cadence(), my_start_cid_detect(), my_wink(), nbs_alloc(), nbs_call(), nbs_hangup(), nbs_new(), nbs_request(), nbs_xwrite(), NBScat_exec(), NBScatplay(), netconsole(), new_find_extension(), new_realtime_sqlite3_db(), notify_daemon(), 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(), open_stream(), 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_busy_pattern(), parse_config(), parse_empty_options(), parse_events(), parse_gain_value(), parse_ie(), parse_minse(), parse_moved_contact(), parse_naptr(), parse_options(), parse_register_contact(), parse_request(), parse_session_expires(), parse_srv(), parse_tag(), parse_tone_zone(), parse_via(), ParseBookmark(), parsing(), party_id_build_data(), party_id_write(), party_name_build_data(), party_name_write(), party_number_build_data(), party_number_write(), party_subaddress_build_data(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_hangup(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_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_exec(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_by_exten(), pickup_by_group(), pickup_exec(), pickupchan_exec(), pitchshift_helper(), pktccops_add_ippool(), play_message(), play_message_category(), play_message_datetime(), play_message_on_chan(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), policy_set_suite(), pop_exec(), post_raw(), pp_each_extension_helper(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_applicationmap_line(), process_ast_dsp(), process_cn_rfc3389(), process_config(), process_crypto(), process_dahdi(), process_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_function_exists(), queue_function_mem_read(), queue_function_mem_write(), queue_function_memberpenalty_read(), queue_function_memberpenalty_write(), 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_exec(), realtime_handler(), realtime_ldap_base_ap(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_odbc(), realtime_peer(), realtime_peer_by_addr(), realtime_peer_get_sippeer_helper(), realtime_pgsql(), realtime_require_handler(), realtime_sqlite3_destroy(), realtime_sqlite3_execute(), realtime_sqlite3_execute_handle(), realtime_sqlite3_helper(), realtime_sqlite3_load(), realtime_sqlite3_require(), realtime_sqlite3_store(), realtime_sqlite3_update(), realtime_sqlite3_update2(), realtime_store_handler(), realtime_update2_handler(), realtime_update_handler(), realtime_user(), realtimefield_read(), receive_digit(), receive_message(), receivefax_exec(), receivefax_t38_init(), record_exec(), redirecting_read(), redirecting_write(), refresh_list(), reg_source_db(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_realtime_peers_with_callbackextens(), 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(), 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(), ring_entry(), 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(), 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(), setsubstate(), setup_dahdi_int(), setup_incoming_call(), setup_mixmonitor_ds(), 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(), silk_get_val(), silk_isset(), silk_set(), 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_msg_send(), sip_new(), sip_parse_host(), sip_parse_nat_option(), sip_parse_register_line(), 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_extensionstate_cb(), 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(), smdi_load(), smdi_msg_read(), smdi_msg_retrieve_read(), smdi_read(), smdi_toggle_mwi(), smoother_frame_feed(), sms_exec(), sms_generate(), sms_handleincoming(), sms_log(), sms_messagerx2(), sms_process(), sms_readfile(), sms_writefile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), softmix_bridge_thread(), softmix_mixing_array_grow(), softmix_mixing_array_init(), soundcard_init(), soundcard_writeframe(), span_message(), spandsp_fax_new(), spandsp_fax_start(), spandsp_fax_write(), spandsp_log(), spandsp_modems(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite_log(), srv_datastore_setup(), srv_query_read(), srv_result_read(), ssl_verify(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_rtp(), start_session_timer(), start_spying(), start_stream(), startelm(), starttimer(), static_realtime_cb(), 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(), strreplace(), stun_monitor_request(), stun_start_monitor(), stun_stop_monitor(), subscript(), substitute_escapes(), swap_subs(), 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_bysession(), transmit_response_using_temp(), transmit_response_with_auth(), transmit_response_with_sdp(), transmit_response_with_t38_sdp(), transmit_state_notify(), transmit_t38(), try_calling(), try_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), tvfix(), txt_callback(), unalloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), unistim_request(), unistim_rtp_read(), unistim_senddigit_end(), unistim_sendtext(), unistim_ss(), unistim_write(), unistimsock_read(), unload_module(), unlock_read(), 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_answer(), 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(), xpmr_config(), yyerror(), and yyparse().
01195 { 01196 struct logmsg *logmsg = NULL; 01197 struct ast_str *buf = NULL; 01198 struct ast_tm tm; 01199 struct timeval now = ast_tvnow(); 01200 int res = 0; 01201 va_list ap; 01202 char datestring[256]; 01203 01204 if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) 01205 return; 01206 01207 if (level != __LOG_VERBOSE && AST_RWLIST_EMPTY(&logchannels)) { 01208 /* 01209 * we don't have the logger chain configured yet, 01210 * so just log to stdout 01211 */ 01212 int result; 01213 va_start(ap, fmt); 01214 result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */ 01215 va_end(ap); 01216 if (result != AST_DYNSTR_BUILD_FAILED) { 01217 term_filter_escapes(ast_str_buffer(buf)); 01218 fputs(ast_str_buffer(buf), stdout); 01219 } 01220 return; 01221 } 01222 01223 /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug 01224 are non-zero; LOG_DEBUG messages can still be displayed if option_debug 01225 is zero, if option_verbose is non-zero (this allows for 'level zero' 01226 LOG_DEBUG messages to be displayed, if the logmask on any channel 01227 allows it) 01228 */ 01229 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) 01230 return; 01231 01232 /* Ignore anything that never gets logged anywhere */ 01233 if (level != __LOG_VERBOSE && !(global_logmask & (1 << level))) 01234 return; 01235 01236 /* Build string */ 01237 va_start(ap, fmt); 01238 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); 01239 va_end(ap); 01240 01241 /* If the build failed, then abort and free this structure */ 01242 if (res == AST_DYNSTR_BUILD_FAILED) 01243 return; 01244 01245 /* Create a new logging message */ 01246 if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128))) 01247 return; 01248 01249 /* Copy string over */ 01250 ast_string_field_set(logmsg, message, ast_str_buffer(buf)); 01251 01252 /* Set type */ 01253 if (level == __LOG_VERBOSE) { 01254 logmsg->type = LOGMSG_VERBOSE; 01255 } else { 01256 logmsg->type = LOGMSG_NORMAL; 01257 } 01258 01259 /* Create our date/time */ 01260 ast_localtime(&now, &tm, NULL); 01261 ast_strftime(datestring, sizeof(datestring), dateformat, &tm); 01262 ast_string_field_set(logmsg, date, datestring); 01263 01264 /* Copy over data */ 01265 logmsg->level = level; 01266 logmsg->line = line; 01267 ast_string_field_set(logmsg, level_name, levels[level]); 01268 ast_string_field_set(logmsg, file, file); 01269 ast_string_field_set(logmsg, function, function); 01270 logmsg->lwp = ast_get_tid(); 01271 01272 /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */ 01273 if (logthread != AST_PTHREADT_NULL) { 01274 AST_LIST_LOCK(&logmsgs); 01275 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01276 ast_cond_signal(&logcond); 01277 AST_LIST_UNLOCK(&logmsgs); 01278 } else { 01279 logger_print_normal(logmsg); 01280 ast_free(logmsg); 01281 } 01282 01283 return; 01284 }
| static void ast_log_vsyslog | ( | struct logmsg * | msg | ) | [static] |
Definition at line 953 of file logger.c.
References ast_syslog_priority_from_loglevel(), logmsg::file, logmsg::function, logmsg::level, levels, logmsg::line, logmsg::lwp, logmsg::message, and term_strip().
Referenced by logger_print_normal().
00954 { 00955 char buf[BUFSIZ]; 00956 int syslog_level = ast_syslog_priority_from_loglevel(msg->level); 00957 00958 if (syslog_level < 0) { 00959 /* we are locked here, so cannot ast_log() */ 00960 fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level); 00961 return; 00962 } 00963 00964 snprintf(buf, sizeof(buf), "%s[%d]: %s:%d in %s: %s", 00965 levels[msg->level], msg->lwp, msg->file, msg->line, msg->function, msg->message); 00966 00967 term_strip(buf, buf, strlen(buf) + 1); 00968 syslog(syslog_level, "%s", buf); 00969 }
| 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 1602 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().
01603 { 01604 unsigned int level; 01605 unsigned int available = 0; 01606 01607 AST_RWLIST_WRLOCK(&logchannels); 01608 01609 for (level = 0; level < ARRAY_LEN(levels); level++) { 01610 if ((level >= 16) && !available && !levels[level]) { 01611 available = level; 01612 continue; 01613 } 01614 01615 if (levels[level] && !strcasecmp(levels[level], name)) { 01616 ast_log(LOG_WARNING, 01617 "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n", 01618 name); 01619 AST_RWLIST_UNLOCK(&logchannels); 01620 01621 return -1; 01622 } 01623 } 01624 01625 if (!available) { 01626 ast_log(LOG_WARNING, 01627 "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n", 01628 name); 01629 AST_RWLIST_UNLOCK(&logchannels); 01630 01631 return -1; 01632 } 01633 01634 levels[available] = ast_strdup(name); 01635 01636 AST_RWLIST_UNLOCK(&logchannels); 01637 01638 ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available); 01639 01640 update_logchannels(); 01641 01642 return available; 01643 }
| 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 1645 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().
01646 { 01647 unsigned int found = 0; 01648 unsigned int x; 01649 01650 AST_RWLIST_WRLOCK(&logchannels); 01651 01652 for (x = 16; x < ARRAY_LEN(levels); x++) { 01653 if (!levels[x]) { 01654 continue; 01655 } 01656 01657 if (strcasecmp(levels[x], name)) { 01658 continue; 01659 } 01660 01661 found = 1; 01662 break; 01663 } 01664 01665 if (found) { 01666 /* take this level out of the global_logmask, to ensure that no new log messages 01667 * will be queued for it 01668 */ 01669 01670 global_logmask &= ~(1 << x); 01671 01672 ast_free(levels[x]); 01673 levels[x] = NULL; 01674 AST_RWLIST_UNLOCK(&logchannels); 01675 01676 ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x); 01677 01678 update_logchannels(); 01679 } else { 01680 AST_RWLIST_UNLOCK(&logchannels); 01681 } 01682 }
| void ast_queue_log | ( | const char * | queuename, | |
| const char * | callid, | |||
| const char * | agent, | |||
| const char * | event, | |||
| const char * | fmt, | |||
| ... | ||||
| ) |
Definition at line 480 of file logger.c.
References args, AST_APP_ARG, ast_check_realtime(), AST_DECLARE_APP_ARGS, ast_localtime(), AST_NONSTANDARD_APP_ARGS, ast_queue_log(), ast_realtime_require_field(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_store_realtime(), ast_strftime(), ast_tvnow(), logfiles, logger_queue_init(), qlog, RQ_CHAR, S_OR, and SENTINEL.
Referenced by aqm_exec(), ast_queue_log(), find_queue_by_name_rt(), handle_queue_add_member(), handle_queue_remove_member(), login_exec(), manager_add_queue_member(), manager_queue_log_custom(), manager_remove_queue_member(), ql_exec(), queue_exec(), queue_transfer_fixup(), reload_logger(), rna(), rqm_exec(), rt_handle_member_record(), set_member_paused(), set_member_penalty_help_members(), try_calling(), update_realtime_members(), and wait_our_turn().
00481 { 00482 va_list ap; 00483 struct timeval tv; 00484 struct ast_tm tm; 00485 char qlog_msg[8192]; 00486 int qlog_len; 00487 char time_str[30]; 00488 00489 if (!logger_initialized) { 00490 /* You are too early. We are not open yet! */ 00491 return; 00492 } 00493 if (!queuelog_init) { 00494 AST_RWLIST_WRLOCK(&logchannels); 00495 if (!queuelog_init) { 00496 /* 00497 * We have delayed initializing the queue logging system so 00498 * preloaded realtime modules can get up. We must initialize 00499 * now since someone is trying to log something. 00500 */ 00501 logger_queue_init(); 00502 queuelog_init = 1; 00503 AST_RWLIST_UNLOCK(&logchannels); 00504 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); 00505 } else { 00506 AST_RWLIST_UNLOCK(&logchannels); 00507 } 00508 } 00509 00510 if (ast_check_realtime("queue_log")) { 00511 tv = ast_tvnow(); 00512 ast_localtime(&tv, &tm, NULL); 00513 ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm); 00514 va_start(ap, fmt); 00515 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap); 00516 va_end(ap); 00517 if (logfiles.queue_adaptive_realtime) { 00518 AST_DECLARE_APP_ARGS(args, 00519 AST_APP_ARG(data)[5]; 00520 ); 00521 AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|'); 00522 /* Ensure fields are large enough to receive data */ 00523 ast_realtime_require_field("queue_log", 00524 "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")), 00525 "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")), 00526 "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")), 00527 "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")), 00528 "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")), 00529 SENTINEL); 00530 00531 /* Store the log */ 00532 ast_store_realtime("queue_log", "time", time_str, 00533 "callid", callid, 00534 "queuename", queuename, 00535 "agent", agent, 00536 "event", event, 00537 "data1", S_OR(args.data[0], ""), 00538 "data2", S_OR(args.data[1], ""), 00539 "data3", S_OR(args.data[2], ""), 00540 "data4", S_OR(args.data[3], ""), 00541 "data5", S_OR(args.data[4], ""), 00542 SENTINEL); 00543 } else { 00544 ast_store_realtime("queue_log", "time", time_str, 00545 "callid", callid, 00546 "queuename", queuename, 00547 "agent", agent, 00548 "event", event, 00549 "data", qlog_msg, 00550 SENTINEL); 00551 } 00552 00553 if (!logfiles.queue_log_to_file) { 00554 return; 00555 } 00556 } 00557 00558 if (qlog) { 00559 va_start(ap, fmt); 00560 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); 00561 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap); 00562 va_end(ap); 00563 AST_RWLIST_RDLOCK(&logchannels); 00564 if (qlog) { 00565 fprintf(qlog, "%s\n", qlog_msg); 00566 fflush(qlog); 00567 } 00568 AST_RWLIST_UNLOCK(&logchannels); 00569 } 00570 }
| int ast_register_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1552 of file logger.c.
References ast_malloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb::verboser.
Referenced by ast_makesocket(), and main().
01553 { 01554 struct verb *verb; 01555 01556 if (!(verb = ast_malloc(sizeof(*verb)))) 01557 return -1; 01558 01559 verb->verboser = v; 01560 01561 AST_RWLIST_WRLOCK(&verbosers); 01562 AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); 01563 AST_RWLIST_UNLOCK(&verbosers); 01564 01565 return 0; 01566 }
| int ast_unregister_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1568 of file logger.c.
References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb::verboser.
01569 { 01570 struct verb *cur; 01571 01572 AST_RWLIST_WRLOCK(&verbosers); 01573 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { 01574 if (cur->verboser == v) { 01575 AST_RWLIST_REMOVE_CURRENT(list); 01576 ast_free(cur); 01577 break; 01578 } 01579 } 01580 AST_RWLIST_TRAVERSE_SAFE_END; 01581 AST_RWLIST_UNLOCK(&verbosers); 01582 01583 return cur ? 0 : -1; 01584 }
| void ast_verbose | ( | const char * | fmt, | |
| ... | ||||
| ) |
Definition at line 1543 of file logger.c.
References __ast_verbose_ap().
01544 { 01545 va_list ap; 01546 01547 va_start(ap, fmt); 01548 __ast_verbose_ap("", 0, "", fmt, ap); 01549 va_end(ap); 01550 }
| void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1155 of file logger.c.
References ast_cond_signal, AST_LIST_LOCK, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, close_logger_thread, f, logchannel::fileptr, logchannel::list, logcond, logthread, and qlog.
Referenced by really_quit().
01156 { 01157 struct logchannel *f = NULL; 01158 01159 logger_initialized = 0; 01160 01161 /* Stop logger thread */ 01162 AST_LIST_LOCK(&logmsgs); 01163 close_logger_thread = 1; 01164 ast_cond_signal(&logcond); 01165 AST_LIST_UNLOCK(&logmsgs); 01166 01167 if (logthread != AST_PTHREADT_NULL) 01168 pthread_join(logthread, NULL); 01169 01170 AST_RWLIST_WRLOCK(&logchannels); 01171 01172 if (qlog) { 01173 fclose(qlog); 01174 qlog = NULL; 01175 } 01176 01177 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 01178 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01179 fclose(f->fileptr); 01180 f->fileptr = NULL; 01181 } 01182 } 01183 01184 closelog(); /* syslog */ 01185 01186 AST_RWLIST_UNLOCK(&logchannels); 01187 01188 return; 01189 }
| static char* handle_logger_reload | ( | struct ast_cli_entry * | e, | |
| int | cmd, | |||
| struct ast_cli_args * | a | |||
| ) | [static] |
Definition at line 809 of file logger.c.
References ast_cli_args::argc, ast_cli_args::argv, 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.
00810 { 00811 switch (cmd) { 00812 case CLI_INIT: 00813 e->command = "logger reload"; 00814 e->usage = 00815 "Usage: logger reload [<alt-conf>]\n" 00816 " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n"; 00817 return NULL; 00818 case CLI_GENERATE: 00819 return NULL; 00820 } 00821 if (reload_logger(0, a->argc == 3 ? a->argv[2] : NULL)) { 00822 ast_cli(a->fd, "Failed to reload the logger\n"); 00823 return CLI_FAILURE; 00824 } 00825 return CLI_SUCCESS; 00826 }
| static char* handle_logger_rotate | ( | struct ast_cli_entry * | e, | |
| int | cmd, | |||
| struct ast_cli_args * | a | |||
| ) | [static] |
Definition at line 828 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.
00829 { 00830 switch (cmd) { 00831 case CLI_INIT: 00832 e->command = "logger rotate"; 00833 e->usage = 00834 "Usage: logger rotate\n" 00835 " Rotates and Reopens the log files.\n"; 00836 return NULL; 00837 case CLI_GENERATE: 00838 return NULL; 00839 } 00840 if (reload_logger(1, NULL)) { 00841 ast_cli(a->fd, "Failed to reload the logger and rotate log files\n"); 00842 return CLI_FAILURE; 00843 } 00844 return CLI_SUCCESS; 00845 }
| static char* handle_logger_set_level | ( | struct ast_cli_entry * | e, | |
| int | cmd, | |||
| struct ast_cli_args * | a | |||
| ) | [static] |
Definition at line 847 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.
00848 { 00849 int x; 00850 int state; 00851 int level = -1; 00852 00853 switch (cmd) { 00854 case CLI_INIT: 00855 e->command = "logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}"; 00856 e->usage = 00857 "Usage: logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n" 00858 " Set a specific log level to enabled/disabled for this console.\n"; 00859 return NULL; 00860 case CLI_GENERATE: 00861 return NULL; 00862 } 00863 00864 if (a->argc < 5) 00865 return CLI_SHOWUSAGE; 00866 00867 AST_RWLIST_WRLOCK(&logchannels); 00868 00869 for (x = 0; x < ARRAY_LEN(levels); x++) { 00870 if (levels[x] && !strcasecmp(a->argv[3], levels[x])) { 00871 level = x; 00872 break; 00873 } 00874 } 00875 00876 AST_RWLIST_UNLOCK(&logchannels); 00877 00878 state = ast_true(a->argv[4]) ? 1 : 0; 00879 00880 if (level != -1) { 00881 ast_console_toggle_loglevel(a->fd, level, state); 00882 ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off"); 00883 } else 00884 return CLI_SHOWUSAGE; 00885 00886 return CLI_SUCCESS; 00887 }
| 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 890 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.
00891 { 00892 #define FORMATL "%-35.35s %-8.8s %-9.9s " 00893 struct logchannel *chan; 00894 switch (cmd) { 00895 case CLI_INIT: 00896 e->command = "logger show channels"; 00897 e->usage = 00898 "Usage: logger show channels\n" 00899 " List configured logger channels.\n"; 00900 return NULL; 00901 case CLI_GENERATE: 00902 return NULL; 00903 } 00904 ast_cli(a->fd, FORMATL, "Channel", "Type", "Status"); 00905 ast_cli(a->fd, "Configuration\n"); 00906 ast_cli(a->fd, FORMATL, "-------", "----", "------"); 00907 ast_cli(a->fd, "-------------\n"); 00908 AST_RWLIST_RDLOCK(&logchannels); 00909 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00910 unsigned int level; 00911 00912 ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), 00913 chan->disabled ? "Disabled" : "Enabled"); 00914 ast_cli(a->fd, " - "); 00915 for (level = 0; level < ARRAY_LEN(levels); level++) { 00916 if ((chan->logmask & (1 << level)) && levels[level]) { 00917 ast_cli(a->fd, "%s ", levels[level]); 00918 } 00919 } 00920 ast_cli(a->fd, "\n"); 00921 } 00922 AST_RWLIST_UNLOCK(&logchannels); 00923 ast_cli(a->fd, "\n"); 00924 00925 return CLI_SUCCESS; 00926 }
| int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 1131 of file logger.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_cond_destroy, ast_cond_init, ast_config_AST_LOG_DIR, ast_mkdir(), ast_pthread_create, cli_logger, handle_SIGXFSZ, init_logger_chain(), logcond, logger_thread(), and logthread.
Referenced by main().
01132 { 01133 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01134 sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL); 01135 01136 /* start logger thread */ 01137 ast_cond_init(&logcond, NULL); 01138 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01139 ast_cond_destroy(&logcond); 01140 return -1; 01141 } 01142 01143 /* register the logger cli commands */ 01144 ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01145 01146 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01147 01148 /* create log channels */ 01149 init_logger_chain(0 /* locked */, NULL); 01150 logger_initialized = 1; 01151 01152 return 0; 01153 }
| static void init_logger_chain | ( | int | locked, | |
| const char * | altconf | |||
| ) | [static] |
Definition at line 308 of file logger.c.
References __LOG_ERROR, __LOG_NOTICE, __LOG_WARNING, ast_calloc, ast_config_destroy(), ast_config_load2(), ast_console_puts_mutable(), ast_copy_string(), ast_free, AST_RWLIST_INSERT_HEAD, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), ast_variable_browse(), ast_variable_retrieve(), CONFIG_STATUS_FILEINVALID, errno, ast_variable::lineno, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ast_variable::name, ast_variable::next, qlog, ROTATE, S_OR, SEQUENTIAL, TIMESTAMP, logchannel::type, ast_variable::value, and var.
Referenced by init_logger(), and reload_logger().
00309 { 00310 struct logchannel *chan; 00311 struct ast_config *cfg; 00312 struct ast_variable *var; 00313 const char *s; 00314 struct ast_flags config_flags = { 0 }; 00315 00316 if (!(cfg = ast_config_load2(S_OR(altconf, "logger.conf"), "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) { 00317 return; 00318 } 00319 00320 /* delete our list of log channels */ 00321 if (!locked) { 00322 AST_RWLIST_WRLOCK(&logchannels); 00323 } 00324 while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) { 00325 ast_free(chan); 00326 } 00327 global_logmask = 0; 00328 if (!locked) { 00329 AST_RWLIST_UNLOCK(&logchannels); 00330 } 00331 00332 errno = 0; 00333 /* close syslog */ 00334 closelog(); 00335 00336 /* If no config file, we're fine, set default options. */ 00337 if (!cfg) { 00338 if (errno) { 00339 fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno)); 00340 } else { 00341 fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n"); 00342 } 00343 if (!(chan = ast_calloc(1, sizeof(*chan)))) { 00344 return; 00345 } 00346 chan->type = LOGTYPE_CONSOLE; 00347 chan->logmask = __LOG_WARNING | __LOG_NOTICE | __LOG_ERROR; 00348 if (!locked) { 00349 AST_RWLIST_WRLOCK(&logchannels); 00350 } 00351 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00352 global_logmask |= chan->logmask; 00353 if (!locked) { 00354 AST_RWLIST_UNLOCK(&logchannels); 00355 } 00356 return; 00357 } 00358 00359 if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) { 00360 if (ast_true(s)) { 00361 if (gethostname(hostname, sizeof(hostname) - 1)) { 00362 ast_copy_string(hostname, "unknown", sizeof(hostname)); 00363 fprintf(stderr, "What box has no hostname???\n"); 00364 } 00365 } else 00366 hostname[0] = '\0'; 00367 } else 00368 hostname[0] = '\0'; 00369 if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) 00370 ast_copy_string(dateformat, s, sizeof(dateformat)); 00371 else 00372 ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat)); 00373 if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) { 00374 logfiles.queue_log = ast_true(s); 00375 } 00376 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) { 00377 logfiles.queue_log_to_file = ast_true(s); 00378 } 00379 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) { 00380 ast_copy_string(queue_log_name, s, sizeof(queue_log_name)); 00381 } 00382 if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) { 00383 ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate)); 00384 } 00385 if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) { 00386 if (strcasecmp(s, "timestamp") == 0) { 00387 rotatestrategy = TIMESTAMP; 00388 } else if (strcasecmp(s, "rotate") == 0) { 00389 rotatestrategy = ROTATE; 00390 } else if (strcasecmp(s, "sequential") == 0) { 00391 rotatestrategy = SEQUENTIAL; 00392 } else { 00393 fprintf(stderr, "Unknown rotatestrategy: %s\n", s); 00394 } 00395 } else { 00396 if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) { 00397 rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL; 00398 fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n"); 00399 } 00400 } 00401 00402 if (!locked) { 00403 AST_RWLIST_WRLOCK(&logchannels); 00404 } 00405 var = ast_variable_browse(cfg, "logfiles"); 00406 for (; var; var = var->next) { 00407 if (!(chan = make_logchannel(var->name, var->value, var->lineno))) { 00408 /* Print error message directly to the consoles since the lock is held 00409 * and we don't want to unlock with the list partially built */ 00410 ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR); 00411 ast_console_puts_mutable(var->name, __LOG_ERROR); 00412 ast_console_puts_mutable("'\n", __LOG_ERROR); 00413 continue; 00414 } 00415 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00416 global_logmask |= chan->logmask; 00417 } 00418 00419 if (qlog) { 00420 fclose(qlog); 00421 qlog = NULL; 00422 } 00423 00424 if (!locked) { 00425 AST_RWLIST_UNLOCK(&logchannels); 00426 } 00427 00428 ast_config_destroy(cfg); 00429 }
| static void logger_print_normal | ( | struct logmsg * | logmsg | ) | [static] |
Print a normal log message to the channels.
Definition at line 972 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, logmsg::lwp, manager_event, logmsg::message, reload_logger(), term_color(), term_strip(), logchannel::type, and verb::verboser.
Referenced by ast_log(), and logger_thread().
00973 { 00974 struct logchannel *chan = NULL; 00975 char buf[BUFSIZ]; 00976 struct verb *v = NULL; 00977 00978 if (logmsg->level == __LOG_VERBOSE) { 00979 char *tmpmsg = ast_strdupa(logmsg->message + 1); 00980 /* Iterate through the list of verbosers and pass them the log message string */ 00981 AST_RWLIST_RDLOCK(&verbosers); 00982 AST_RWLIST_TRAVERSE(&verbosers, v, list) 00983 v->verboser(logmsg->message); 00984 AST_RWLIST_UNLOCK(&verbosers); 00985 ast_string_field_set(logmsg, message, tmpmsg); 00986 } 00987 00988 AST_RWLIST_RDLOCK(&logchannels); 00989 00990 if (!AST_RWLIST_EMPTY(&logchannels)) { 00991 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00992 /* If the channel is disabled, then move on to the next one */ 00993 if (chan->disabled) 00994 continue; 00995 /* Check syslog channels */ 00996 if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) { 00997 ast_log_vsyslog(logmsg); 00998 /* Console channels */ 00999 } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) { 01000 char linestr[128]; 01001 char tmp1[80], tmp2[80], tmp3[80], tmp4[80]; 01002 01003 /* If the level is verbose, then skip it */ 01004 if (logmsg->level == __LOG_VERBOSE) 01005 continue; 01006 01007 /* Turn the numerical line number into a string */ 01008 snprintf(linestr, sizeof(linestr), "%d", logmsg->line); 01009 /* Build string to print out */ 01010 snprintf(buf, sizeof(buf), "[%s] %s[%d]: %s:%s %s: %s", 01011 logmsg->date, 01012 term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)), 01013 logmsg->lwp, 01014 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)), 01015 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), 01016 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)), 01017 logmsg->message); 01018 /* Print out */ 01019 ast_console_puts_mutable(buf, logmsg->level); 01020 /* File channels */ 01021 } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) { 01022 int res = 0; 01023 01024 /* If no file pointer exists, skip it */ 01025 if (!chan->fileptr) { 01026 continue; 01027 } 01028 01029 /* Print out to the file */ 01030 res = fprintf(chan->fileptr, "[%s] %s[%d] %s: %s", 01031 logmsg->date, logmsg->level_name, logmsg->lwp, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ)); 01032 if (res <= 0 && !ast_strlen_zero(logmsg->message)) { 01033 fprintf(stderr, "**** Asterisk Logging Error: ***********\n"); 01034 if (errno == ENOMEM || errno == ENOSPC) 01035 fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename); 01036 else 01037 fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno)); 01038 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno)); 01039 chan->disabled = 1; 01040 } else if (res > 0) { 01041 fflush(chan->fileptr); 01042 } 01043 } 01044 } 01045 } else if (logmsg->level != __LOG_VERBOSE) { 01046 fputs(logmsg->message, stdout); 01047 } 01048 01049 AST_RWLIST_UNLOCK(&logchannels); 01050 01051 /* If we need to reload because of the file size, then do so */ 01052 if (filesize_reload_needed) { 01053 reload_logger(-1, NULL); 01054 ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 01055 } 01056 01057 return; 01058 }
| static void logger_queue_init | ( | void | ) | [static] |
Definition at line 1107 of file logger.c.
References ast_config_AST_LOG_DIR, ast_log(), ast_unload_realtime(), errno, LOG_ERROR, logfiles, logger_queue_rt_start(), and qlog.
Referenced by ast_queue_log().
01108 { 01109 ast_unload_realtime("queue_log"); 01110 if (logfiles.queue_log) { 01111 char qfname[PATH_MAX]; 01112 01113 if (logger_queue_rt_start()) { 01114 return; 01115 } 01116 01117 /* Open the log file. */ 01118 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, 01119 queue_log_name); 01120 if (qlog) { 01121 /* Just in case it was already open. */ 01122 fclose(qlog); 01123 } 01124 qlog = fopen(qfname, "a"); 01125 if (!qlog) { 01126 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 01127 } 01128 } 01129 }
| static int logger_queue_restart | ( | int | queue_rotate | ) | [static] |
Definition at line 708 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().
00709 { 00710 int res = 0; 00711 char qfname[PATH_MAX]; 00712 00713 if (logger_queue_rt_start()) { 00714 return res; 00715 } 00716 00717 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00718 if (qlog) { 00719 /* Just in case it was still open. */ 00720 fclose(qlog); 00721 qlog = NULL; 00722 } 00723 if (queue_rotate) { 00724 rotate_file(qfname); 00725 } 00726 00727 /* Open the log file. */ 00728 qlog = fopen(qfname, "a"); 00729 if (!qlog) { 00730 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 00731 res = -1; 00732 } 00733 return res; 00734 }
| static int logger_queue_rt_start | ( | void | ) | [static] |
Definition at line 673 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().
00674 { 00675 if (ast_check_realtime("queue_log")) { 00676 if (!ast_realtime_require_field("queue_log", 00677 "time", RQ_DATETIME, 26, 00678 "data1", RQ_CHAR, 20, 00679 "data2", RQ_CHAR, 20, 00680 "data3", RQ_CHAR, 20, 00681 "data4", RQ_CHAR, 20, 00682 "data5", RQ_CHAR, 20, 00683 SENTINEL)) { 00684 logfiles.queue_adaptive_realtime = 1; 00685 } else { 00686 logfiles.queue_adaptive_realtime = 0; 00687 } 00688 00689 if (!logfiles.queue_log_to_file) { 00690 /* Don't open the log file. */ 00691 return 1; 00692 } 00693 } 00694 return 0; 00695 }
| int logger_reload | ( | void | ) |
Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload).
Reload logger without rotating log files.
Definition at line 801 of file logger.c.
References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.
00802 { 00803 if (reload_logger(0, NULL)) { 00804 return RESULT_FAILURE; 00805 } 00806 return RESULT_SUCCESS; 00807 }
| static void* logger_thread | ( | void * | data | ) | [static] |
Actual logging thread.
Definition at line 1061 of file logger.c.
References ast_cond_wait, ast_free, AST_LIST_EMPTY, AST_LIST_FIRST, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_LOCK, AST_LIST_NEXT, AST_LIST_UNLOCK, close_logger_thread, logchannel::list, logcond, logger_print_normal(), and logchannel::next.
Referenced by init_logger().
01062 { 01063 struct logmsg *next = NULL, *msg = NULL; 01064 01065 for (;;) { 01066 /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */ 01067 AST_LIST_LOCK(&logmsgs); 01068 if (AST_LIST_EMPTY(&logmsgs)) { 01069 if (close_logger_thread) { 01070 break; 01071 } else { 01072 ast_cond_wait(&logcond, &logmsgs.lock); 01073 } 01074 } 01075 next = AST_LIST_FIRST(&logmsgs); 01076 AST_LIST_HEAD_INIT_NOLOCK(&logmsgs); 01077 AST_LIST_UNLOCK(&logmsgs); 01078 01079 /* Otherwise go through and process each message in the order added */ 01080 while ((msg = next)) { 01081 /* Get the next entry now so that we can free our current structure later */ 01082 next = AST_LIST_NEXT(msg, list); 01083 01084 /* Depending on the type, send it to the proper function */ 01085 logger_print_normal(msg); 01086 01087 /* Free the data since we are done */ 01088 ast_free(msg); 01089 } 01090 01091 /* If we should stop, then stop */ 01092 if (close_logger_thread) 01093 break; 01094 } 01095 01096 return NULL; 01097 }
| static unsigned int make_components | ( | const char * | s, | |
| int | lineno | |||
| ) | [static] |
Definition at line 212 of file logger.c.
References ARRAY_LEN, ast_skip_blanks(), ast_strdupa, levels, and strsep().
Referenced by make_logchannel(), and update_logchannels().
00213 { 00214 char *w; 00215 unsigned int res = 0; 00216 char *stringp = ast_strdupa(s); 00217 unsigned int x; 00218 00219 while ((w = strsep(&stringp, ","))) { 00220 w = ast_skip_blanks(w); 00221 00222 if (!strcmp(w, "*")) { 00223 res = 0xFFFFFFFF; 00224 break; 00225 } else for (x = 0; x < ARRAY_LEN(levels); x++) { 00226 if (levels[x] && !strcasecmp(w, levels[x])) { 00227 res |= (1 << x); 00228 break; 00229 } 00230 } 00231 } 00232 00233 return res; 00234 }
| static struct logchannel* make_logchannel | ( | const char * | channel, | |
| const char * | components, | |||
| int | lineno | |||
| ) | [static, read] |
Definition at line 236 of file logger.c.
References __LOG_ERROR, ast_build_date, ast_build_hostname, ast_build_machine, ast_build_os, ast_build_user, ast_calloc, ast_config_AST_LOG_DIR, ast_console_puts_mutable(), ast_copy_string(), ast_free, ast_get_version(), ast_localtime(), ast_strftime(), ast_strlen_zero(), ast_syslog_facility(), ast_tvnow(), logchannel::components, errno, logchannel::facility, logchannel::filename, logchannel::fileptr, logchannel::lineno, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, make_components(), and logchannel::type.
Referenced by init_logger_chain().
00237 { 00238 struct logchannel *chan; 00239 char *facility; 00240 struct ast_tm tm; 00241 struct timeval now = ast_tvnow(); 00242 char datestring[256]; 00243 00244 if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1))) 00245 return NULL; 00246 00247 strcpy(chan->components, components); 00248 chan->lineno = lineno; 00249 00250 if (!strcasecmp(channel, "console")) { 00251 chan->type = LOGTYPE_CONSOLE; 00252 } else if (!strncasecmp(channel, "syslog", 6)) { 00253 /* 00254 * syntax is: 00255 * syslog.facility => level,level,level 00256 */ 00257 facility = strchr(channel, '.'); 00258 if (!facility++ || !facility) { 00259 facility = "local0"; 00260 } 00261 00262 chan->facility = ast_syslog_facility(facility); 00263 00264 if (chan->facility < 0) { 00265 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n"); 00266 ast_free(chan); 00267 return NULL; 00268 } 00269 00270 chan->type = LOGTYPE_SYSLOG; 00271 ast_copy_string(chan->filename, channel, sizeof(chan->filename)); 00272 openlog("asterisk", LOG_PID, chan->facility); 00273 } else { 00274 if (!ast_strlen_zero(hostname)) { 00275 snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s", 00276 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname); 00277 } else { 00278 snprintf(chan->filename, sizeof(chan->filename), "%s/%s", 00279 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel); 00280 } 00281 if (!(chan->fileptr = fopen(chan->filename, "a"))) { 00282 /* Can't do real logging here since we're called with a lock 00283 * so log to any attached consoles */ 00284 ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR); 00285 ast_console_puts_mutable(chan->filename, __LOG_ERROR); 00286 ast_console_puts_mutable("': ", __LOG_ERROR); 00287 ast_console_puts_mutable(strerror(errno), __LOG_ERROR); 00288 ast_console_puts_mutable("'\n", __LOG_ERROR); 00289 ast_free(chan); 00290 return NULL; 00291 } else { 00292 /* Create our date/time */ 00293 ast_localtime(&now, &tm, NULL); 00294 ast_strftime(datestring, sizeof(datestring), dateformat, &tm); 00295 00296 fprintf(chan->fileptr, "[%s] Asterisk %s built by %s @ %s on a %s running %s on %s\n", 00297 datestring, ast_get_version(), ast_build_user, ast_build_hostname, 00298 ast_build_machine, ast_build_os, ast_build_date); 00299 fflush(chan->fileptr); 00300 } 00301 chan->type = LOGTYPE_FILE; 00302 } 00303 chan->logmask = make_components(chan->components, lineno); 00304 00305 return chan; 00306 }
| static int reload_logger | ( | int | rotate, | |
| const char * | altconf | |||
| ) | [static] |
Definition at line 736 of file logger.c.
References ast_config_AST_LOG_DIR, ast_mkdir(), ast_queue_log(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_unload_realtime(), ast_verb, logchannel::disabled, EVENT_FLAG_SYSTEM, f, logchannel::filename, logchannel::fileptr, init_logger_chain(), logchannel::list, logfiles, logger_queue_restart(), manager_event, qlog, and rotate_file().
Referenced by handle_logger_reload(), handle_logger_rotate(), logger_print_normal(), and logger_reload().
00737 { 00738 int queue_rotate = rotate; 00739 struct logchannel *f; 00740 int res = 0; 00741 00742 AST_RWLIST_WRLOCK(&logchannels); 00743 00744 if (qlog) { 00745 if (rotate < 0) { 00746 /* Check filesize - this one typically doesn't need an auto-rotate */ 00747 if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */ 00748 fclose(qlog); 00749 qlog = NULL; 00750 } else { 00751 queue_rotate = 0; 00752 } 00753 } else { 00754 fclose(qlog); 00755 qlog = NULL; 00756 } 00757 } else { 00758 queue_rotate = 0; 00759 } 00760 00761 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 00762 00763 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 00764 if (f->disabled) { 00765 f->disabled = 0; /* Re-enable logging at reload */ 00766 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename); 00767 } 00768 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00769 int rotate_this = 0; 00770 if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */ 00771 /* Be more proactive about rotating massive log files */ 00772 rotate_this = 1; 00773 } 00774 fclose(f->fileptr); /* Close file */ 00775 f->fileptr = NULL; 00776 if (rotate || rotate_this) { 00777 rotate_file(f->filename); 00778 } 00779 } 00780 } 00781 00782 filesize_reload_needed = 0; 00783 00784 init_logger_chain(1 /* locked */, altconf); 00785 00786 ast_unload_realtime("queue_log"); 00787 if (logfiles.queue_log) { 00788 res = logger_queue_restart(queue_rotate); 00789 AST_RWLIST_UNLOCK(&logchannels); 00790 ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); 00791 ast_verb(1, "Asterisk Queue Logger restarted\n"); 00792 } else { 00793 AST_RWLIST_UNLOCK(&logchannels); 00794 } 00795 00796 return res; 00797 }
| static int rotate_file | ( | const char * | filename | ) | [static] |
Definition at line 572 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().
00573 { 00574 char old[PATH_MAX]; 00575 char new[PATH_MAX]; 00576 int x, y, which, found, res = 0, fd; 00577 char *suffixes[4] = { "", ".gz", ".bz2", ".Z" }; 00578 00579 switch (rotatestrategy) { 00580 case SEQUENTIAL: 00581 for (x = 0; ; x++) { 00582 snprintf(new, sizeof(new), "%s.%d", filename, x); 00583 fd = open(new, O_RDONLY); 00584 if (fd > -1) 00585 close(fd); 00586 else 00587 break; 00588 } 00589 if (rename(filename, new)) { 00590 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00591 res = -1; 00592 } else { 00593 filename = new; 00594 } 00595 break; 00596 case TIMESTAMP: 00597 snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL)); 00598 if (rename(filename, new)) { 00599 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00600 res = -1; 00601 } else { 00602 filename = new; 00603 } 00604 break; 00605 case ROTATE: 00606 /* Find the next empty slot, including a possible suffix */ 00607 for (x = 0; ; x++) { 00608 found = 0; 00609 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00610 snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]); 00611 fd = open(new, O_RDONLY); 00612 if (fd > -1) { 00613 close(fd); 00614 found = 1; 00615 break; 00616 } 00617 } 00618 if (!found) { 00619 break; 00620 } 00621 } 00622 00623 /* Found an empty slot */ 00624 for (y = x; y > 0; y--) { 00625 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00626 snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]); 00627 fd = open(old, O_RDONLY); 00628 if (fd > -1) { 00629 /* Found the right suffix */ 00630 close(fd); 00631 snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]); 00632 if (rename(old, new)) { 00633 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00634 res = -1; 00635 } 00636 break; 00637 } 00638 } 00639 } 00640 00641 /* Finally, rename the current file */ 00642 snprintf(new, sizeof(new), "%s.0", filename); 00643 if (rename(filename, new)) { 00644 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00645 res = -1; 00646 } else { 00647 filename = new; 00648 } 00649 } 00650 00651 if (!ast_strlen_zero(exec_after_rotate)) { 00652 struct ast_channel *c = ast_dummy_channel_alloc(); 00653 char buf[512]; 00654 00655 pbx_builtin_setvar_helper(c, "filename", filename); 00656 pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf)); 00657 if (c) { 00658 c = ast_channel_unref(c); 00659 } 00660 if (ast_safe_system(buf) == -1) { 00661 ast_log(LOG_WARNING, "error executing '%s'\n", buf); 00662 } 00663 } 00664 return res; 00665 }
| static void update_logchannels | ( | void | ) | [static] |
Definition at line 1586 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().
01587 { 01588 struct logchannel *cur; 01589 01590 AST_RWLIST_WRLOCK(&logchannels); 01591 01592 global_logmask = 0; 01593 01594 AST_RWLIST_TRAVERSE(&logchannels, cur, list) { 01595 cur->logmask = make_components(cur->components, cur->lineno); 01596 global_logmask |= cur->logmask; 01597 } 01598 01599 AST_RWLIST_UNLOCK(&logchannels); 01600 }
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 169 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,
}
Definition at line 948 of file logger.c.
Referenced by init_logger().
char hostname[MAXHOSTNAMELEN] [static] |
Definition at line 89 of file logger.c.
Referenced by app_exec(), ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), main(), netconsole(), set_destination(), sip_parse_register_line(), sip_subscribe_mwi(), and tds_load_module().
char* levels[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 158 of file logger.c.
Referenced by ast_log(), ast_log_vsyslog(), ast_logger_register_level(), ast_logger_unregister_level(), ast_network_puts_mutable(), handle_logger_set_level(), handle_logger_show_channels(), and make_components().
struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , } [static] |
ast_cond_t logcond [static] |
Definition at line 142 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 141 of file logger.c.
Referenced by ast_log(), close_logger(), and init_logger().
FILE* qlog [static] |
Definition at line 145 of file logger.c.
Referenced by ast_queue_log(), close_logger(), init_logger_chain(), logger_queue_init(), logger_queue_restart(), and reload_logger().
| unsigned int queue_adaptive_realtime |
char queue_log_name[256] = QUEUELOG [static] |
| unsigned int queue_log_to_file |
int queuelog_init [static] |
struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } [static] |
1.5.6