Wed Oct 28 13:33:07 2009

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 <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 GETTID()   getpid()
#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)
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.
static int handle_SIGXFSZ (int sig)
int init_logger (void)
static void init_logger_chain (int locked)
static void logger_print_normal (struct logmsg *logmsg)
 Print a normal log message to the channels.
static void logger_print_verbose (struct logmsg *logmsg)
 Print a verbose message to the verbosers.
int logger_reload (void)
 Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload).
static void * logger_thread (void *data)
 Actual logging thread.
static 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)
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 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_log:1
logfiles
static pthread_t logthread = AST_PTHREADT_NULL
static FILE * qlog
static char queue_log_name [256] = QUEUELOG
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 GETTID (  )     getpid()

Definition at line 68 of file logger.c.

Referenced by ast_log().

#define LOG_BUF_INIT_SIZE   256

Definition at line 207 of file logger.c.

Referenced by ast_log().

#define VERBOSE_BUF_INIT_SIZE   256

Definition at line 204 of file logger.c.

Referenced by __ast_verbose_ap().


Enumeration Type Documentation

Enumerator:
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 119 of file logger.c.

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

enum logtypes

Enumerator:
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 90 of file logger.c.

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

Enumerator:
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 78 of file logger.c.

00078                            {
00079    SEQUENTIAL = 1 << 0,     /* Original method - create a new file, in order */
00080    ROTATE = 1 << 1,         /* Rotate all files, such that the oldest file has the highest suffix */
00081    TIMESTAMP = 1 << 2,      /* Append the epoch timestamp onto the end of the archived file */
00082 } 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 1204 of file logger.c.

References __ast_verbose_ap().

01205 {
01206    va_list ap;
01207 
01208    va_start(ap, fmt);
01209    __ast_verbose_ap(file, line, func, fmt, ap);
01210    va_end(ap);
01211 }

void __ast_verbose_ap ( const char *  file,
int  line,
const char *  func,
const char *  fmt,
va_list  ap 
)

Definition at line 1148 of file logger.c.

References __LOG_VERBOSE, ast_calloc_with_stringfields, ast_cond_signal(), AST_DYNSTR_BUILD_FAILED, ast_free, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), ast_log(), ast_opt_timestamp, AST_PTHREADT_NULL, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_string_field_set, ast_tvnow(), buf, logchannel::list, logcond, logger_print_verbose(), LOGMSG_VERBOSE, logthread, logmsg::message, logmsg::type, verbose_buf, and VERBOSE_BUF_INIT_SIZE.

Referenced by __ast_verbose(), and ast_verbose().

01149 {
01150    struct logmsg *logmsg = NULL;
01151    struct ast_str *buf = NULL;
01152    int res = 0;
01153 
01154    if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE)))
01155       return;
01156 
01157    if (ast_opt_timestamp) {
01158       struct timeval now;
01159       struct ast_tm tm;
01160       char date[40];
01161       char *datefmt;
01162 
01163       now = ast_tvnow();
01164       ast_localtime(&now, &tm, NULL);
01165       ast_strftime(date, sizeof(date), dateformat, &tm);
01166       datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1);
01167       sprintf(datefmt, "%c[%s] %s", 127, date, fmt);
01168       fmt = datefmt;
01169    } else {
01170       char *tmp = alloca(strlen(fmt) + 2);
01171       sprintf(tmp, "%c%s", 127, fmt);
01172       fmt = tmp;
01173    }
01174 
01175    /* Build string */
01176    res = ast_str_set_va(&buf, 0, fmt, ap);
01177 
01178    /* If the build failed then we can drop this allocated message */
01179    if (res == AST_DYNSTR_BUILD_FAILED)
01180       return;
01181 
01182    if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128)))
01183       return;
01184 
01185    ast_string_field_set(logmsg, message, ast_str_buffer(buf));
01186 
01187    ast_log(__LOG_VERBOSE, file, line, func, "%s", logmsg->message + 1);
01188 
01189    /* Set type */
01190    logmsg->type = LOGMSG_VERBOSE;
01191    
01192    /* Add to the list and poke the thread if possible */
01193    if (logthread != AST_PTHREADT_NULL) {
01194       AST_LIST_LOCK(&logmsgs);
01195       AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
01196       ast_cond_signal(&logcond);
01197       AST_LIST_UNLOCK(&logmsgs);
01198    } else {
01199       logger_print_verbose(logmsg);
01200       ast_free(logmsg);
01201    }
01202 }

static void __fini_logchannels ( void   )  [static]

Definition at line 117 of file logger.c.

