#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 <execinfo.h>
Go to the source code of this file.
Data Structures | |
struct | logchannel |
struct | logchannels |
struct | logmsg |
struct | logmsgs |
struct | verb |
struct | verbosers |
Defines | |
#define | FORMATL "%-35.35s %-8.8s %-9.9s " |
#define | GETTID() getpid() |
#define | LOG_BUF_INIT_SIZE 256 |
#define | MAX_BACKTRACE_FRAMES 20 |
#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) |
static void | _handle_SIGXFSZ (int sig) |
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) |
char ** | ast_bt_get_symbols (void **addresses, size_t num_frames) |
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 (struct logmsg *msg) |
int | ast_logger_register_level (const char *name) |
Register a new logger level. | |
void | ast_logger_unregister_level (const char *name) |
Unregister a previously registered logger level. | |
void | ast_queue_log (const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...) |
int | ast_register_verbose (void(*v)(const char *string)) |
int | ast_unregister_verbose (void(*v)(const char *string)) |
void | ast_verbose (const char *fmt,...) |
void | close_logger (void) |
static char * | handle_logger_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_rotate (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_set_level (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_show_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
CLI command to show logging system configuration. | |
int | init_logger (void) |
static void | init_logger_chain (int locked) |
static void | logger_print_normal (struct logmsg *logmsg) |
Print a normal log message to the channels. | |
static void | logger_queue_init (void) |
int | logger_reload (void) |
Reload logger without rotating log files. | |
static void * | logger_thread (void *data) |
Actual logging thread. | |
static unsigned int | make_components (const char *s, int lineno) |
static struct logchannel * | make_logchannel (const char *channel, const char *components, int lineno) |
static int | reload_logger (int rotate) |
static int | rotate_file (const char *filename) |
static void | update_logchannels (void) |
Variables | |
static struct ast_cli_entry | cli_logger [] |
static int | close_logger_thread = 0 |
static const int | colors [32] |
Colors used in the console for logging. | |
static char | dateformat [256] = "%b %e %T" |
static char | exec_after_rotate [256] = "" |
static int | filesize_reload_needed |
static unsigned int | global_logmask = 0xFFFF |
static struct sigaction | handle_SIGXFSZ |
static char | hostname [MAXHOSTNAMELEN] |
static char * | levels [32] |
Logging channels used in the Asterisk logging system. | |
static struct ast_threadstorage | log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , } |
static ast_cond_t | logcond |
struct { | |
unsigned int queue_adaptive_realtime:1 | |
unsigned int queue_log:1 | |
unsigned int queue_log_to_file:1 | |
} | logfiles |
static pthread_t | logthread = AST_PTHREADT_NULL |
static FILE * | qlog |
static char | queue_log_name [256] = QUEUELOG |
static int | queuelog_init |
static struct ast_threadstorage | verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } |
Logging routines
Definition in file logger.c.
#define FORMATL "%-35.35s %-8.8s %-9.9s " |
Referenced by handle_logger_show_channels().
#define VERBOSE_BUF_INIT_SIZE 256 |
enum logmsgtypes |
Definition at line 126 of file logger.c.
00126 { 00127 LOGMSG_NORMAL = 0, 00128 LOGMSG_VERBOSE, 00129 };
enum logtypes |
Definition at line 97 of file logger.c.
00097 { 00098 LOGTYPE_SYSLOG, 00099 LOGTYPE_FILE, 00100 LOGTYPE_CONSOLE, 00101 };
enum rotatestrategy |
Definition at line 83 of file logger.c.
00083 { 00084 SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */ 00085 ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */ 00086 TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */ 00087 } rotatestrategy = SEQUENTIAL;
void __ast_verbose | ( | const char * | file, | |
int | line, | |||
const char * | func, | |||
const char * | fmt, | |||
... | ||||
) |
This works like ast_log, but prints verbose messages to the console depending on verbosity level set. ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing"); This will print the message to the console if the verbose level is set to a level >= 3 Note the abscence of a comma after the VERBOSE_PREFIX_3. This is important. VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined.
Send a verbose message (based on verbose level)
Definition at line 1441 of file logger.c.
References __ast_verbose_ap().
01442 { 01443 va_list ap; 01444 01445 va_start(ap, fmt); 01446 __ast_verbose_ap(file, line, func, fmt, ap); 01447 va_end(ap); 01448 }
void __ast_verbose_ap | ( | const char * | file, | |
int | line, | |||
const char * | func, | |||
const char * | fmt, | |||
va_list | ap | |||
) |
Definition at line 1405 of file logger.c.
References __LOG_VERBOSE, AST_DYNSTR_BUILD_FAILED, ast_localtime(), ast_log(), ast_opt_timestamp, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_tvnow(), verbose_buf, and VERBOSE_BUF_INIT_SIZE.
Referenced by __ast_verbose(), and ast_verbose().
01406 { 01407 struct ast_str *buf = NULL; 01408 int res = 0; 01409 01410 if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) 01411 return; 01412 01413 if (ast_opt_timestamp) { 01414 struct timeval now; 01415 struct ast_tm tm; 01416 char date[40]; 01417 char *datefmt; 01418 01419 now = ast_tvnow(); 01420 ast_localtime(&now, &tm, NULL); 01421 ast_strftime(date, sizeof(date), dateformat, &tm); 01422 datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1); 01423 sprintf(datefmt, "%c[%s] %s", 127, date, fmt); 01424 fmt = datefmt; 01425 } else { 01426 char *tmp = alloca(strlen(fmt) + 2); 01427 sprintf(tmp, "%c%s", 127, fmt); 01428 fmt = tmp; 01429 } 01430 01431 /* Build string */ 01432 res = ast_str_set_va(&buf, 0, fmt, ap); 01433 01434 /* If the build failed then we can drop this allocated message */ 01435 if (res == AST_DYNSTR_BUILD_FAILED) 01436 return; 01437 01438 ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf)); 01439 }
static void _handle_SIGXFSZ | ( | int | sig | ) | [static] |
Definition at line 867 of file logger.c.
00868 { 00869 /* Indicate need to reload */ 00870 filesize_reload_needed = 1; 00871 }
void ast_backtrace | ( | void | ) |
Definition at line 1375 of file logger.c.
References ast_bt::addresses, ast_bt_create(), ast_bt_destroy(), ast_bt_get_symbols(), ast_debug, ast_log(), free, LOG_DEBUG, LOG_WARNING, and ast_bt::num_frames.
01376 { 01377 #ifdef HAVE_BKTR 01378 struct ast_bt *bt; 01379 int i = 0; 01380 char **strings; 01381 01382 if (!(bt = ast_bt_create())) { 01383 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n"); 01384 return; 01385 } 01386 01387 if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) { 01388 ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' '); 01389 for (i = 3; i < bt->num_frames - 2; i++) { 01390 ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]); 01391 } 01392 01393 /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */ 01394 #undef free 01395 free(strings); 01396 } else { 01397 ast_debug(1, "Could not allocate memory for backtrace\n"); 01398 } 01399 ast_bt_destroy(bt); 01400 #else 01401 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n"); 01402 #endif /* defined(HAVE_BKTR) */ 01403 }
struct ast_bt* ast_bt_create | ( | void | ) |
Definition at line 1198 of file logger.c.
References ast_bt_get_addresses(), ast_calloc, ast_log(), and LOG_ERROR.
Referenced by ast_backtrace().
01199 { 01200 struct ast_bt *bt = ast_calloc(1, sizeof(*bt)); 01201 if (!bt) { 01202 ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n"); 01203 return NULL; 01204 } 01205 01206 bt->alloced = 1; 01207 01208 ast_bt_get_addresses(bt); 01209 01210 return bt; 01211 }
void* ast_bt_destroy | ( | struct ast_bt * | bt | ) |
Definition at line 1220 of file logger.c.
References ast_bt::alloced, and ast_free.
Referenced by ast_backtrace().
int ast_bt_get_addresses | ( | struct ast_bt * | bt | ) |
Definition at line 1213 of file logger.c.
References ast_bt::addresses, AST_MAX_BT_FRAMES, and ast_bt::num_frames.
Referenced by __ast_cond_timedwait(), __ast_cond_wait(), __ast_pthread_mutex_lock(), __ast_pthread_mutex_trylock(), __ast_rwlock_rdlock(), __ast_rwlock_timedrdlock(), __ast_rwlock_timedwrlock(), __ast_rwlock_tryrdlock(), __ast_rwlock_trywrlock(), __ast_rwlock_wrlock(), and ast_bt_create().
01214 { 01215 bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES); 01216 01217 return 0; 01218 }
char** ast_bt_get_symbols | ( | void ** | addresses, | |
size_t | num_frames | |||
) |
Definition at line 1229 of file logger.c.
References ast_calloc, ast_log(), ast_malloc, ast_utils_which(), LOG_DEBUG, and S_OR.
Referenced by ao2_bt(), and ast_backtrace().
01230 { 01231 char **strings = NULL; 01232 #if defined(BETTER_BACKTRACES) 01233 int stackfr; 01234 bfd *bfdobj; /* bfd.h */ 01235 Dl_info dli; /* dlfcn.h */ 01236 long allocsize; 01237 asymbol **syms = NULL; /* bfd.h */ 01238 bfd_vma offset; /* bfd.h */ 01239 const char *lastslash; 01240 asection *section; 01241 const char *file, *func; 01242 unsigned int line; 01243 char address_str[128]; 01244 char msg[1024]; 01245 size_t strings_size; 01246 size_t *eachlen; 01247 #endif 01248 01249 #if defined(BETTER_BACKTRACES) 01250 strings_size = num_frames * sizeof(*strings); 01251 eachlen = ast_calloc(num_frames, sizeof(*eachlen)); 01252 01253 if (!(strings = ast_calloc(num_frames, sizeof(*strings)))) { 01254 return NULL; 01255 } 01256 01257 for (stackfr = 0; stackfr < num_frames; stackfr++) { 01258 int found = 0, symbolcount; 01259 01260 msg[0] = '\0'; 01261 01262 if (!dladdr(addresses[stackfr], &dli)) { 01263 continue; 01264 } 01265 01266 if (strcmp(dli.dli_fname, "asterisk") == 0) { 01267 char asteriskpath[256]; 01268 if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) { 01269 /* This will fail to find symbols */ 01270 ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n"); 01271 dli.dli_fname = "asterisk"; 01272 } 01273 } 01274 01275 lastslash = strrchr(dli.dli_fname, '/'); 01276 if ( (bfdobj = bfd_openr(dli.dli_fname, NULL)) && 01277 bfd_check_format(bfdobj, bfd_object) && 01278 (allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 && 01279 (syms = ast_malloc(allocsize)) && 01280 (symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) { 01281 01282 if (bfdobj->flags & DYNAMIC) { 01283 offset = addresses[stackfr] - dli.dli_fbase; 01284 } else { 01285 offset = addresses[stackfr] - (void *) 0; 01286 } 01287 01288 for (section = bfdobj->sections; section; section = section->next) { 01289 if ( !bfd_get_section_flags(bfdobj, section) & SEC_ALLOC || 01290 section->vma > offset || 01291 section->size + section->vma < offset) { 01292 continue; 01293 } 01294 01295 if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) { 01296 continue; 01297 } 01298 01299 /* Stack trace output */ 01300 found++; 01301 if ((lastslash = strrchr(file, '/'))) { 01302 const char *prevslash; 01303 for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--); 01304 if (prevslash >= file) { 01305 lastslash = prevslash; 01306 } 01307 } 01308 if (dli.dli_saddr == NULL) { 01309 address_str[0] = '\0'; 01310 } else { 01311 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01312 dli.dli_saddr, 01313 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01314 } 01315 snprintf(msg, sizeof(msg), "%s:%u %s()%s", 01316 lastslash ? lastslash + 1 : file, line, 01317 S_OR(func, "???"), 01318 address_str); 01319 01320 break; /* out of section iteration */ 01321 } 01322 } 01323 if (bfdobj) { 01324 bfd_close(bfdobj); 01325 if (syms) { 01326 ast_free(syms); 01327 } 01328 } 01329 01330 /* Default output, if we cannot find the information within BFD */ 01331 if (!found) { 01332 if (dli.dli_saddr == NULL) { 01333 address_str[0] = '\0'; 01334 } else { 01335 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01336 dli.dli_saddr, 01337 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01338 } 01339 snprintf(msg, sizeof(msg), "%s %s()%s", 01340 lastslash ? lastslash + 1 : dli.dli_fname, 01341 S_OR(dli.dli_sname, "<unknown>"), 01342 address_str); 01343 } 01344 01345 if (!ast_strlen_zero(msg)) { 01346 char **tmp; 01347 eachlen[stackfr] = strlen(msg); 01348 if (!(tmp = ast_realloc(strings, strings_size + eachlen[stackfr] + 1))) { 01349 ast_free(strings); 01350 strings = NULL; 01351 break; /* out of stack frame iteration */ 01352 } 01353 strings = tmp; 01354 strings[stackfr] = (char *) strings + strings_size; 01355 ast_copy_string(strings[stackfr], msg, eachlen[stackfr] + 1); 01356 strings_size += eachlen[stackfr] + 1; 01357 } 01358 } 01359 01360 if (strings) { 01361 /* Recalculate the offset pointers */ 01362 strings[0] = (char *) strings + num_frames * sizeof(*strings); 01363 for (stackfr = 1; stackfr < num_frames; stackfr++) { 01364 strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1] + 1; 01365 } 01366 } 01367 #else /* !defined(BETTER_BACKTRACES) */ 01368 strings = backtrace_symbols(addresses, num_frames); 01369 #endif /* defined(BETTER_BACKTRACES) */ 01370 return strings; 01371 }
void ast_child_verbose | ( | int | level, | |
const char * | fmt, | |||
... | ||||
) |
Definition at line 414 of file logger.c.
References ast_free, ast_malloc, and option_verbose.
Referenced by launch_script().
00415 { 00416 char *msg = NULL, *emsg = NULL, *sptr, *eptr; 00417 va_list ap, aq; 00418 int size; 00419 00420 /* Don't bother, if the level isn't that high */ 00421 if (option_verbose < level) { 00422 return; 00423 } 00424 00425 va_start(ap, fmt); 00426 va_copy(aq, ap); 00427 if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) { 00428 va_end(ap); 00429 va_end(aq); 00430 return; 00431 } 00432 va_end(ap); 00433 00434 if (!(msg = ast_malloc(size + 1))) { 00435 va_end(aq); 00436 return; 00437 } 00438 00439 vsnprintf(msg, size + 1, fmt, aq); 00440 va_end(aq); 00441 00442 if (!(emsg = ast_malloc(size * 2 + 1))) { 00443 ast_free(msg); 00444 return; 00445 } 00446 00447 for (sptr = msg, eptr = emsg; ; sptr++) { 00448 if (*sptr == '"') { 00449 *eptr++ = '\\'; 00450 } 00451 *eptr++ = *sptr; 00452 if (*sptr == '\0') { 00453 break; 00454 } 00455 } 00456 ast_free(msg); 00457 00458 fprintf(stdout, "verbose \"%s\" %d\n", emsg, level); 00459 fflush(stdout); 00460 ast_free(emsg); 00461 }
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.
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 1102 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(), GETTID, levels, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, LOGMSG_VERBOSE, logthread, option_debug, option_verbose, and term_filter_escapes().
Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __analog_handle_event(), __analog_ss_thread(), __ast_answer(), __ast_bridge_technology_register(), __ast_channel_alloc_ap(), __ast_channel_masquerade(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_data_register(), __ast_data_unregister(), __ast_format_register(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_register_translator(), __ast_request_and_dial(), __ast_smoother_feed(), __ast_string_field_init(), __ast_udptl_reload(), __ast_verbose_ap(), __attempt_transmit(), __auto_congest(), __dahdi_exception(), __find_callno(), __iax2_poke_noanswer(), __init_manager(), __mgcp_xmit(), __oh323_destroy(), __oh323_new(), __oh323_rtp_create(), __oh323_update_info(), __set_address_from_contact(), __sip_autodestruct(), __sip_pretend_ack(), __sip_reliable_xmit(), __sip_xmit(), __transmit_response(), __unload_module(), _analog_get_index(), _ast_odbc_request_obj2(), _ast_sockaddr_from_sin(), _ast_sockaddr_port(), _ast_sockaddr_set_port(), _ast_sockaddr_to_sin(), _dahdi_get_index(), _enum_array_map(), _extension_match_core(), _get_mohbyname(), _lookup_timer(), _macro_exec(), _moh_register(), _sip_tcp_helper_thread(), _while_exec(), accept_thread(), access_counter_file(), acf_channel_read(), acf_curl_helper(), acf_curlopt_helper(), acf_curlopt_write(), acf_cut_exec(), acf_cut_exec2(), acf_faxopt_read(), acf_faxopt_write(), acf_iaxvar_write(), acf_if(), acf_isexten_exec(), acf_jabberreceive_read(), acf_jabberstatus_read(), acf_mailbox_exists(), acf_meetme_info(), acf_odbc_read(), acf_odbc_write(), acf_sort_exec(), acf_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_cc_call_info_to_response(), add_cfg_entry(), add_codec_to_answer(), add_content(), add_email_attachment(), add_event_to_list(), add_exten_to_pattern_tree(), add_extensions(), add_features_datastores(), add_header(), add_ie(), add_in_calls(), add_line(), add_out_calls(), add_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_indicate(), agent_new(), agent_read(), agent_request(), agent_set_base_channel(), agentmonitoroutgoing_exec(), agi_exec_full(), aji_act_hook(), aji_client_connect(), aji_client_info_handler(), aji_create_buddy(), aji_create_client(), aji_delete_node_list(), aji_devstate_cb(), aji_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_message(), aji_handle_presence(), aji_handle_pubsub_error(), aji_handle_pubsub_event(), aji_handle_subscribe(), aji_initialize(), aji_join_exec(), aji_leave_exec(), aji_load_config(), aji_mwi_cb(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), aji_send_raw_chat(), aji_sendgroup_exec(), aji_set_group_presence(), aji_set_presence(), aji_start_sasl(), aji_status_exec(), alarmreceiver_exec(), alloc_expr_node(), alloc_resampler(), alloc_sub(), alsa_card_init(), alsa_indicate(), alsa_new(), alsa_read(), alsa_request(), alsa_write(), analog_answer(), analog_attempt_transfer(), analog_call(), analog_exception(), analog_handle_init_event(), analog_hangup(), analog_request(), analog_ss_thread(), analogsub_to_dahdisub(), announce_thread(), answer_call(), anti_injection(), aoc_append_ie(), aoc_parse_ie(), app_exec(), append_ie(), apply_general_options(), apply_option(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_adsi_get_cpeid(), ast_adsi_get_cpeinfo(), ast_adsi_load_session(), ast_adsi_transmit_message_full(), ast_agi_register(), ast_agi_send(), ast_agi_unregister(), ast_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_alaw_init(), ast_aoc_create(), ast_aoc_decode(), ast_aoc_encode(), ast_app_dtget(), ast_app_group_match_get_count(), ast_app_run_macro(), ast_append_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_timelimit(), ast_bt_create(), ast_bt_get_symbols(), ast_calendar_register(), ast_call_forward(), ast_careful_fwrite(), ast_carefulwrite(), ast_cc_get_param(), ast_cc_set_param(), ast_cdr_alloc(), ast_cdr_end(), ast_cdr_engine_init(), ast_cdr_merge(), ast_cdr_register(), ast_cdr_serialize_variables(), ast_cdr_setvar(), ast_cdr_submit_batch(), ast_cel_fill_record(), ast_cel_get_ama_flag_name(), ast_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_queryoption(), ast_channel_register(), ast_channel_setoption(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_check_signature(), ast_check_signature_bin(), ast_check_timing2(), ast_cli_perms_init(), ast_codec_get_len(), ast_codec_get_samples(), ast_config_engine_register(), ast_config_internal_load(), ast_connected_line_build_data(), ast_connected_line_parse_data(), ast_context_find_or_create(), ast_context_remove_extension_callerid2(), ast_context_verify_includes(), ast_data_get(), ast_data_retrieve(), ast_db_get(), ast_db_gettree(), ast_db_put(), ast_decrypt_bin(), 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_encrypt_bin(), ast_event_cb(), ast_event_check_subscriber(), ast_event_get_cached(), ast_event_get_ie_pltype(), ast_event_get_ie_type_name(), ast_event_get_type_name(), ast_event_new(), ast_event_queue(), ast_event_queue_and_cache(), ast_event_subscribe_new(), ast_extension_close(), ast_fax_log(), ast_fax_state_to_str(), ast_filehelper(), ast_find_ourip(), ast_format_str_reduce(), ast_format_unregister(), ast_framehook_attach(), ast_func_read(), ast_func_read2(), ast_func_write(), ast_get_encoded_char(), ast_get_enum(), ast_get_group(), ast_handle_cc_control_frame(), ast_hangup(), ast_heap_create(), ast_http_send(), ast_iax2_new(), ast_include_new(), ast_indicate_data(), ast_io_remove(), ast_ivr_menu_run_internal(), ast_jb_put(), ast_linear_stream(), ast_lock_path_flock(), ast_lock_path_lockfile(), ast_logger_register_level(), ast_makesocket(), ast_manager_register_struct(), ast_manager_unregister(), 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_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_pktccops_gate_alloc(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_queue_cc_frame(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), ast_redirecting_build_data(), ast_redirecting_parse_data(), ast_register_application2(), ast_register_feature(), ast_register_switch(), ast_remotecontrol(), ast_request(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_engine_register2(), ast_rtp_glue_register2(), ast_rtp_instance_bridge(), ast_rtp_instance_early_bridge(), ast_rtp_instance_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_vi(), ast_say_date_with_format_zh(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_se(), 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_cc_offer_timer(), ast_set_cc_recall_timer(), ast_set_ccbs_available_timer(), ast_set_ccnr_available_timer(), ast_set_owners_and_peers(), ast_set_priority(), ast_set_qos(), ast_sign_bin(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_sockaddr_hash(), ast_sockaddr_parse(), ast_sockaddr_resolve(), ast_sockaddr_split_hostport(), ast_sockaddr_stringify_fmt(), ast_speech_register(), ast_srtp_change_source(), ast_srtp_policy_alloc(), ast_srtp_protect(), ast_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_new_with_bindaddr(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_wait_for_output(), ast_waitfor_nandfds(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_reconnect(), attempt_thread(), attempt_transfer(), audiohook_read_frame_both(), auth_credentials(), auth_exec(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), background_detect_exec(), base64_helper(), base_encode(), birdbath(), blr_ebl(), blr_txt(), board_setup(), bridge_array_add(), bridge_call_thread(), bridge_exec(), bridge_make_compatible(), bridge_p2p_rtp_write(), build_alias(), build_calendar(), build_callno_limits(), build_channels(), build_conf(), build_device(), build_event_channel(), build_filename(), 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(), calculate_far_max_ifp(), calculate_local_max_datagram(), caldav_add_event(), caldav_get_events_between(), caldav_load_calendar(), caldav_request(), caldav_write_event(), calendar_busy_exec(), calendar_devstate_change(), calendar_event_notify(), calendar_event_read(), calendar_join_attendees(), calendar_query_exec(), calendar_query_result_exec(), calendar_write_exec(), callerid_feed(), callerid_feed_jp(), callerid_get_dtmf(), callerid_read(), callerid_write(), callerpres_read(), callerpres_write(), canary_thread(), canmatch(), careful_write(), cb_events(), cc_available(), cc_caller_requested(), cc_esc_publish_handler(), cc_handle_publish_error(), cccancel_exec(), cdata(), cdr_handler(), cdr_merge_vars(), chan_misdn_log(), chan_ringing(), chanavail_exec(), channel_admin_exec(), channel_revert(), channel_spy(), channel_steer(), channel_to_session(), chanspy_exec(), check_access(), check_app_args(), 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_timerange(), check_tx_freq(), check_user_full(), check_vars(), check_via(), cleanup_connection(), clear_caller(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), cli_fax_show_session(), cli_fax_show_sessions(), close_call(), close_client(), close_mailbox(), collect_function_digits(), commit_exec(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_span_helper(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), confbridge_exec(), config_curl(), config_device(), config_function_read(), config_handler(), config_ldap(), config_line(), config_load(), config_module(), config_odbc(), config_parse_variables(), config_pgsql(), config_text_file_load(), connect_link(), connectedline_read(), connectedline_write(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), convertcap(), cops_connect(), cops_gate_cmd(), cops_sendmsg(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), count_lines(), 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_accept_r2_call_exec(), dahdi_answer(), dahdi_ast_cause_to_r2_cause(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_func_write(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_open(), dahdi_pri_error(), dahdi_pri_message(), dahdi_r2_disconnect_call(), dahdi_r2_get_channel_category(), dahdi_r2_get_link(), dahdi_r2_on_call_accepted(), dahdi_r2_on_call_init(), dahdi_r2_on_call_offered(), dahdi_r2_on_line_blocked(), dahdi_r2_on_line_idle(), dahdi_r2_on_os_error(), dahdi_r2_on_protocol_error(), dahdi_r2_set_context(), dahdi_r2_write_log(), dahdi_read(), dahdi_request(), dahdi_ring_phone(), dahdi_send_callrerouting_facility_exec(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_ss7_error(), dahdi_status_data_provider_get(), dahdi_test_timer(), dahdi_timer_set_rate(), dahdi_train_ec(), dahdi_translate(), dahdi_version_data_provider_get(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dahdiscan_exec(), data_channels_provider_handler(), data_result_generate(), data_result_generate_node(), data_search_generate(), data_structure_compatible(), dbinit(), deadagi_exec(), dec_init(), del_exec(), delete_old_messages(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_pval_item(), destroy_session(), destroy_trans(), determine_starting_point(), device2chan(), device_state_cb(), devstate_cache_cb(), devstate_change_collector_cb(), devstate_write(), dial_exec_full(), dial_handle_playtones(), dialgroup_read(), dialgroup_write(), dialog_ref_debug(), dictate_exec(), digitcollect(), digitdirect(), directory_exec(), disa_exec(), disable_jack_hook(), disable_t38(), diskavail(), dispatch_thread_handler(), display_last_error(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_dtmf_local(), do_forward(), do_idle_thread(), do_magic_pickup(), do_monitor(), do_notify(), do_pktccops(), 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_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), duplicate_pseudo(), eagi_exec(), ebl_callback(), enable_jack_hook(), encode_open_type(), endelm(), enum_callback(), enum_query_read(), enum_result_read(), event_channel_destroy(), eventhandler(), evt_event_deliver_cb(), ewscal_load_calendar(), exchangecal_get_events_between(), exchangecal_load_calendar(), exchangecal_request(), exchangecal_write_event(), exec(), exec_exec(), execif_exec(), exists(), ext_cmp1(), extension_matches(), extenspy_exec(), external_rtp_create(), extstate_read(), fax_generator_generate(), fax_rate_str_to_int(), fax_session_new(), fax_session_reserve(), fbuf_append(), feature_exec_app(), feature_request_and_dial(), festival_exec(), fetch_icalendar(), ffmpeg_decode(), ffmpeg_encode(), file2format(), file_read(), file_write(), filter(), finalize_content(), find_account(), find_cache(), find_call_locked(), find_conf(), find_desc(), find_desc_usb(), find_details(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), find_or_create_details(), find_pval_goto_item(), find_queue_by_name_rt(), find_sdp(), find_speeddial_by_instance(), find_subchannel_and_lock(), find_subchannel_by_instance_reference(), find_subchannel_by_name(), find_subchannel_by_reference(), find_table(), find_transaction(), find_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), flush_telem(), fn_wrapper(), forkcdr_exec(), forward_message(), framein(), func_args(), func_channel_read(), func_channel_write_real(), 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_fieldnum_helper(), function_ilink(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_remote(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g719read(), g719write(), g723_len(), g723_read(), g723_write(), g726_read(), g726_write(), g729_read(), g729_write(), generic_execute(), generic_fax_exec(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_canmatch_exten(), get_crypto_attrib(), get_destination(), get_domain(), get_ewscal_ids_for(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_mem_set(), get_member_penalty(), get_params(), get_range(), get_rdnis(), get_refer_info(), get_timerange(), get_to_address(), get_token(), get_unused_callno(), getdisplaybyname(), getflagbyname(), getkeybyname(), getstatebyname(), getsubbyname(), gosub_exec(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_function_write(), gsm_read(), gsm_seek(), gsm_write(), gsmtolin_framein(), gtalk_alloc(), gtalk_call(), gtalk_create_candidates(), gtalk_create_member(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_invite(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_ringing_ack(), gtalk_sendhtml(), gtalk_sendtext(), gtalk_show_channels(), gtalk_update_externip(), gtalk_update_stun(), 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_call_token(), handle_callforward_button(), handle_capabilities_res_message(), handle_cc_subscribe(), handle_clear_alarms(), 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_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_options(), handle_request_publish(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_response_notify(), handle_response_peerpoke(), handle_response_publish(), handle_response_refer(), handle_response_register(), handle_response_subscribe(), handle_response_update(), handle_soft_key_event_message(), handle_stimulus_message(), handle_t38_options(), handle_tcptls_connection(), handle_transfer_button(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hidthread(), hint_read(), 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(), ical_load_calendar(), icalendar_add_event(), icalendar_update_events(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), ilbc_write(), ilbctolin_framein(), import_ch(), in_band_indication(), increase_call_count(), init_acf_query(), init_app_class(), init_jack_data(), init_req(), init_resp(), init_timing_thread(), initialize_cc_max_requests(), inotify_daemon(), inprocess_count(), insert_penaltychange(), inspect_module(), internal_ao2_ref(), INTERNAL_OBJ(), invent_message(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jack_hook_callback(), jack_hook_write(), jb_error_output(), jb_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(), keypad_cfg_read(), keypad_pick_up(), keypad_setup(), keypad_toggle(), kickptt(), kp_match_area(), kqueue_timer_open(), launch_asyncagi(), launch_ha_netscript(), launch_monitor_thread(), launch_netscript(), launch_script(), launch_service(), ldap_loadentry(), ldap_reconnect(), leave_voicemail(), linear_alloc(), linear_generator(), linear_release(), linkcount(), linkset_addsigchan(), lintogsm_framein(), lintolpc10_framein(), lintoulaw(), listener(), listfilter(), load_column_config(), load_config(), load_config_meetme(), load_dynamic_module(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_pktccops_config(), load_realtime_queue(), load_resource(), load_resource_list(), 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_queue_frame(), local_setoption(), 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(), manager_sipnotify(), map_video_codec(), masq_park_call(), matchmore(), math(), md5(), measurenoise(), meetmemute(), memcpy_decrypt(), memcpy_encrypt(), message_template_build(), message_template_parse_emailbody(), message_template_parse_filebody(), mfcr2_monitor(), 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(), moh_alloc(), moh_class_destructor(), moh_files_generator(), moh_files_release(), moh_generate(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), mssql_connect(), multicast_rtp_write(), multicast_send_control_packet(), multiplexed_bridge_create(), multiplexed_nudge(), multiplexed_thread_function(), mute_add_audiohook(), mute_fragment(), mwi_send_init(), mwi_send_process_buffer(), mwi_send_process_event(), mwi_sub_event_cb(), mwi_thread(), my_all_subchannels_hungup(), my_callwait(), my_dial_digits(), my_distinctive_ring(), my_dsp_set_digitmode(), my_get_callerid(), my_handle_dchan_exception(), my_handle_dtmf(), my_handle_link_exception(), my_handle_notify_message(), my_is_dialing(), my_is_off_hook(), my_new_pri_ast_channel(), my_new_ss7_ast_channel(), my_pri_open_media(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), my_ss7_set_loopback(), my_start_cid_detect(), my_wink(), 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(), 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(), OpenHistory(), openserial(), originate_exec(), osp_auth(), osp_check_destination(), osp_create_callid(), osp_create_provider(), osp_create_transaction(), osp_create_uuid(), osp_load(), osp_lookup(), osp_next(), osp_uuid2str(), osp_validate_token(), ospauth_exec(), ospfinished_exec(), osplookup_exec(), ospnext_exec(), oss_indicate(), oss_new(), oss_request(), page_exec(), park_call_exec(), park_call_full(), park_exec_full(), park_space_reserve(), parkandannounce_exec(), 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_options(), parse_register_contact(), parse_session_expires(), parse_srv(), parse_tag(), parse_tone_zone(), ParseBookmark(), parsing(), party_id_build_data(), party_id_write(), party_name_build_data(), party_name_write(), party_number_build_data(), party_number_write(), party_subaddress_build_data(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_hangup(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_saynumber(), pbx_builtin_serialize_variables(), pbx_builtin_setvar(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_exec(), pbx_extension_helper(), pbx_find_extension(), pbx_load_config(), pbx_load_module(), pbx_load_users(), pbx_parseable_goto(), pbx_substitute_variables_helper_full(), pcm_read(), pcm_seek(), pcm_write(), peek_read(), peer_iphash_cb(), peer_set_srcaddr(), peercnt_add(), pgsql_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(), pidf_validate_presence(), pidf_validate_tuple(), pitchshift_helper(), pktccops_add_ippool(), 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(), policy_set_suite(), pop_exec(), post_raw(), powerof(), pp_each_extension_helper(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), prepare_pri(), pri_active_dchan_index(), pri_check_restart(), pri_create_spanmap(), pri_create_trunkgroup(), pri_dchannel(), pri_fixup_principle(), pri_resolve_span(), pri_send_callrerouting_facility_exec(), pri_ss_thread(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_ast_dsp(), process_cn_rfc3389(), process_crypto(), process_dahdi(), process_dtmf_rfc2833(), process_echocancel(), process_message_callback(), process_opcode(), process_request(), process_returncode(), process_sdp(), process_sdp_a_audio(), process_sdp_c(), process_sdp_o(), process_text_line(), profile_set_param(), progress(), proxy_update(), pthread_timer_set_rate(), purge_old_messages(), pvalCheckType(), pvalGlobalsAddStatement(), pvalTopLevAddObject(), pw_cb(), ql_exec(), queue_exec(), queue_file(), queue_function_exists(), 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(), readexten_exec(), readfile_exec(), readmimefile(), 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_update2_handler(), realtime_update_handler(), realtimefield_read(), receive_digit(), receive_message(), receivefax_exec(), receivefax_t38_init(), record_exec(), redirecting_read(), redirecting_write(), refresh_list(), reg_source_db(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_config(), reload_firmware(), reload_followme(), reload_logger(), reload_module(), reload_queue_members(), reload_queue_rules(), reload_queues(), reload_single_member(), reload_single_queue(), remote_bridge_loop(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), replace(), replace_callno(), reply_digest(), require_curl(), require_odbc(), require_pgsql(), res_srtp_new(), resample_frame(), reset_conf(), resolve_first(), restart_monitor(), restart_pktc_thread(), 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(), rt_handle_member_record(), rtp_reload(), run_agi(), run_externnotify(), run_ras(), s_streamwait3(), safe_append(), save_conference(), save_to_folder(), say_date(), say_date_with_format(), say_datetime(), say_datetime_from_now(), say_init_mode(), say_number_full(), say_time(), saycharstr(), saycountedadj_exec(), saycountednoun_exec(), sayfile(), saynum(), scan_service(), scan_thread(), schedule(), scheduled_destroy(), sdl_setup(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_ews_request_and_parse(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_usb_txt(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendfax_exec(), sendfax_t38_init(), sendimage_exec(), sendkenwood(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), serial_remote_io(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_ctcss_mode_ic706(), set_destination(), set_fax_t38_caps(), set_format(), set_freq_ic706(), set_full_cmd(), set_ic706(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_mode_ic706(), set_moh_exec(), set_offset_ic706(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setdtr(), setflag(), setformat(), setrem(), setup_dahdi_int(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_srtp(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), shift_pop(), show_dialplan_helper(), showdisplay(), showkeys(), sig_pri_call(), sig_pri_chan_alarm_notify(), sig_pri_digit_begin(), sig_pri_get_orig_dialstring(), sig_pri_handle_hold(), sig_pri_handle_subcmds(), sig_pri_hangup(), sig_pri_indicate(), sig_pri_request(), sig_pri_start_pri(), sig_ss7_add_sigchan(), sig_ss7_answer(), sig_ss7_call(), sig_ss7_hangup(), sip_addheader(), sip_alloc(), sip_call(), sip_cc_monitor_suspend(), sip_cli_notify(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_park(), sip_park_thread(), sip_pidf_validate(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_read(), sip_reg_timeout(), sip_register(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_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_messagerx2(), sms_process(), sms_readfile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), soundcard_init(), soundcard_writeframe(), span_message(), spandsp_fax_new(), spandsp_fax_start(), spandsp_fax_write(), spandsp_log(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite_log(), srv_datastore_setup(), srv_query_read(), srv_result_read(), ss7_start_call(), ssl_lock(), ssl_verify(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_rtp(), start_session_timer(), start_spying(), start_stream(), startelm(), 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(), str_to_agent_policy(), str_to_monitor_policy(), stun_monitor_request(), stun_start_monitor(), stun_stop_monitor(), subscribe_event_destroy(), subscript(), substitute_escapes(), swap_subs(), switch_video_out(), sysinfo_helper(), syslog_log(), system_exec_helper(), t38_tx_packet_handler(), tdd_feed(), tdd_new(), tds_error_handler(), tds_load_module(), tds_log(), tds_message_handler(), telem_lookup(), testclient_exec(), testserver_exec(), timed_read(), timeout_read(), timeout_write(), timerfd_timer_ack(), timerfd_timer_close(), timerfd_timer_disable_continuous(), timerfd_timer_enable_continuous(), timerfd_timer_get_event(), timerfd_timer_open(), timerfd_timer_set_rate(), timezone_add(), to_number(), to_string(), tonepair_alloc(), tonepair_generator(), tps_processing_function(), tps_taskprocessor_destroy(), tps_taskprocessor_pop(), transfer_exec(), TransferCallStep1(), transmit(), transmit_audio(), transmit_cc_notify(), transmit_invite(), transmit_refer(), transmit_register(), transmit_request_with_auth(), transmit_response(), transmit_response_using_temp(), transmit_response_with_auth(), transmit_response_with_sdp(), transmit_response_with_t38_sdp(), transmit_state_notify(), transmit_t38(), try_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), turn_on_off(), tvfix(), txt_callback(), unalloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), unistim_request(), unistim_rtp_read(), unistim_senddigit_end(), unistim_sendtext(), unistim_ss(), unistim_write(), unistimsock_read(), unload_module(), unlock_read(), unref_mansession(), unregister_exten(), unshift_push(), update2_curl(), update2_ldap(), update2_odbc(), update2_pgsql(), update2_prepare(), update_call_counter(), update_common_options(), update_config(), update_curl(), update_header(), update_key(), update_ldap(), update_modem_bits(), update_odbc(), update_pgsql(), update_registry(), update_scoreboard(), update_stats(), upqm_exec(), uridecode(), uriencode(), usbradio_fixup(), usbradio_indicate(), usbradio_new(), usbradio_read(), usbradio_request(), usbradio_text(), usbradio_write(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_check_password_shell(), vm_exec(), vm_execmain(), vm_intro(), vm_newuser(), vm_options(), vmsayname_exec(), vox_read(), vox_write(), wait_file(), wait_file2(), wait_for_winner(), wait_interval(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_write(), write_byte(), write_cdr(), write_header(), write_history(), write_password_to_file(), write_stream(), writefile(), xmldoc_build_field(), xmldoc_get_syntax_fun(), xmldoc_string_cleanup(), xmldoc_string_wrap(), xpmr_config(), yyerror(), and yyparse().
01103 { 01104 struct logmsg *logmsg = NULL; 01105 struct ast_str *buf = NULL; 01106 struct ast_tm tm; 01107 struct timeval now = ast_tvnow(); 01108 int res = 0; 01109 va_list ap; 01110 char datestring[256]; 01111 01112 if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) 01113 return; 01114 01115 if (AST_RWLIST_EMPTY(&logchannels)) { 01116 /* 01117 * we don't have the logger chain configured yet, 01118 * so just log to stdout 01119 */ 01120 if (level != __LOG_VERBOSE) { 01121 int result; 01122 va_start(ap, fmt); 01123 result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */ 01124 va_end(ap); 01125 if (result != AST_DYNSTR_BUILD_FAILED) { 01126 term_filter_escapes(ast_str_buffer(buf)); 01127 fputs(ast_str_buffer(buf), stdout); 01128 } 01129 } 01130 return; 01131 } 01132 01133 /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug 01134 are non-zero; LOG_DEBUG messages can still be displayed if option_debug 01135 is zero, if option_verbose is non-zero (this allows for 'level zero' 01136 LOG_DEBUG messages to be displayed, if the logmask on any channel 01137 allows it) 01138 */ 01139 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) 01140 return; 01141 01142 /* Ignore anything that never gets logged anywhere */ 01143 if (level != __LOG_VERBOSE && !(global_logmask & (1 << level))) 01144 return; 01145 01146 /* Build string */ 01147 va_start(ap, fmt); 01148 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); 01149 va_end(ap); 01150 01151 /* If the build failed, then abort and free this structure */ 01152 if (res == AST_DYNSTR_BUILD_FAILED) 01153 return; 01154 01155 /* Create a new logging message */ 01156 if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128))) 01157 return; 01158 01159 /* Copy string over */ 01160 ast_string_field_set(logmsg, message, ast_str_buffer(buf)); 01161 01162 /* Set type */ 01163 if (level == __LOG_VERBOSE) { 01164 logmsg->type = LOGMSG_VERBOSE; 01165 } else { 01166 logmsg->type = LOGMSG_NORMAL; 01167 } 01168 01169 /* Create our date/time */ 01170 ast_localtime(&now, &tm, NULL); 01171 ast_strftime(datestring, sizeof(datestring), dateformat, &tm); 01172 ast_string_field_set(logmsg, date, datestring); 01173 01174 /* Copy over data */ 01175 logmsg->level = level; 01176 logmsg->line = line; 01177 ast_string_field_set(logmsg, level_name, levels[level]); 01178 ast_string_field_set(logmsg, file, file); 01179 ast_string_field_set(logmsg, function, function); 01180 logmsg->process_id = (long) GETTID(); 01181 01182 /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */ 01183 if (logthread != AST_PTHREADT_NULL) { 01184 AST_LIST_LOCK(&logmsgs); 01185 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01186 ast_cond_signal(&logcond); 01187 AST_LIST_UNLOCK(&logmsgs); 01188 } else { 01189 logger_print_normal(logmsg); 01190 ast_free(logmsg); 01191 } 01192 01193 return; 01194 }
static void ast_log_vsyslog | ( | struct logmsg * | msg | ) | [static] |
Definition at line 878 of file logger.c.
References ast_syslog_priority_from_loglevel(), logmsg::file, logmsg::function, logmsg::level, levels, logmsg::line, logmsg::message, logmsg::process_id, and term_strip().
Referenced by logger_print_normal().
00879 { 00880 char buf[BUFSIZ]; 00881 int syslog_level = ast_syslog_priority_from_loglevel(msg->level); 00882 00883 if (syslog_level < 0) { 00884 /* we are locked here, so cannot ast_log() */ 00885 fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level); 00886 return; 00887 } 00888 00889 snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s", 00890 levels[msg->level], msg->process_id, msg->file, msg->line, msg->function, msg->message); 00891 00892 term_strip(buf, buf, strlen(buf) + 1); 00893 syslog(syslog_level, "%s", buf); 00894 }
int ast_logger_register_level | ( | const char * | name | ) |
Register a new logger level.
name | The name of the level to be registered |
-1 | if an error occurs | |
non-zero | level to be used with ast_log for sending messages to this level |
Definition at line 1512 of file logger.c.
References ARRAY_LEN, ast_debug, ast_log(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strdup, available(), levels, LOG_WARNING, and update_logchannels().
Referenced by ast_cc_init(), and load_module().
01513 { 01514 unsigned int level; 01515 unsigned int available = 0; 01516 01517 AST_RWLIST_WRLOCK(&logchannels); 01518 01519 for (level = 0; level < ARRAY_LEN(levels); level++) { 01520 if ((level >= 16) && !available && !levels[level]) { 01521 available = level; 01522 continue; 01523 } 01524 01525 if (levels[level] && !strcasecmp(levels[level], name)) { 01526 ast_log(LOG_WARNING, 01527 "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n", 01528 name); 01529 AST_RWLIST_UNLOCK(&logchannels); 01530 01531 return -1; 01532 } 01533 } 01534 01535 if (!available) { 01536 ast_log(LOG_WARNING, 01537 "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n", 01538 name); 01539 AST_RWLIST_UNLOCK(&logchannels); 01540 01541 return -1; 01542 } 01543 01544 levels[available] = ast_strdup(name); 01545 01546 AST_RWLIST_UNLOCK(&logchannels); 01547 01548 ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available); 01549 01550 update_logchannels(); 01551 01552 return available; 01553 }
void ast_logger_unregister_level | ( | const char * | name | ) |
Unregister a previously registered logger level.
name | The name of the level to be unregistered |
Definition at line 1555 of file logger.c.
References ARRAY_LEN, ast_debug, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, free, levels, and update_logchannels().
Referenced by load_module(), and unload_module().
01556 { 01557 unsigned int found = 0; 01558 unsigned int x; 01559 01560 AST_RWLIST_WRLOCK(&logchannels); 01561 01562 for (x = 16; x < ARRAY_LEN(levels); x++) { 01563 if (!levels[x]) { 01564 continue; 01565 } 01566 01567 if (strcasecmp(levels[x], name)) { 01568 continue; 01569 } 01570 01571 found = 1; 01572 break; 01573 } 01574 01575 if (found) { 01576 /* take this level out of the global_logmask, to ensure that no new log messages 01577 * will be queued for it 01578 */ 01579 01580 global_logmask &= ~(1 << x); 01581 01582 free(levels[x]); 01583 levels[x] = NULL; 01584 AST_RWLIST_UNLOCK(&logchannels); 01585 01586 ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x); 01587 01588 update_logchannels(); 01589 } else { 01590 AST_RWLIST_UNLOCK(&logchannels); 01591 } 01592 }
void ast_queue_log | ( | const char * | queuename, | |
const char * | callid, | |||
const char * | agent, | |||
const char * | event, | |||
const char * | fmt, | |||
... | ||||
) |
Definition at line 463 of file logger.c.
References args, AST_APP_ARG, ast_check_realtime(), AST_DECLARE_APP_ARGS, ast_localtime(), AST_NONSTANDARD_APP_ARGS, ast_realtime_require_field(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_store_realtime(), ast_strftime(), ast_tvnow(), logfiles, logger_queue_init(), qlog, RQ_CHAR, S_OR, and SENTINEL.
Referenced by aqm_exec(), handle_queue_add_member(), handle_queue_remove_member(), logger_queue_init(), 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(), update_realtime_members(), and wait_our_turn().
00464 { 00465 va_list ap; 00466 struct timeval tv; 00467 struct ast_tm tm; 00468 char qlog_msg[8192]; 00469 int qlog_len; 00470 char time_str[30]; 00471 00472 if (!queuelog_init) { 00473 queuelog_init = 1; 00474 logger_queue_init(); 00475 } 00476 00477 if (ast_check_realtime("queue_log")) { 00478 tv = ast_tvnow(); 00479 ast_localtime(&tv, &tm, NULL); 00480 ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm); 00481 va_start(ap, fmt); 00482 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap); 00483 va_end(ap); 00484 if (logfiles.queue_adaptive_realtime) { 00485 AST_DECLARE_APP_ARGS(args, 00486 AST_APP_ARG(data)[5]; 00487 ); 00488 AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|'); 00489 /* Ensure fields are large enough to receive data */ 00490 ast_realtime_require_field("queue_log", "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")), 00491 "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")), 00492 "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")), 00493 "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")), 00494 "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")), 00495 SENTINEL); 00496 00497 /* Store the log */ 00498 ast_store_realtime("queue_log", "time", time_str, 00499 "callid", callid, 00500 "queuename", queuename, 00501 "agent", agent, 00502 "event", event, 00503 "data1", S_OR(args.data[0], ""), 00504 "data2", S_OR(args.data[1], ""), 00505 "data3", S_OR(args.data[2], ""), 00506 "data4", S_OR(args.data[3], ""), 00507 "data5", S_OR(args.data[4], ""), 00508 SENTINEL); 00509 } else { 00510 ast_store_realtime("queue_log", "time", time_str, 00511 "callid", callid, 00512 "queuename", queuename, 00513 "agent", agent, 00514 "event", event, 00515 "data", qlog_msg, 00516 SENTINEL); 00517 } 00518 00519 if (!logfiles.queue_log_to_file) { 00520 return; 00521 } 00522 } 00523 00524 if (qlog) { 00525 va_start(ap, fmt); 00526 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); 00527 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap); 00528 va_end(ap); 00529 AST_RWLIST_RDLOCK(&logchannels); 00530 if (qlog) { 00531 fprintf(qlog, "%s\n", qlog_msg); 00532 fflush(qlog); 00533 } 00534 AST_RWLIST_UNLOCK(&logchannels); 00535 } 00536 }
int ast_register_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1462 of file logger.c.
References ast_malloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and verb::list.
Referenced by ast_makesocket(), and main().
01463 { 01464 struct verb *verb; 01465 01466 if (!(verb = ast_malloc(sizeof(*verb)))) 01467 return -1; 01468 01469 verb->verboser = v; 01470 01471 AST_RWLIST_WRLOCK(&verbosers); 01472 AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); 01473 AST_RWLIST_UNLOCK(&verbosers); 01474 01475 return 0; 01476 }
int ast_unregister_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1478 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, verb::list, and verb::verboser.
01479 { 01480 struct verb *cur; 01481 01482 AST_RWLIST_WRLOCK(&verbosers); 01483 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { 01484 if (cur->verboser == v) { 01485 AST_RWLIST_REMOVE_CURRENT(list); 01486 ast_free(cur); 01487 break; 01488 } 01489 } 01490 AST_RWLIST_TRAVERSE_SAFE_END; 01491 AST_RWLIST_UNLOCK(&verbosers); 01492 01493 return cur ? 0 : -1; 01494 }
void ast_verbose | ( | const char * | fmt, | |
... | ||||
) |
Definition at line 1453 of file logger.c.
References __ast_verbose_ap().
01454 { 01455 va_list ap; 01456 01457 va_start(ap, fmt); 01458 __ast_verbose_ap("", 0, "", fmt, ap); 01459 va_end(ap); 01460 }
void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1065 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::list, logcond, logthread, and qlog.
Referenced by quit_handler().
01066 { 01067 struct logchannel *f = NULL; 01068 01069 /* Stop logger thread */ 01070 AST_LIST_LOCK(&logmsgs); 01071 close_logger_thread = 1; 01072 ast_cond_signal(&logcond); 01073 AST_LIST_UNLOCK(&logmsgs); 01074 01075 if (logthread != AST_PTHREADT_NULL) 01076 pthread_join(logthread, NULL); 01077 01078 AST_RWLIST_WRLOCK(&logchannels); 01079 01080 if (qlog) { 01081 fclose(qlog); 01082 qlog = NULL; 01083 } 01084 01085 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 01086 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01087 fclose(f->fileptr); 01088 f->fileptr = NULL; 01089 } 01090 } 01091 01092 closelog(); /* syslog */ 01093 01094 AST_RWLIST_UNLOCK(&logchannels); 01095 01096 return; 01097 }
static char* handle_logger_reload | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 734 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.
00735 { 00736 switch (cmd) { 00737 case CLI_INIT: 00738 e->command = "logger reload"; 00739 e->usage = 00740 "Usage: logger reload\n" 00741 " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n"; 00742 return NULL; 00743 case CLI_GENERATE: 00744 return NULL; 00745 } 00746 if (reload_logger(0)) { 00747 ast_cli(a->fd, "Failed to reload the logger\n"); 00748 return CLI_FAILURE; 00749 } 00750 return CLI_SUCCESS; 00751 }
static char* handle_logger_rotate | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 753 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.
00754 { 00755 switch (cmd) { 00756 case CLI_INIT: 00757 e->command = "logger rotate"; 00758 e->usage = 00759 "Usage: logger rotate\n" 00760 " Rotates and Reopens the log files.\n"; 00761 return NULL; 00762 case CLI_GENERATE: 00763 return NULL; 00764 } 00765 if (reload_logger(1)) { 00766 ast_cli(a->fd, "Failed to reload the logger and rotate log files\n"); 00767 return CLI_FAILURE; 00768 } 00769 return CLI_SUCCESS; 00770 }
static char* handle_logger_set_level | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 772 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.
00773 { 00774 int x; 00775 int state; 00776 int level = -1; 00777 00778 switch (cmd) { 00779 case CLI_INIT: 00780 e->command = "logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}"; 00781 e->usage = 00782 "Usage: logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n" 00783 " Set a specific log level to enabled/disabled for this console.\n"; 00784 return NULL; 00785 case CLI_GENERATE: 00786 return NULL; 00787 } 00788 00789 if (a->argc < 5) 00790 return CLI_SHOWUSAGE; 00791 00792 AST_RWLIST_WRLOCK(&logchannels); 00793 00794 for (x = 0; x < ARRAY_LEN(levels); x++) { 00795 if (levels[x] && !strcasecmp(a->argv[3], levels[x])) { 00796 level = x; 00797 break; 00798 } 00799 } 00800 00801 AST_RWLIST_UNLOCK(&logchannels); 00802 00803 state = ast_true(a->argv[4]) ? 1 : 0; 00804 00805 if (level != -1) { 00806 ast_console_toggle_loglevel(a->fd, level, state); 00807 ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off"); 00808 } else 00809 return CLI_SHOWUSAGE; 00810 00811 return CLI_SUCCESS; 00812 }
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 815 of file logger.c.
References ARRAY_LEN, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, logchannel::disabled, ast_cli_args::fd, logchannel::filename, FORMATL, levels, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, logchannel::type, and ast_cli_entry::usage.
00816 { 00817 #define FORMATL "%-35.35s %-8.8s %-9.9s " 00818 struct logchannel *chan; 00819 switch (cmd) { 00820 case CLI_INIT: 00821 e->command = "logger show channels"; 00822 e->usage = 00823 "Usage: logger show channels\n" 00824 " List configured logger channels.\n"; 00825 return NULL; 00826 case CLI_GENERATE: 00827 return NULL; 00828 } 00829 ast_cli(a->fd, FORMATL, "Channel", "Type", "Status"); 00830 ast_cli(a->fd, "Configuration\n"); 00831 ast_cli(a->fd, FORMATL, "-------", "----", "------"); 00832 ast_cli(a->fd, "-------------\n"); 00833 AST_RWLIST_RDLOCK(&logchannels); 00834 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00835 unsigned int level; 00836 00837 ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), 00838 chan->disabled ? "Disabled" : "Enabled"); 00839 ast_cli(a->fd, " - "); 00840 for (level = 0; level < ARRAY_LEN(levels); level++) { 00841 if ((chan->logmask & (1 << level)) && levels[level]) { 00842 ast_cli(a->fd, "%s ", levels[level]); 00843 } 00844 } 00845 ast_cli(a->fd, "\n"); 00846 } 00847 AST_RWLIST_UNLOCK(&logchannels); 00848 ast_cli(a->fd, "\n"); 00849 00850 return CLI_SUCCESS; 00851 }
int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 1042 of file logger.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_cond_destroy, ast_cond_init, ast_config_AST_LOG_DIR, ast_mkdir(), ast_pthread_create, cli_logger, init_logger_chain(), logcond, logger_thread(), and logthread.
Referenced by main().
01043 { 01044 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01045 sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL); 01046 01047 /* start logger thread */ 01048 ast_cond_init(&logcond, NULL); 01049 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01050 ast_cond_destroy(&logcond); 01051 return -1; 01052 } 01053 01054 /* register the logger cli commands */ 01055 ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01056 01057 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01058 01059 /* create log channels */ 01060 init_logger_chain(0 /* locked */); 01061 01062 return 0; 01063 }
static void init_logger_chain | ( | int | locked | ) | [static] |
Definition at line 295 of file logger.c.
References __LOG_ERROR, __LOG_NOTICE, __LOG_WARNING, ast_calloc, 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(), config_flags, CONFIG_STATUS_FILEINVALID, errno, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ROTATE, SEQUENTIAL, TIMESTAMP, and var.
Referenced by init_logger(), and reload_logger().
00296 { 00297 struct logchannel *chan; 00298 struct ast_config *cfg; 00299 struct ast_variable *var; 00300 const char *s; 00301 struct ast_flags config_flags = { 0 }; 00302 00303 if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) { 00304 return; 00305 } 00306 00307 /* delete our list of log channels */ 00308 if (!locked) { 00309 AST_RWLIST_WRLOCK(&logchannels); 00310 } 00311 while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) { 00312 ast_free(chan); 00313 } 00314 global_logmask = 0; 00315 if (!locked) { 00316 AST_RWLIST_UNLOCK(&logchannels); 00317 } 00318 00319 errno = 0; 00320 /* close syslog */ 00321 closelog(); 00322 00323 /* If no config file, we're fine, set default options. */ 00324 if (!cfg) { 00325 if (errno) { 00326 fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno)); 00327 } else { 00328 fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n"); 00329 } 00330 if (!(chan = ast_calloc(1, sizeof(*chan)))) { 00331 return; 00332 } 00333 chan->type = LOGTYPE_CONSOLE; 00334 chan->logmask = __LOG_WARNING | __LOG_NOTICE | __LOG_ERROR; 00335 if (!locked) { 00336 AST_RWLIST_WRLOCK(&logchannels); 00337 } 00338 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00339 global_logmask |= chan->logmask; 00340 if (!locked) { 00341 AST_RWLIST_UNLOCK(&logchannels); 00342 } 00343 return; 00344 } 00345 00346 if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) { 00347 if (ast_true(s)) { 00348 if (gethostname(hostname, sizeof(hostname) - 1)) { 00349 ast_copy_string(hostname, "unknown", sizeof(hostname)); 00350 fprintf(stderr, "What box has no hostname???\n"); 00351 } 00352 } else 00353 hostname[0] = '\0'; 00354 } else 00355 hostname[0] = '\0'; 00356 if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) 00357 ast_copy_string(dateformat, s, sizeof(dateformat)); 00358 else 00359 ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat)); 00360 if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) { 00361 logfiles.queue_log = ast_true(s); 00362 } 00363 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) { 00364 logfiles.queue_log_to_file = ast_true(s); 00365 } 00366 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) { 00367 ast_copy_string(queue_log_name, s, sizeof(queue_log_name)); 00368 } 00369 if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) { 00370 ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate)); 00371 } 00372 if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) { 00373 if (strcasecmp(s, "timestamp") == 0) { 00374 rotatestrategy = TIMESTAMP; 00375 } else if (strcasecmp(s, "rotate") == 0) { 00376 rotatestrategy = ROTATE; 00377 } else if (strcasecmp(s, "sequential") == 0) { 00378 rotatestrategy = SEQUENTIAL; 00379 } else { 00380 fprintf(stderr, "Unknown rotatestrategy: %s\n", s); 00381 } 00382 } else { 00383 if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) { 00384 rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL; 00385 fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n"); 00386 } 00387 } 00388 00389 if (!locked) { 00390 AST_RWLIST_WRLOCK(&logchannels); 00391 } 00392 var = ast_variable_browse(cfg, "logfiles"); 00393 for (; var; var = var->next) { 00394 if (!(chan = make_logchannel(var->name, var->value, var->lineno))) { 00395 continue; 00396 } 00397 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00398 global_logmask |= chan->logmask; 00399 } 00400 if (qlog) { 00401 char tmp[4096]; 00402 fclose(qlog); 00403 snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00404 qlog = fopen(tmp, "a"); 00405 } 00406 00407 if (!locked) { 00408 AST_RWLIST_UNLOCK(&logchannels); 00409 } 00410 00411 ast_config_destroy(cfg); 00412 }
static void logger_print_normal | ( | struct logmsg * | logmsg | ) | [static] |
Print a normal log message to the channels.
Definition at line 897 of file logger.c.
References __LOG_VERBOSE, ast_console_puts_mutable(), ast_log_vsyslog(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdupa, ast_string_field_set, ast_strlen_zero(), ast_verb, COLOR_BRWHITE, colors, logmsg::date, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, logmsg::file, logchannel::filename, logchannel::fileptr, logmsg::function, logmsg::level, logmsg::level_name, logmsg::line, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::message, logmsg::process_id, reload_logger(), term_color(), term_strip(), logchannel::type, and verb::verboser.
Referenced by ast_log(), and logger_thread().
00898 { 00899 struct logchannel *chan = NULL; 00900 char buf[BUFSIZ]; 00901 struct verb *v = NULL; 00902 00903 if (logmsg->level == __LOG_VERBOSE) { 00904 char *tmpmsg = ast_strdupa(logmsg->message + 1); 00905 /* Iterate through the list of verbosers and pass them the log message string */ 00906 AST_RWLIST_RDLOCK(&verbosers); 00907 AST_RWLIST_TRAVERSE(&verbosers, v, list) 00908 v->verboser(logmsg->message); 00909 AST_RWLIST_UNLOCK(&verbosers); 00910 ast_string_field_set(logmsg, message, tmpmsg); 00911 } 00912 00913 AST_RWLIST_RDLOCK(&logchannels); 00914 00915 if (!AST_RWLIST_EMPTY(&logchannels)) { 00916 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00917 /* If the channel is disabled, then move on to the next one */ 00918 if (chan->disabled) 00919 continue; 00920 /* Check syslog channels */ 00921 if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) { 00922 ast_log_vsyslog(logmsg); 00923 /* Console channels */ 00924 } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) { 00925 char linestr[128]; 00926 char tmp1[80], tmp2[80], tmp3[80], tmp4[80]; 00927 00928 /* If the level is verbose, then skip it */ 00929 if (logmsg->level == __LOG_VERBOSE) 00930 continue; 00931 00932 /* Turn the numerical line number into a string */ 00933 snprintf(linestr, sizeof(linestr), "%d", logmsg->line); 00934 /* Build string to print out */ 00935 snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s", 00936 logmsg->date, 00937 term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)), 00938 logmsg->process_id, 00939 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)), 00940 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), 00941 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)), 00942 logmsg->message); 00943 /* Print out */ 00944 ast_console_puts_mutable(buf, logmsg->level); 00945 /* File channels */ 00946 } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) { 00947 int res = 0; 00948 00949 /* If no file pointer exists, skip it */ 00950 if (!chan->fileptr) { 00951 continue; 00952 } 00953 00954 /* Print out to the file */ 00955 res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s", 00956 logmsg->date, logmsg->level_name, logmsg->process_id, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ)); 00957 if (res <= 0 && !ast_strlen_zero(logmsg->message)) { 00958 fprintf(stderr, "**** Asterisk Logging Error: ***********\n"); 00959 if (errno == ENOMEM || errno == ENOSPC) 00960 fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename); 00961 else 00962 fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno)); 00963 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno)); 00964 chan->disabled = 1; 00965 } else if (res > 0) { 00966 fflush(chan->fileptr); 00967 } 00968 } 00969 } 00970 } else if (logmsg->level != __LOG_VERBOSE) { 00971 fputs(logmsg->message, stdout); 00972 } 00973 00974 AST_RWLIST_UNLOCK(&logchannels); 00975 00976 /* If we need to reload because of the file size, then do so */ 00977 if (filesize_reload_needed) { 00978 reload_logger(-1); 00979 ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 00980 } 00981 00982 return; 00983 }
static void logger_queue_init | ( | void | ) | [static] |
Definition at line 1024 of file logger.c.
References ast_check_realtime(), ast_queue_log(), ast_realtime_require_field(), ast_unload_realtime(), logfiles, RQ_CHAR, RQ_DATETIME, and SENTINEL.
Referenced by ast_queue_log().
01025 { 01026 /* Preloaded modules are up. */ 01027 ast_unload_realtime("queue_log"); 01028 if (logfiles.queue_log && ast_check_realtime("queue_log")) { 01029 if (!ast_realtime_require_field("queue_log", 01030 "time", RQ_DATETIME, 26, "data1", RQ_CHAR, 20, 01031 "data2", RQ_CHAR, 20, "data3", RQ_CHAR, 20, 01032 "data4", RQ_CHAR, 20, "data5", RQ_CHAR, 20, SENTINEL)) { 01033 logfiles.queue_adaptive_realtime = 1; 01034 } else { 01035 logfiles.queue_adaptive_realtime = 0; 01036 } 01037 } 01038 01039 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); 01040 }
int logger_reload | ( | void | ) |
Reload logger without rotating log files.
Definition at line 726 of file logger.c.
References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.
00727 { 00728 if (reload_logger(0)) { 00729 return RESULT_FAILURE; 00730 } 00731 return RESULT_SUCCESS; 00732 }
static void* logger_thread | ( | void * | data | ) | [static] |
Actual logging thread.
Definition at line 986 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(), and logchannel::next.
Referenced by init_logger().
00987 { 00988 struct logmsg *next = NULL, *msg = NULL; 00989 00990 for (;;) { 00991 /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */ 00992 AST_LIST_LOCK(&logmsgs); 00993 if (AST_LIST_EMPTY(&logmsgs)) { 00994 if (close_logger_thread) { 00995 break; 00996 } else { 00997 ast_cond_wait(&logcond, &logmsgs.lock); 00998 } 00999 } 01000 next = AST_LIST_FIRST(&logmsgs); 01001 AST_LIST_HEAD_INIT_NOLOCK(&logmsgs); 01002 AST_LIST_UNLOCK(&logmsgs); 01003 01004 /* Otherwise go through and process each message in the order added */ 01005 while ((msg = next)) { 01006 /* Get the next entry now so that we can free our current structure later */ 01007 next = AST_LIST_NEXT(msg, list); 01008 01009 /* Depending on the type, send it to the proper function */ 01010 logger_print_normal(msg); 01011 01012 /* Free the data since we are done */ 01013 ast_free(msg); 01014 } 01015 01016 /* If we should stop, then stop */ 01017 if (close_logger_thread) 01018 break; 01019 } 01020 01021 return NULL; 01022 }
static unsigned int make_components | ( | const char * | s, | |
int | lineno | |||
) | [static] |
Definition at line 218 of file logger.c.
References ARRAY_LEN, ast_skip_blanks(), ast_strdupa, levels, and strsep().
Referenced by make_logchannel(), and update_logchannels().
00219 { 00220 char *w; 00221 unsigned int res = 0; 00222 char *stringp = ast_strdupa(s); 00223 unsigned int x; 00224 00225 while ((w = strsep(&stringp, ","))) { 00226 w = ast_skip_blanks(w); 00227 00228 if (!strcmp(w, "*")) { 00229 res = 0xFFFFFFFF; 00230 break; 00231 } else for (x = 0; x < ARRAY_LEN(levels); x++) { 00232 if (levels[x] && !strcasecmp(w, levels[x])) { 00233 res |= (1 << x); 00234 break; 00235 } 00236 } 00237 } 00238 00239 return res; 00240 }
static struct logchannel* make_logchannel | ( | const char * | channel, | |
const char * | components, | |||
int | lineno | |||
) | [static] |
Definition at line 242 of file logger.c.
References ast_calloc, ast_config_AST_LOG_DIR, ast_copy_string(), ast_free, ast_strlen_zero(), ast_syslog_facility(), errno, logchannel::facility, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, and make_components().
Referenced by init_logger_chain().
00243 { 00244 struct logchannel *chan; 00245 char *facility; 00246 00247 if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1))) 00248 return NULL; 00249 00250 strcpy(chan->components, components); 00251 chan->lineno = lineno; 00252 00253 if (!strcasecmp(channel, "console")) { 00254 chan->type = LOGTYPE_CONSOLE; 00255 } else if (!strncasecmp(channel, "syslog", 6)) { 00256 /* 00257 * syntax is: 00258 * syslog.facility => level,level,level 00259 */ 00260 facility = strchr(channel, '.'); 00261 if (!facility++ || !facility) { 00262 facility = "local0"; 00263 } 00264 00265 chan->facility = ast_syslog_facility(facility); 00266 00267 if (chan->facility < 0) { 00268 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n"); 00269 ast_free(chan); 00270 return NULL; 00271 } 00272 00273 chan->type = LOGTYPE_SYSLOG; 00274 ast_copy_string(chan->filename, channel, sizeof(chan->filename)); 00275 openlog("asterisk", LOG_PID, chan->facility); 00276 } else { 00277 if (!ast_strlen_zero(hostname)) { 00278 snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s", 00279 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname); 00280 } else { 00281 snprintf(chan->filename, sizeof(chan->filename), "%s/%s", 00282 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel); 00283 } 00284 if (!(chan->fileptr = fopen(chan->filename, "a"))) { 00285 /* Can't log here, since we're called with a lock */ 00286 fprintf(stderr, "Logger Warning: Unable to open log file '%s': %s\n", chan->filename, strerror(errno)); 00287 } 00288 chan->type = LOGTYPE_FILE; 00289 } 00290 chan->logmask = make_components(chan->components, lineno); 00291 00292 return chan; 00293 }
static int reload_logger | ( | int | rotate | ) | [static] |
Definition at line 628 of file logger.c.
References ast_check_realtime(), ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_queue_log(), ast_realtime_require_field(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_unload_realtime(), ast_verb, errno, EVENT_FLAG_SYSTEM, f, init_logger_chain(), logchannel::list, LOG_ERROR, logfiles, manager_event, qlog, rotate_file(), RQ_CHAR, RQ_DATETIME, and SENTINEL.
Referenced by handle_logger_reload(), handle_logger_rotate(), logger_print_normal(), and logger_reload().
00629 { 00630 char old[PATH_MAX] = ""; 00631 int queue_rotate = rotate; 00632 struct logchannel *f; 00633 int res = 0; 00634 00635 AST_RWLIST_WRLOCK(&logchannels); 00636 00637 if (qlog) { 00638 if (rotate < 0) { 00639 /* Check filesize - this one typically doesn't need an auto-rotate */ 00640 if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */ 00641 fclose(qlog); 00642 qlog = NULL; 00643 } else { 00644 queue_rotate = 0; 00645 } 00646 } else { 00647 fclose(qlog); 00648 qlog = NULL; 00649 } 00650 } else { 00651 queue_rotate = 0; 00652 } 00653 00654 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 00655 00656 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 00657 if (f->disabled) { 00658 f->disabled = 0; /* Re-enable logging at reload */ 00659 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename); 00660 } 00661 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00662 int rotate_this = 0; 00663 if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */ 00664 /* Be more proactive about rotating massive log files */ 00665 rotate_this = 1; 00666 } 00667 fclose(f->fileptr); /* Close file */ 00668 f->fileptr = NULL; 00669 if (rotate || rotate_this) { 00670 rotate_file(f->filename); 00671 } 00672 } 00673 } 00674 00675 filesize_reload_needed = 0; 00676 00677 init_logger_chain(1 /* locked */); 00678 00679 if (logfiles.queue_log) { 00680 do { 00681 ast_unload_realtime("queue_log"); 00682 if (ast_check_realtime("queue_log")) { 00683 if (!ast_realtime_require_field("queue_log", 00684 "time", RQ_DATETIME, 26, "data1", RQ_CHAR, 20, 00685 "data2", RQ_CHAR, 20, "data3", RQ_CHAR, 20, 00686 "data4", RQ_CHAR, 20, "data5", RQ_CHAR, 20, SENTINEL)) { 00687 logfiles.queue_adaptive_realtime = 1; 00688 } else { 00689 logfiles.queue_adaptive_realtime = 0; 00690 } 00691 00692 if (!logfiles.queue_log_to_file) { 00693 /* Skip the following section */ 00694 break; 00695 } 00696 } 00697 if (qlog) { 00698 fclose(qlog); 00699 qlog = NULL; 00700 } 00701 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00702 if (queue_rotate) { 00703 rotate_file(old); 00704 } 00705 00706 qlog = fopen(old, "a"); 00707 if (qlog) { 00708 AST_RWLIST_UNLOCK(&logchannels); 00709 ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); 00710 AST_RWLIST_WRLOCK(&logchannels); 00711 ast_verb(1, "Asterisk Queue Logger restarted\n"); 00712 } else { 00713 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 00714 res = -1; 00715 } 00716 } while (0); 00717 } 00718 00719 AST_RWLIST_UNLOCK(&logchannels); 00720 00721 return res; 00722 }
static int rotate_file | ( | const char * | filename | ) | [static] |
Definition at line 538 of file logger.c.
References ARRAY_LEN, ast_channel_release(), ast_dummy_channel_alloc(), ast_log(), ast_safe_system(), ast_strlen_zero(), LOG_WARNING, pbx_builtin_setvar_helper(), pbx_substitute_variables_helper(), ROTATE, SEQUENTIAL, and TIMESTAMP.
Referenced by reload_logger().
00539 { 00540 char old[PATH_MAX]; 00541 char new[PATH_MAX]; 00542 int x, y, which, found, res = 0, fd; 00543 char *suffixes[4] = { "", ".gz", ".bz2", ".Z" }; 00544 00545 switch (rotatestrategy) { 00546 case SEQUENTIAL: 00547 for (x = 0; ; x++) { 00548 snprintf(new, sizeof(new), "%s.%d", filename, x); 00549 fd = open(new, O_RDONLY); 00550 if (fd > -1) 00551 close(fd); 00552 else 00553 break; 00554 } 00555 if (rename(filename, new)) { 00556 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00557 res = -1; 00558 } else { 00559 filename = new; 00560 } 00561 break; 00562 case TIMESTAMP: 00563 snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL)); 00564 if (rename(filename, new)) { 00565 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00566 res = -1; 00567 } else { 00568 filename = new; 00569 } 00570 break; 00571 case ROTATE: 00572 /* Find the next empty slot, including a possible suffix */ 00573 for (x = 0; ; x++) { 00574 found = 0; 00575 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00576 snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]); 00577 fd = open(new, O_RDONLY); 00578 if (fd > -1) { 00579 close(fd); 00580 found = 1; 00581 break; 00582 } 00583 } 00584 if (!found) { 00585 break; 00586 } 00587 } 00588 00589 /* Found an empty slot */ 00590 for (y = x; y > 0; y--) { 00591 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00592 snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]); 00593 fd = open(old, O_RDONLY); 00594 if (fd > -1) { 00595 /* Found the right suffix */ 00596 close(fd); 00597 snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]); 00598 if (rename(old, new)) { 00599 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00600 res = -1; 00601 } 00602 break; 00603 } 00604 } 00605 } 00606 00607 /* Finally, rename the current file */ 00608 snprintf(new, sizeof(new), "%s.0", filename); 00609 if (rename(filename, new)) { 00610 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00611 res = -1; 00612 } 00613 } 00614 00615 if (!ast_strlen_zero(exec_after_rotate)) { 00616 struct ast_channel *c = ast_dummy_channel_alloc(); 00617 char buf[512]; 00618 pbx_builtin_setvar_helper(c, "filename", filename); 00619 pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf)); 00620 if (ast_safe_system(buf) == -1) { 00621 ast_log(LOG_WARNING, "error executing '%s'\n", buf); 00622 } 00623 c = ast_channel_release(c); 00624 } 00625 return res; 00626 }
static void update_logchannels | ( | void | ) | [static] |
Definition at line 1496 of file logger.c.
References AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::components, logchannel::lineno, logchannel::list, logchannel::logmask, and make_components().
Referenced by ast_logger_register_level(), and ast_logger_unregister_level().
01497 { 01498 struct logchannel *cur; 01499 01500 AST_RWLIST_WRLOCK(&logchannels); 01501 01502 global_logmask = 0; 01503 01504 AST_RWLIST_TRAVERSE(&logchannels, cur, list) { 01505 cur->logmask = make_components(cur->components, cur->lineno); 01506 global_logmask |= cur->logmask; 01507 } 01508 01509 AST_RWLIST_UNLOCK(&logchannels); 01510 }
struct ast_cli_entry cli_logger[] [static] |
int close_logger_thread = 0 [static] |
const int colors[32] [static] |
Colors used in the console for logging.
Definition at line 175 of file logger.c.
Referenced by logger_print_normal().
char dateformat[256] = "%b %e %T" [static] |
char exec_after_rotate[256] = "" [static] |
int filesize_reload_needed [static] |
unsigned int global_logmask = 0xFFFF [static] |
struct sigaction handle_SIGXFSZ [static] |
Initial value:
{ .sa_handler = _handle_SIGXFSZ, .sa_flags = SA_RESTART, }
char hostname[MAXHOSTNAMELEN] [static] |
Definition at line 95 of file logger.c.
Referenced by app_exec(), ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), netconsole(), set_destination(), sip_subscribe_mwi(), and tds_load_module().
char* levels[32] [static] |
Logging channels used in the Asterisk logging system.
The first 16 levels are reserved for system usage, and the remaining levels are reserved for usage by dynamic levels registered via ast_logger_register_level.
Definition at line 164 of file logger.c.
Referenced by ast_console_toggle_loglevel(), ast_log(), ast_log_vsyslog(), ast_logger_register_level(), ast_logger_unregister_level(), ast_network_puts_mutable(), handle_logger_set_level(), handle_logger_show_channels(), and make_components().
struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , } [static] |
ast_cond_t logcond [static] |
Definition at line 148 of file logger.c.
Referenced by ast_log(), close_logger(), init_logger(), and logger_thread().
struct { ... } logfiles [static] |
Referenced by ast_queue_log(), init_logger_chain(), logger_queue_init(), and reload_logger().
pthread_t logthread = AST_PTHREADT_NULL [static] |
Definition at line 147 of file logger.c.
Referenced by ast_log(), close_logger(), and init_logger().
FILE* qlog [static] |
Definition at line 151 of file logger.c.
Referenced by ast_queue_log(), close_logger(), and reload_logger().
unsigned int queue_adaptive_realtime |
char queue_log_name[256] = QUEUELOG [static] |
unsigned int queue_log_to_file |
int queuelog_init [static] |
struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } [static] |