Asterisk Logger. More...
#include "asterisk.h"#include "asterisk/_private.h"#include "asterisk/paths.h"#include <signal.h>#include <time.h>#include <sys/stat.h>#include <fcntl.h>#include <execinfo.h>#include <syslog.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"
Go to the source code of this file.
Data Structures | |
| struct | logchannel |
| struct | logchannels |
| struct | logmsg |
| struct | logmsgs |
| struct | verb |
| struct | verbosers |
Defines | |
| #define | _ASTERISK_LOGGER_H |
| #define | FORMATL "%-35.35s %-8.8s %-9.9s " |
| #define | GETTID() getpid() |
| #define | LOG_BUF_INIT_SIZE 256 |
| #define | MAX_BACKTRACE_FRAMES 20 |
| #define | SYSLOG_NAMES |
| #define | SYSLOG_NLEVELS sizeof(syslog_level_map) / sizeof(int) |
| #define | VERBOSE_BUF_INIT_SIZE 256 |
Enumerations | |
| enum | logmsgtypes { LOGMSG_NORMAL = 0, LOGMSG_VERBOSE } |
| enum | logtypes { LOGTYPE_SYSLOG, LOGTYPE_FILE, LOGTYPE_CONSOLE } |
| enum | rotatestrategy { SEQUENTIAL = 1 << 0, ROTATE = 1 << 1, TIMESTAMP = 1 << 2 } |
Functions | |
| void | __ast_verbose (const char *file, int line, const char *func, const char *fmt,...) |
| This works like ast_log, but prints verbose messages to the console depending on verbosity level set. ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing"); This will print the message to the console if the verbose level is set to a level >= 3 Note the abscence of a comma after the VERBOSE_PREFIX_3. This is important. VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined. | |
| void | __ast_verbose_ap (const char *file, int line, const char *func, const char *fmt, va_list ap) |
| static void | __init_log_buf (void) |
| static void | __init_verbose_buf (void) |
| void | ast_backtrace (void) |
| struct ast_bt * | ast_bt_create (void) |
| void * | ast_bt_destroy (struct ast_bt *bt) |
| int | ast_bt_get_addresses (struct ast_bt *bt) |
| 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 (int level, const char *file, int line, const char *function, char *str, long pid) |
| 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. | |
| static int | handle_SIGXFSZ (int sig) |
| int | init_logger (void) |
| static void | init_logger_chain (int locked) |
| static void | logger_print_normal (struct logmsg *logmsg) |
| Print a normal log message to the channels. | |
| static void | logger_print_verbose (struct logmsg *logmsg) |
| Print a verbose message to the verbosers. | |
| 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 int | make_components (const char *s, int lineno) |
| static struct logchannel * | make_logchannel (const char *channel, const char *components, int lineno) |
| static int | reload_logger (int rotate) |
| static int | rotate_file (const char *filename) |
Variables | |
| static struct ast_cli_entry | cli_logger [] |
| static int | close_logger_thread = 0 |
| static int | colors [] |
| Colors used in the console for logging. | |
| static char | dateformat [256] = "%b %e %T" |
| static FILE * | eventlog |
| static char | exec_after_rotate [256] = "" |
| static int | filesize_reload_needed |
| static int | global_logmask = -1 |
| static char | hostname [MAXHOSTNAMELEN] |
| static char * | levels [] |
| 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 event_log:1 | |
| unsigned int queue_log:1 | |
| } | logfiles |
| static pthread_t | logthread = AST_PTHREADT_NULL |
| static FILE * | qlog |
| static char | queue_log_name [256] = QUEUELOG |
| static int | syslog_level_map [] |
| static struct ast_threadstorage | verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } |
Asterisk Logger.
Logging routines
Definition in file logger.c.
| #define FORMATL "%-35.35s %-8.8s %-9.9s " |
Referenced by handle_logger_show_channels().
| #define SYSLOG_NLEVELS sizeof(syslog_level_map) / sizeof(int) |
Definition at line 67 of file logger.c.
Referenced by ast_log_vsyslog().
| #define VERBOSE_BUF_INIT_SIZE 256 |
Definition at line 180 of file logger.c.
Referenced by __ast_verbose_ap().
| enum logmsgtypes |
Definition at line 132 of file logger.c.
00132 { 00133 LOGMSG_NORMAL = 0, 00134 LOGMSG_VERBOSE, 00135 };
| enum logtypes |
Definition at line 114 of file logger.c.
00114 { 00115 LOGTYPE_SYSLOG, 00116 LOGTYPE_FILE, 00117 LOGTYPE_CONSOLE, 00118 };
| enum rotatestrategy |
Definition at line 101 of file logger.c.
00101 { 00102 SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */ 00103 ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */ 00104 TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */ 00105 } 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 1295 of file logger.c.
References __ast_verbose_ap().
01296 { 01297 va_list ap; 01298 va_start(ap, fmt); 01299 __ast_verbose_ap(file, line, func, fmt, ap); 01300 va_end(ap); 01301 }
| void __ast_verbose_ap | ( | const char * | file, | |
| int | line, | |||
| const char * | func, | |||
| const char * | fmt, | |||
| va_list | ap | |||
| ) |
Definition at line 1239 of file logger.c.
References __LOG_VERBOSE, ast_calloc, ast_cond_signal(), AST_DYNSTR_BUILD_FAILED, ast_free, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), ast_log(), ast_opt_timestamp, AST_PTHREADT_NULL, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_tvnow(), buf, logchannel::list, logcond, logger_print_verbose(), LOGMSG_VERBOSE, logthread, logmsg::str, logmsg::type, verbose_buf, and VERBOSE_BUF_INIT_SIZE.
Referenced by __ast_verbose(), and ast_verbose().
01240 { 01241 struct logmsg *logmsg = NULL; 01242 struct ast_str *buf = NULL; 01243 int res = 0; 01244 01245 if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) 01246 return; 01247 01248 if (ast_opt_timestamp) { 01249 struct timeval now; 01250 struct ast_tm tm; 01251 char date[40]; 01252 char *datefmt; 01253 01254 now = ast_tvnow(); 01255 ast_localtime(&now, &tm, NULL); 01256 ast_strftime(date, sizeof(date), dateformat, &tm); 01257 datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1); 01258 sprintf(datefmt, "%c[%s] %s", 127, date, fmt); 01259 fmt = datefmt; 01260 } else { 01261 char *tmp = alloca(strlen(fmt) + 2); 01262 sprintf(tmp, "%c%s", 127, fmt); 01263 fmt = tmp; 01264 } 01265 01266 /* Build string */ 01267 res = ast_str_set_va(&buf, 0, fmt, ap); 01268 01269 /* If the build failed then we can drop this allocated message */ 01270 if (res == AST_DYNSTR_BUILD_FAILED) 01271 return; 01272 01273 if (!(logmsg = ast_calloc(1, sizeof(*logmsg) + res + 1))) 01274 return; 01275 01276 strcpy(logmsg->str, ast_str_buffer(buf)); 01277 01278 ast_log(__LOG_VERBOSE, file, line, func, "%s", logmsg->str + 1); 01279 01280 /* Set type */ 01281 logmsg->type = LOGMSG_VERBOSE; 01282 01283 /* Add to the list and poke the thread if possible */ 01284 if (logthread != AST_PTHREADT_NULL) { 01285 AST_LIST_LOCK(&logmsgs); 01286 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01287 ast_cond_signal(&logcond); 01288 AST_LIST_UNLOCK(&logmsgs); 01289 } else { 01290 logger_print_verbose(logmsg); 01291 ast_free(logmsg); 01292 } 01293 }
| void ast_backtrace | ( | void | ) |
Definition at line 1212 of file logger.c.
References ast_bt::addresses, ast_bt_create(), ast_bt_destroy(), ast_debug, ast_log(), free, LOG_DEBUG, LOG_WARNING, and ast_bt::num_frames.
01213 { 01214 #ifdef HAVE_BKTR 01215 struct ast_bt *bt; 01216 int i = 0; 01217 char **strings; 01218 01219 if (!(bt = ast_bt_create())) { 01220 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n"); 01221 return; 01222 } 01223 01224 if ((strings = backtrace_symbols(bt->addresses, bt->num_frames))) { 01225 ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' '); 01226 for (i = 0; i < bt->num_frames; i++) { 01227 ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i, bt->addresses[i], strings[i]); 01228 } 01229 free(strings); 01230 } else { 01231 ast_debug(1, "Could not allocate memory for backtrace\n"); 01232 } 01233 ast_bt_destroy(bt); 01234 #else 01235 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n"); 01236 #endif 01237 }
| struct ast_bt* ast_bt_create | ( | void | ) | [read] |
Definition at line 1179 of file logger.c.
References ast_bt::alloced, ast_bt_get_addresses(), ast_calloc, ast_log(), and LOG_ERROR.
Referenced by ast_backtrace().
01180 { 01181 struct ast_bt *bt = ast_calloc(1, sizeof(*bt)); 01182 if (!bt) { 01183 ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n"); 01184 return NULL; 01185 } 01186 01187 bt->alloced = 1; 01188 01189 ast_bt_get_addresses(bt); 01190 01191 return bt; 01192 }
| void* ast_bt_destroy | ( | struct ast_bt * | bt | ) |
Definition at line 1201 of file logger.c.
References ast_bt::alloced, and ast_free.
Referenced by ast_backtrace().
| int ast_bt_get_addresses | ( | struct ast_bt * | bt | ) |
Definition at line 1194 of file logger.c.
References ast_bt::addresses, AST_MAX_BT_FRAMES, and ast_bt::num_frames.
Referenced by ast_bt_create().
01195 { 01196 bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES); 01197 01198 return 0; 01199 }
| void ast_child_verbose | ( | int | level, | |
| const char * | fmt, | |||
| ... | ||||
| ) |
Definition at line 416 of file logger.c.
References ast_free, ast_malloc, msg, and option_verbose.
Referenced by launch_script().
00417 { 00418 char *msg = NULL, *emsg = NULL, *sptr, *eptr; 00419 va_list ap, aq; 00420 int size; 00421 00422 /* Don't bother, if the level isn't that high */ 00423 if (option_verbose < level) { 00424 return; 00425 } 00426 00427 va_start(ap, fmt); 00428 va_copy(aq, ap); 00429 if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) { 00430 va_end(ap); 00431 va_end(aq); 00432 return; 00433 } 00434 va_end(ap); 00435 00436 if (!(msg = ast_malloc(size + 1))) { 00437 va_end(aq); 00438 return; 00439 } 00440 00441 vsnprintf(msg, size + 1, fmt, aq); 00442 va_end(aq); 00443 00444 if (!(emsg = ast_malloc(size * 2 + 1))) { 00445 ast_free(msg); 00446 return; 00447 } 00448 00449 for (sptr = msg, eptr = emsg; ; sptr++) { 00450 if (*sptr == '"') { 00451 *eptr++ = '\\'; 00452 } 00453 *eptr++ = *sptr; 00454 if (*sptr == '\0') { 00455 break; 00456 } 00457 } 00458 ast_free(msg); 00459 00460 fprintf(stdout, "verbose \"%s\" %d\n", emsg, level); 00461 fflush(stdout); 00462 ast_free(emsg); 00463 }
| 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 1090 of file logger.c.
References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc, ast_cond_signal(), ast_copy_string(), AST_DYNSTR_BUILD_FAILED, ast_free, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), AST_PTHREADT_NULL, AST_RWLIST_EMPTY, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_tvnow(), buf, logmsg::date, logmsg::file, logmsg::function, GETTID, logmsg::level, logmsg::line, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, logthread, option_debug, option_verbose, logmsg::process_id, logmsg::str, term_filter_escapes(), and logmsg::type.
Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __ao2_callback(), __ao2_ref(), __ast_answer(), __ast_bridge_technology_register(), __ast_channel_alloc_ap(), __ast_check_signature(), __ast_check_signature_bin(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_decrypt_bin(), __ast_dsp_call_progress(), __ast_encrypt_bin(), __ast_format_register(), __ast_http_load(), __ast_mm_init(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_register_translator(), __ast_request_and_dial(), __ast_rtp_reload(), __ast_sign_bin(), __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_destroy(), __sip_pretend_ack(), __sip_reliable_xmit(), __sip_xmit(), __transmit_response(), __unload_module(), _ast_adsi_get_cpeid(), _ast_adsi_get_cpeinfo(), _ast_adsi_load_session(), _ast_adsi_transmit_message_full(), _dsp_init(), _enum_array_map(), _extension_match_core(), _get_mohbyname(), _macro_exec(), _moh_register(), _sip_tcp_helper_thread(), _while_exec(), accept_thread(), access_counter_file(), acf_channel_read(), acf_curl_exec(), acf_curlopt_read(), acf_curlopt_write(), acf_cut_exec(), acf_iaxvar_write(), acf_if(), acf_isexten_exec(), acf_jabberstatus_read(), acf_mailbox_exists(), acf_meetme_info(), acf_odbc_read(), acf_odbc_write(), acf_sort_exec(), acf_sprintf(), acf_strftime(), acf_strptime(), acf_transaction_write(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_login(), add_agent(), add_agi_cmd(), add_calltoken_ignore(), add_cfg_entry(), add_codec_to_answer(), add_email_attachment(), add_exten_to_pattern_tree(), add_extensions(), add_features_datastores(), add_header(), add_in_calls(), add_line(), add_notify(), add_out_calls(), add_pri_lockopt(), add_publish_event(), add_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_subscribe_event(), add_to_agi(), add_user_extension(), admin_exec(), adsi_begin(), adsi_careful_send(), adsi_process(), adsi_prog(), advanced_options(), ael2_print(), aes_helper(), agent_answer(), agent_call(), agent_fixup(), agent_get_base_channel(), agent_hangup(), 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_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_presence(), aji_handle_subscribe(), aji_initialize(), aji_load_config(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), 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(), announce_thread(), answer_call(), anti_injection(), app_exec(), apply_general_options(), apply_option(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_agi_register(), ast_agi_send(), ast_agi_unregister(), ast_ais_clm_load_module(), ast_ais_clm_unload_module(), ast_ais_evt_load_module(), ast_ais_evt_unload_module(), ast_aji_create_chat(), ast_aji_invite_chat(), ast_aji_join_chat(), ast_aji_send_chat(), ast_alaw_init(), ast_app_dtget(), ast_app_parse_options(), ast_app_parse_options64(), ast_append_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bt_create(), ast_call_forward(), ast_careful_fwrite(), ast_carefulwrite(), ast_cdr_alloc(), ast_cdr_end(), ast_cdr_engine_init(), ast_cdr_merge(), ast_cdr_noanswer(), ast_cdr_register(), ast_cdr_serialize_variables(), ast_cdr_setvar(), ast_cdr_submit_batch(), ast_channel_audiohook_count_by_source(), ast_channel_audiohook_count_by_source_running(), ast_channel_bridge(), ast_channel_free(), ast_channel_make_compatible_helper(), ast_channel_masquerade(), ast_channel_queryoption(), ast_channel_register(), ast_channel_setoption(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_check_timing(), ast_cli_perms_init(), ast_codec_get_len(), ast_codec_get_samples(), ast_config_engine_register(), ast_config_internal_load(), ast_context_find_or_create(), ast_context_remove_extension_callerid2(), ast_context_verify_includes(), ast_db_get(), ast_db_gettree(), ast_db_put(), ast_device_state_engine_init(), ast_do_masquerade(), ast_dsp_call_progress(), ast_dsp_noise(), ast_dsp_process(), ast_dsp_silence(), ast_dtmf_stream(), ast_el_read_char(), ast_enable_distributed_devstate(), ast_enable_packet_fragmentation(), ast_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_filehelper(), ast_find_ourip(), ast_format_str_reduce(), ast_format_unregister(), ast_func_read(), ast_func_write(), ast_get_encoded_char(), ast_get_enum(), ast_get_group(), ast_get_ip_or_srv(), ast_hangup(), ast_heap_create(), ast_http_uri_link(), 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_makesocket(), ast_manager_register_struct(), ast_manager_unregister(), ast_merge_contexts_and_delete(), ast_module_reload(), ast_moh_files_next(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), ast_netsock_bindaddr(), ast_netsock_set_qos(), ast_odbc_direct_execute(), ast_odbc_find_table(), ast_odbc_prepare_and_execute(), ast_odbc_request_obj2(), ast_odbc_sanity_check(), ast_odbc_smart_execute(), ast_openstream_full(), ast_openvstream(), ast_ouraddrfor(), ast_parse_allow_disallow(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_run_app(), ast_pbx_start(), ast_pickup_call(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), 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_bridge(), ast_rtp_codec_setpref(), ast_rtp_early_bridge(), ast_rtp_get_qosvalue(), ast_rtp_make_compatible(), ast_rtp_new_with_bindaddr(), ast_rtp_proto_register(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_senddigit_begin(), ast_rtp_senddigit_continuation(), ast_rtp_senddigit_end(), 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_zh(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_zh(), ast_sched_del(), ast_sched_runq(), ast_sched_thread_create(), ast_search_dns(), ast_set_priority(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_speech_register(), ast_stopstream(), ast_streamfile(), ast_stun_request(), ast_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_tryconnect(), ast_udptl_bridge(), ast_udptl_new_with_bindaddr(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_wait_for_output(), ast_waitfor_nandfds(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_xmldoc_load_documentation(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_reconnect(), attempt_thread(), attempt_transfer(), audiohook_read_frame_both(), auth_exec(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), available(), background_detect_exec(), base64_decode(), base64_encode(), base_encode(), birdbath(), blr_ebl(), blr_txt(), bridge_array_add(), bridge_call_thread(), bridge_exec(), bridge_make_compatible(), bridge_native_loop(), bridge_p2p_loop(), build_alias(), build_callno_limits(), build_channels(), build_conf(), build_device(), build_event_channel(), build_filename(), build_gateway(), build_mapping(), build_parkinglot(), build_peer(), build_route(), build_rpid(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), bump_gains(), cache_get_callno_locked(), calc_cost(), calc_metric(), calculate_far_max_ifp(), calculate_local_max_datagram(), callerid_feed(), callerid_feed_jp(), callerid_get_dtmf(), callerid_read(), callerid_write(), callerpres_write(), canary_thread(), canmatch(), careful_write(), cb_events(), cb_extensionstate(), cdr_handler(), cdr_merge_vars(), chan_misdn_log(), chan_ringing(), chanavail_exec(), channel_admin_exec(), channel_revert(), channel_spy(), channel_steer(), channel_to_session(), chanspy_exec(), check_abstract_reference(), check_access(), check_app_args(), check_auth(), check_break(), check_compat(), check_context_names(), check_continue(), check_day(), check_dow(), check_expr2_input(), check_for_conference(), check_freq_ic706(), check_goto(), check_header(), 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(), clear_caller(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), close_call(), close_client(), close_mailbox(), collect_function_digits(), commit_exec(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_span_helper(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), confbridge_exec(), config_curl(), config_device(), config_function_read(), config_handler(), config_ldap(), config_line(), config_load(), config_module(), config_odbc(), config_parse_variables(), config_pgsql(), config_text_file_load(), connect_link(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), convertcap(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), create_addr(), create_dirpath(), create_jb(), create_match_char_tree(), create_queue_member(), create_video_frame(), create_vmaccount(), crypto_load(), csv_log(), csv_quote(), custom_log(), custom_prepare(), cut_internal(), dahdi_answer(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_get_index(), dahdi_handle_dtmfup(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_loopback(), dahdi_new(), dahdi_open(), dahdi_pri_error(), dahdi_pri_message(), dahdi_read(), dahdi_request(), dahdi_restart(), dahdi_ring_phone(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_show_channel(), dahdi_ss7_error(), dahdi_test_timer(), dahdi_timer_set_rate(), dahdi_train_ec(), dahdi_translate(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dbinit(), deadagi_exec(), dec_init(), del_exec(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_pval_item(), destroy_session(), destroy_trans(), device_state_cb(), devstate_cache_cb(), devstate_change_collector_cb(), devstate_write(), dial_exec_full(), dialgroup_read(), dialgroup_write(), dialog_ref(), dictate_exec(), digitcollect(), digitdirect(), directory_exec(), disa_exec(), disable_jack_hook(), diskavail(), dispatch_thread_handler(), display_last_error(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_dtmf_local(), do_forward(), do_idle_thread(), do_magic_pickup(), do_monitor(), do_register(), do_reload(), do_say(), do_scheduler(), do_timelimit(), do_waiting(), donodelog(), dump_agents(), dump_queue(), dump_queue_members(), dundi_answer_entity(), dundi_answer_query(), dundi_discover(), dundi_encrypt(), dundi_error_output(), dundi_exec(), dundi_helper(), dundi_lookup_internal(), dundi_precache_full(), dundi_precache_internal(), dundi_prop_precache(), dundi_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), duplicate_pseudo(), eagi_exec(), ebl_callback(), enable_jack_hook(), encode_open_type(), enum_callback(), enum_query_read(), enum_result_read(), event_channel_destroy(), evt_event_deliver_cb(), exec(), exec_exec(), execif_exec(), exists(), ext_cmp1(), extension_matches(), extenspy_exec(), external_rtp_create(), extstate_read(), fax_generator_generate(), fbuf_append(), feature_exec_app(), feature_request_and_dial(), festival_exec(), ffmpeg_decode(), ffmpeg_encode(), file_read(), filter(), find_account(), find_cache(), find_call_locked(), find_conf(), find_conf_realtime(), find_desc(), find_desc_usb(), find_engine(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), find_parkinglot(), find_pval_goto_item(), find_queue_by_name_rt(), find_sdp(), find_speeddial_by_instance(), find_subchannel_and_lock(), find_subchannel_by_instance_reference(), find_subchannel_by_name(), find_subchannel_by_reference(), find_table(), find_transaction(), find_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), flush_telem(), fn_wrapper(), forkcdr_exec(), forward_message(), framein(), func_args(), func_channel_read(), func_channel_write(), func_channels_read(), func_check_sipdomain(), func_header_read(), func_inheritance_write(), function_agent(), function_autopatchup(), function_cop(), function_db_delete(), function_db_exists(), function_db_read(), function_db_write(), function_enum(), function_eval(), function_ilink(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_remote(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g723_len(), g723_read(), g723_write(), g726_read(), g726_write(), g729_read(), g729_write(), generic_execute(), generic_http_callback(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_canmatch_exten(), get_destination(), get_in_brackets(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_mem_set(), get_member_penalty(), get_params(), 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_digit(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_indicate(), gtalk_invite(), gtalk_invite_response(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_sendhtml(), gtalk_show_channels(), 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_callforward_button(), handle_capabilities_res_message(), handle_cli_agi_add_cmd(), 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_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_orig(), handle_playtones(), handle_recordfile(), handle_register_message(), handle_remote_data(), handle_remote_dtmf_digit(), handle_request(), handle_request_bye(), handle_request_do(), handle_request_info(), handle_request_invite(), handle_request_notify(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_response_notify(), handle_response_peerpoke(), handle_response_refer(), handle_response_register(), handle_response_subscribe(), 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(), httpd_helper_thread(), iax2_ack_registry(), iax2_bridge(), iax2_call(), iax2_canmatch(), iax2_devicestate(), iax2_do_register(), iax2_dup_variable_datastore(), iax2_exec(), iax2_exists(), iax2_fixup(), iax2_hangup(), iax2_matchmore(), iax2_poke_peer(), iax2_prov_app(), iax2_read(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_template_parse(), ic706_pltocode(), 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_logger(), init_req(), init_resp(), init_timing_thread(), inotify_daemon(), insert_penaltychange(), inspect_module(), INTERNAL_OBJ(), invent_message(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jack_hook_callback(), jack_hook_write(), jb_error_output(), jb_get_and_deliver(), jb_warning_output(), jingle_alloc(), jingle_call(), jingle_create_candidates(), jingle_create_member(), jingle_digit(), jingle_free_pvt(), jingle_handle_dtmf(), jingle_hangup_farend(), jingle_indicate(), jingle_is_answered(), jingle_load_config(), jingle_new(), jingle_newcall(), jingle_parser(), jingle_request(), jingle_sendhtml(), jingle_show_channels(), jingle_write(), join_conference_bridge(), jpeg_read_image(), jpeg_write_image(), key_call(), Keyfavorite(), kickptt(), launch_asyncagi(), launch_monitor_thread(), launch_netscript(), launch_script(), launch_service(), ldap_loadentry(), ldap_reconnect(), leave_voicemail(), linear_alloc(), linear_generator(), linear_release(), linkcount(), linkset_addsigchan(), lintogsm_framein(), lintolpc10_framein(), lintoulaw(), listener(), listfilter(), load_column_config(), load_config(), load_config_meetme(), load_dynamic_module(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_realtime_queue(), load_resource(), load_rpt_vars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_start(), local_call(), local_devicestate(), local_dtmf_helper(), local_fixup(), local_new(), local_write(), log_exec(), log_jack_status(), logger_print_normal(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), lua_read_extensions_file(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manage_parkinglot(), manager_modulecheck(), manager_show_dialplan_helper(), 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_thread(), mkif(), mkintf(), moh_alloc(), moh_class_destructor(), moh_files_generator(), moh_files_release(), moh_generate(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), mssql_connect(), multiplexed_bridge_create(), multiplexed_nudge(), multiplexed_thread_function(), mute_fragment(), mwi_send_init(), mwi_send_process_buffer(), mwi_send_process_event(), mwi_sub_event_cb(), mwi_thread(), nbs_alloc(), nbs_call(), nbs_hangup(), nbs_new(), nbs_request(), nbs_xwrite(), NBScat_exec(), NBScatplay(), netconsole(), new_find_extension(), notify_new_message(), odbc_load_module(), odbc_log(), odbc_obj_connect(), odbc_obj_disconnect(), odbc_register_class(), odbc_release_obj2(), ogg_vorbis_open(), ogg_vorbis_read(), ogg_vorbis_rewrite(), ogg_vorbis_seek(), ogg_vorbis_tell(), ogg_vorbis_trunc(), ogg_vorbis_write(), oh323_alloc(), oh323_call(), oh323_digit_begin(), oh323_digit_end(), oh323_fixup(), oh323_hangup(), oh323_indicate(), oh323_read(), oh323_request(), oh323_rtp_read(), oh323_set_rtp_peer(), oh323_write(), old_milliwatt_exec(), onevent(), op_colon(), op_div(), op_eq(), op_eqtilde(), op_func(), op_minus(), op_negate(), op_plus(), op_rem(), op_times(), open_mailbox(), open_stream(), OpenHistory(), openserial(), originate_exec(), osp_check_destination(), osp_create_provider(), osp_load(), ospauth_exec(), ospfinished_exec(), osplookup_exec(), ospnext_exec(), oss_indicate(), oss_new(), oss_request(), page_exec(), park_call_exec(), park_call_full(), park_exec_full(), park_space_reserve(), parkandannounce_exec(), parkinglot_addref(), parkinglot_unref(), parse(), parse_args(), parse_config(), parse_cookies(), parse_empty_options(), parse_gain_value(), parse_ie(), parse_minse(), parse_naptr(), parse_register_contact(), parse_request(), parse_session_expires(), parse_srv(), parse_tone_zone(), ParseBookmark(), parsing(), 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_set_srcaddr(), peercnt_add(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_do(), pickup_exec(), pickupchan_exec(), play_message(), play_message_category(), play_message_datetime(), play_message_in_bridged_call(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), pop_exec(), post_raw(), powerof(), pp_each_extension_exec(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), pri_create_spanmap(), pri_create_trunkgroup(), pri_dchannel(), pri_find_dchan(), pri_fixup_principle(), pri_resolve_span(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_ast_dsp(), process_dahdi(), process_echocancel(), process_message_callback(), process_opcode(), process_request(), process_request_queue(), process_returncode(), process_rfc2833(), process_rfc3389(), process_sdp(), process_sdp_a_audio(), process_sdp_c(), process_sdp_o(), process_text_line(), profile_set_param(), progress(), proxy_update(), pthread_timer_set_rate(), purge_old_messages(), pvalCheckType(), pvalGlobalsAddStatement(), pvalTopLevAddObject(), pw_cb(), ql_exec(), queue_exec(), queue_function_memberpenalty_read(), queue_function_memberpenalty_write(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), queue_function_queuewaitingcount(), queue_function_var(), queue_reload_request(), queue_set_param(), queue_transfer_fixup(), queue_voice_frame(), quote(), radio_tune(), radius_log(), rbi_out(), rcv_mac_addr(), rcvfax_exec(), read_agent_config(), read_config(), read_config_maps(), read_exec(), read_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_pgsql(), realtime_require_handler(), realtime_store_handler(), realtime_update2_handler(), realtime_update_handler(), realtime_user(), realtimefield_read(), receive_digit(), receive_message(), record_exec(), refresh_list(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_agents(), reload_config(), reload_firmware(), reload_followme(), reload_logger(), reload_queue_members(), reload_queue_rules(), reload_queues(), reload_single_member(), reload_single_queue(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), replace_callno(), reply_digest(), require_curl(), require_odbc(), require_pgsql(), resample_frame(), reset_conf(), restart_monitor(), restart_session_timer(), restore_conference(), restore_gains(), retrans_pkt(), retreive_memory(), retrydial_exec(), return_exec(), 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_socket(), 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(), sayfile(), saynum(), scan_service(), scan_thread(), schedule(), scheduled_destroy(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_usb_txt(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), 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_ctcss_mode_ic706(), set_destination(), set_format(), set_freq_ic706(), set_full_cmd(), set_ic706(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_mode_ic706(), set_moh_exec(), set_offset_ic706(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setdtr(), setflag(), setformat(), setrem(), setup_dahdi(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), show_dialplan_helper(), showdisplay(), showkeys(), sip_addheader(), sip_alloc(), sip_call(), sip_cli_notify(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_park(), sip_park_thread(), sip_parse_host(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_read(), sip_reg_timeout(), sip_register(), sip_removeheader(), sip_request_call(), sip_reregister(), sip_rtp_read(), sip_scheddestroy(), sip_sendhtml(), sip_sipredirect(), sip_st_alloc(), sip_subscribe_mwi(), sip_tcptls_write(), sip_threadinfo_create(), sip_write(), sipsock_read(), siren14read(), siren14write(), siren7read(), siren7write(), skel_exec(), skinny_call(), skinny_fixup(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), skinny_transfer(), skinny_write(), sla_add_trunk_to_station(), sla_build_station(), sla_build_trunk(), sla_load_config(), sla_queue_event_conf(), sla_state(), sla_station_exec(), sla_trunk_exec(), slinear_read(), slinear_write(), smdi_load(), smdi_msg_read(), smdi_msg_retrieve_read(), smdi_read(), smdi_toggle_mwi(), smoother_frame_feed(), sms_exec(), sms_generate(), sms_handleincoming(), sms_log(), sms_messagerx2(), sms_process(), sms_readfile(), sms_writefile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), soundcard_init(), soundcard_writeframe(), span_message(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite3_log(), sqlite_log(), ss7_handle_cqm(), ss7_linkset(), ss7_start_call(), ss_thread(), ssl_lock(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_pri(), start_rtp(), start_session_timer(), start_spying(), start_stream(), starttimer(), static_callback(), 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(), stub_ast_key_get(), subscribe_event_destroy(), subscript(), substitute_escapes(), swap_subs(), sysinfo_helper(), 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_invite(), transmit_refer(), transmit_register(), transmit_request_with_auth(), transmit_response(), transmit_response_using_temp(), transmit_response_with_auth(), transmit_response_with_sdp(), transmit_response_with_t38_sdp(), transmit_state_notify(), transmit_t38(), try_calling(), try_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), tvfix(), txt_callback(), unalloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), unistim_request(), unistim_rtp_read(), unistim_senddigit_end(), unistim_sendtext(), unistim_ss(), unistim_write(), unistimsock_read(), unload_module(), unlock_read(), unregister_exten(), 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_odbc(), update_pgsql(), update_registry(), update_scoreboard(), upqm_exec(), uridecode(), uriencode(), 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(), 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_header(), write_history(), write_stream(), writefile(), xmldoc_build_field(), xmldoc_get_syntax_fun(), xmldoc_string_cleanup(), xmldoc_string_wrap(), xpmr_config(), yyerror(), and yyparse().
01091 { 01092 struct logmsg *logmsg = NULL; 01093 struct ast_str *buf = NULL; 01094 struct ast_tm tm; 01095 struct timeval now = ast_tvnow(); 01096 int res = 0; 01097 va_list ap; 01098 01099 if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) 01100 return; 01101 01102 if (AST_RWLIST_EMPTY(&logchannels)) { 01103 /* 01104 * we don't have the logger chain configured yet, 01105 * so just log to stdout 01106 */ 01107 if (level != __LOG_VERBOSE) { 01108 int result; 01109 va_start(ap, fmt); 01110 result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */ 01111 va_end(ap); 01112 if (result != AST_DYNSTR_BUILD_FAILED) { 01113 term_filter_escapes(ast_str_buffer(buf)); 01114 fputs(ast_str_buffer(buf), stdout); 01115 } 01116 } 01117 return; 01118 } 01119 01120 /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug 01121 are non-zero; LOG_DEBUG messages can still be displayed if option_debug 01122 is zero, if option_verbose is non-zero (this allows for 'level zero' 01123 LOG_DEBUG messages to be displayed, if the logmask on any channel 01124 allows it) 01125 */ 01126 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) 01127 return; 01128 01129 /* Ignore anything that never gets logged anywhere */ 01130 if (!(global_logmask & (1 << level))) 01131 return; 01132 01133 /* Build string */ 01134 va_start(ap, fmt); 01135 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); 01136 va_end(ap); 01137 01138 /* If the build failed, then abort and free this structure */ 01139 if (res == AST_DYNSTR_BUILD_FAILED) 01140 return; 01141 01142 /* Create a new logging message */ 01143 if (!(logmsg = ast_calloc(1, sizeof(*logmsg) + res + 1))) 01144 return; 01145 01146 /* Copy string over */ 01147 strcpy(logmsg->str, ast_str_buffer(buf)); 01148 01149 /* Set type to be normal */ 01150 logmsg->type = LOGMSG_NORMAL; 01151 01152 /* Create our date/time */ 01153 ast_localtime(&now, &tm, NULL); 01154 ast_strftime(logmsg->date, sizeof(logmsg->date), dateformat, &tm); 01155 01156 /* Copy over data */ 01157 logmsg->level = level; 01158 logmsg->line = line; 01159 ast_copy_string(logmsg->file, file, sizeof(logmsg->file)); 01160 ast_copy_string(logmsg->function, function, sizeof(logmsg->function)); 01161 logmsg->process_id = (long) GETTID(); 01162 01163 /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */ 01164 if (logthread != AST_PTHREADT_NULL) { 01165 AST_LIST_LOCK(&logmsgs); 01166 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01167 ast_cond_signal(&logcond); 01168 AST_LIST_UNLOCK(&logmsgs); 01169 } else { 01170 logger_print_normal(logmsg); 01171 ast_free(logmsg); 01172 } 01173 01174 return; 01175 }
| static void ast_log_vsyslog | ( | int | level, | |
| const char * | file, | |||
| int | line, | |||
| const char * | function, | |||
| char * | str, | |||
| long | pid | |||
| ) | [static] |
Definition at line 837 of file logger.c.
References __LOG_DEBUG, __LOG_DTMF, __LOG_VERBOSE, buf, levels, SYSLOG_NLEVELS, and term_strip().
Referenced by logger_print_normal().
00838 { 00839 char buf[BUFSIZ]; 00840 00841 if (level >= SYSLOG_NLEVELS) { 00842 /* we are locked here, so cannot ast_log() */ 00843 fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", level); 00844 return; 00845 } 00846 00847 if (level == __LOG_VERBOSE) { 00848 snprintf(buf, sizeof(buf), "VERBOSE[%ld]: %s", pid, str); 00849 level = __LOG_DEBUG; 00850 } else if (level == __LOG_DTMF) { 00851 snprintf(buf, sizeof(buf), "DTMF[%ld]: %s", pid, str); 00852 level = __LOG_DEBUG; 00853 } else { 00854 snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s", 00855 levels[level], pid, file, line, function, str); 00856 } 00857 00858 term_strip(buf, buf, strlen(buf) + 1); 00859 syslog(syslog_level_map[level], "%s", buf); 00860 }
| void ast_queue_log | ( | const char * | queuename, | |
| const char * | callid, | |||
| const char * | agent, | |||
| const char * | event, | |||
| const char * | fmt, | |||
| ... | ||||
| ) |
Definition at line 465 of file logger.c.
References ast_check_realtime(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_store_realtime(), qlog, and SENTINEL.
Referenced by agent_logoff_maintenance(), aqm_exec(), find_queue_by_name_rt(), handle_queue_add_member(), handle_queue_remove_member(), init_logger(), login_exec(), manager_add_queue_member(), manager_queue_log_custom(), manager_remove_queue_member(), ql_exec(), queue_exec(), queue_transfer_fixup(), reload_logger(), rna(), rqm_exec(), rt_handle_member_record(), set_member_paused(), set_member_penalty(), try_calling(), update_realtime_members(), and wait_our_turn().
00466 { 00467 va_list ap; 00468 char qlog_msg[8192]; 00469 int qlog_len; 00470 char time_str[16]; 00471 00472 if (ast_check_realtime("queue_log")) { 00473 va_start(ap, fmt); 00474 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap); 00475 va_end(ap); 00476 snprintf(time_str, sizeof(time_str), "%ld", (long)time(NULL)); 00477 ast_store_realtime("queue_log", "time", time_str, 00478 "callid", callid, 00479 "queuename", queuename, 00480 "agent", agent, 00481 "event", event, 00482 "data", qlog_msg, 00483 SENTINEL); 00484 } else { 00485 if (qlog) { 00486 va_start(ap, fmt); 00487 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); 00488 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap); 00489 va_end(ap); 00490 } 00491 AST_RWLIST_RDLOCK(&logchannels); 00492 if (qlog) { 00493 fprintf(qlog, "%s\n", qlog_msg); 00494 fflush(qlog); 00495 } 00496 AST_RWLIST_UNLOCK(&logchannels); 00497 } 00498 }
| int ast_register_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1314 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(), main(), and show_console().
01315 { 01316 struct verb *verb; 01317 01318 if (!(verb = ast_malloc(sizeof(*verb)))) 01319 return -1; 01320 01321 verb->verboser = v; 01322 01323 AST_RWLIST_WRLOCK(&verbosers); 01324 AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); 01325 AST_RWLIST_UNLOCK(&verbosers); 01326 01327 return 0; 01328 }
| int ast_unregister_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1330 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.
Referenced by exit_now().
01331 { 01332 struct verb *cur; 01333 01334 AST_RWLIST_WRLOCK(&verbosers); 01335 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { 01336 if (cur->verboser == v) { 01337 AST_RWLIST_REMOVE_CURRENT(list); 01338 ast_free(cur); 01339 break; 01340 } 01341 } 01342 AST_RWLIST_TRAVERSE_SAFE_END; 01343 AST_RWLIST_UNLOCK(&verbosers); 01344 01345 return cur ? 0 : -1; 01346 }
| void ast_verbose | ( | const char * | fmt, | |
| ... | ||||
| ) |
Definition at line 1306 of file logger.c.
References __ast_verbose_ap().
01307 { 01308 va_list ap; 01309 va_start(ap, fmt); 01310 __ast_verbose_ap("", 0, "", fmt, ap); 01311 va_end(ap); 01312 }
| void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1048 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, eventlog, f, logchannel::fileptr, logchannel::list, logcond, logthread, and qlog.
Referenced by quit_handler().
01049 { 01050 struct logchannel *f = NULL; 01051 01052 /* Stop logger thread */ 01053 AST_LIST_LOCK(&logmsgs); 01054 close_logger_thread = 1; 01055 ast_cond_signal(&logcond); 01056 AST_LIST_UNLOCK(&logmsgs); 01057 01058 if (logthread != AST_PTHREADT_NULL) 01059 pthread_join(logthread, NULL); 01060 01061 AST_RWLIST_WRLOCK(&logchannels); 01062 01063 if (eventlog) { 01064 fclose(eventlog); 01065 eventlog = NULL; 01066 } 01067 01068 if (qlog) { 01069 fclose(qlog); 01070 qlog = NULL; 01071 } 01072 01073 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 01074 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01075 fclose(f->fileptr); 01076 f->fileptr = NULL; 01077 } 01078 } 01079 01080 closelog(); /* syslog */ 01081 01082 AST_RWLIST_UNLOCK(&logchannels); 01083 01084 return; 01085 }
| static char* handle_logger_reload | ( | struct ast_cli_entry * | e, | |
| int | cmd, | |||
| struct ast_cli_args * | a | |||
| ) | [static] |
Definition at line 694 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.
00695 { 00696 switch (cmd) { 00697 case CLI_INIT: 00698 e->command = "logger reload"; 00699 e->usage = 00700 "Usage: logger reload\n" 00701 " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n"; 00702 return NULL; 00703 case CLI_GENERATE: 00704 return NULL; 00705 } 00706 if (reload_logger(0)) { 00707 ast_cli(a->fd, "Failed to reload the logger\n"); 00708 return CLI_FAILURE; 00709 } 00710 return CLI_SUCCESS; 00711 }
| static char* handle_logger_rotate | ( | struct ast_cli_entry * | e, | |
| int | cmd, | |||
| struct ast_cli_args * | a | |||
| ) | [static] |
Definition at line 713 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.
00714 { 00715 switch (cmd) { 00716 case CLI_INIT: 00717 e->command = "logger rotate"; 00718 e->usage = 00719 "Usage: logger rotate\n" 00720 " Rotates and Reopens the log files.\n"; 00721 return NULL; 00722 case CLI_GENERATE: 00723 return NULL; 00724 } 00725 if (reload_logger(1)) { 00726 ast_cli(a->fd, "Failed to reload the logger and rotate log files\n"); 00727 return CLI_FAILURE; 00728 } 00729 return CLI_SUCCESS; 00730 }
| static char* handle_logger_set_level | ( | struct ast_cli_entry * | e, | |
| int | cmd, | |||
| struct ast_cli_args * | a | |||
| ) | [static] |
Definition at line 732 of file logger.c.
References ast_cli_args::argc, ast_cli_args::argv, ast_cli(), ast_console_toggle_loglevel(), ast_true(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, levels, NUMLOGLEVELS, and ast_cli_entry::usage.
00733 { 00734 int x; 00735 int state; 00736 int level = -1; 00737 00738 switch (cmd) { 00739 case CLI_INIT: 00740 e->command = "logger set level"; 00741 e->usage = 00742 "Usage: logger set level\n" 00743 " Set a specific log level to enabled/disabled for this console.\n"; 00744 return NULL; 00745 case CLI_GENERATE: 00746 return NULL; 00747 } 00748 00749 if (a->argc < 5) 00750 return CLI_SHOWUSAGE; 00751 00752 for (x = 0; x <= NUMLOGLEVELS; x++) { 00753 if (!strcasecmp(a->argv[3], levels[x])) { 00754 level = x; 00755 break; 00756 } 00757 } 00758 00759 state = ast_true(a->argv[4]) ? 1 : 0; 00760 00761 if (level != -1) { 00762 ast_console_toggle_loglevel(a->fd, level, state); 00763 ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off"); 00764 } else 00765 return CLI_SHOWUSAGE; 00766 00767 return CLI_SUCCESS; 00768 }
| 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 771 of file logger.c.
References __LOG_DEBUG, __LOG_DTMF, __LOG_ERROR, __LOG_EVENT, __LOG_NOTICE, __LOG_VERBOSE, __LOG_WARNING, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, chan, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, logchannel::disabled, ast_cli_args::fd, logchannel::filename, FORMATL, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, logchannel::type, and ast_cli_entry::usage.
00772 { 00773 #define FORMATL "%-35.35s %-8.8s %-9.9s " 00774 struct logchannel *chan; 00775 switch (cmd) { 00776 case CLI_INIT: 00777 e->command = "logger show channels"; 00778 e->usage = 00779 "Usage: logger show channels\n" 00780 " List configured logger channels.\n"; 00781 return NULL; 00782 case CLI_GENERATE: 00783 return NULL; 00784 } 00785 ast_cli(a->fd, FORMATL, "Channel", "Type", "Status"); 00786 ast_cli(a->fd, "Configuration\n"); 00787 ast_cli(a->fd, FORMATL, "-------", "----", "------"); 00788 ast_cli(a->fd, "-------------\n"); 00789 AST_RWLIST_RDLOCK(&logchannels); 00790 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00791 ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), 00792 chan->disabled ? "Disabled" : "Enabled"); 00793 ast_cli(a->fd, " - "); 00794 if (chan->logmask & (1 << __LOG_DEBUG)) 00795 ast_cli(a->fd, "Debug "); 00796 if (chan->logmask & (1 << __LOG_DTMF)) 00797 ast_cli(a->fd, "DTMF "); 00798 if (chan->logmask & (1 << __LOG_VERBOSE)) 00799 ast_cli(a->fd, "Verbose "); 00800 if (chan->logmask & (1 << __LOG_WARNING)) 00801 ast_cli(a->fd, "Warning "); 00802 if (chan->logmask & (1 << __LOG_NOTICE)) 00803 ast_cli(a->fd, "Notice "); 00804 if (chan->logmask & (1 << __LOG_ERROR)) 00805 ast_cli(a->fd, "Error "); 00806 if (chan->logmask & (1 << __LOG_EVENT)) 00807 ast_cli(a->fd, "Event "); 00808 ast_cli(a->fd, "\n"); 00809 } 00810 AST_RWLIST_UNLOCK(&logchannels); 00811 ast_cli(a->fd, "\n"); 00812 00813 return CLI_SUCCESS; 00814 }
| static int handle_SIGXFSZ | ( | int | sig | ) | [static] |
Definition at line 830 of file logger.c.
Referenced by init_logger().
00831 { 00832 /* Indicate need to reload */ 00833 filesize_reload_needed = 1; 00834 return 0; 00835 }
| int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 1004 of file logger.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_cond_destroy(), ast_cond_init(), ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_pthread_create, ast_queue_log(), ast_verb, cli_logger, errno, eventlog, EVENTLOG, handle_SIGXFSZ(), init_logger_chain(), LOG_ERROR, LOG_EVENT, logcond, logfiles, logger_thread(), logthread, and qlog.
Referenced by main().
01005 { 01006 char tmp[256]; 01007 int res = 0; 01008 01009 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01010 (void) signal(SIGXFSZ, (void *) handle_SIGXFSZ); 01011 01012 /* start logger thread */ 01013 ast_cond_init(&logcond, NULL); 01014 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01015 ast_cond_destroy(&logcond); 01016 return -1; 01017 } 01018 01019 /* register the logger cli commands */ 01020 ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01021 01022 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01023 01024 /* create log channels */ 01025 init_logger_chain(0 /* locked */); 01026 01027 /* create the eventlog */ 01028 if (logfiles.event_log) { 01029 snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG); 01030 eventlog = fopen(tmp, "a"); 01031 if (eventlog) { 01032 ast_log(LOG_EVENT, "Started Asterisk Event Logger\n"); 01033 ast_verb(1, "Asterisk Event Logger Started %s\n", tmp); 01034 } else { 01035 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); 01036 res = -1; 01037 } 01038 } 01039 01040 if (logfiles.queue_log) { 01041 snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 01042 qlog = fopen(tmp, "a"); 01043 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); 01044 } 01045 return res; 01046 }
| static void init_logger_chain | ( | int | locked | ) | [static] |
Definition at line 320 of file logger.c.
References ast_calloc, ast_config_destroy(), ast_config_load2(), 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(), chan, CONFIG_STATUS_FILEINVALID, errno, ast_variable::lineno, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ast_variable::name, ast_variable::next, ROTATE, s, SEQUENTIAL, TIMESTAMP, logchannel::type, ast_variable::value, and var.
Referenced by init_logger(), and reload_logger().
00321 { 00322 struct logchannel *chan; 00323 struct ast_config *cfg; 00324 struct ast_variable *var; 00325 const char *s; 00326 struct ast_flags config_flags = { 0 }; 00327 00328 if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) 00329 return; 00330 00331 /* delete our list of log channels */ 00332 if (!locked) 00333 AST_RWLIST_WRLOCK(&logchannels); 00334 while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) 00335 ast_free(chan); 00336 if (!locked) 00337 AST_RWLIST_UNLOCK(&logchannels); 00338 00339 global_logmask = 0; 00340 errno = 0; 00341 /* close syslog */ 00342 closelog(); 00343 00344 /* If no config file, we're fine, set default options. */ 00345 if (!cfg) { 00346 if (errno) 00347 fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno)); 00348 else 00349 fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n"); 00350 if (!(chan = ast_calloc(1, sizeof(*chan)))) 00351 return; 00352 chan->type = LOGTYPE_CONSOLE; 00353 chan->logmask = 28; /*warning,notice,error */ 00354 if (!locked) 00355 AST_RWLIST_WRLOCK(&logchannels); 00356 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00357 if (!locked) 00358 AST_RWLIST_UNLOCK(&logchannels); 00359 global_logmask |= chan->logmask; 00360 return; 00361 } 00362 00363 if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) { 00364 if (ast_true(s)) { 00365 if (gethostname(hostname, sizeof(hostname) - 1)) { 00366 ast_copy_string(hostname, "unknown", sizeof(hostname)); 00367 fprintf(stderr, "What box has no hostname???\n"); 00368 } 00369 } else 00370 hostname[0] = '\0'; 00371 } else 00372 hostname[0] = '\0'; 00373 if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) 00374 ast_copy_string(dateformat, s, sizeof(dateformat)); 00375 else 00376 ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat)); 00377 if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) 00378 logfiles.queue_log = ast_true(s); 00379 if ((s = ast_variable_retrieve(cfg, "general", "event_log"))) 00380 logfiles.event_log = ast_true(s); 00381 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) 00382 ast_copy_string(queue_log_name, s, sizeof(queue_log_name)); 00383 if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) 00384 ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate)); 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 } else { 00395 if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) { 00396 rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL; 00397 fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n"); 00398 } 00399 } 00400 00401 if (!locked) 00402 AST_RWLIST_WRLOCK(&logchannels); 00403 var = ast_variable_browse(cfg, "logfiles"); 00404 for (; var; var = var->next) { 00405 if (!(chan = make_logchannel(var->name, var->value, var->lineno))) 00406 continue; 00407 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00408 global_logmask |= chan->logmask; 00409 } 00410 if (!locked) 00411 AST_RWLIST_UNLOCK(&logchannels); 00412 00413 ast_config_destroy(cfg); 00414 }
| static void logger_print_normal | ( | struct logmsg * | logmsg | ) | [static] |
Print a normal log message to the channels.
Definition at line 863 of file logger.c.
References __LOG_EVENT, __LOG_VERBOSE, ast_console_puts_mutable(), ast_log(), ast_log_vsyslog(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strlen_zero(), ast_verb, buf, chan, COLOR_BRWHITE, colors, logmsg::date, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, eventlog, logmsg::file, logchannel::filename, logchannel::fileptr, logmsg::function, logmsg::level, levels, logmsg::line, logchannel::list, LOG_EVENT, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::process_id, reload_logger(), logmsg::str, term_color(), term_strip(), and logchannel::type.
Referenced by ast_log(), and logger_thread().
00864 { 00865 struct logchannel *chan = NULL; 00866 char buf[BUFSIZ]; 00867 00868 AST_RWLIST_RDLOCK(&logchannels); 00869 00870 if (logfiles.event_log && logmsg->level == __LOG_EVENT) { 00871 fprintf(eventlog, "%s asterisk[%ld]: %s", logmsg->date, (long)getpid(), logmsg->str); 00872 fflush(eventlog); 00873 AST_RWLIST_UNLOCK(&logchannels); 00874 return; 00875 } 00876 00877 if (!AST_RWLIST_EMPTY(&logchannels)) { 00878 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00879 /* If the channel is disabled, then move on to the next one */ 00880 if (chan->disabled) 00881 continue; 00882 /* Check syslog channels */ 00883 if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) { 00884 ast_log_vsyslog(logmsg->level, logmsg->file, logmsg->line, logmsg->function, logmsg->str, logmsg->process_id); 00885 /* Console channels */ 00886 } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) { 00887 char linestr[128]; 00888 char tmp1[80], tmp2[80], tmp3[80], tmp4[80]; 00889 00890 /* If the level is verbose, then skip it */ 00891 if (logmsg->level == __LOG_VERBOSE) 00892 continue; 00893 00894 /* Turn the numerical line number into a string */ 00895 snprintf(linestr, sizeof(linestr), "%d", logmsg->line); 00896 /* Build string to print out */ 00897 snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s", 00898 logmsg->date, 00899 term_color(tmp1, levels[logmsg->level], colors[logmsg->level], 0, sizeof(tmp1)), 00900 logmsg->process_id, 00901 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)), 00902 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), 00903 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)), 00904 logmsg->str); 00905 /* Print out */ 00906 ast_console_puts_mutable(buf, logmsg->level); 00907 /* File channels */ 00908 } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) { 00909 int res = 0; 00910 00911 /* If no file pointer exists, skip it */ 00912 if (!chan->fileptr) { 00913 continue; 00914 } 00915 00916 /* Print out to the file */ 00917 res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s", 00918 logmsg->date, levels[logmsg->level], logmsg->process_id, logmsg->file, term_strip(buf, logmsg->str, BUFSIZ)); 00919 if (res <= 0 && !ast_strlen_zero(logmsg->str)) { 00920 fprintf(stderr, "**** Asterisk Logging Error: ***********\n"); 00921 if (errno == ENOMEM || errno == ENOSPC) 00922 fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename); 00923 else 00924 fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno)); 00925 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno)); 00926 chan->disabled = 1; 00927 } else if (res > 0) { 00928 fflush(chan->fileptr); 00929 } 00930 } 00931 } 00932 } else if (logmsg->level != __LOG_VERBOSE) { 00933 fputs(logmsg->str, stdout); 00934 } 00935 00936 AST_RWLIST_UNLOCK(&logchannels); 00937 00938 /* If we need to reload because of the file size, then do so */ 00939 if (filesize_reload_needed) { 00940 reload_logger(-1); 00941 ast_log(LOG_EVENT, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 00942 ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 00943 } 00944 00945 return; 00946 }
| static void logger_print_verbose | ( | struct logmsg * | logmsg | ) | [static] |
Print a verbose message to the verbosers.
Definition at line 949 of file logger.c.
References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, logchannel::list, logmsg::str, and verb::verboser.
Referenced by __ast_verbose_ap(), and logger_thread().
00950 { 00951 struct verb *v = NULL; 00952 00953 /* Iterate through the list of verbosers and pass them the log message string */ 00954 AST_RWLIST_RDLOCK(&verbosers); 00955 AST_RWLIST_TRAVERSE(&verbosers, v, list) 00956 v->verboser(logmsg->str); 00957 AST_RWLIST_UNLOCK(&verbosers); 00958 00959 return; 00960 }
| 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 687 of file logger.c.
References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.
00688 { 00689 if(reload_logger(0)) 00690 return RESULT_FAILURE; 00691 return RESULT_SUCCESS; 00692 }
| static void* logger_thread | ( | void * | data | ) | [static] |
Actual logging thread.
Definition at line 963 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(), logger_print_verbose(), LOGMSG_NORMAL, LOGMSG_VERBOSE, msg, and logchannel::next.
Referenced by init_logger().
00964 { 00965 struct logmsg *next = NULL, *msg = NULL; 00966 00967 for (;;) { 00968 /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */ 00969 AST_LIST_LOCK(&logmsgs); 00970 if (AST_LIST_EMPTY(&logmsgs)) { 00971 if (close_logger_thread) { 00972 break; 00973 } else { 00974 ast_cond_wait(&logcond, &logmsgs.lock); 00975 } 00976 } 00977 next = AST_LIST_FIRST(&logmsgs); 00978 AST_LIST_HEAD_INIT_NOLOCK(&logmsgs); 00979 AST_LIST_UNLOCK(&logmsgs); 00980 00981 /* Otherwise go through and process each message in the order added */ 00982 while ((msg = next)) { 00983 /* Get the next entry now so that we can free our current structure later */ 00984 next = AST_LIST_NEXT(msg, list); 00985 00986 /* Depending on the type, send it to the proper function */ 00987 if (msg->type == LOGMSG_NORMAL) 00988 logger_print_normal(msg); 00989 else if (msg->type == LOGMSG_VERBOSE) 00990 logger_print_verbose(msg); 00991 00992 /* Free the data since we are done */ 00993 ast_free(msg); 00994 } 00995 00996 /* If we should stop, then stop */ 00997 if (close_logger_thread) 00998 break; 00999 } 01000 01001 return NULL; 01002 }
| static int make_components | ( | const char * | s, | |
| int | lineno | |||
| ) | [static] |
Definition at line 185 of file logger.c.
References __LOG_DEBUG, __LOG_DTMF, __LOG_ERROR, __LOG_EVENT, __LOG_NOTICE, __LOG_VERBOSE, __LOG_WARNING, and ast_skip_blanks().
Referenced by make_logchannel().
00186 { 00187 char *w; 00188 int res = 0; 00189 char *stringp = ast_strdupa(s); 00190 00191 while ((w = strsep(&stringp, ","))) { 00192 w = ast_skip_blanks(w); 00193 if (!strcasecmp(w, "error")) 00194 res |= (1 << __LOG_ERROR); 00195 else if (!strcasecmp(w, "warning")) 00196 res |= (1 << __LOG_WARNING); 00197 else if (!strcasecmp(w, "notice")) 00198 res |= (1 << __LOG_NOTICE); 00199 else if (!strcasecmp(w, "event")) 00200 res |= (1 << __LOG_EVENT); 00201 else if (!strcasecmp(w, "debug")) 00202 res |= (1 << __LOG_DEBUG); 00203 else if (!strcasecmp(w, "verbose")) 00204 res |= (1 << __LOG_VERBOSE); 00205 else if (!strcasecmp(w, "dtmf")) 00206 res |= (1 << __LOG_DTMF); 00207 else { 00208 fprintf(stderr, "Logfile Warning: Unknown keyword '%s' at line %d of logger.conf\n", w, lineno); 00209 } 00210 } 00211 00212 return res; 00213 }
| static struct logchannel* make_logchannel | ( | const char * | channel, | |
| const char * | components, | |||
| int | lineno | |||
| ) | [static, read] |
Definition at line 215 of file logger.c.
References ast_calloc, ast_config_AST_LOG_DIR, ast_free, ast_strlen_zero(), chan, errno, logchannel::facility, logchannel::filename, logchannel::fileptr, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, make_components(), and logchannel::type.
Referenced by init_logger_chain().
00216 { 00217 struct logchannel *chan; 00218 char *facility; 00219 #ifndef SOLARIS 00220 CODE *cptr; 00221 #endif 00222 00223 if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan)))) 00224 return NULL; 00225 00226 if (!strcasecmp(channel, "console")) { 00227 chan->type = LOGTYPE_CONSOLE; 00228 } else if (!strncasecmp(channel, "syslog", 6)) { 00229 /* 00230 * syntax is: 00231 * syslog.facility => level,level,level 00232 */ 00233 facility = strchr(channel, '.'); 00234 if (!facility++ || !facility) { 00235 facility = "local0"; 00236 } 00237 00238 #ifndef SOLARIS 00239 /* 00240 * Walk through the list of facilitynames (defined in sys/syslog.h) 00241 * to see if we can find the one we have been given 00242 */ 00243 chan->facility = -1; 00244 cptr = facilitynames; 00245 while (cptr->c_name) { 00246 if (!strcasecmp(facility, cptr->c_name)) { 00247 chan->facility = cptr->c_val; 00248 break; 00249 } 00250 cptr++; 00251 } 00252 #else 00253 chan->facility = -1; 00254 if (!strcasecmp(facility, "kern")) 00255 chan->facility = LOG_KERN; 00256 else if (!strcasecmp(facility, "USER")) 00257 chan->facility = LOG_USER; 00258 else if (!strcasecmp(facility, "MAIL")) 00259 chan->facility = LOG_MAIL; 00260 else if (!strcasecmp(facility, "DAEMON")) 00261 chan->facility = LOG_DAEMON; 00262 else if (!strcasecmp(facility, "AUTH")) 00263 chan->facility = LOG_AUTH; 00264 else if (!strcasecmp(facility, "SYSLOG")) 00265 chan->facility = LOG_SYSLOG; 00266 else if (!strcasecmp(facility, "LPR")) 00267 chan->facility = LOG_LPR; 00268 else if (!strcasecmp(facility, "NEWS")) 00269 chan->facility = LOG_NEWS; 00270 else if (!strcasecmp(facility, "UUCP")) 00271 chan->facility = LOG_UUCP; 00272 else if (!strcasecmp(facility, "CRON")) 00273 chan->facility = LOG_CRON; 00274 else if (!strcasecmp(facility, "LOCAL0")) 00275 chan->facility = LOG_LOCAL0; 00276 else if (!strcasecmp(facility, "LOCAL1")) 00277 chan->facility = LOG_LOCAL1; 00278 else if (!strcasecmp(facility, "LOCAL2")) 00279 chan->facility = LOG_LOCAL2; 00280 else if (!strcasecmp(facility, "LOCAL3")) 00281 chan->facility = LOG_LOCAL3; 00282 else if (!strcasecmp(facility, "LOCAL4")) 00283 chan->facility = LOG_LOCAL4; 00284 else if (!strcasecmp(facility, "LOCAL5")) 00285 chan->facility = LOG_LOCAL5; 00286 else if (!strcasecmp(facility, "LOCAL6")) 00287 chan->facility = LOG_LOCAL6; 00288 else if (!strcasecmp(facility, "LOCAL7")) 00289 chan->facility = LOG_LOCAL7; 00290 #endif /* Solaris */ 00291 00292 if (0 > chan->facility) { 00293 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n"); 00294 ast_free(chan); 00295 return NULL; 00296 } 00297 00298 chan->type = LOGTYPE_SYSLOG; 00299 snprintf(chan->filename, sizeof(chan->filename), "%s", channel); 00300 openlog("asterisk", LOG_PID, chan->facility); 00301 } else { 00302 if (!ast_strlen_zero(hostname)) { 00303 snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s", 00304 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname); 00305 } else { 00306 snprintf(chan->filename, sizeof(chan->filename), "%s/%s", 00307 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel); 00308 } 00309 chan->fileptr = fopen(chan->filename, "a"); 00310 if (!chan->fileptr) { 00311 /* Can't log here, since we're called with a lock */ 00312 fprintf(stderr, "Logger Warning: Unable to open log file '%s': %s\n", chan->filename, strerror(errno)); 00313 } 00314 chan->type = LOGTYPE_FILE; 00315 } 00316 chan->logmask = make_components(components, lineno); 00317 return chan; 00318 }
| static int reload_logger | ( | int | rotate | ) | [static] |
Definition at line 586 of file logger.c.
References ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_queue_log(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, EVENTLOG, eventlog, f, logchannel::filename, logchannel::fileptr, init_logger_chain(), logchannel::list, LOG_ERROR, LOG_EVENT, logfiles, manager_event, qlog, and rotate_file().
Referenced by handle_logger_reload(), handle_logger_rotate(), logger_print_normal(), and logger_reload().
00587 { 00588 char old[PATH_MAX] = ""; 00589 int event_rotate = rotate, queue_rotate = rotate; 00590 struct logchannel *f; 00591 int res = 0; 00592 struct stat st; 00593 00594 AST_RWLIST_WRLOCK(&logchannels); 00595 00596 if (eventlog) { 00597 if (rotate < 0) { 00598 /* Check filesize - this one typically doesn't need an auto-rotate */ 00599 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG); 00600 if (stat(old, &st) != 0 || st.st_size > 0x40000000) { /* Arbitrarily, 1 GB */ 00601 fclose(eventlog); 00602 eventlog = NULL; 00603 } else 00604 event_rotate = 0; 00605 } else { 00606 fclose(eventlog); 00607 eventlog = NULL; 00608 } 00609 } else 00610 event_rotate = 0; 00611 00612 if (qlog) { 00613 if (rotate < 0) { 00614 /* Check filesize - this one typically doesn't need an auto-rotate */ 00615 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00616 if (stat(old, &st) != 0 || st.st_size > 0x40000000) { /* Arbitrarily, 1 GB */ 00617 fclose(qlog); 00618 qlog = NULL; 00619 } else 00620 queue_rotate = 0; 00621 } else { 00622 fclose(qlog); 00623 qlog = NULL; 00624 } 00625 } else 00626 queue_rotate = 0; 00627 00628 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 00629 00630 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 00631 if (f->disabled) { 00632 f->disabled = 0; /* Re-enable logging at reload */ 00633 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename); 00634 } 00635 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00636 fclose(f->fileptr); /* Close file */ 00637 f->fileptr = NULL; 00638 if (rotate) 00639 rotate_file(f->filename); 00640 } 00641 } 00642 00643 filesize_reload_needed = 0; 00644 00645 init_logger_chain(1 /* locked */); 00646 00647 if (logfiles.event_log) { 00648 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG); 00649 if (event_rotate) 00650 rotate_file(old); 00651 00652 eventlog = fopen(old, "a"); 00653 if (eventlog) { 00654 ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n"); 00655 ast_verb(1, "Asterisk Event Logger restarted\n"); 00656 } else { 00657 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); 00658 res = -1; 00659 } 00660 } 00661 00662 if (logfiles.queue_log) { 00663 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00664 if (queue_rotate) 00665 rotate_file(old); 00666 00667 qlog = fopen(old, "a"); 00668 if (qlog) { 00669 AST_RWLIST_UNLOCK(&logchannels); 00670 ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); 00671 AST_RWLIST_WRLOCK(&logchannels); 00672 ast_log(LOG_EVENT, "Restarted Asterisk Queue Logger\n"); 00673 ast_verb(1, "Asterisk Queue Logger restarted\n"); 00674 } else { 00675 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 00676 res = -1; 00677 } 00678 } 00679 00680 AST_RWLIST_UNLOCK(&logchannels); 00681 00682 return res; 00683 }
| static int rotate_file | ( | const char * | filename | ) | [static] |
Definition at line 500 of file logger.c.
References ARRAY_LEN, ast_channel_alloc, ast_channel_free(), ast_log(), ast_safe_system(), ast_strlen_zero(), buf, LOG_WARNING, pbx_builtin_setvar_helper(), pbx_substitute_variables_helper(), ROTATE, SEQUENTIAL, and TIMESTAMP.
Referenced by reload_logger().
00501 { 00502 char old[PATH_MAX]; 00503 char new[PATH_MAX]; 00504 int x, y, which, found, res = 0, fd; 00505 char *suffixes[4] = { "", ".gz", ".bz2", ".Z" }; 00506 00507 switch (rotatestrategy) { 00508 case SEQUENTIAL: 00509 for (x = 0; ; x++) { 00510 snprintf(new, sizeof(new), "%s.%d", filename, x); 00511 fd = open(new, O_RDONLY); 00512 if (fd > -1) 00513 close(fd); 00514 else 00515 break; 00516 } 00517 if (rename(filename, new)) { 00518 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00519 res = -1; 00520 } 00521 break; 00522 case TIMESTAMP: 00523 snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL)); 00524 if (rename(filename, new)) { 00525 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00526 res = -1; 00527 } 00528 break; 00529 case ROTATE: 00530 /* Find the next empty slot, including a possible suffix */ 00531 for (x = 0; ; x++) { 00532 found = 0; 00533 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00534 snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]); 00535 fd = open(new, O_RDONLY); 00536 if (fd > -1) { 00537 close(fd); 00538 found = 1; 00539 break; 00540 } 00541 } 00542 if (!found) { 00543 break; 00544 } 00545 } 00546 00547 /* Found an empty slot */ 00548 for (y = x; y > 0; y--) { 00549 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00550 snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]); 00551 fd = open(old, O_RDONLY); 00552 if (fd > -1) { 00553 /* Found the right suffix */ 00554 close(fd); 00555 snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]); 00556 if (rename(old, new)) { 00557 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00558 res = -1; 00559 } 00560 break; 00561 } 00562 } 00563 } 00564 00565 /* Finally, rename the current file */ 00566 snprintf(new, sizeof(new), "%s.0", filename); 00567 if (rename(filename, new)) { 00568 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00569 res = -1; 00570 } 00571 } 00572 00573 if (!ast_strlen_zero(exec_after_rotate)) { 00574 struct ast_channel *c = ast_channel_alloc(0, 0, "", "", "", "", "", 0, "Logger/rotate"); 00575 char buf[512]; 00576 pbx_builtin_setvar_helper(c, "filename", filename); 00577 pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf)); 00578 if (ast_safe_system(buf) == -1) { 00579 ast_log(LOG_WARNING, "error executing '%s'\n", buf); 00580 } 00581 ast_channel_free(c); 00582 } 00583 return res; 00584 }
struct ast_cli_entry cli_logger[] [static] |
Definition at line 823 of file logger.c.
Referenced by init_logger().
int close_logger_thread = 0 [static] |
Definition at line 152 of file logger.c.
Referenced by close_logger(), and logger_thread().
int colors[] [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] |
Definition at line 93 of file logger.c.
Referenced by build_device().
FILE* eventlog [static] |
Definition at line 154 of file logger.c.
Referenced by close_logger(), init_logger(), logger_print_normal(), and reload_logger().
char exec_after_rotate[256] = "" [static] |
int filesize_reload_needed [static] |
int global_logmask = -1 [static] |
char hostname[MAXHOSTNAMELEN] [static] |
Definition at line 112 of file logger.c.
Referenced by app_exec(), ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), main(), netconsole(), set_destination(), sip_register(), sip_subscribe_mwi(), and tds_load_module().
char* levels[] [static] |
Logging channels used in the Asterisk logging system.
Definition at line 158 of file logger.c.
Referenced by ast_log_vsyslog(), ast_network_puts_mutable(), handle_logger_set_level(), and logger_print_normal().
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 151 of file logger.c.
Referenced by __ast_verbose_ap(), ast_log(), close_logger(), init_logger(), and logger_thread().
struct { ... } logfiles [static] |
Referenced by init_logger(), init_logger_chain(), logger_print_normal(), and reload_logger().
pthread_t logthread = AST_PTHREADT_NULL [static] |
Definition at line 150 of file logger.c.
Referenced by __ast_verbose_ap(), ast_log(), close_logger(), and init_logger().
FILE* qlog [static] |
Definition at line 155 of file logger.c.
Referenced by ast_queue_log(), close_logger(), init_logger(), and reload_logger().
char queue_log_name[256] = QUEUELOG [static] |
int syslog_level_map[] [static] |
struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } [static] |
Definition at line 179 of file logger.c.
Referenced by __ast_verbose_ap().
1.6.2