00119 {

static void __fini_verbosers ( void   )  [static]

Definition at line 750 of file logger.c.

00752 {

static void __init_log_buf ( void   )  [static]

Definition at line 206 of file logger.c.

00210 {

static void __init_logchannels ( void   )  [static]

Definition at line 117 of file logger.c.

00119 {

static void __init_verbose_buf ( void   )  [static]

Definition at line 203 of file logger.c.

00210 {

static void __init_verbosers ( void   )  [static]

Definition at line 750 of file logger.c.

00752 {

void ast_backtrace ( void   ) 

Definition at line 1118 of file logger.c.

References ast_debug, ast_log(), free, LOG_DEBUG, and LOG_WARNING.

01119 {
01120 #ifdef HAVE_BKTR
01121    struct ast_bt *bt;
01122    int i = 0;
01123    char **strings;
01124 
01125    if (!(bt = ast_bt_create())) {
01126       ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
01127       return;
01128    }
01129 
01130    if ((strings = backtrace_symbols(bt->addresses, bt->num_frames))) {
01131       ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' ');
01132       for (i = 0; i < bt->num_frames; i++) {
01133          ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i, bt->addresses[i], strings[i]);
01134       }
01135 
01136       /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */
01137 #undef free
01138       free(strings);
01139    } else {
01140       ast_debug(1, "Could not allocate memory for backtrace\n");
01141    }
01142    ast_bt_destroy(bt);
01143 #else
01144    ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
01145 #endif
01146 }

void ast_child_verbose ( int  level,
const char *  fmt,
  ... 
)

Definition at line 380 of file logger.c.

References ast_free, ast_malloc, msg, and option_verbose.

Referenced by launch_script().

00381 {
00382    char *msg = NULL, *emsg = NULL, *sptr, *eptr;
00383    va_list ap, aq;
00384    int size;
00385 
00386    /* Don't bother, if the level isn't that high */
00387    if (option_verbose < level) {
00388       return;
00389    }
00390 
00391    va_start(ap, fmt);
00392    va_copy(aq, ap);
00393    if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) {
00394       va_end(ap);
00395       va_end(aq);
00396       return;
00397    }
00398    va_end(ap);
00399 
00400    if (!(msg = ast_malloc(size + 1))) {
00401       va_end(aq);
00402       return;
00403    }
00404 
00405    vsnprintf(msg, size + 1, fmt, aq);
00406    va_end(aq);
00407 
00408    if (!(emsg = ast_malloc(size * 2 + 1))) {
00409       ast_free(msg);
00410       return;
00411    }
00412 
00413    for (sptr = msg, eptr = emsg; ; sptr++) {
00414       if (*sptr == '"') {
00415          *eptr++ = '\\';
00416       }
00417       *eptr++ = *sptr;
00418       if (*sptr == '\0') {
00419          break;
00420       }
00421    }
00422    ast_free(msg);
00423 
00424    fprintf(stdout, "verbose \"%s\" %d\n", emsg, level);
00425    fflush(stdout);
00426    ast_free(emsg);
00427 }

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

References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc_with_stringfields, ast_cond_signal(), AST_DYNSTR_BUILD_FAILED, ast_free, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), AST_PTHREADT_NULL, AST_RWLIST_EMPTY, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_string_field_set, ast_tvnow(), buf, GETTID, logmsg::level, levels, logmsg::line, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, logthread, option_debug, option_verbose, logmsg::process_id, 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_check_signature(), __ast_check_signature_bin(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_decrypt_bin(), __ast_dsp_call_progress(), __ast_encrypt_bin(), __ast_format_register(), __ast_http_load(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_register_translator(), __ast_request_and_dial(), __ast_sign_bin(), __ast_smoother_feed(), __ast_string_field_init(), __ast_udptl_reload(), __ast_verbose_ap(), __attempt_transmit(), __auto_congest(), __dahdi_exception(), __find_callno(), __iax2_poke_noanswer(), __init_manager(), __mgcp_xmit(), __oh323_destroy(), __oh323_new(), __oh323_rtp_create(), __oh323_update_info(), __set_address_from_contact(), __sip_autodestruct(), __sip_destroy(), __sip_pretend_ack(), __sip_reliable_xmit(), __sip_xmit(), __transmit_response(), __unload_module(), _ast_adsi_get_cpeid(), _ast_adsi_get_cpeinfo(), _ast_adsi_load_session(), _ast_adsi_transmit_message_full(), _dsp_init(), _enum_array_map(), _extension_match_core(), _macro_exec(), _sip_tcp_helper_thread(), _while_exec(), accept_thread(), access_counter_file(), acf_channel_read(), acf_channel_write(), acf_curl_helper(), acf_curlopt_helper(), acf_curlopt_write(), acf_cut_exec(), acf_cut_exec2(), 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(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_hangup(), add_agent(), add_agi_cmd(), add_calltoken_ignore(), add_cfg_entry(), add_codec_to_answer(), 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_pri_lockopt(), add_publish_event(), add_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_subscribe_event(), add_to_agi(), add_user_extension(), admin_exec(), adsi_begin(), adsi_careful_send(), adsi_process(), adsi_prog(), advanced_options(), ael2_print(), aes_helper(), agent_answer(), agent_call(), agent_fixup(), agent_get_base_channel(), agent_new(), agent_read(), agent_request(), agent_set_base_channel(), agentmonitoroutgoing_exec(), agi_exec_full(), aji_act_hook(), aji_client_connect(), aji_client_info_handler(), aji_create_buddy(), aji_create_client(), aji_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_message(), aji_handle_presence(), aji_handle_subscribe(), aji_initialize(), aji_load_config(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), aji_set_presence(), aji_start_sasl(), aji_status_exec(), alarmreceiver_exec(), alloc_expr_node(), alloc_resampler(), alloc_sub(), alsa_card_init(), alsa_indicate(), alsa_new(), alsa_read(), alsa_request(), alsa_write(), analog_answer(), analog_attempt_transfer(), analog_available(), analog_call(), analog_exception(), analog_get_index(), analog_handle_dtmfup(), analog_handle_init_event(), analog_hangup(), analog_request(), analog_ss_thread(), analogsub_to_dahdisub(), announce_thread(), answer_call(), anti_injection(), app_exec(), append_ie(), apply_general_options(), apply_option(), apply_outgoing(), aqm_exec(), array_insert(), array_remove(), ast_add_extension2_lockopt(), ast_agi_register(), ast_agi_send(), ast_agi_unregister(), ast_ais_clm_load_module(), ast_ais_clm_unload_module(), ast_ais_evt_load_module(), ast_ais_evt_unload_module(), ast_aji_create_chat(), ast_aji_invite_chat(), ast_aji_join_chat(), ast_aji_send_chat(), ast_alaw_init(), ast_app_dtget(), ast_app_parse_options(), ast_app_parse_options64(), ast_app_run_macro(), ast_append_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_timelimit(), ast_calendar_register(), ast_call_forward(), ast_careful_fwrite(), ast_carefulwrite(), ast_cdr_alloc(), ast_cdr_end(), ast_cdr_engine_init(), ast_cdr_merge(), ast_cdr_noanswer(), ast_cdr_register(), ast_cdr_serialize_variables(), ast_cdr_setvar(), ast_cdr_submit_batch(), ast_cel_fill_record(), ast_channel_audiohook_count_by_source(), ast_channel_audiohook_count_by_source_running(), ast_channel_bridge(), ast_channel_destructor(), ast_channel_log(), ast_channel_make_compatible_helper(), ast_channel_masquerade(), ast_channel_queryoption(), ast_channel_register(), ast_channel_setoption(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_check_timing(), ast_cli_perms_init(), ast_codec_get_len(), ast_codec_get_samples(), ast_config_engine_register(), ast_config_internal_load(), ast_connected_line_build_data(), ast_connected_line_parse_data(), ast_context_find_or_create(), ast_context_remove_extension_callerid2(), ast_context_verify_includes(), ast_db_get(), ast_db_gettree(), ast_db_put(), ast_device_state_engine_init(), ast_do_masquerade(), ast_dsp_call_progress(), ast_dsp_noise(), ast_dsp_process(), ast_dsp_silence(), ast_dtmf_stream(), ast_el_read_char(), ast_enable_distributed_devstate(), ast_enable_packet_fragmentation(), ast_event_cb(), ast_event_check_subscriber(), ast_event_get_cached(), ast_event_get_ie_pltype(), ast_event_get_ie_type_name(), ast_event_get_type_name(), ast_event_new(), ast_event_queue(), ast_event_queue_and_cache(), ast_event_subscribe_new(), ast_extension_close(), ast_filehelper(), ast_find_ourip(), ast_format_unregister(), ast_func_read(), ast_func_read2(), ast_func_write(), ast_get_encoded_char(), ast_get_enum(), ast_get_group(), ast_get_ip_or_srv(), ast_hangup(), ast_heap_create(), ast_http_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_manager_unregister(), ast_merge_contexts_and_delete(), ast_module_reload(), ast_moh_files_next(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), ast_netsock_bindaddr(), ast_netsock_set_qos(), ast_odbc_direct_execute(), ast_odbc_find_table(), ast_odbc_prepare_and_execute(), ast_odbc_request_obj2(), ast_odbc_sanity_check(), ast_odbc_smart_execute(), ast_openstream_full(), ast_openvstream(), ast_ouraddrfor(), ast_parse_allow_disallow(), ast_parse_digest(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_run_app(), ast_pbx_start(), ast_pickup_call(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), ast_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(), ast_rtp_engine_register2(), ast_rtp_glue_register2(), ast_rtp_instance_bridge(), ast_rtp_instance_early_bridge(), ast_rtp_instance_new(), ast_rtp_new(), ast_rtp_read(), ast_rtp_write(), ast_safe_fork(), ast_safe_system(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_es(), ast_say_date_with_format_fr(), ast_say_date_with_format_gr(), ast_say_date_with_format_he(), ast_say_date_with_format_it(), ast_say_date_with_format_nl(), ast_say_date_with_format_pl(), ast_say_date_with_format_pt(), ast_say_date_with_format_th(), ast_say_date_with_format_zh(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_ur(), ast_say_number_full_zh(), ast_sched_del(), ast_sched_runq(), ast_sched_thread_create(), ast_search_dns(), ast_security_event_report(), ast_set_owners_and_peers(), ast_set_priority(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_speech_register(), ast_stopstream(), ast_str_substitute_variables_full(), ast_streamfile(), ast_stun_request(), ast_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_tls_read_conf(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_tryconnect(), ast_udptl_bridge(), ast_udptl_get_error_correction_scheme(), ast_udptl_get_far_max_datagram(), ast_udptl_get_local_max_datagram(), ast_udptl_new_with_bindaddr(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_set_error_correction_scheme(), ast_udptl_set_far_max_datagram(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_wait_for_output(), ast_waitfor_nandfds(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_reconnect(), attempt_thread(), attempt_transfer(), audiohook_read_frame_both(), auth_credentials(), auth_exec(), 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(), build_alias(), build_calendar(), build_callno_limits(), build_channels(), build_conf(), build_device(), build_event_channel(), build_filename(), build_gateway(), build_mapping(), build_parkinglot(), build_peer(), build_route(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), bump_gains(), cache_get_callno_locked(), calc_cost(), calc_metric(), 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_write(), canary_thread(), canmatch(), careful_write(), cb_events(), cb_extensionstate(), cdr_handler(), cdr_merge_vars(), chan_misdn_log(), chan_ringing(), chanavail_exec(), change_t38_state(), 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_includes(), check_key(), check_label(), check_macro_returns(), check_month(), check_password(), check_post(), check_pval_item(), check_rtp_timeout(), check_srcaddr(), check_switch_expr(), check_timerange(), check_tx_freq(), check_user_full(), check_vars(), check_via(), cleanup_connection(), clear_caller(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), close_call(), close_client(), close_mailbox(), collect_function_digits(), commit_exec(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), confbridge_exec(), config_curl(), config_device(), config_function_read(), config_handler(), config_ldap(), config_line(), config_load(), config_module(), config_odbc(), config_parse_variables(), config_pgsql(), config_text_file_load(), connect_link(), connectedline_read(), connectedline_write(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), convertcap(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), create_addr(), create_dirpath(), create_jb(), create_match_char_tree(), create_new_socket(), create_queue_member(), create_video_frame(), create_vmaccount(), crement_function_read(), crypto_load(), csv_log(), csv_quote(), custom_log(), custom_prepare(), cut_internal(), dahdi_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_get_index(), dahdi_handle_dtmfup(), 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_test_timer(), dahdi_timer_set_rate(), dahdi_train_ec(), dahdi_translate(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dahdiscan_exec(), dbinit(), deadagi_exec(), dec_init(), del_exec(), delete_old_messages(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_pval_item(), destroy_session(), destroy_trans(), device_state_cb(), devstate_cache_cb(), devstate_change_collector_cb(), devstate_write(), dial_exec_full(), dialgroup_read(), dialgroup_write(), dialog_ref(), dictate_exec(), digitcollect(), digitdirect(), directory_exec(), disa_exec(), disable_jack_hook(), diskavail(), dispatch_thread_handler(), display_last_error(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_dtmf_local(), do_forward(), do_magic_pickup(), do_monitor(), do_notify(), do_register(), do_reload(), do_say(), do_scheduler(), do_waiting(), donodelog(), dump_queue(), dump_queue_members(), dundi_answer_entity(), dundi_answer_query(), dundi_discover(), dundi_encrypt(), dundi_error_output(), dundi_exec(), dundi_helper(), dundi_lookup_internal(), dundi_precache_full(), dundi_precache_internal(), dundi_prop_precache(), dundi_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), duplicate_pseudo(), eagi_exec(), ebl_callback(), enable_jack_hook(), encode_open_type(), enum_callback(), enum_query_read(), enum_result_read(), event_channel_destroy(), evt_event_deliver_cb(), exchangecal_get_events_between(), exchangecal_load_calendar(), exchangecal_request(), exchangecal_write_event(), exec(), exec_exec(), execif_exec(), exists(), ext_cmp1(), extension_matches(), extenspy_exec(), external_rtp_create(), extstate_read(), fax_generator_generate(), fbuf_append(), feature_exec_app(), feature_request_and_dial(), festival_exec(), fetch_icalendar(), ffmpeg_decode(), ffmpeg_encode(), file_read(), filter(), find_account(), find_cache(), find_call_locked(), find_conf(), find_conf_realtime(), find_desc(), find_desc_usb(), find_engine(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), find_parkinglot(), find_pval_goto_item(), find_queue_by_name_rt(), find_sdp(), find_speeddial_by_instance(), find_subchannel_and_lock(), find_subchannel_by_instance_reference(), find_subchannel_by_name(), find_subchannel_by_reference(), find_table(), find_transaction(), find_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), flush_telem(), fn_wrapper(), forkcdr_exec(), forward_message(), framein(), func_args(), func_channel_read(), func_channel_write(), func_channels_read(), func_check_sipdomain(), func_header_read(), func_inheritance_write(), function_agent(), function_autopatchup(), function_cop(), function_db_delete(), function_db_exists(), function_db_read(), function_db_write(), function_enum(), function_eval(), function_eval2(), function_ilink(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_remote(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g723_len(), g723_read(), g723_write(), g726_read(), g726_write(), g729_read(), g729_write(), generic_execute(), generic_http_callback(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_canmatch_exten(), get_destination(), get_domain(), get_in_brackets(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_mem_set(), get_member_penalty(), get_mohbyname(), get_params(), get_range(), get_rdnis(), get_refer_info(), get_timerange(), get_to_address(), get_token(), get_unused_callno(), getdisplaybyname(), getflagbyname(), getkeybyname(), getstatebyname(), getsubbyname(), gosub_exec(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_function_write(), gsm_read(), gsm_seek(), gsm_write(), gsmtolin_framein(), gtalk_alloc(), gtalk_call(), gtalk_create_candidates(), gtalk_create_member(), gtalk_digit(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_indicate(), gtalk_invite(), gtalk_invite_response(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_sendhtml(), gtalk_sendtext(), gtalk_show_channels(), gtalk_write(), h261_decap(), h263_decap(), h263_encap(), h263_open(), h263_read(), h263_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), h264_write(), handle_alarms(), handle_call_token(), handle_callforward_button(), handle_capabilities_res_message(), handle_cli_agi_add_cmd(), handle_cli_h323_cycle_gk(), handle_cli_indication_add(), handle_cli_indication_remove(), handle_command_response(), handle_common_options(), handle_devstate_change(), handle_enbloc_call_message(), handle_error(), handle_exec(), handle_getoption(), handle_gosub(), handle_hd_hf(), handle_incoming(), handle_init_event(), handle_input(), handle_invite_replaces(), handle_jack_audio(), handle_keypad_button_message(), handle_link_data(), handle_message(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_orig(), handle_playtones(), handle_recordfile(), handle_register_message(), handle_remote_data(), handle_remote_dtmf_digit(), handle_request(), handle_request_bye(), handle_request_do(), handle_request_info(), handle_request_invite(), handle_request_notify(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_response_notify(), handle_response_peerpoke(), handle_response_refer(), handle_response_register(), handle_response_subscribe(), handle_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_read(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_template_parse(), ic706_pltocode(), 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(), insert_penaltychange(), inspect_module(), internal_ao2_ref(), INTERNAL_OBJ(), invent_message(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jack_hook_callback(), jack_hook_write(), jb_error_output(), jb_get_and_deliver(), jb_warning_output(), jingle_alloc(), jingle_call(), jingle_create_candidates(), jingle_create_member(), jingle_digit(), jingle_free_pvt(), jingle_handle_dtmf(), jingle_hangup_farend(), jingle_indicate(), jingle_is_answered(), jingle_load_config(), jingle_new(), jingle_newcall(), jingle_parser(), jingle_request(), jingle_sendhtml(), jingle_sendtext(), jingle_show_channels(), jingle_write(), join_conference_bridge(), join_queue(), jpeg_read_image(), jpeg_write_image(), key_call(), Keyfavorite(), kickptt(), launch_asyncagi(), launch_monitor_thread(), launch_netscript(), launch_script(), launch_service(), ldap_loadentry(), ldap_reconnect(), leave_voicemail(), linear_alloc(), linear_generator(), linear_release(), linkcount(), lintogsm_framein(), lintolpc10_framein(), lintoulaw(), listener(), listfilter(), load_column_config(), load_config(), load_config_meetme(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_realtime_queue(), load_resource(), load_rpt_vars(), load_tech_calendars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_start(), local_call(), local_devicestate(), local_dtmf_helper(), local_fixup(), local_new(), local_write(), log_exec(), log_jack_status(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), lua_read_extensions_file(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manage_parkinglot(), manager_log(), manager_modulecheck(), manager_show_dialplan_helper(), map_video_codec(), masq_park_call(), matchmore(), math(), md5(), measurenoise(), meetmemute(), memcpy_decrypt(), memcpy_encrypt(), message_template_build(), message_template_parse_emailbody(), message_template_parse_filebody(), mgcp_call(), mgcp_fixup(), mgcp_indicate(), mgcp_new(), mgcp_reload(), mgcp_request(), mgcp_rtp_read(), mgcp_senddigit_begin(), mgcp_senddigit_end(), mgcp_ss(), mgcp_write(), mgcpsock_read(), milliwatt_generate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_delete_exec(), minivm_greet_exec(), minivm_mwi_exec(), minivm_notify_exec(), minivm_record_exec(), misdn_answer(), misdn_bridge(), misdn_call(), misdn_cfg_get(), misdn_cfg_get_config_string(), misdn_cfg_init(), misdn_cfg_is_msn_valid(), misdn_cfg_update_ptp(), misdn_check_l2l1(), misdn_digit_end(), misdn_facility_exec(), misdn_hangup(), misdn_indication(), misdn_new(), misdn_request(), misdn_send_text(), misdn_set_opt_exec(), misdn_write(), mixmonitor_exec(), mixmonitor_thread(), mkif(), mkintf(), moh_alloc(), moh_class_destructor(), moh_files_generator(), moh_files_release(), moh_generate(), moh_register(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), mssql_connect(), multicast_rtp_write(), 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_dtmfup(), my_handle_notify_message(), my_is_dialing(), my_is_off_hook(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), 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(), notify_new_message(), odbc_load_module(), odbc_log(), odbc_obj_connect(), odbc_obj_disconnect(), odbc_register_class(), odbc_release_obj2(), ogg_vorbis_open(), ogg_vorbis_read(), ogg_vorbis_rewrite(), ogg_vorbis_seek(), ogg_vorbis_tell(), ogg_vorbis_trunc(), ogg_vorbis_write(), oh323_alloc(), oh323_call(), oh323_digit_begin(), oh323_digit_end(), oh323_fixup(), oh323_hangup(), oh323_indicate(), oh323_read(), oh323_request(), oh323_rtp_read(), oh323_set_rtp_peer(), oh323_write(), old_milliwatt_exec(), onevent(), op_colon(), op_div(), op_eq(), op_eqtilde(), op_func(), op_minus(), op_negate(), op_plus(), op_rem(), op_times(), open_mailbox(), open_stream(), OpenHistory(), openserial(), originate_exec(), osp_check_destination(), osp_create_provider(), osp_load(), ospauth_exec(), ospfinished_exec(), osplookup_exec(), ospnext_exec(), oss_indicate(), oss_new(), oss_request(), page_exec(), park_call_exec(), park_call_full(), park_exec_full(), park_space_reserve(), parkandannounce_exec(), parkinglot_addref(), parkinglot_unref(), parse(), parse_apps(), parse_args(), parse_buffers_policy(), parse_config(), parse_cookies(), parse_empty_options(), parse_events(), parse_gain_value(), parse_ie(), parse_minse(), parse_moved_contact(), parse_naptr(), parse_register_contact(), parse_request(), parse_session_expires(), parse_srv(), parse_tag(), parse_tone_zone(), ParseBookmark(), parsing(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_hangup(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_saynumber(), pbx_builtin_serialize_variables(), pbx_builtin_setvar(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_exec(), pbx_extension_helper(), pbx_find_extension(), pbx_load_config(), pbx_load_module(), pbx_load_users(), pbx_parseable_goto(), pbx_substitute_variables_helper_full(), pcm_read(), pcm_seek(), pcm_write(), peek_read(), peer_set_srcaddr(), peercnt_add(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_do(), pickup_exec(), pickupchan_exec(), play_message(), play_message_category(), play_message_datetime(), play_message_in_bridged_call(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), pop_exec(), post_raw(), powerof(), pp_each_extension_helper(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_ast_dsp(), process_cn_rfc3389(), process_dahdi(), process_dtmf_rfc2833(), process_echocancel(), process_message_callback(), process_opcode(), process_request(), process_request_queue(), process_returncode(), process_sdp(), process_text_line(), profile_set_param(), progress(), proxy_update(), pthread_timer_set_rate(), purge_old_messages(), pvalCheckType(), pvalGlobalsAddStatement(), pvalTopLevAddObject(), pw_cb(), ql_exec(), queue_exec(), queue_function_memberpenalty_read(), queue_function_memberpenalty_write(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), queue_function_queuewaitingcount(), queue_function_var(), queue_reload_request(), queue_set_param(), queue_transfer_fixup(), queue_voice_frame(), quote(), radio_tune(), radius_log(), rbi_out(), rcv_mac_addr(), rcvfax_exec(), read_agent_config(), read_config(), read_config_maps(), read_exec(), read_password_from_file(), read_pipe(), read_samples(), read_to_parts(), readexten_exec(), readfile_exec(), readmimefile(), realtime_curl(), realtime_destroy_handler(), realtime_directory(), realtime_exec(), realtime_handler(), realtime_ldap_base_ap(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_odbc(), realtime_peer(), realtime_pgsql(), realtime_require_handler(), realtime_store_handler(), realtime_update2_handler(), realtime_update_handler(), realtime_user(), realtimefield_read(), receive_digit(), receive_message(), record_exec(), redirecting_id_write(), redirecting_read(), redirecting_write(), refresh_list(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_config(), reload_firmware(), reload_followme(), reload_logger(), 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_callno(), reply_digest(), require_curl(), require_odbc(), require_pgsql(), resample_frame(), reset_conf(), restart_monitor(), restart_session_timer(), restore_conference(), restore_gains(), retrans_pkt(), retreive_memory(), retrydial_exec(), return_exec(), revert_fax_buffers(), rollback_exec(), rotate_file(), rpt(), rpt_call(), rpt_do_lstats(), rpt_do_stats(), rpt_exec(), rpt_manager_do_stats(), rpt_master(), rpt_push_alt_macro(), rpt_tele_thread(), rpt_telemetry(), rqm_exec(), 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(), sayfile(), saynum(), scan_service(), scan_thread(), schedule(), scheduled_destroy(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_usb_txt(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendimage_exec(), sendkenwood(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), serial_remote_io(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_ctcss_mode_ic706(), set_destination(), set_format(), set_freq_ic706(), set_full_cmd(), set_ic706(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_mode_ic706(), set_moh_exec(), set_offset_ic706(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setdtr(), setflag(), setformat(), setrem(), setup_dahdi(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), show_dialplan_helper(), showdisplay(), showkeys(), sip_addheader(), sip_call(), sip_cli_notify(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_park(), sip_park_thread(), sip_parse_host(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_reg_timeout(), sip_register(), sip_removeheader(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_sipredirect(), sip_st_alloc(), sip_subscribe_mwi(), sip_tcptls_write(), sip_threadinfo_create(), sip_write(), sipsock_read(), siren14read(), siren14write(), siren7read(), siren7write(), skel_exec(), skinny_call(), skinny_fixup(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), skinny_transfer(), skinny_write(), sla_add_trunk_to_station(), sla_build_station(), sla_build_trunk(), sla_load_config(), sla_queue_event_conf(), sla_state(), sla_station_exec(), sla_trunk_exec(), slinear_read(), slinear_write(), smdi_load(), smdi_msg_read(), smdi_msg_retrieve_read(), smdi_read(), smdi_toggle_mwi(), smoother_frame_feed(), sms_exec(), sms_generate(), sms_handleincoming(), sms_log(), sms_messagerx2(), sms_process(), sms_readfile(), sms_writefile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), soundcard_init(), soundcard_writeframe(), span_message(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite3_log(), sqlite_log(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_rtp(), start_session_timer(), start_spying(), start_stream(), starttimer(), statpost(), stop_session_timer(), store_boost(), store_by_peercallno(), store_by_transfercallno(), store_config(), store_config_core(), store_curl(), store_digit(), store_mixer(), store_odbc(), store_pgsql(), store_rxcdtype(), store_rxdemod(), store_rxsdtype(), store_tone_zone_ring_cadence(), store_txmixa(), store_txmixb(), store_txtoctype(), stub_ast_key_get(), subscribe_event_destroy(), 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_invite(), transmit_refer(), transmit_register(), transmit_request_with_auth(), transmit_response(), transmit_response_using_temp(), transmit_response_with_auth(), transmit_response_with_sdp(), transmit_response_with_t38_sdp(), transmit_state_notify(), transmit_t38(), try_calling(), try_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), tvfix(), txt_callback(), udptl_build_packet(), unalloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), unistim_request(), unistim_rtp_read(), unistim_senddigit_end(), unistim_sendtext(), unistim_ss(), unistim_write(), unistimsock_read(), unload_module(), unlock_read(), unref_mansession(), unregister_exten(), update2_curl(), update2_ldap(), update2_odbc(), update2_pgsql(), update2_prepare(), update_call_counter(), update_common_options(), update_config(), update_connectedline(), update_curl(), update_header(), update_key(), update_ldap(), update_odbc(), update_pgsql(), update_registry(), update_scoreboard(), upqm_exec(), uridecode(), uriencode(), usbradio_fixup(), usbradio_indicate(), usbradio_new(), usbradio_read(), usbradio_request(), usbradio_text(), usbradio_write(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_check_password_shell(), vm_exec(), vm_execmain(), vm_newuser(), vm_options(), vox_read(), vox_write(), wait_file(), wait_file2(), wait_for_answer(), wait_for_winner(), wait_interval(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_write(), write_byte(), write_header(), write_history(), write_password_to_file(), write_stream(), writefile(), xpmr_config(), yyerror(), and yyparse().

00994 {
00995    struct logmsg *logmsg = NULL;
00996    struct ast_str *buf = NULL;
00997    struct ast_tm tm;
00998    struct timeval now = ast_tvnow();
00999    int res = 0;
01000    va_list ap;
01001    char datestring[256];
01002 
01003    if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE)))
01004       return;
01005 
01006    if (AST_RWLIST_EMPTY(&logchannels)) {
01007       /*
01008        * we don't have the logger chain configured yet,
01009        * so just log to stdout
01010        */
01011       if (level != __LOG_VERBOSE) {
01012          int result;
01013          va_start(ap, fmt);
01014          result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */
01015          va_end(ap);
01016          if (result != AST_DYNSTR_BUILD_FAILED) {
01017             term_filter_escapes(ast_str_buffer(buf));
01018             fputs(ast_str_buffer(buf), stdout);
01019          }
01020       }
01021       return;
01022    }
01023    
01024    /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug
01025       are non-zero; LOG_DEBUG messages can still be displayed if option_debug
01026       is zero, if option_verbose is non-zero (this allows for 'level zero'
01027       LOG_DEBUG messages to be displayed, if the logmask on any channel
01028       allows it)
01029    */
01030    if (!option_verbose && !option_debug && (level == __LOG_DEBUG))
01031       return;
01032 
01033    /* Ignore anything that never gets logged anywhere */
01034    if (!(global_logmask & (1 << level)))
01035       return;
01036    
01037    /* Build string */
01038    va_start(ap, fmt);
01039    res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
01040    va_end(ap);
01041 
01042    /* If the build failed, then abort and free this structure */
01043    if (res == AST_DYNSTR_BUILD_FAILED)
01044       return;
01045 
01046    /* Create a new logging message */
01047    if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128)))
01048       return;
01049 
01050    /* Copy string over */
01051    ast_string_field_set(logmsg, message, ast_str_buffer(buf));
01052 
01053    /* Set type to be normal */
01054    logmsg->type = LOGMSG_NORMAL;
01055 
01056    /* Create our date/time */
01057    ast_localtime(&now, &tm, NULL);
01058    ast_strftime(datestring, sizeof(datestring), dateformat, &tm);
01059    ast_string_field_set(logmsg, date, datestring);
01060 
01061    /* Copy over data */
01062    logmsg->level = level;
01063    logmsg->line = line;
01064    ast_string_field_set(logmsg, level_name, levels[level]);
01065    ast_string_field_set(logmsg, file, file);
01066    ast_string_field_set(logmsg, function, function);
01067    logmsg->process_id = (long) GETTID();
01068 
01069    /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */
01070    if (logthread != AST_PTHREADT_NULL) {
01071       AST_LIST_LOCK(&logmsgs);
01072       AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
01073       ast_cond_signal(&logcond);
01074       AST_LIST_UNLOCK(&logmsgs);
01075    } else {
01076       logger_print_normal(logmsg);
01077       ast_free(logmsg);
01078    }
01079 
01080    return;
01081 }

static void ast_log_vsyslog ( struct logmsg msg  )  [static]

Definition at line 766 of file logger.c.

References __LOG_DEBUG, __LOG_DTMF, __LOG_VERBOSE, ast_syslog_priority_from_loglevel(), buf, logmsg::file, logmsg::function, logmsg::level, levels, logmsg::line, logmsg::message, logmsg::process_id, and term_strip().

Referenced by logger_print_normal().

00767 {
00768    char buf[BUFSIZ];
00769    int syslog_level = ast_syslog_priority_from_loglevel(msg->level);
00770 
00771    if (syslog_level < 0) {
00772       /* we are locked here, so cannot ast_log() */
00773       fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level);
00774       return;
00775    }
00776 
00777    if (msg->level == __LOG_VERBOSE) {
00778       snprintf(buf, sizeof(buf), "VERBOSE[%ld]: %s", msg->process_id, msg->message);
00779       msg->level = __LOG_DEBUG;
00780    } else if (msg->level == __LOG_DTMF) {
00781       snprintf(buf, sizeof(buf), "DTMF[%ld]: %s", msg->process_id, msg->message);
00782       msg->level = __LOG_DEBUG;
00783    } else {
00784       snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s",
00785           levels[msg->level], msg->process_id, msg->file, msg->line, msg->function, msg->message);
00786    }
00787 
00788    term_strip(buf, buf, strlen(buf) + 1);
00789    syslog(syslog_level, "%s", buf);
00790 }

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.6.3

Definition at line 1275 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 load_module().

01276 {
01277    unsigned int level;
01278    unsigned int available = 0;
01279 
01280    AST_RWLIST_WRLOCK(&logchannels);
01281 
01282    for (level = 0; level < ARRAY_LEN(levels); level++) {
01283       if ((level >= 16) && !available && !levels[level]) {
01284          available = level;
01285          continue;
01286       }
01287 
01288       if (levels[level] && !strcasecmp(levels[level], name)) {
01289          ast_log(LOG_WARNING,
01290             "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n",
01291             name);
01292          AST_RWLIST_UNLOCK(&logchannels);
01293 
01294          return -1;
01295       }
01296    }
01297 
01298    if (!available) {
01299       ast_log(LOG_WARNING,
01300          "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n",
01301          name);
01302       AST_RWLIST_UNLOCK(&logchannels);
01303 
01304       return -1;
01305    }
01306 
01307    levels[available] = ast_strdup(name);
01308 
01309    AST_RWLIST_UNLOCK(&logchannels);
01310 
01311    ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available);
01312 
01313    update_logchannels();
01314 
01315    return available;
01316 }

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.6.3

Definition at line 1318 of file logger.c.

References ARRAY_LEN, ast_debug, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, free, levels, and update_logchannels().

Referenced by load_module().

01319 {
01320    unsigned int found = 0;
01321    unsigned int x;
01322 
01323    AST_RWLIST_WRLOCK(&logchannels);
01324 
01325    for (x = 16; x < ARRAY_LEN(levels); x++) {
01326       if (!levels[x]) {
01327          continue;
01328       }
01329 
01330       if (strcasecmp(levels[x], name)) {
01331          continue;
01332       }
01333 
01334       found = 1;
01335       break;
01336    }
01337 
01338    if (found) {
01339       /* take this level out of the global_logmask, to ensure that no new log messages
01340        * will be queued for it
01341        */
01342 
01343       global_logmask &= ~(1 << x);
01344 
01345       free(levels[x]);
01346       levels[x] = NULL;
01347       AST_RWLIST_UNLOCK(&logchannels);
01348 
01349       ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x);
01350 
01351       update_logchannels();
01352    } else {
01353       AST_RWLIST_UNLOCK(&logchannels);
01354    }
01355 }

void ast_queue_log ( const char *  queuename,
const char *  callid,
const char *  agent,
const char *  event,
const char *  fmt,
  ... 
)

Definition at line 429 of file logger.c.

References ast_check_realtime(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_store_realtime(), qlog, and SENTINEL.

Referenced by aqm_exec(), find_queue_by_name_rt(), handle_queue_add_member(), handle_queue_remove_member(), init_logger(), login_exec(), manager_add_queue_member(), manager_queue_log_custom(), manager_remove_queue_member(), ql_exec(), queue_exec(), queue_transfer_fixup(), reload_logger(), rna(), rqm_exec(), rt_handle_member_record(), set_member_paused(), set_member_penalty(), try_calling(), update_realtime_members(), and wait_our_turn().

00430 {
00431    va_list ap;
00432    char qlog_msg[8192];
00433    int qlog_len;
00434    char time_str[16];
00435 
00436    if (ast_check_realtime("queue_log")) {
00437       va_start(ap, fmt);
00438       vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
00439       va_end(ap);
00440       snprintf(time_str, sizeof(time_str), "%ld", (long)time(NULL));
00441       ast_store_realtime("queue_log", "time", time_str, 
00442                   "callid", callid, 
00443                   "queuename", queuename, 
00444                   "agent", agent, 
00445                   "event", event,
00446                   "data", qlog_msg,
00447                   SENTINEL);
00448    } else {
00449       if (qlog) {
00450          va_start(ap, fmt);
00451          qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
00452          vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
00453          va_end(ap);
00454       }
00455       AST_RWLIST_RDLOCK(&logchannels);
00456       if (qlog) {
00457          fprintf(qlog, "%s\n", qlog_msg);
00458          fflush(qlog);
00459       }
00460       AST_RWLIST_UNLOCK(&logchannels);
00461    }
00462 }

int ast_register_verbose ( void(*)(const char *string v  ) 

Definition at line 1225 of file logger.c.

References ast_malloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb::verboser.

Referenced by ast_makesocket(), main(), and show_console().

01226 {
01227    struct verb *verb;
01228 
01229    if (!(verb = ast_malloc(sizeof(*verb))))
01230       return -1;
01231 
01232    verb->verboser = v;
01233 
01234    AST_RWLIST_WRLOCK(&verbosers);
01235    AST_RWLIST_INSERT_HEAD(&verbosers, verb, list);
01236    AST_RWLIST_UNLOCK(&verbosers);
01237    
01238    return 0;
01239 }

int ast_unregister_verbose ( void(*)(const char *string v  ) 

Definition at line 1241 of file logger.c.

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb::verboser.

Referenced by exit_now().

01242 {
01243    struct verb *cur;
01244 
01245    AST_RWLIST_WRLOCK(&verbosers);
01246    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) {
01247       if (cur->verboser == v) {
01248          AST_RWLIST_REMOVE_CURRENT(list);
01249          ast_free(cur);
01250          break;
01251       }
01252    }
01253    AST_RWLIST_TRAVERSE_SAFE_END;
01254    AST_RWLIST_UNLOCK(&verbosers);
01255    
01256    return cur ? 0 : -1;
01257 }

void ast_verbose ( const char *  fmt,
  ... 
)

Definition at line 1216 of file logger.c.

References __ast_verbose_ap().

01217 {
01218    va_list ap;
01219 
01220    va_start(ap, fmt);
01221    __ast_verbose_ap("", 0, "", fmt, ap);
01222    va_end(ap);
01223 }

void close_logger ( void   ) 

Provided by logger.c

Definition at line 956 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 quit_handler().

00957 {
00958    struct logchannel *f = NULL;
00959 
00960    /* Stop logger thread */
00961    AST_LIST_LOCK(&logmsgs);
00962    close_logger_thread = 1;
00963    ast_cond_signal(&logcond);
00964    AST_LIST_UNLOCK(&logmsgs);
00965 
00966    if (logthread != AST_PTHREADT_NULL)
00967       pthread_join(logthread, NULL);
00968 
00969    AST_RWLIST_WRLOCK(&logchannels);
00970 
00971    if (qlog) {
00972       fclose(qlog);
00973       qlog = NULL;
00974    }
00975 
00976    AST_RWLIST_TRAVERSE(&logchannels, f, list) {
00977       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
00978          fclose(f->fileptr);
00979          f->fileptr = NULL;
00980       }
00981    }
00982 
00983    closelog(); /* syslog */
00984 
00985    AST_RWLIST_UNLOCK(&logchannels);
00986 
00987    return;
00988 }

static char* handle_logger_reload ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
) [static]

Definition at line 626 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.

00627 {
00628    switch (cmd) {
00629    case CLI_INIT:
00630       e->command = "logger reload";
00631       e->usage = 
00632          "Usage: logger reload\n"
00633          "       Reloads the logger subsystem state.  Use after restarting syslogd(8) if you are using syslog logging.\n";
00634       return NULL;
00635    case CLI_GENERATE:
00636       return NULL;
00637    }
00638    if (reload_logger(0)) {
00639       ast_cli(a->fd, "Failed to reload the logger\n");
00640       return CLI_FAILURE;
00641    }
00642    return CLI_SUCCESS;
00643 }

static char* handle_logger_rotate ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
) [static]

Definition at line 645 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.

00646 {
00647    switch (cmd) {
00648    case CLI_INIT:
00649       e->command = "logger rotate";
00650       e->usage = 
00651          "Usage: logger rotate\n"
00652          "       Rotates and Reopens the log files.\n";
00653       return NULL;
00654    case CLI_GENERATE:
00655       return NULL;   
00656    }
00657    if (reload_logger(1)) {
00658       ast_cli(a->fd, "Failed to reload the logger and rotate log files\n");
00659       return CLI_FAILURE;
00660    } 
00661    return CLI_SUCCESS;
00662 }

static char* handle_logger_set_level ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
) [static]

Definition at line 664 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.

00665 {
00666    int x;
00667    int state;
00668    int level = -1;
00669 
00670    switch (cmd) {
00671    case CLI_INIT:
00672       e->command = "logger set level";
00673       e->usage = 
00674          "Usage: logger set level\n"
00675          "       Set a specific log level to enabled/disabled for this console.\n";
00676       return NULL;
00677    case CLI_GENERATE:
00678       return NULL;
00679    }
00680 
00681    if (a->argc < 5)
00682       return CLI_SHOWUSAGE;
00683 
00684    AST_RWLIST_WRLOCK(&logchannels);
00685 
00686    for (x = 0; x < ARRAY_LEN(levels); x++) {
00687       if (levels[x] && !strcasecmp(a->argv[3], levels[x])) {
00688          level = x;
00689          break;
00690       }
00691    }
00692 
00693    AST_RWLIST_UNLOCK(&logchannels);
00694 
00695    state = ast_true(a->argv[4]) ? 1 : 0;
00696 
00697    if (level != -1) {
00698       ast_console_toggle_loglevel(a->fd, level, state);
00699       ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off");
00700    } else
00701       return CLI_SHOWUSAGE;
00702 
00703    return CLI_SUCCESS;
00704 }

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

References ARRAY_LEN, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, chan, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, logchannel::disabled, ast_cli_args::fd, logchannel::filename, FORMATL, levels, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, logchannel::type, and ast_cli_entry::usage.

00708 {
00709 #define FORMATL   "%-35.35s %-8.8s %-9.9s "
00710    struct logchannel *chan;
00711    switch (cmd) {
00712    case CLI_INIT:
00713       e->command = "logger show channels";
00714       e->usage = 
00715          "Usage: logger show channels\n"
00716          "       List configured logger channels.\n";
00717       return NULL;
00718    case CLI_GENERATE:
00719       return NULL;   
00720    }
00721    ast_cli(a->fd, FORMATL, "Channel", "Type", "Status");
00722    ast_cli(a->fd, "Configuration\n");
00723    ast_cli(a->fd, FORMATL, "-------", "----", "------");
00724    ast_cli(a->fd, "-------------\n");
00725    AST_RWLIST_RDLOCK(&logchannels);
00726    AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
00727       unsigned int level;
00728 
00729       ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"),
00730          chan->disabled ? "Disabled" : "Enabled");
00731       ast_cli(a->fd, " - ");
00732       for (level = 0; level < ARRAY_LEN(levels); level++) {
00733          if (chan->logmask & (1 << level)) {
00734             ast_cli(a->fd, "%s ", levels[level]);
00735          }
00736       }
00737       ast_cli(a->fd, "\n");
00738    }
00739    AST_RWLIST_UNLOCK(&logchannels);
00740    ast_cli(a->fd, "\n");
00741       
00742    return CLI_SUCCESS;
00743 }

static int handle_SIGXFSZ ( int  sig  )  [static]

Definition at line 759 of file logger.c.

Referenced by init_logger().

00760 {
00761    /* Indicate need to reload */
00762    filesize_reload_needed = 1;
00763    return 0;
00764 }

int init_logger ( void   ) 

Provided by logger.c

Definition at line 925 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, ast_queue_log(), cli_logger, handle_SIGXFSZ(), init_logger_chain(), logcond, logfiles, logger_thread(), logthread, and qlog.

Referenced by main().

00926 {
00927    char tmp[256];
00928    int res = 0;
00929 
00930    /* auto rotate if sig SIGXFSZ comes a-knockin */
00931    (void) signal(SIGXFSZ, (void *) handle_SIGXFSZ);
00932 
00933    /* start logger thread */
00934    ast_cond_init(&logcond, NULL);
00935    if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) {
00936       ast_cond_destroy(&logcond);
00937       return -1;
00938    }
00939 
00940    /* register the logger cli commands */
00941    ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger));
00942 
00943    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
00944   
00945    /* create log channels */
00946    init_logger_chain(0 /* locked */);
00947 
00948    if (logfiles.queue_log) {
00949       snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
00950       qlog = fopen(tmp, "a");
00951       ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", "");
00952    }
00953    return res;
00954 }

static void init_logger_chain ( int  locked  )  [static]

Definition at line 286 of file logger.c.

References __LOG_ERROR, __LOG_NOTICE, __LOG_WARNING, ast_calloc, ast_config_destroy(), ast_config_load2(), ast_copy_string(), ast_free, AST_RWLIST_INSERT_HEAD, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), ast_variable_browse(), ast_variable_retrieve(), chan, CONFIG_STATUS_FILEINVALID, errno, ast_variable::lineno, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ast_variable::name, ast_variable::next, ROTATE, s, SEQUENTIAL, TIMESTAMP, logchannel::type, ast_variable::value, and var.

Referenced by init_logger(), and reload_logger().

00287 {
00288    struct logchannel *chan;
00289    struct ast_config *cfg;
00290    struct ast_variable *var;
00291    const char *s;
00292    struct ast_flags config_flags = { 0 };
00293 
00294    if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID)
00295       return;
00296 
00297    /* delete our list of log channels */
00298    if (!locked)
00299       AST_RWLIST_WRLOCK(&logchannels);
00300    while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list)))
00301       ast_free(chan);
00302    global_logmask = 0;
00303    if (!locked)
00304       AST_RWLIST_UNLOCK(&logchannels);
00305    
00306    errno = 0;
00307    /* close syslog */
00308    closelog();
00309    
00310    /* If no config file, we're fine, set default options. */
00311    if (!cfg) {
00312       if (errno)
00313          fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno));
00314       else
00315          fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n");
00316       if (!(chan = ast_calloc(1, sizeof(*chan))))
00317          return;
00318       chan->type = LOGTYPE_CONSOLE;
00319       chan->logmask = __LOG_WARNING | __LOG_NOTICE | __LOG_ERROR;
00320       if (!locked)
00321          AST_RWLIST_WRLOCK(&logchannels);
00322       AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
00323       global_logmask |= chan->logmask;
00324       if (!locked)
00325          AST_RWLIST_UNLOCK(&logchannels);
00326       return;
00327    }
00328    
00329    if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) {
00330       if (ast_true(s)) {
00331          if (gethostname(hostname, sizeof(hostname) - 1)) {
00332             ast_copy_string(hostname, "unknown", sizeof(hostname));
00333             fprintf(stderr, "What box has no hostname???\n");
00334          }
00335       } else
00336          hostname[0] = '\0';
00337    } else
00338       hostname[0] = '\0';
00339    if ((s = ast_variable_retrieve(cfg, "general", "dateformat")))
00340       ast_copy_string(dateformat, s, sizeof(dateformat));
00341    else
00342       ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat));
00343    if ((s = ast_variable_retrieve(cfg, "general", "queue_log")))
00344       logfiles.queue_log = ast_true(s);
00345    if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name")))
00346       ast_copy_string(queue_log_name, s, sizeof(queue_log_name));
00347    if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate")))
00348       ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate));
00349    if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) {
00350       if (strcasecmp(s, "timestamp") == 0)
00351          rotatestrategy = TIMESTAMP;
00352       else if (strcasecmp(s, "rotate") == 0)
00353          rotatestrategy = ROTATE;
00354       else if (strcasecmp(s, "sequential") == 0)
00355          rotatestrategy = SEQUENTIAL;
00356       else
00357          fprintf(stderr, "Unknown rotatestrategy: %s\n", s);
00358    } else {
00359       if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) {
00360          rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL;
00361          fprintf(stderr, "rotatetimestamp option has been deprecated.  Please use rotatestrategy instead.\n");
00362       }
00363    }
00364 
00365    if (!locked)
00366       AST_RWLIST_WRLOCK(&logchannels);
00367    var = ast_variable_browse(cfg, "logfiles");
00368    for (; var; var = var->next) {
00369       if (!(chan = make_logchannel(var->name, var->value, var->lineno)))
00370          continue;
00371       AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
00372       global_logmask |= chan->logmask;
00373    }
00374    if (!locked)
00375       AST_RWLIST_UNLOCK(&logchannels);
00376 
00377    ast_config_destroy(cfg);
00378 }

static void logger_print_normal ( struct logmsg logmsg  )  [static]

Print a normal log message to the channels.

Definition at line 793 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_strlen_zero(), ast_verb, buf, chan, COLOR_BRWHITE, colors, logmsg::date, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, logmsg::file, logchannel::filename, logchannel::fileptr, logmsg::function, logmsg::level, logmsg::level_name, logmsg::line, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::message, logmsg::process_id, reload_logger(), term_color(), and logchannel::type.

Referenced by ast_log(), and logger_thread().

00794 {
00795    struct logchannel *chan = NULL;
00796    char buf[BUFSIZ];
00797 
00798    AST_RWLIST_RDLOCK(&logchannels);
00799 
00800    if (!AST_RWLIST_EMPTY(&logchannels)) {
00801       AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
00802          /* If the channel is disabled, then move on to the next one */
00803          if (chan->disabled)
00804             continue;
00805          /* Check syslog channels */
00806          if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) {
00807             ast_log_vsyslog(logmsg);
00808          /* Console channels */
00809          } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) {
00810             char linestr[128];
00811             char tmp1[80], tmp2[80], tmp3[80], tmp4[80];
00812 
00813             /* If the level is verbose, then skip it */
00814             if (logmsg->level == __LOG_VERBOSE)
00815                continue;
00816 
00817             /* Turn the numerical line number into a string */
00818             snprintf(linestr, sizeof(linestr), "%d", logmsg->line);
00819             /* Build string to print out */
00820             snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s",
00821                 logmsg->date,
00822                 term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)),
00823                 logmsg->process_id,
00824                 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)),
00825                 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
00826                 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)),
00827                 logmsg->message);
00828             /* Print out */
00829             ast_console_puts_mutable(buf, logmsg->level);
00830          /* File channels */
00831          } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) {
00832             int res = 0;
00833 
00834             /* If no file pointer exists, skip it */
00835             if (!chan->fileptr)
00836                continue;
00837             
00838             /* Print out to the file */
00839             res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s",
00840                      logmsg->date, logmsg->level_name, logmsg->process_id, logmsg->file, logmsg->message);
00841             if (res <= 0 && !ast_strlen_zero(logmsg->message)) {
00842                fprintf(stderr, "**** Asterisk Logging Error: ***********\n");
00843                if (errno == ENOMEM || errno == ENOSPC)
00844                   fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename);
00845                else
00846                   fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno));
00847                manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno));
00848                chan->disabled = 1;
00849             } else if (res > 0) {
00850                fflush(chan->fileptr);
00851             }
00852          }
00853       }
00854    } else if (logmsg->level != __LOG_VERBOSE) {
00855       fputs(logmsg->message, stdout);
00856    }
00857 
00858    AST_RWLIST_UNLOCK(&logchannels);
00859 
00860    /* If we need to reload because of the file size, then do so */
00861    if (filesize_reload_needed) {
00862       reload_logger(-1);
00863       ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n");
00864    }
00865 
00866    return;
00867 }

