Fri Feb 10 06:36:45 2012

Asterisk developer's documentation


logger.c File Reference

Asterisk Logger. More...

#include "asterisk.h"
#include <syslog.h>
#include "asterisk/_private.h"
#include "asterisk/paths.h"
#include "asterisk/logger.h"
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/config.h"
#include "asterisk/term.h"
#include "asterisk/cli.h"
#include "asterisk/utils.h"
#include "asterisk/manager.h"
#include "asterisk/threadstorage.h"
#include "asterisk/strings.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include "asterisk/buildinfo.h"
#include "asterisk/ast_version.h"
#include <signal.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>

Include dependency graph for logger.c:

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 logchannelmake_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 , }


Detailed Description

Asterisk Logger.

Logging routines

Author:
Mark Spencer <markster@digium.com>

Definition in file logger.c.


Define Documentation

#define FORMATL   "%-35.35s %-8.8s %-9.9s "

#define LOG_BUF_INIT_SIZE   256

Definition at line 208 of file logger.c.

Referenced by ast_log().

#define VERBOSE_BUF_INIT_SIZE   256

Definition at line 205 of file logger.c.

Referenced by __ast_verbose_ap().


Enumeration Type Documentation

Enumerator:
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 120 of file logger.c.

00120                  {
00121    LOGMSG_NORMAL = 0,
00122    LOGMSG_VERBOSE,
00123 };

enum logtypes

Enumerator:
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 91 of file logger.c.

00091               {
00092    LOGTYPE_SYSLOG,
00093    LOGTYPE_FILE,
00094    LOGTYPE_CONSOLE,
00095 };

Enumerator:
SEQUENTIAL 
ROTATE 
TIMESTAMP 

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;


Function Documentation

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 __fini_logchannels ( void   )  [static]

Definition at line 118 of file logger.c.

00120 {

static void __fini_verbosers ( void   )  [static]

Definition at line 933 of file logger.c.

00935 {

static void __init_log_buf ( void   )  [static]

Definition at line 207 of file logger.c.

00213 {

static void __init_logchannels ( void   )  [static]

Definition at line 118 of file logger.c.

00120 {

static void __init_verbose_buf ( void   )  [static]

Definition at line 204 of file logger.c.

00213 {

static void __init_verbosers ( void   )  [static]

Definition at line 933 of file logger.c.

00935 {

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.

Parameters:
name The name of the level to be registered
Return values:
-1 if an error occurs
non-zero level to be used with ast_log for sending messages to this level
Since:
1.8

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.

Parameters:
name The name of the level to be unregistered
Returns:
nothing
Since:
1.8

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]


Variable Documentation

struct ast_cli_entry cli_logger[] [static]

Definition at line 935 of file logger.c.

Referenced by init_logger().

int close_logger_thread = 0 [static]

Definition at line 143 of file logger.c.

Referenced by close_logger(), and logger_thread().

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]

Definition at line 67 of file logger.c.

Referenced by build_device().

char exec_after_rotate[256] = "" [static]

Definition at line 70 of file logger.c.

int filesize_reload_needed [static]

Definition at line 72 of file logger.c.

unsigned int global_logmask = 0xFFFF [static]

Definition at line 73 of file logger.c.

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]

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]

Definition at line 207 of file logger.c.

Referenced by ast_log().

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]

int logger_initialized [static]

Definition at line 75 of file logger.c.

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 86 of file logger.c.

unsigned int queue_log

Definition at line 84 of file logger.c.

char queue_log_name[256] = QUEUELOG [static]

Definition at line 69 of file logger.c.

unsigned int queue_log_to_file

Definition at line 85 of file logger.c.

int queuelog_init [static]

Definition at line 74 of file logger.c.

struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } [static]

Definition at line 204 of file logger.c.

Referenced by __ast_verbose_ap().


Generated on Fri Feb 10 06:36:46 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.5.6