Fri Jun 19 12:10:40 2009

Asterisk developer's documentation


logger.c File Reference

Asterisk Logger. More...

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

Go to the source code of this file.

Data Structures

struct  logchannel
struct  logchannels
struct  logmsg
struct  logmsgs
struct  verb
struct  verbosers

Defines

#define _ASTERISK_LOGGER_H
#define FORMATL   "%-35.35s %-8.8s %-9.9s "
#define GETTID()   getpid()
#define LOG_BUF_INIT_SIZE   256
#define MAX_BACKTRACE_FRAMES   20
#define SYSLOG_NAMES
#define SYSLOG_NLEVELS   sizeof(syslog_level_map) / sizeof(int)
#define VERBOSE_BUF_INIT_SIZE   256

Enumerations

enum  logmsgtypes { LOGMSG_NORMAL = 0, LOGMSG_VERBOSE }
enum  logtypes { LOGTYPE_SYSLOG, LOGTYPE_FILE, LOGTYPE_CONSOLE }
enum  rotatestrategy { SEQUENTIAL = 1 << 0, ROTATE = 1 << 1, TIMESTAMP = 1 << 2 }

Functions

void __ast_verbose (const char *file, int line, const char *func, const char *fmt,...)
 This works like ast_log, but prints verbose messages to the console depending on verbosity level set. ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing"); This will print the message to the console if the verbose level is set to a level >= 3 Note the abscence of a comma after the VERBOSE_PREFIX_3. This is important. VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined.
void __ast_verbose_ap (const char *file, int line, const char *func, const char *fmt, va_list ap)
static void __init_log_buf (void)
static void __init_verbose_buf (void)
void ast_backtrace (void)
ast_bt * ast_bt_create (void)
void * ast_bt_destroy (struct ast_bt *bt)
int ast_bt_get_addresses (struct ast_bt *bt)
void ast_child_verbose (int level, const char *fmt,...)
void ast_log (int level, const char *file, int line, const char *function, const char *fmt,...)
 Used for sending a log message This is the standard logger function. Probably the only way you will invoke it would be something like this: ast_log(AST_LOG_WHATEVER, "Problem with the %s Captain. We should get some more. Will %d be enough?\n", "flux capacitor", 10); where WHATEVER is one of ERROR, DEBUG, EVENT, NOTICE, or WARNING depending on which log you wish to output to. These are implemented as macros, that will provide the function with the needed arguments.