static void logger_print_verbose ( struct logmsg logmsg  )  [static]

Print a verbose message to the verbosers.

Definition at line 870 of file logger.c.

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, logchannel::list, logmsg::message, and verb::verboser.

Referenced by __ast_verbose_ap(), and logger_thread().

00871 {
00872    struct verb *v = NULL;
00873 
00874    /* Iterate through the list of verbosers and pass them the log message string */
00875    AST_RWLIST_RDLOCK(&verbosers);
00876    AST_RWLIST_TRAVERSE(&verbosers, v, list)
00877       v->verboser(logmsg->message);
00878    AST_RWLIST_UNLOCK(&verbosers);
00879 
00880    return;
00881 }

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

References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.

00620 {
00621    if(reload_logger(0))
00622       return RESULT_FAILURE;
00623    return RESULT_SUCCESS;
00624 }

static void* logger_thread ( void *  data  )  [static]

Actual logging thread.

Definition at line 884 of file logger.c.

References ast_cond_wait(), ast_free, AST_LIST_EMPTY, AST_LIST_FIRST, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_LOCK, AST_LIST_NEXT, AST_LIST_UNLOCK, close_logger_thread, logchannel::list, logcond, logger_print_normal(), logger_print_verbose(), LOGMSG_NORMAL, LOGMSG_VERBOSE, msg, and logchannel::next.

Referenced by init_logger().

00885 {
00886    struct logmsg *next = NULL, *msg = NULL;
00887 
00888    for (;;) {
00889       /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */
00890       AST_LIST_LOCK(&logmsgs);
00891       if (AST_LIST_EMPTY(&logmsgs)) {
00892          if (close_logger_thread) {
00893             break;
00894          } else {
00895             ast_cond_wait(&logcond, &logmsgs.lock);
00896          }
00897       }
00898       next = AST_LIST_FIRST(&logmsgs);
00899       AST_LIST_HEAD_INIT_NOLOCK(&logmsgs);
00900       AST_LIST_UNLOCK(&logmsgs);
00901 
00902       /* Otherwise go through and process each message in the order added */
00903       while ((msg = next)) {
00904          /* Get the next entry now so that we can free our current structure later */
00905          next = AST_LIST_NEXT(msg, list);
00906 
00907          /* Depending on the type, send it to the proper function */
00908          if (msg->type == LOGMSG_NORMAL)
00909             logger_print_normal(msg);
00910          else if (msg->type == LOGMSG_VERBOSE)
00911             logger_print_verbose(msg);
00912 
00913          /* Free the data since we are done */
00914          ast_free(msg);
00915       }
00916 
00917       /* If we should stop, then stop */
00918       if (close_logger_thread)
00919          break;
00920    }
00921 
00922    return NULL;
00923 }