static void ast_log_vsyslog (int level, const char *file, int line, const char *function, char *str, long pid)
void ast_queue_log (const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
int ast_register_verbose (void(*v)(const char *string))
int ast_unregister_verbose (void(*v)(const char *string))
void ast_verbose (const char *fmt,...)
void close_logger (void)
static char * handle_logger_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_logger_rotate (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_logger_set_level (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_logger_show_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command to show logging system configuration.
static int handle_SIGXFSZ (int sig)
int init_logger (void)
static void init_logger_chain (int locked)
static void logger_print_normal (struct logmsg *logmsg)
 Print a normal log message to the channels.
static void logger_print_verbose (struct logmsg *logmsg)
 Print a verbose message to the verbosers.
int logger_reload (void)
 Reload logger without rotating log files.
static void * logger_thread (void *data)
 Actual logging thread.
static 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)

Variables

static struct ast_cli_entry cli_logger []
static int close_logger_thread
static int colors []
 Colors used in the console for logging.
static char dateformat [256] = "%b %e %T"
static FILE * eventlog
static char exec_after_rotate [256] = ""
static int filesize_reload_needed
static int global_logmask = -1
static char hostname [MAXHOSTNAMELEN]
static char * levels []
 Logging channels used in the Asterisk logging system.
static struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT, .key_init = __init_log_buf , .custom_init = NULL , }
static ast_cond_t logcond
struct {
   unsigned int   event_log:1
   unsigned int   queue_log:1
logfiles
static pthread_t logthread = AST_PTHREADT_NULL
static FILE * qlog
static char queue_log_name [256] = QUEUELOG
static int syslog_level_map []
static struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT, .key_init = __init_verbose_buf , .custom_init = NULL , }


Detailed Description

Asterisk Logger.

Logging routines

Author:
Mark Spencer <markster@digium.com>

Definition in file logger.c.


Define Documentation

#define _ASTERISK_LOGGER_H

Definition at line 33 of file logger.c.

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

Referenced by handle_logger_show_channels().

 
#define GETTID (  )     getpid()

Definition at line 85 of file logger.c.

Referenced by ast_log().

#define LOG_BUF_INIT_SIZE   256

Definition at line 178 of file logger.c.

Referenced by ast_log().

#define MAX_BACKTRACE_FRAMES   20

Definition at line 46 of file logger.c.

#define SYSLOG_NAMES

Definition at line 49 of file logger.c.

#define SYSLOG_NLEVELS   sizeof(syslog_level_map) / sizeof(int)

Definition at line 63 of file logger.c.

Referenced by ast_log_vsyslog().

#define VERBOSE_BUF_INIT_SIZE   256

Definition at line 175 of file logger.c.

Referenced by __ast_verbose_ap().


Enumeration Type Documentation

enum logmsgtypes

Enumerator:
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 127 of file logger.c.

00128                  {
00129    LOGMSG_NORMAL = 0,
00130    LOGMSG_VERBOSE,

enum logtypes

Enumerator:
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 109 of file logger.c.

00110               {
00111    LOGTYPE_SYSLOG,
00112    LOGTYPE_FILE,
00113    LOGTYPE_CONSOLE,

enum rotatestrategy

Enumerator:
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 96 of file logger.c.

00097                     {
00098    SEQUENTIAL = 1 << 0,     /* Original method - create a new file, in order */
00099    ROTATE = 1 << 1,         /* Rotate all files, such that the oldest file has the highest suffix */
00100    TIMESTAMP = 1 << 2,      /* Append the epoch timestamp onto the end of the archived file */


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

References __ast_verbose_ap().

01298 {
01299    va_list ap;
01300    va_start(ap, fmt);
01301    __ast_verbose_ap(file, line, func, fmt, ap);
01302    va_end(ap);

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

Definition at line 1240 of file logger.c.

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

Referenced by __ast_verbose(), and ast_verbose().

01242 {
01243    struct logmsg *logmsg = NULL;
01244    struct ast_str *buf = NULL;
01245    int res = 0;
01246 
01247    if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE)))
01248       return;
01249 
01250    if (ast_opt_timestamp) {
01251       struct timeval now;
01252       struct ast_tm tm;
01253       char date[40];
01254       char *datefmt;
01255 
01256       now = ast_tvnow();
01257       ast_localtime(&now, &tm, NULL);
01258       ast_strftime(date, sizeof(date), dateformat, &tm);
01259       datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1);
01260       sprintf(datefmt, "%c[%s] %s", 127, date, fmt);
01261       fmt = datefmt;
01262    } else {
01263       char *tmp = alloca(strlen(fmt) + 2);
01264       sprintf(tmp, "%c%s", 127, fmt);
01265       fmt = tmp;
01266    }
01267 
01268    /* Build string */
01269    res = ast_str_set_va(&buf, 0, fmt, ap);
01270 
01271    /* If the build failed then we can drop this allocated message */
01272    if (res == AST_DYNSTR_BUILD_FAILED)
01273       return;
01274 
01275    if (!(logmsg = ast_calloc(1, sizeof(*logmsg) + res + 1)))
01276       return;
01277 
01278    strcpy(logmsg->str, buf->str);
01279 
01280    ast_log(__LOG_VERBOSE, file, line, func, "%s", logmsg->str + 1);
01281 
01282    /* Set type */
01283    logmsg->type = LOGMSG_VERBOSE;
01284    
01285    /* Add to the list and poke the thread if possible */
01286    if (logthread != AST_PTHREADT_NULL) {
01287       AST_LIST_LOCK(&logmsgs);
01288       AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
01289       ast_cond_signal(&logcond);
01290       AST_LIST_UNLOCK(&logmsgs);
01291    } else {
01292       logger_print_verbose(logmsg);
01293       ast_free(logmsg);
01294    }

static void __init_log_buf ( void   )  [static]

Definition at line 177 of file logger.c.

00182 {

static void __init_verbose_buf ( void   )  [static]

Definition at line 174 of file logger.c.

00182 {

void ast_backtrace ( void   ) 

Definition at line 1213 of file logger.c.

References ast_bt_create(), ast_bt_destroy(), ast_debug, ast_log(), free, and LOG_WARNING.

01215 {
01216 #ifdef HAVE_BKTR
01217    struct ast_bt *bt;
01218    int i = 0;
01219    char **strings;
01220 
01221    if (!(bt = ast_bt_create())) {
01222       ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
01223       return;
01224    }
01225 
01226    if ((strings = backtrace_symbols(bt->addresses, bt->num_frames))) {
01227       ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' ');
01228       for (i = 0; i < bt->num_frames; i++) {
01229          ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i, bt->addresses[i], strings[i]);
01230       }
01231       free(strings);
01232    } else {
01233       ast_debug(1, "Could not allocate memory for backtrace\n");
01234    }
01235    ast_bt_destroy(bt);
01236 #else
01237    ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
01238 #endif

struct ast_bt* ast_bt_create ( void   ) 

Definition at line 1180 of file logger.c.

References ast_bt_get_addresses(), ast_calloc, ast_log(), and LOG_ERROR.

Referenced by ast_backtrace().

01182 {
01183    struct ast_bt *bt = ast_calloc(1, sizeof(*bt));
01184    if (!bt) {
01185       ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n");
01186       return NULL;
01187    }
01188 
01189    bt->alloced = 1;
01190 
01191    ast_bt_get_addresses(bt);
01192 
01193    return bt;

void* ast_bt_destroy ( struct ast_bt *  bt  ) 

Definition at line 1202 of file logger.c.

References ast_free.

Referenced by ast_backtrace().

01204 {
01205    if (bt->alloced) {
01206       ast_free(bt);
01207    }
01208 
01209    return NULL;

int ast_bt_get_addresses ( struct ast_bt *  bt  ) 

Definition at line 1195 of file logger.c.

Referenced by ast_bt_create().

01197 {
01198    bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES);
01199 
01200    return 0;

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

Definition at line 417 of file logger.c.

References ast_free, ast_malloc, msg, and option_verbose.

Referenced by launch_script().

00419 {
00420    char *msg = NULL, *emsg = NULL, *sptr, *eptr;
00421    va_list ap, aq;
00422    int size;
00423 
00424    /* Don't bother, if the level isn't that high */
00425    if (option_verbose < level) {
00426       return;
00427    }
00428 
00429    va_start(ap, fmt);
00430    va_copy(aq, ap);
00431    if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) {
00432       va_end(ap);
00433       va_end(aq);
00434       return;
00435    }
00436    va_end(ap);
00437 
00438    if (!(msg = ast_malloc(size + 1))) {
00439       va_end(aq);
00440       return;
00441    }
00442 
00443    vsnprintf(msg, size + 1, fmt, aq);
00444    va_end(aq);
00445 
00446    if (!(emsg = ast_malloc(size * 2 + 1))) {
00447       ast_free(msg);
00448       return;
00449    }
00450 
00451    for (sptr = msg, eptr = emsg; ; sptr++) {
00452       if (*sptr == '"') {
00453          *eptr++ = '\\';
00454       }
00455       *eptr++ = *sptr;
00456       if (*sptr == '\0') {
00457          break;
00458       }
00459    }
00460    ast_free(msg);
00461 
00462    fprintf(stdout, "verbose \"%s\" %d\n", emsg, level);
00463    fflush(stdout);
00464    ast_free(emsg);

void ast_log ( int  level,
const char *  file,
int  line,
const char *  function,
const char *  fmt,
  ... 
)

Used for sending a log message This is the standard logger function. Probably the only way you will invoke it would be something like this: ast_log(AST_LOG_WHATEVER, "Problem with the %s Captain. We should get some more. Will %d be enough?\n", "flux capacitor", 10); where WHATEVER is one of ERROR, DEBUG, EVENT, NOTICE, or WARNING depending on which log you wish to output to. These are implemented as macros, that will provide the function with the needed arguments.

Parameters:
level Type of log event
file Will be provided by the AST_LOG_* macro
line Will be provided by the AST_LOG_* macro
function Will be provided by the AST_LOG_* macro
fmt This is what is important. The format is the same as your favorite breed of printf. You know how that works, right? :-)

Definition at line 1091 of file logger.c.

References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc, ast_cond_signal(), ast_copy_string(), AST_DYNSTR_BUILD_FAILED, ast_free, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), AST_PTHREADT_NULL, AST_RWLIST_EMPTY, ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_tvnow(), buf, GETTID, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, logthread, option_debug, option_verbose, and term_filter_escapes().

Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __ao2_callback(), __ao2_ref(), __ast_answer(), __ast_check_signature(), __ast_check_signature_bin(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_decrypt_bin(), __ast_encrypt_bin(), __ast_format_register(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_register_translator(), __ast_request_and_dial(), __ast_rtp_reload(), __ast_sign_bin(), __ast_smoother_feed(), __ast_string_field_init(), __ast_udptl_reload(), __ast_verbose_ap(), __attempt_transmit(), __auto_congest(), __dahdi_exception(), __find_callno(), __iax2_poke_noanswer(), __init_manager(), __mgcp_xmit(), __oh323_destroy(), __oh323_new(), __oh323_rtp_create(), __oh323_update_info(), __send_lagrq(), __send_ping(), __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(), _while_exec(), accept_thread(), access_counter_file(), acf_channel_read(), acf_channel_write(), acf_curl_exec(), acf_cut_exec(), acf_iaxvar_write(), acf_if(), acf_isexten_exec(), acf_jabberstatus_read(), acf_mailbox_exists(), acf_meetme_info(), acf_odbc_read(), acf_odbc_write(), acf_sort_exec(), acf_strftime(), acf_strptime(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_login(), add_agent(), add_agi_cmd(), add_cfg_entry(), add_codec_to_answer(), add_email_attachment(), add_exten_to_pattern_tree(), add_features_datastores(), add_header(), add_in_calls(), add_line(), add_out_calls(), add_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_to_agi(), add_user_extension(), admin_exec(), adsi_begin(), adsi_careful_send(), adsi_process(), adsi_prog(), advanced_options(), agent_answer(), agent_call(), agent_fixup(), agent_get_base_channel(), agent_hangup(), agent_new(), agent_read(), agent_request(), agent_set_base_channel(), agentmonitoroutgoing_exec(), agi_exec_full(), aji_act_hook(), aji_client_connect(), aji_client_info_handler(), aji_create_buddy(), aji_create_client(), aji_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_presence(), aji_handle_subscribe(), aji_initialize(), aji_load_config(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), aji_set_presence(), aji_start_sasl(), aji_status_exec(), alarmreceiver_exec(), alloc_expr_node(), alloc_resampler(), alloc_sub(), alsa_card_init(), alsa_indicate(), alsa_new(), alsa_read(), alsa_request(), alsa_write(), announce_thread(), answer_call(), anti_injection(), app_exec(), apply_general_options(), apply_option(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_agi_register(), ast_agi_send(), ast_agi_unregister(), ast_aji_create_chat(), ast_aji_invite_chat(), ast_aji_join_chat(), ast_aji_send_chat(), ast_alaw_init(), ast_app_dtget(), ast_app_parse_options(), ast_app_parse_options64(), ast_append_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_call_thread(), ast_bt_create(), ast_careful_fwrite(), ast_carefulwrite(), ast_cdr_alloc(), ast_cdr_end(), ast_cdr_engine_init(), ast_cdr_merge(), ast_cdr_noanswer(), ast_cdr_register(), ast_cdr_serialize_variables(), ast_cdr_setvar(), ast_cdr_submit_batch(), ast_channel_alloc(), ast_channel_audiohook_count_by_source(), ast_channel_audiohook_count_by_source_running(), ast_channel_bridge(), ast_channel_free(), ast_channel_make_compatible_helper(), ast_channel_masquerade(), ast_channel_queryoption(), ast_channel_register(), ast_channel_setoption(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_check_timing(), ast_codec_get_len(), ast_codec_get_samples(), ast_config_engine_register(), ast_config_internal_load(), ast_context_find_or_create(), ast_context_remove_extension_callerid2(), ast_context_verify_includes(), ast_db_get(), ast_db_gettree(), ast_db_put(), ast_device_state_engine_init(), ast_do_masquerade(), ast_dsp_busydetect(), ast_dsp_call_progress(), ast_dsp_noise(), ast_dsp_process(), ast_dsp_silence(), ast_dtmf_stream(), ast_el_read_char(), ast_enable_distributed_devstate(), ast_enable_packet_fragmentation(), ast_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_feature_request_and_dial(), ast_filehelper(), ast_find_ourip(), ast_format_unregister(), ast_func_read(), ast_func_write(), ast_get_encoded_char(), ast_get_enum(), ast_get_group(), ast_get_indication_zone(), ast_get_ip_or_srv(), ast_hangup(), ast_heap_create(), ast_http_uri_link(), ast_iax2_new(), ast_include_new(), ast_indicate_data(), ast_io_remove(), ast_ivr_menu_run_internal(), ast_jb_put(), ast_linear_stream(), ast_lock_path_flock(), ast_lock_path_lockfile(), ast_makesocket(), ast_manager_register_struct(), ast_manager_unregister(), ast_merge_contexts_and_delete(), ast_module_reload(), ast_moh_files_next(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), ast_netsock_bindaddr(), ast_netsock_set_qos(), ast_odbc_direct_execute(), ast_odbc_find_table(), ast_odbc_prepare_and_execute(), ast_odbc_request_obj(), ast_odbc_sanity_check(), ast_odbc_smart_execute(), ast_openstream_full(), ast_openvstream(), ast_ouraddrfor(), ast_park_call_full(), ast_parse_allow_disallow(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_run_app(), ast_pbx_start(), ast_pickup_call(), ast_playtones_start(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), ast_register_application2(), ast_register_feature(), ast_register_switch(), ast_remotecontrol(), ast_request(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_bridge(), ast_rtp_codec_setpref(), ast_rtp_early_bridge(), ast_rtp_get_qosvalue(), ast_rtp_make_compatible(), ast_rtp_new_with_bindaddr(), ast_rtp_proto_register(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_senddigit_begin(), ast_rtp_senddigit_continuation(), ast_rtp_senddigit_end(), ast_rtp_write(), ast_safe_fork(), ast_safe_system(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_es(), ast_say_date_with_format_fr(), ast_say_date_with_format_gr(), ast_say_date_with_format_he(), ast_say_date_with_format_it(), ast_say_date_with_format_nl(), ast_say_date_with_format_pl(), ast_say_date_with_format_pt(), ast_say_date_with_format_th(), ast_say_date_with_format_tw(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_tw(), ast_sched_del(), ast_sched_runq(), ast_search_dns(), ast_set_priority(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_speech_register(), ast_stopstream(), ast_streamfile(), ast_stun_request(), ast_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_start(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_tryconnect(), ast_udptl_bridge(), ast_udptl_get_error_correction_scheme(), ast_udptl_get_far_max_datagram(), ast_udptl_get_local_max_datagram(), ast_udptl_new_with_bindaddr(), ast_udptl_offered_from_local(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_set_error_correction_scheme(), ast_udptl_set_far_max_datagram(), ast_udptl_set_local_max_datagram(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_unregister_indication_country(), 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_exec(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), available(), background_detect_exec(), base64_decode(), base64_encode(), base_encode(), birdbath(), blr_ebl(), blr_txt(), board_setup(), bridge_exec(), bridge_native_loop(), build_alias(), build_channels(), build_conf(), build_device(), build_filename(), build_gateway(), build_mapping(), build_parkinglot(), build_peer(), build_reply_digest(), build_route(), build_rpid(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), bump_gains(), cache_get_callno_locked(), calc_cost(), calc_metric(), 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(), chandup(), channel_admin_exec(), channel_revert(), channel_spy(), channel_steer(), channel_to_session(), chanspy_exec(), check_access(), check_auth(), check_compat(), check_for_conference(), check_freq_ic706(), check_header(), check_key(), check_password(), check_post(), check_rtp_timeout(), check_srcaddr(), 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(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_span_helper(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), config_curl(), config_function_read(), config_handler(), config_ldap(), config_module(), config_odbc(), config_pgsql(), config_text_file_load(), connect_link(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), convertcap(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), create_addr(), create_dirpath(), create_jb(), create_match_char_tree(), create_queue_member(), create_video_frame(), create_vmaccount(), crypto_load(), csv_log(), custom_log(), custom_prepare(), cut_internal(), dahdi_answer(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_get_index(), dahdi_handle_dtmfup(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_open(), dahdi_pri_error(), dahdi_pri_message(), dahdi_read(), dahdi_request(), dahdi_restart(), dahdi_ring_phone(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_show_channel(), dahdi_test_timer(), dahdi_timer_set_rate(), dahdi_train_ec(), dahdi_translate(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dbinit(), deadagi_exec(), dec_init(), del_exec(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_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_directory(), do_dtmf_local(), do_forward(), do_idle_thread(), do_monitor(), do_register(), do_reload(), do_say(), do_scheduler(), do_timelimit(), do_waiting(), donodelog(), dump_agents(), dump_queue(), dump_queue_members(), dundi_answer_entity(), dundi_answer_query(), dundi_discover(), dundi_encrypt(), dundi_error_output(), dundi_exec(), dundi_helper(), dundi_lookup_internal(), dundi_precache_full(), dundi_precache_internal(), dundi_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), eagi_exec(), ebl_callback(), enable_jack_hook(), encode_open_type(), enum_callback(), enum_query_read(), enum_result_read(), eventhandler(), exec(), exec_exec(), execif_exec(), exists(), ext_cmp1(), extenspy_exec(), external_rtp_create(), extstate_read(), fax_generator_generate(), fbuf_append(), feature_exec_app(), festival_exec(), ffmpeg_decode(), ffmpeg_encode(), file_read(), filter(), find_account(), find_cache(), find_call_locked(), find_conf(), find_conf_realtime(), find_desc(), find_desc_usb(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), find_parkinglot(), 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_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), flush_telem(), fn_wrapper(), forkcdr_exec(), forward_message(), framein(), func_args(), func_channel_read(), func_channel_write(), func_channels_read(), func_check_sipdomain(), func_header_read(), func_inheritance_write(), function_agent(), function_autopatchup(), function_cop(), function_db_delete(), function_db_exists(), function_db_read(), function_db_write(), function_enum(), function_eval(), function_ilink(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_remote(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g723_len(), g723_read(), g723_write(), g726_read(), g726_write(), g729_read(), g729_write(), generic_execute(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_canmatch_exten(), get_destination(), get_in_brackets(), get_input(), 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(), getdisplaybyname(), getflagbyname(), getkeybyname(), getstatebyname(), getsubbyname(), gosub_exec(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_function_write(), gsm_read(), gsm_seek(), gsm_write(), gsmtolin_framein(), gtalk_alloc(), gtalk_call(), gtalk_create_candidates(), gtalk_create_member(), gtalk_digit(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_indicate(), gtalk_invite(), gtalk_invite_response(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_sendhtml(), gtalk_show_channels(), gtalk_write(), gui_init(), h261_decap(), h263_decap(), h263_encap(), h263_open(), h263_read(), h263_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), h264_write(), handle_alarms(), handle_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_mousedown(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), 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_soft_key_event_message(), handle_stimulus_message(), handle_tls_connection(), handle_transfer_button(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hidthread(), hint_read(), httpd_helper_thread(), iax2_ack_registry(), iax2_call(), iax2_canmatch(), iax2_devicestate(), iax2_do_register(), iax2_dup_variable_datastore(), iax2_exec(), iax2_exists(), iax2_fixup(), iax2_hangup(), iax2_matchmore(), iax2_poke_peer(), iax2_prov_app(), iax2_read(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_template_parse(), ic706_pltocode(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), ilbc_write(), ilbctolin_framein(), import_ch(), in_band_indication(), increase_call_count(), ind_load_module(), init_acf_query(), init_app_class(), init_jack_data(), init_logger(), init_req(), init_resp(), init_timing_thread(), insert_penaltychange(), inspect_module(), INTERNAL_OBJ(), invent_message(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jack_hook_callback(), jack_hook_write(), jb_error_output(), jb_get_and_deliver(), jb_warning_output(), jingle_alloc(), jingle_call(), jingle_create_candidates(), jingle_create_member(), jingle_digit(), jingle_free_pvt(), jingle_handle_dtmf(), jingle_hangup_farend(), jingle_indicate(), jingle_is_answered(), jingle_load_config(), jingle_new(), jingle_newcall(), jingle_parser(), jingle_request(), jingle_sendhtml(), jingle_show_channels(), jingle_write(), jpeg_read_image(), jpeg_write_image(), key_call(), Keyfavorite(), keypad_cfg_read(), keypad_pick_up(), keypad_setup(), keypad_toggle(), kickptt(), kp_match_area(), 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(), load_column_config(), load_config(), load_config_meetme(), load_dynamic_module(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_realtime_queue(), load_resource(), load_rpt_vars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_start(), local_call(), local_devicestate(), local_dtmf_helper(), local_fixup(), local_new(), local_write(), log_exec(), log_jack_status(), logger_print_normal(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), lua_read_extensions_file(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manage_parkinglot(), manager_modulecheck(), manager_show_dialplan_helper(), map_video_codec(), masq_park_call(), matchmore(), math(), md5(), measurenoise(), meetmemute(), memcpy_decrypt(), memcpy_encrypt(), message_template_build(), message_template_parse_emailbody(), message_template_parse_filebody(), mgcp_call(), mgcp_fixup(), mgcp_indicate(), mgcp_new(), mgcp_reload(), mgcp_request(), mgcp_rtp_read(), mgcp_senddigit_begin(), mgcp_senddigit_end(), mgcp_ss(), mgcp_write(), mgcpsock_read(), milliwatt_exec(), milliwatt_generate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_delete_exec(), minivm_greet_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(), mute_fragment(), mwi_send_thread(), mwi_sub_event_cb(), mwi_thread(), my_x_handler(), nbs_alloc(), nbs_call(), nbs_hangup(), nbs_new(), nbs_request(), nbs_xwrite(), NBScat_exec(), NBScatplay(), netconsole(), new_find_extension(), notify_new_message(), odbc_load_module(), odbc_log(), odbc_obj_connect(), odbc_obj_disconnect(), odbc_register_class(), ogg_vorbis_open(), ogg_vorbis_read(), ogg_vorbis_rewrite(), ogg_vorbis_seek(), ogg_vorbis_tell(), ogg_vorbis_trunc(), ogg_vorbis_write(), oh323_alloc(), oh323_call(), oh323_digit_begin(), oh323_digit_end(), oh323_fixup(), oh323_hangup(), oh323_indicate(), oh323_read(), oh323_request(), oh323_rtp_read(), oh323_set_rtp_peer(), oh323_write(), old_milliwatt_exec(), onevent(), op_colon(), op_div(), op_eq(), op_eqtilde(), op_func(), op_minus(), op_negate(), op_plus(), op_rem(), op_times(), open_mailbox(), OpenHistory(), openserial(), 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_exec_full(), park_space_reserve(), parkandannounce_exec(), parkinglot_addref(), parkinglot_unref(), parse(), parse_args(), parse_config(), parse_cookies(), parse_gain_value(), parse_ie(), parse_minse(), parse_naptr(), parse_register_contact(), parse_session_expires(), parse_srv(), 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(), peer_set_srcaddr(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_do(), pickup_exec(), pickupchan_exec(), play_message(), play_message_category(), play_message_datetime(), play_message_in_bridged_call(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), pop_exec(), post_raw(), powerof(), pp_each_extension_exec(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), pri_create_spanmap(), pri_create_trunkgroup(), pri_dchannel(), pri_fixup_principle(), pri_resolve_span(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_ast_dsp(), process_dahdi(), process_echocancel(), process_message_callback(), process_opcode(), process_request(), process_request_queue(), process_returncode(), process_rfc2833(), process_rfc3389(), process_sdp(), process_text_line(), profile_set_param(), progress(), proxy_update(), pthread_timer_set_rate(), purge_old_messages(), 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_set_param(), queue_transfer_fixup(), queue_voice_frame(), radio_tune(), radius_log(), rbi_out(), rcv_mac_addr(), rcvfax_exec(), read_agent_config(), read_config(), read_config_maps(), read_exec(), read_pipe(), read_samples(), readexten_exec(), readfile_exec(), realtime_curl(), realtime_destroy_handler(), realtime_directory(), realtime_handler(), realtime_ldap_base_ap(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_odbc(), realtime_pgsql(), realtime_require_handler(), realtime_store_handler(), realtime_update_handler(), receive_digit(), receive_message(), record_exec(), refresh_list(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_agents(), reload_config(), reload_firmware(), reload_followme(), reload_logger(), reload_queue_members(), reload_queue_rules(), reload_queues(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), 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(), 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_socket(), run_agi(), run_externnotify(), run_ras(), s_streamwait3(), safe_append(), save_conference(), save_to_folder(), say_init_mode(), saycharstr(), sayfile(), saynum(), scan_service(), scan_thread(), schedule(), scheduled_destroy(), sdl_setup(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_usb_txt(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendimage_exec(), sendkenwood(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), serial_remote_io(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_ctcss_mode_ic706(), set_destination(), set_format(), set_freq_ic706(), set_full_cmd(), set_ic706(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_mode_ic706(), set_moh_exec(), set_offset_ic706(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setdtr(), setflag(), setformat(), setrem(), setup_dahdi(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), show_dialplan_helper(), showdisplay(), showkeys(), sip_addheader(), sip_alloc(), sip_call(), sip_cli_notify(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_park(), sip_park_thread(), sip_parse_host(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_reg_timeout(), sip_register(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_sipredirect(), sip_st_alloc(), sip_write(), sipsock_read(), skel_exec(), skinny_call(), skinny_fixup(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), skinny_transfer(), skinny_write(), sla_add_trunk_to_station(), sla_build_station(), sla_build_trunk(), sla_load_config(), sla_queue_event_conf(), sla_state(), sla_station_exec(), sla_trunk_exec(), slinear_read(), slinear_write(), smdi_load(), smdi_msg_read(), smdi_msg_retrieve_read(), smdi_read(), smdi_toggle_mwi(), smoother_frame_feed(), sms_exec(), sms_generate(), sms_handleincoming(), sms_messagerx2(), sms_process(), sms_readfile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), soundcard_init(), soundcard_writeframe(), span_message(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite3_log(), sqlite_log(), ss_thread(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_pri(), start_rtp(), start_session_timer(), start_spying(), start_stream(), starttimer(), static_callback(), statpost(), stop_session_timer(), store_boost(), store_by_peercallno(), store_by_transfercallno(), store_config(), store_config_core(), store_curl(), store_digit(), store_mixer(), store_odbc(), store_pgsql(), store_rxcdtype(), store_rxdemod(), store_rxsdtype(), store_txmixa(), store_txmixb(), store_txtoctype(), stub_ast_key_get(), subscript(), substitute_escapes(), swap_subs(), switch_video_out(), sysinfo_helper(), system_exec_helper(), t38_tx_packet_handler(), tdd_feed(), tdd_new(), tds_error_handler(), tds_load_module(), tds_log(), tds_message_handler(), telem_lookup(), testclient_exec(), testserver_exec(), timed_read(), timeout_read(), timeout_write(), 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(), turn_on_off(), 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(), unregister_exten(), update_call_counter(), update_common_options(), update_config(), update_curl(), update_header(), update_key(), update_ldap(), update_odbc(), update_pgsql(), update_registry(), update_scoreboard(), upqm_exec(), uridecode(), uriencode(), usbradio_fixup(), usbradio_indicate(), usbradio_new(), usbradio_read(), usbradio_request(), usbradio_text(), usbradio_write(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_check_password_shell(), vm_exec(), vm_execmain(), vm_newuser(), vm_options(), vox_read(), vox_write(), wait_file(), wait_file2(), wait_for_answer(), wait_for_winner(), wait_interval(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_write(), write_byte(), write_header(), write_history(), write_stream(), writefile(), and xpmr_config().

01093 {
01094    struct logmsg *logmsg = NULL;
01095    struct ast_str *buf = NULL;
01096    struct ast_tm tm;
01097    struct timeval now = ast_tvnow();
01098    int res = 0;
01099    va_list ap;
01100 
01101    if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE)))
01102       return;
01103 
01104    if (AST_RWLIST_EMPTY(&logchannels)) {
01105       /*
01106        * we don't have the logger chain configured yet,
01107        * so just log to stdout
01108        */
01109       if (level != __LOG_VERBOSE) {
01110          int result;
01111          va_start(ap, fmt);
01112          result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */
01113          va_end(ap);
01114          if (result != AST_DYNSTR_BUILD_FAILED) {
01115             term_filter_escapes(buf->str);
01116             fputs(buf->str, stdout);
01117          }
01118       }
01119       return;
01120    }
01121    
01122    /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug
01123       are non-zero; LOG_DEBUG messages can still be displayed if option_debug
01124       is zero, if option_verbose is non-zero (this allows for 'level zero'
01125       LOG_DEBUG messages to be displayed, if the logmask on any channel
01126       allows it)
01127    */
01128    if (!option_verbose && !option_debug && (level == __LOG_DEBUG))
01129       return;
01130 
01131    /* Ignore anything that never gets logged anywhere */
01132    if (!(global_logmask & (1 << level)))
01133       return;
01134    
01135    /* Build string */
01136    va_start(ap, fmt);
01137    res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
01138    va_end(ap);
01139 
01140    /* If the build failed, then abort and free this structure */
01141    if (res == AST_DYNSTR_BUILD_FAILED)
01142       return;
01143 
01144    /* Create a new logging message */
01145    if (!(logmsg = ast_calloc(1, sizeof(*logmsg) + res + 1)))
01146       return;
01147 
01148    /* Copy string over */
01149    strcpy(logmsg->str, buf->str);
01150 
01151    /* Set type to be normal */
01152    logmsg->type = LOGMSG_NORMAL;
01153 
01154    /* Create our date/time */
01155    ast_localtime(&now, &tm, NULL);
01156    ast_strftime(logmsg->date, sizeof(logmsg->date), dateformat, &tm);
01157 
01158    /* Copy over data */
01159    logmsg->level = level;
01160    logmsg->line = line;
01161    ast_copy_string(logmsg->file, file, sizeof(logmsg->file));
01162    ast_copy_string(logmsg->function, function, sizeof(logmsg->function));
01163    logmsg->process_id = (long) GETTID();
01164 
01165    /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */
01166    if (logthread != AST_PTHREADT_NULL) {
01167       AST_LIST_LOCK(&logmsgs);
01168       AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
01169       ast_cond_signal(&logcond);
01170       AST_LIST_UNLOCK(&logmsgs);
01171    } else {
01172       logger_print_normal(logmsg);
01173       ast_free(logmsg);
01174    }
01175 
01176    return;

static void ast_log_vsyslog ( int  level,
const char *  file,
int  line,
const char *  function,
char *  str,
long  pid 
) [static]

Definition at line 839 of file logger.c.

References __LOG_DEBUG, __LOG_DTMF, __LOG_VERBOSE, buf, levels, SYSLOG_NLEVELS, and term_strip().

Referenced by logger_print_normal().

00841 {
00842    char buf[BUFSIZ];
00843 
00844    if (level >= SYSLOG_NLEVELS) {
00845       /* we are locked here, so cannot ast_log() */
00846       fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", level);
00847       return;
00848    }
00849 
00850    if (level == __LOG_VERBOSE) {
00851       snprintf(buf, sizeof(buf), "VERBOSE[%ld]: %s", pid, str);
00852       level = __LOG_DEBUG;
00853    } else if (level == __LOG_DTMF) {
00854       snprintf(buf, sizeof(buf), "DTMF[%ld]: %s", pid, str);
00855       level = __LOG_DEBUG;
00856    } else {
00857       snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s",
00858           levels[level], pid, file, line, function, str);
00859    }
00860 
00861    term_strip(buf, buf, strlen(buf) + 1);
00862    syslog(syslog_level_map[level], "%s", buf);

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

Definition at line 466 of file logger.c.

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

Referenced by agent_logoff_maintenance(), aqm_exec(), 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().

00468 {
00469    va_list ap;
00470    char qlog_msg[8192];
00471    int qlog_len;
00472    char time_str[16];
00473 
00474    if (ast_check_realtime("queue_log")) {
00475       va_start(ap, fmt);
00476       vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
00477       va_end(ap);
00478       snprintf(time_str, sizeof(time_str), "%ld", (long)time(NULL));
00479       ast_store_realtime("queue_log", "time", time_str, 
00480                   "callid", callid, 
00481                   "queuename", queuename, 
00482                   "agent", agent, 
00483                   "event", event,
00484                   "data", qlog_msg,
00485                   SENTINEL);
00486    } else {
00487       if (qlog) {
00488          va_start(ap, fmt);
00489          qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
00490          vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
00491          va_end(ap);
00492       }
00493       AST_RWLIST_RDLOCK(&logchannels);
00494       if (qlog) {
00495          fprintf(qlog, "%s\n", qlog_msg);
00496          fflush(qlog);
00497       }
00498       AST_RWLIST_UNLOCK(&logchannels);
00499    }

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

Definition at line 1315 of file logger.c.

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

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

01317 {
01318    struct verb *verb;
01319 
01320    if (!(verb = ast_malloc(sizeof(*verb))))
01321       return -1;
01322 
01323    verb->verboser = v;
01324 
01325    AST_RWLIST_WRLOCK(&verbosers);
01326    AST_RWLIST_INSERT_HEAD(&verbosers, verb, list);
01327    AST_RWLIST_UNLOCK(&verbosers);
01328    
01329    return 0;

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

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

01333 {
01334    struct verb *cur;
01335 
01336    AST_RWLIST_WRLOCK(&verbosers);
01337    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) {
01338       if (cur->verboser == v) {
01339          AST_RWLIST_REMOVE_CURRENT(list);
01340          ast_free(cur);
01341          break;
01342       }
01343    }
01344    AST_RWLIST_TRAVERSE_SAFE_END;
01345    AST_RWLIST_UNLOCK(&verbosers);
01346    
01347    return cur ? 0 : -1;

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

Definition at line 1307 of file logger.c.

References __ast_verbose_ap().

01309 {
01310    va_list ap;
01311    va_start(ap, fmt);
01312    __ast_verbose_ap("", 0, "", fmt, ap);
01313    va_end(ap);

void close_logger ( void   ) 

Provided by logger.c

Definition at line 1049 of file logger.c.

References ast_cond_signal(), AST_LIST_LOCK, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, close_logger_thread, eventlog, f, logchannel::list, logcond, logthread, and qlog.

Referenced by quit_handler().

01051 {
01052    struct logchannel *f = NULL;
01053 
01054    /* Stop logger thread */
01055    AST_LIST_LOCK(&logmsgs);
01056    close_logger_thread = 1;
01057    ast_cond_signal(&logcond);
01058    AST_LIST_UNLOCK(&logmsgs);
01059 
01060    if (logthread != AST_PTHREADT_NULL)
01061       pthread_join(logthread, NULL);
01062 
01063    AST_RWLIST_WRLOCK(&logchannels);
01064 
01065    if (eventlog) {
01066       fclose(eventlog);
01067       eventlog = NULL;
01068    }
01069 
01070    if (qlog) {
01071       fclose(qlog);
01072       qlog = NULL;
01073    }
01074 
01075    AST_RWLIST_TRAVERSE(&logchannels, f, list) {
01076       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
01077          fclose(f->fileptr);
01078          f->fileptr = NULL;
01079       }
01080    }
01081 
01082    closelog(); /* syslog */
01083 
01084    AST_RWLIST_UNLOCK(&logchannels);
01085 
01086    return;

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

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

00698 {
00699    switch (cmd) {
00700    case CLI_INIT:
00701       e->command = "logger reload";
00702       e->usage = 
00703          "Usage: logger reload\n"
00704          "       Reloads the logger subsystem state.  Use after restarting syslogd(8) if you are using syslog logging.\n";
00705       return NULL;
00706    case CLI_GENERATE:
00707       return NULL;
00708    }
00709    if (reload_logger(0)) {
00710       ast_cli(a->fd, "Failed to reload the logger\n");
00711       return CLI_FAILURE;
00712    }
00713    return CLI_SUCCESS;

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

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

00717 {
00718    switch (cmd) {
00719    case CLI_INIT:
00720       e->command = "logger rotate";
00721       e->usage = 
00722          "Usage: logger rotate\n"
00723          "       Rotates and Reopens the log files.\n";
00724       return NULL;
00725    case CLI_GENERATE:
00726       return NULL;   
00727    }
00728    if (reload_logger(1)) {
00729       ast_cli(a->fd, "Failed to reload the logger and rotate log files\n");
00730       return CLI_FAILURE;
00731    } 
00732    return CLI_SUCCESS;

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

Definition at line 734 of file logger.c.

References ast_cli_args::argc, ast_cli_args::argv, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, ast_cli_entry::command, levels, NUMLOGLEVELS, and ast_cli_entry::usage.

00736 {
00737    int x;
00738    int state;
00739    int level = -1;
00740 
00741    switch (cmd) {
00742    case CLI_INIT:
00743       e->command = "logger set level";
00744       e->usage = 
00745          "Usage: logger set level\n"
00746          "       Set a specific log level to enabled/disabled for this console.\n";
00747       return NULL;
00748    case CLI_GENERATE:
00749       return NULL;
00750    }
00751 
00752    if (a->argc < 5)
00753       return CLI_SHOWUSAGE;
00754 
00755    for (x = 0; x <= NUMLOGLEVELS; x++) {
00756       if (!strcasecmp(a->argv[3], levels[x])) {
00757          level = x;
00758          break;
00759       }
00760    }
00761 
00762    state = ast_true(a->argv[4]) ? 1 : 0;
00763 
00764    if (level != -1) {
00765       ast_console_toggle_loglevel(a->fd, level, state);
00766       ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off");
00767    } else
00768       return CLI_SHOWUSAGE;
00769 
00770    return CLI_SUCCESS;

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

References __LOG_DEBUG, __LOG_DTMF, __LOG_ERROR, __LOG_EVENT, __LOG_NOTICE, __LOG_VERBOSE, __LOG_WARNING, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, chan, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, FORMATL, logchannel::list, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, and ast_cli_entry::usage.

00775 {
00776 #define FORMATL   "%-35.35s %-8.8s %-9.9s "
00777    struct logchannel *chan;
00778    switch (cmd) {
00779    case CLI_INIT:
00780       e->command = "logger show channels";
00781       e->usage = 
00782          "Usage: logger show channels\n"
00783          "       List configured logger channels.\n";
00784       return NULL;
00785    case CLI_GENERATE:
00786       return NULL;   
00787    }
00788    ast_cli(a->fd, FORMATL, "Channel", "Type", "Status");
00789    ast_cli(a->fd, "Configuration\n");
00790    ast_cli(a->fd, FORMATL, "-------", "----", "------");
00791    ast_cli(a->fd, "-------------\n");
00792    AST_RWLIST_RDLOCK(&logchannels);
00793    AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
00794       ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"),
00795          chan->disabled ? "Disabled" : "Enabled");
00796       ast_cli(a->fd, " - ");
00797       if (chan->logmask & (1 << __LOG_DEBUG)) 
00798          ast_cli(a->fd, "Debug ");
00799       if (chan->logmask & (1 << __LOG_DTMF)) 
00800          ast_cli(a->fd, "DTMF ");
00801       if (chan->logmask & (1 << __LOG_VERBOSE)) 
00802          ast_cli(a->fd, "Verbose ");
00803       if (chan->logmask & (1 << __LOG_WARNING)) 
00804          ast_cli(a->fd, "Warning ");
00805       if (chan->logmask & (1 << __LOG_NOTICE)) 
00806          ast_cli(a->fd, "Notice ");
00807       if (chan->logmask & (1 << __LOG_ERROR)) 
00808          ast_cli(a->fd, "Error ");
00809       if (chan->logmask & (1 << __LOG_EVENT)) 
00810          ast_cli(a->fd, "Event ");
00811       ast_cli(a->fd, "\n");
00812    }
00813    AST_RWLIST_UNLOCK(&logchannels);
00814    ast_cli(a->fd, "\n");
00815       
00816    return CLI_SUCCESS;

static int handle_SIGXFSZ ( int  sig  )  [static]

Definition at line 832 of file logger.c.

Referenced by init_logger().

00834 {
00835    /* Indicate need to reload */
00836    filesize_reload_needed = 1;
00837    return 0;

int init_logger ( void   ) 

Provided by logger.c

Definition at line 1005 of file logger.c.

References ast_cli_register_multiple(), ast_cond_destroy(), ast_cond_init(), ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_pthread_create, ast_queue_log(), ast_verb, cli_logger, errno, EVENTLOG, eventlog, handle_SIGXFSZ(), init_logger_chain(), LOG_ERROR, LOG_EVENT, logcond, logfiles, logger_thread(), logthread, and qlog.

Referenced by main().

01007 {
01008    char tmp[256];
01009    int res = 0;
01010 
01011    /* auto rotate if sig SIGXFSZ comes a-knockin */
01012    (void) signal(SIGXFSZ, (void *) handle_SIGXFSZ);
01013 
01014    /* start logger thread */
01015    ast_cond_init(&logcond, NULL);
01016    if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) {
01017       ast_cond_destroy(&logcond);
01018       return -1;
01019    }
01020 
01021    /* register the logger cli commands */
01022    ast_cli_register_multiple(cli_logger, sizeof(cli_logger) / sizeof(struct ast_cli_entry));
01023 
01024    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
01025   
01026    /* create log channels */
01027    init_logger_chain(0 /* locked */);
01028 
01029    /* create the eventlog */
01030    if (logfiles.event_log) {
01031       snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG);
01032       eventlog = fopen(tmp, "a");
01033       if (eventlog) {
01034          ast_log(LOG_EVENT, "Started Asterisk Event Logger\n");
01035          ast_verb(1, "Asterisk Event Logger Started %s\n", tmp);
01036       } else {
01037          ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno));
01038          res = -1;
01039       }
01040    }
01041 
01042    if (logfiles.queue_log) {
01043       snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
01044       qlog = fopen(tmp, "a");
01045       ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", "");
01046    }
01047    return res;

static void init_logger_chain ( int  locked  )  [static]

Definition at line 321 of file logger.c.

References ast_calloc, ast_config_destroy(), ast_config_load2(), ast_copy_string(), ast_free, AST_RWLIST_INSERT_HEAD, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), ast_variable_browse(), ast_variable_retrieve(), chan, config_flags, errno, logchannel::list, logfiles, LOGTYPE_CONSOLE, make_logchannel(), ROTATE, s, SEQUENTIAL, TIMESTAMP, and var.

Referenced by init_logger(), and reload_logger().

00323 {
00324    struct logchannel *chan;
00325    struct ast_config *cfg;
00326    struct ast_variable *var;
00327    const char *s;
00328    struct ast_flags config_flags = { 0 };
00329 
00330    if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)))
00331       return;
00332 
00333    /* delete our list of log channels */
00334    if (!locked)
00335       AST_RWLIST_WRLOCK(&logchannels);
00336    while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list)))
00337       ast_free(chan);
00338    if (!locked)
00339       AST_RWLIST_UNLOCK(&logchannels);
00340    
00341    global_logmask = 0;
00342    errno = 0;
00343    /* close syslog */
00344    closelog();
00345    
00346    /* If no config file, we're fine, set default options. */
00347    if (!cfg) {
00348       if (errno)
00349          fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno));
00350       else
00351          fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n");
00352       if (!(chan = ast_calloc(1, sizeof(*chan))))
00353          return;
00354       chan->type = LOGTYPE_CONSOLE;
00355       chan->logmask = 28; /*warning,notice,error */
00356       if (!locked)
00357          AST_RWLIST_WRLOCK(&logchannels);
00358       AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
00359       if (!locked)
00360          AST_RWLIST_UNLOCK(&logchannels);
00361       global_logmask |= chan->logmask;
00362       return;
00363    }
00364    
00365    if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) {
00366       if (ast_true(s)) {
00367          if (gethostname(hostname, sizeof(hostname) - 1)) {
00368             ast_copy_string(hostname, "unknown", sizeof(hostname));
00369             fprintf(stderr, "What box has no hostname???\n");
00370          }
00371       } else
00372          hostname[0] = '\0';
00373    } else
00374       hostname[0] = '\0';
00375    if ((s = ast_variable_retrieve(cfg, "general", "dateformat")))
00376       ast_copy_string(dateformat, s, sizeof(dateformat));
00377    else
00378       ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat));
00379    if ((s = ast_variable_retrieve(cfg, "general", "queue_log")))
00380       logfiles.queue_log = ast_true(s);
00381    if ((s = ast_variable_retrieve(cfg, "general", "event_log")))
00382       logfiles.event_log = ast_true(s);
00383    if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name")))
00384       ast_copy_string(queue_log_name, s, sizeof(queue_log_name));
00385    if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate")))
00386       ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate));
00387    if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) {
00388       if (strcasecmp(s, "timestamp") == 0)
00389          rotatestrategy = TIMESTAMP;
00390       else if (strcasecmp(s, "rotate") == 0)
00391          rotatestrategy = ROTATE;
00392       else if (strcasecmp(s, "sequential") == 0)
00393          rotatestrategy = SEQUENTIAL;
00394       else
00395          fprintf(stderr, "Unknown rotatestrategy: %s\n", s);
00396    } else {
00397       if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) {
00398          rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL;
00399          fprintf(stderr, "rotatetimestamp option has been deprecated.  Please use rotatestrategy instead.\n");
00400       }
00401    }
00402 
00403    if (!locked)
00404       AST_RWLIST_WRLOCK(&logchannels);
00405    var = ast_variable_browse(cfg, "logfiles");
00406    for (; var; var = var->next) {
00407       if (!(chan = make_logchannel(var->name, var->value, var->lineno)))
00408          continue;
00409       AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
00410       global_logmask |= chan->logmask;
00411    }
00412    if (!locked)
00413       AST_RWLIST_UNLOCK(&logchannels);
00414 
00415    ast_config_destroy(cfg);

static void logger_print_normal ( struct logmsg logmsg  )  [static]

Print a normal log message to the channels.

Definition at line 865 of file logger.c.

References __LOG_EVENT, __LOG_VERBOSE, ast_console_puts_mutable(), ast_log(), ast_log_vsyslog(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strlen_zero(), ast_verb, buf, chan, COLOR_BRWHITE, colors, logmsg::date, errno, EVENT_FLAG_SYSTEM, eventlog, logmsg::file, logmsg::function, logmsg::level, levels, logmsg::line, logchannel::list, LOG_EVENT, logfiles, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::process_id, reload_logger(), logmsg::str, and term_color().

Referenced by ast_log(), and logger_thread().

00867 {
00868    struct logchannel *chan = NULL;
00869    char buf[BUFSIZ];
00870 
00871    AST_RWLIST_RDLOCK(&logchannels);
00872 
00873    if (logfiles.event_log && logmsg->level == __LOG_EVENT) {
00874       fprintf(eventlog, "%s asterisk[%ld]: %s", logmsg->date, (long)getpid(), logmsg->str);
00875       fflush(eventlog);
00876       AST_RWLIST_UNLOCK(&logchannels);
00877       return;
00878    }
00879 
00880    if (!AST_RWLIST_EMPTY(&logchannels)) {
00881       AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
00882          /* If the channel is disabled, then move on to the next one */
00883          if (chan->disabled)
00884             continue;
00885          /* Check syslog channels */
00886          if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) {
00887             ast_log_vsyslog(logmsg->level, logmsg->file, logmsg->line, logmsg->function, logmsg->str, logmsg->process_id);
00888          /* Console channels */
00889          } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) {
00890             char linestr[128];
00891             char tmp1[80], tmp2[80], tmp3[80], tmp4[80];
00892 
00893             /* If the level is verbose, then skip it */
00894             if (logmsg->level == __LOG_VERBOSE)
00895                continue;
00896 
00897             /* Turn the numerical line number into a string */
00898             snprintf(linestr, sizeof(linestr), "%d", logmsg->line);
00899             /* Build string to print out */
00900             snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s",
00901                 logmsg->date,
00902                 term_color(tmp1, levels[logmsg->level], colors[logmsg->level], 0, sizeof(tmp1)),
00903                 logmsg->process_id,
00904                 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)),
00905                 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
00906                 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)),
00907                 logmsg->str);
00908             /* Print out */
00909             ast_console_puts_mutable(buf, logmsg->level);
00910          /* File channels */
00911          } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) {
00912             int res = 0;
00913 
00914             /* If no file pointer exists, skip it */
00915             if (!chan->fileptr)
00916                continue;
00917             
00918             /* Print out to the file */
00919             res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s",
00920                      logmsg->date, levels[logmsg->level], logmsg->process_id, logmsg->file, logmsg->str);
00921             if (res <= 0 && !ast_strlen_zero(logmsg->str)) {
00922                fprintf(stderr, "**** Asterisk Logging Error: ***********\n");
00923                if (errno == ENOMEM || errno == ENOSPC)
00924                   fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename);
00925                else
00926                   fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno));
00927                manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno));
00928                chan->disabled = 1;
00929             } else if (res > 0) {
00930                fflush(chan->fileptr);
00931             }
00932          }
00933       }
00934    } else if (logmsg->level != __LOG_VERBOSE) {
00935       fputs(logmsg->str, stdout);
00936    }
00937 
00938    AST_RWLIST_UNLOCK(&logchannels);
00939 
00940    /* If we need to reload because of the file size, then do so */
00941    if (filesize_reload_needed) {
00942       reload_logger(-1);
00943       ast_log(LOG_EVENT, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n");
00944       ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n");
00945    }
00946 
00947    return;

static void logger_print_verbose ( struct logmsg logmsg  )  [static]

Print a verbose message to the verbosers.

Definition at line 950 of file logger.c.

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

Referenced by __ast_verbose_ap(), and logger_thread().

00952 {
00953    struct verb *v = NULL;
00954 
00955    /* Iterate through the list of verbosers and pass them the log message string */
00956    AST_RWLIST_RDLOCK(&verbosers);
00957    AST_RWLIST_TRAVERSE(&verbosers, v, list)
00958       v->verboser(logmsg->str);
00959    AST_RWLIST_UNLOCK(&verbosers);
00960 
00961    return;

int logger_reload ( void   ) 

Reload logger without rotating log files.

Definition at line 689 of file logger.c.

References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.

00691 {
00692    if(reload_logger(0))
00693       return RESULT_FAILURE;
00694    return RESULT_SUCCESS;

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

Actual logging thread.

Definition at line 964 of file logger.c.

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

Referenced by init_logger().

00966 {
00967    struct logmsg *next = NULL, *msg = NULL;
00968 
00969    for (;;) {
00970       /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */
00971       AST_LIST_LOCK(&logmsgs);
00972       if (AST_LIST_EMPTY(&logmsgs)) {
00973          if (close_logger_thread) {
00974             break;
00975          } else {
00976             ast_cond_wait(&logcond, &logmsgs.lock);
00977          }
00978       }
00979       next = AST_LIST_FIRST(&logmsgs);
00980       AST_LIST_HEAD_INIT_NOLOCK(&logmsgs);
00981       AST_LIST_UNLOCK(&logmsgs);
00982 
00983       /* Otherwise go through and process each message in the order added */
00984       while ((msg = next)) {
00985          /* Get the next entry now so that we can free our current structure later */
00986          next = AST_LIST_NEXT(msg, list);
00987 
00988          /* Depending on the type, send it to the proper function */
00989          if (msg->type == LOGMSG_NORMAL)
00990             logger_print_normal(msg);
00991          else if (msg->type == LOGMSG_VERBOSE)
00992             logger_print_verbose(msg);
00993 
00994          /* Free the data since we are done */
00995          ast_free(msg);
00996       }
00997 
00998       /* If we should stop, then stop */
00999       if (close_logger_thread)
01000          break;
01001    }
01002 
01003    return NULL;

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

Definition at line 180 of file logger.c.

References __LOG_DEBUG, __LOG_DTMF, __LOG_ERROR, __LOG_EVENT, __LOG_NOTICE, __LOG_VERBOSE, __LOG_WARNING, ast_skip_blanks(), ast_strdupa, and strsep().

Referenced by make_logchannel().

00182 {
00183    char *w;
00184    int res = 0;
00185    char *stringp = ast_strdupa(s);
00186 
00187    while ((w = strsep(&stringp, ","))) {
00188       w = ast_skip_blanks(w);
00189       if (!strcasecmp(w, "error")) 
00190          res |= (1 << __LOG_ERROR);
00191       else if (!strcasecmp(w, "warning"))
00192          res |= (1 << __LOG_WARNING);
00193       else if (!strcasecmp(w, "notice"))
00194          res |= (1 << __LOG_NOTICE);
00195       else if (!strcasecmp(w, "event"))
00196          res |= (1 << __LOG_EVENT);
00197       else if (!strcasecmp(w, "debug"))
00198          res |= (1 << __LOG_DEBUG);
00199       else if (!strcasecmp(w, "verbose"))
00200          res |= (1 << __LOG_VERBOSE);
00201       else if (!strcasecmp(w, "dtmf"))
00202          res |= (1 << __LOG_DTMF);
00203       else {
00204          fprintf(stderr, "Logfile Warning: Unknown keyword '%s' at line %d of logger.conf\n", w, lineno);
00205       }
00206    }
00207 
00208    return res;

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

Definition at line 210 of file logger.c.

References ast_calloc, ast_config_AST_LOG_DIR, ast_copy_string(), ast_free, ast_strlen_zero(), chan, errno, logchannel::facility, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, and make_components().

Referenced by init_logger_chain().

00212 {
00213    struct logchannel *chan;
00214    char *facility;
00215 #ifndef SOLARIS
00216    CODE *cptr;
00217 #endif
00218 
00219    if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan))))
00220       return NULL;
00221 
00222    if (!strcasecmp(channel, "console")) {
00223       chan->type = LOGTYPE_CONSOLE;
00224    } else if (!strncasecmp(channel, "syslog", 6)) {
00225       /*
00226       * syntax is:
00227       *  syslog.facility => level,level,level
00228       */
00229       facility = strchr(channel, '.');
00230       if (!facility++ || !facility) {
00231          facility = "local0";
00232       }
00233 
00234 #ifndef SOLARIS
00235       /*
00236       * Walk through the list of facilitynames (defined in sys/syslog.h)
00237       * to see if we can find the one we have been given
00238       */
00239       chan->facility = -1;
00240       cptr = facilitynames;
00241       while (cptr->c_name) {
00242          if (!strcasecmp(facility, cptr->c_name)) {
00243             chan->facility = cptr->c_val;
00244             break;
00245          }
00246          cptr++;
00247       }
00248 #else
00249       chan->facility = -1;
00250       if (!strcasecmp(facility, "kern")) 
00251          chan->facility = LOG_KERN;
00252       else if (!strcasecmp(facility, "USER")) 
00253          chan->facility = LOG_USER;
00254       else if (!strcasecmp(facility, "MAIL")) 
00255          chan->facility = LOG_MAIL;
00256       else if (!strcasecmp(facility, "DAEMON")) 
00257          chan->facility = LOG_DAEMON;
00258       else if (!strcasecmp(facility, "AUTH")) 
00259          chan->facility = LOG_AUTH;
00260       else if (!strcasecmp(facility, "SYSLOG")) 
00261          chan->facility = LOG_SYSLOG;
00262       else if (!strcasecmp(facility, "LPR")) 
00263          chan->facility = LOG_LPR;
00264       else if (!strcasecmp(facility, "NEWS")) 
00265          chan->facility = LOG_NEWS;
00266       else if (!strcasecmp(facility, "UUCP")) 
00267          chan->facility = LOG_UUCP;
00268       else if (!strcasecmp(facility, "CRON")) 
00269          chan->facility = LOG_CRON;
00270       else if (!strcasecmp(facility, "LOCAL0")) 
00271          chan->facility = LOG_LOCAL0;
00272       else if (!strcasecmp(facility, "LOCAL1")) 
00273          chan->facility = LOG_LOCAL1;
00274       else if (!strcasecmp(facility, "LOCAL2")) 
00275          chan->facility = LOG_LOCAL2;
00276       else if (!strcasecmp(facility, "LOCAL3")) 
00277          chan->facility = LOG_LOCAL3;
00278       else if (!strcasecmp(facility, "LOCAL4")) 
00279          chan->facility = LOG_LOCAL4;
00280       else if (!strcasecmp(facility, "LOCAL5")) 
00281          chan->facility = LOG_LOCAL5;
00282       else if (!strcasecmp(facility, "LOCAL6")) 
00283          chan->facility = LOG_LOCAL6;
00284       else if (!strcasecmp(facility, "LOCAL7")) 
00285          chan->facility = LOG_LOCAL7;
00286 #endif /* Solaris */
00287 
00288       if (0 > chan->facility) {
00289          fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
00290          ast_free(chan);
00291          return NULL;
00292       }
00293 
00294       chan->type = LOGTYPE_SYSLOG;
00295       snprintf(chan->filename, sizeof(chan->filename), "%s", channel);
00296       openlog("asterisk", LOG_PID, chan->facility);
00297    } else {
00298       if (channel[0] == '/') {
00299          if (!ast_strlen_zero(hostname)) { 
00300             snprintf(chan->filename, sizeof(chan->filename), "%s.%s", channel, hostname);
00301          } else {
00302             ast_copy_string(chan->filename, channel, sizeof(chan->filename));
00303          }
00304       }       
00305       
00306       if (!ast_strlen_zero(hostname)) {
00307          snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s", ast_config_AST_LOG_DIR, channel, hostname);
00308       } else {
00309          snprintf(chan->filename, sizeof(chan->filename), "%s/%s", ast_config_AST_LOG_DIR, channel);
00310       }
00311       chan->fileptr = fopen(chan->filename, "a");
00312       if (!chan->fileptr) {
00313          /* Can't log here, since we're called with a lock */
00314          fprintf(stderr, "Logger Warning: Unable to open log file '%s': %s\n", chan->filename, strerror(errno));
00315       } 
00316       chan->type = LOGTYPE_FILE;
00317    }
00318    chan->logmask = make_components(components, lineno);
00319    return chan;

static int reload_logger ( int  rotate  )  [static]

Definition at line 587 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, errno, EVENT_FLAG_SYSTEM, EVENTLOG, eventlog, f, init_logger_chain(), logchannel::list, LOG_ERROR, LOG_EVENT, logfiles, manager_event, qlog, and rotate_file().

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

00589 {
00590    char old[PATH_MAX] = "";
00591    int event_rotate = rotate, queue_rotate = rotate;
00592    struct logchannel *f;
00593    int res = 0;
00594    struct stat st;
00595 
00596    AST_RWLIST_WRLOCK(&logchannels);
00597 
00598    if (eventlog) {
00599       if (rotate < 0) {
00600          /* Check filesize - this one typically doesn't need an auto-rotate */
00601          snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG);
00602          if (stat(old, &st) != 0 || st.st_size > 0x40000000) { /* Arbitrarily, 1 GB */
00603             fclose(eventlog);
00604             eventlog = NULL;
00605          } else
00606             event_rotate = 0;
00607       } else {
00608          fclose(eventlog);
00609          eventlog = NULL;
00610       }
00611    } else
00612       event_rotate = 0;
00613 
00614    if (qlog) {
00615       if (rotate < 0) {
00616          /* Check filesize - this one typically doesn't need an auto-rotate */
00617          snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
00618          if (stat(old, &st) != 0 || st.st_size > 0x40000000) { /* Arbitrarily, 1 GB */
00619             fclose(qlog);
00620             qlog = NULL;
00621          } else
00622             event_rotate = 0;
00623       } else {
00624          fclose(qlog);
00625          qlog = NULL;
00626       }
00627    } else 
00628       queue_rotate = 0;
00629    qlog = NULL;
00630 
00631    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
00632 
00633    AST_RWLIST_TRAVERSE(&logchannels, f, list) {
00634       if (f->disabled) {
00635          f->disabled = 0;  /* Re-enable logging at reload */
00636          manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename);
00637       }
00638       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
00639          fclose(f->fileptr);  /* Close file */
00640          f->fileptr = NULL;
00641          if (rotate)
00642             rotate_file(f->filename);
00643       }
00644    }
00645 
00646    filesize_reload_needed = 0;
00647 
00648    init_logger_chain(1 /* locked */);
00649 
00650    if (logfiles.event_log) {
00651       snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG);
00652       if (event_rotate)
00653          rotate_file(old);
00654 
00655       eventlog = fopen(old, "a");
00656       if (eventlog) {
00657          ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n");
00658          ast_verb(1, "Asterisk Event Logger restarted\n");
00659       } else {
00660          ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno));
00661          res = -1;
00662       }
00663    }
00664 
00665    if (logfiles.queue_log) {
00666       snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
00667       if (queue_rotate)
00668          rotate_file(old);
00669 
00670       qlog = fopen(old, "a");
00671       if (qlog) {
00672          AST_RWLIST_UNLOCK(&logchannels);
00673          ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", "");
00674          AST_RWLIST_WRLOCK(&logchannels);
00675          ast_log(LOG_EVENT, "Restarted Asterisk Queue Logger\n");
00676          ast_verb(1, "Asterisk Queue Logger restarted\n");
00677       } else {
00678          ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
00679          res = -1;
00680       }
00681    }
00682 
00683    AST_RWLIST_UNLOCK(&logchannels);
00684 
00685    return res;

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

Definition at line 501 of file logger.c.

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

Referenced by reload_logger().

00503 {
00504    char old[PATH_MAX];
00505    char new[PATH_MAX];
00506    int x, y, which, found, res = 0, fd;
00507    char *suffixes[4] = { "", ".gz", ".bz2", ".Z" };
00508 
00509    switch (rotatestrategy) {
00510    case SEQUENTIAL:
00511       for (x = 0; ; x++) {
00512          snprintf(new, sizeof(new), "%s.%d", filename, x);
00513          fd = open(new, O_RDONLY);
00514          if (fd > -1)
00515             close(fd);
00516          else
00517             break;
00518       }
00519       if (rename(filename, new)) {
00520          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00521          res = -1;
00522       }
00523       break;
00524    case TIMESTAMP:
00525       snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL));
00526       if (rename(filename, new)) {
00527          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00528          res = -1;
00529       }
00530       break;
00531    case ROTATE:
00532       /* Find the next empty slot, including a possible suffix */
00533       for (x = 0; ; x++) {
00534          found = 0;
00535          for (which = 0; which < ARRAY_LEN(suffixes); which++) {
00536             snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]);
00537             fd = open(new, O_RDONLY);
00538             if (fd > -1) {
00539                close(fd);
00540                found = 1;
00541                break;
00542             }
00543          }
00544          if (!found) {
00545             break;
00546          }
00547       }
00548 
00549       /* Found an empty slot */
00550       for (y = x; y > 0; y--) {
00551          for (which = 0; which < ARRAY_LEN(suffixes); which++) {
00552             snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]);
00553             fd = open(old, O_RDONLY);
00554             if (fd > -1) {
00555                /* Found the right suffix */
00556                close(fd);
00557                snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]);
00558                if (rename(old, new)) {
00559                   fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new);
00560                   res = -1;
00561                }
00562                break;
00563             }
00564          }
00565       }
00566 
00567       /* Finally, rename the current file */
00568       snprintf(new, sizeof(new), "%s.0", filename);
00569       if (rename(filename, new)) {
00570          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00571          res = -1;
00572       }
00573    }
00574 
00575    if (!ast_strlen_zero(exec_after_rotate)) {
00576       struct ast_channel *c = ast_channel_alloc(0, 0, "", "", "", "", "", 0, "Logger/rotate");
00577       char buf[512];
00578       pbx_builtin_setvar_helper(c, "filename", filename);
00579       pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf));
00580       if (ast_safe_system(buf) != -1) {
00581          ast_log(LOG_WARNING, "error executing '%s'\n", buf);
00582       }
00583       ast_channel_free(c);
00584    }
00585    return res;


Variable Documentation

struct ast_cli_entry cli_logger[] [static]

Definition at line 825 of file logger.c.

Referenced by init_logger().

int close_logger_thread [static]

Definition at line 147 of file logger.c.

Referenced by close_logger(), and logger_thread().

int colors[] [static]

Colors used in the console for logging.

Definition at line 164 of file logger.c.

Referenced by logger_print_normal().

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

Definition at line 88 of file logger.c.

Referenced by build_device().

unsigned int event_log

Definition at line 104 of file logger.c.

FILE* eventlog [static]

Definition at line 149 of file logger.c.

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

char exec_after_rotate[256] = "" [static]

Definition at line 91 of file logger.c.

int filesize_reload_needed [static]

Definition at line 93 of file logger.c.

int global_logmask = -1 [static]

Definition at line 94 of file logger.c.

char hostname[MAXHOSTNAMELEN] [static]

Definition at line 107 of file logger.c.

Referenced by app_exec(), ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), netconsole(), set_destination(), sip_register(), and tds_load_module().

char* levels[] [static]

Logging channels used in the Asterisk logging system.

Definition at line 153 of file logger.c.

Referenced by ast_console_toggle_loglevel(), ast_log_vsyslog(), ast_network_puts_mutable(), handle_logger_set_level(), and logger_print_normal().

struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT, .key_init = __init_log_buf , .custom_init = NULL , } [static]

Definition at line 177 of file logger.c.

Referenced by ast_log().

ast_cond_t logcond [static]

Definition at line 146 of file logger.c.

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

struct { ... } logfiles [static]

Referenced by init_logger(), init_logger_chain(), logger_print_normal(), and reload_logger().

pthread_t logthread = AST_PTHREADT_NULL [static]

Definition at line 145 of file logger.c.

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

FILE* qlog [static]

Definition at line 150 of file logger.c.

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

unsigned int queue_log

Definition at line 103 of file logger.c.

char queue_log_name[256] = QUEUELOG [static]

Definition at line 90 of file logger.c.

int syslog_level_map[] [static]

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

Referenced by __ast_verbose_ap().


Generated on Fri Jun 19 12:10:41 2009 for Asterisk - the Open Source PBX by  doxygen 1.4.7