static unsigned int make_components ( const char *  s,
int  lineno 
) [static]

Definition at line 209 of file logger.c.

References ARRAY_LEN, ast_skip_blanks(), ast_strdupa, levels, and strsep().

Referenced by make_logchannel(), and update_logchannels().

00210 {
00211    char *w;
00212    unsigned int res = 0;
00213    char *stringp = ast_strdupa(s);
00214    unsigned int x;
00215 
00216    while ((w = strsep(&stringp, ","))) {
00217       int found = 0;
00218 
00219       w = ast_skip_blanks(w);
00220 
00221       for (x = 0; x < ARRAY_LEN(levels); x++) {
00222          if (levels[x] && !strcasecmp(w, levels[x])) {
00223             res |= (1 << x);
00224             found = 1;
00225             break;
00226          }
00227       }
00228    }
00229 
00230    return res;
00231 }

static struct logchannel* make_logchannel ( const char *  channel,
const char *  components,
int  lineno 
) [static, read]

Definition at line 233 of file logger.c.

References ast_calloc, ast_config_AST_LOG_DIR, ast_copy_string(), ast_free, ast_strlen_zero(), ast_syslog_facility(), chan, 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().

00234 {
00235    struct logchannel *chan;
00236    char *facility;
00237 
00238    if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1)))
00239       return NULL;
00240 
00241    strcpy(chan->components, components);
00242    chan->lineno = lineno;
00243 
00244    if (!strcasecmp(channel, "console")) {
00245       chan->type = LOGTYPE_CONSOLE;
00246    } else if (!strncasecmp(channel, "syslog", 6)) {
00247       /*
00248       * syntax is:
00249       *  syslog.facility => level,level,level
00250       */
00251       facility = strchr(channel, '.');
00252       if (!facility++ || !facility) {
00253          facility = "local0";
00254       }
00255 
00256       chan->facility = ast_syslog_facility(facility);
00257 
00258       if (chan->facility < 0) {
00259          fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
00260          ast_free(chan);
00261          return NULL;
00262       }
00263 
00264       chan->type = LOGTYPE_SYSLOG;
00265       ast_copy_string(chan->filename, channel, sizeof(chan->filename));
00266       openlog("asterisk", LOG_PID, chan->facility);
00267    } else {
00268       if (!ast_strlen_zero(hostname)) {
00269          snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s",
00270              channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname);
00271       } else {
00272          snprintf(chan->filename, sizeof(chan->filename), "%s/%s",
00273              channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel);
00274       }
00275       if (!(chan->fileptr = fopen(chan->filename, "a"))) {
00276          /* Can't log here, since we're called with a lock */
00277          fprintf(stderr, "Logger Warning: Unable to open log file '%s': %s\n", chan->filename, strerror(errno));
00278       } 
00279       chan->type = LOGTYPE_FILE;
00280    }
00281    chan->logmask = make_components(chan->components, lineno);
00282 
00283    return chan;
00284 }

static int reload_logger ( int  rotate  )  [static]

Definition at line 550 of file logger.c.

References ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_queue_log(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, f, logchannel::filename, logchannel::fileptr, init_logger_chain(), logchannel::list, LOG_ERROR, logfiles, manager_event, qlog, and rotate_file().

Referenced by handle_logger_reload(), handle_logger_rotate(), logger_print_normal(), and logger_reload().

00551 {
00552    char old[PATH_MAX] = "";
00553    int queue_rotate = rotate;
00554    struct logchannel *f;
00555    int res = 0;
00556    struct stat st;
00557 
00558    AST_RWLIST_WRLOCK(&logchannels);
00559 
00560    if (qlog) {
00561       if (rotate < 0) {
00562          /* Check filesize - this one typically doesn't need an auto-rotate */
00563          snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
00564          if (stat(old, &st) != 0 || st.st_size > 0x40000000) { /* Arbitrarily, 1 GB */
00565             fclose(qlog);
00566             qlog = NULL;
00567          } else
00568             queue_rotate = 0;
00569       } else {
00570          fclose(qlog);
00571          qlog = NULL;
00572       }
00573    } else 
00574       queue_rotate = 0;
00575 
00576    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
00577 
00578    AST_RWLIST_TRAVERSE(&logchannels, f, list) {
00579       if (f->disabled) {
00580          f->disabled = 0;  /* Re-enable logging at reload */
00581          manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename);
00582       }
00583       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
00584          fclose(f->fileptr);  /* Close file */
00585          f->fileptr = NULL;
00586          if (rotate)
00587             rotate_file(f->filename);
00588       }
00589    }
00590 
00591    filesize_reload_needed = 0;
00592 
00593    init_logger_chain(1 /* locked */);
00594 
00595    if (logfiles.queue_log) {
00596       snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
00597       if (queue_rotate)
00598          rotate_file(old);
00599 
00600       qlog = fopen(old, "a");
00601       if (qlog) {
00602          AST_RWLIST_UNLOCK(&logchannels);
00603          ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", "");
00604          AST_RWLIST_WRLOCK(&logchannels);
00605          ast_verb(1, "Asterisk Queue Logger restarted\n");
00606       } else {
00607          ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
00608          res = -1;
00609       }
00610    }
00611 
00612    AST_RWLIST_UNLOCK(&logchannels);
00613 
00614    return res;
00615 }

static int rotate_file ( const char *  filename  )  [static]

Definition at line 464 of file logger.c.

References ARRAY_LEN, ast_channel_release(), ast_dummy_channel_alloc(), ast_log(), ast_safe_system(), ast_strlen_zero(), buf, LOG_WARNING, pbx_builtin_setvar_helper(), pbx_substitute_variables_helper(), ROTATE, SEQUENTIAL, and TIMESTAMP.

Referenced by reload_logger().

00465 {
00466    char old[PATH_MAX];
00467    char new[PATH_MAX];
00468    int x, y, which, found, res = 0, fd;
00469    char *suffixes[4] = { "", ".gz", ".bz2", ".Z" };
00470 
00471    switch (rotatestrategy) {
00472    case SEQUENTIAL:
00473       for (x = 0; ; x++) {
00474          snprintf(new, sizeof(new), "%s.%d", filename, x);
00475          fd = open(new, O_RDONLY);
00476          if (fd > -1)
00477             close(fd);
00478          else
00479             break;
00480       }
00481       if (rename(filename, new)) {
00482          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00483          res = -1;
00484       }
00485       break;
00486    case TIMESTAMP:
00487       snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL));
00488       if (rename(filename, new)) {
00489          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00490          res = -1;
00491       }
00492       break;
00493    case ROTATE:
00494       /* Find the next empty slot, including a possible suffix */
00495       for (x = 0; ; x++) {
00496          found = 0;
00497          for (which = 0; which < ARRAY_LEN(suffixes); which++) {
00498             snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]);
00499             fd = open(new, O_RDONLY);
00500             if (fd > -1) {
00501                close(fd);
00502                found = 1;
00503                break;
00504             }
00505          }
00506          if (!found) {
00507             break;
00508          }
00509       }
00510 
00511       /* Found an empty slot */
00512       for (y = x; y > 0; y--) {
00513          for (which = 0; which < ARRAY_LEN(suffixes); which++) {
00514             snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]);
00515             fd = open(old, O_RDONLY);
00516             if (fd > -1) {
00517                /* Found the right suffix */
00518                close(fd);
00519                snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]);
00520                if (rename(old, new)) {
00521                   fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new);
00522                   res = -1;
00523                }
00524                break;
00525             }
00526          }
00527       }
00528 
00529       /* Finally, rename the current file */
00530       snprintf(new, sizeof(new), "%s.0", filename);
00531       if (rename(filename, new)) {
00532          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00533          res = -1;
00534       }
00535    }
00536 
00537    if (!ast_strlen_zero(exec_after_rotate)) {
00538       struct ast_channel *c = ast_dummy_channel_alloc();
00539       char buf[512];
00540       pbx_builtin_setvar_helper(c, "filename", filename);
00541       pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf));
00542       if (ast_safe_system(buf) == -1) {
00543          ast_log(LOG_WARNING, "error executing '%s'\n", buf);
00544       }
00545       c = ast_channel_release(c);
00546    }
00547    return res;
00548 }

static void update_logchannels ( void   )  [static]


Variable Documentation

struct ast_cli_entry cli_logger[] [static]

Definition at line 752 of file logger.c.

Referenced by init_logger().

int close_logger_thread = 0 [static]

Definition at line 142 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 168 of file logger.c.

Referenced by logger_print_normal().

char dateformat[256] = "%b %e %T" [static]

Definition at line 70 of file logger.c.

Referenced by build_device().

char exec_after_rotate[256] = "" [static]

Definition at line 73 of file logger.c.

int filesize_reload_needed [static]

Definition at line 75 of file logger.c.

unsigned int global_logmask = 0xFFFF [static]

Definition at line 76 of file logger.c.

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

Referenced by ast_log().

ast_cond_t logcond [static]

Definition at line 141 of file logger.c.

Referenced by __ast_verbose_ap(), ast_log(), close_logger(), init_logger(), and logger_thread().

struct { ... } logfiles [static]

pthread_t logthread = AST_PTHREADT_NULL [static]

Definition at line 140 of file logger.c.

Referenced by __ast_verbose_ap(), ast_log(), close_logger(), and init_logger().

FILE* qlog [static]

Definition at line 144 of file logger.c.

Referenced by ast_queue_log(), close_logger(), init_logger(), and reload_logger().

unsigned int queue_log

Definition at line 85 of file logger.c.

char queue_log_name[256] = QUEUELOG [static]

Definition at line 72 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 203 of file logger.c.

Referenced by __ast_verbose_ap().


Generated on Wed Oct 28 13:33:08 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6