Mon Mar 19 11:30:49 2012

Asterisk developer's documentation


logger.c File Reference

Asterisk Logger. More...

#include "asterisk.h"
#include <syslog.h>
#include "asterisk/_private.h"
#include "asterisk/paths.h"
#include "asterisk/logger.h"
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/config.h"
#include "asterisk/term.h"
#include "asterisk/cli.h"
#include "asterisk/utils.h"
#include "asterisk/manager.h"
#include "asterisk/threadstorage.h"
#include "asterisk/strings.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include <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_btast_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)
static int logger_queue_restart (int queue_rotate)
static int logger_queue_rt_start (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 logchannelmake_logchannel (const char *channel, const char *components, int lineno)
static int reload_logger (int rotate)
static int rotate_file (const char *filename)
static void update_logchannels (void)

Variables

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


Detailed Description

Asterisk Logger.

Logging routines

Author:
Mark Spencer <markster@digium.com>

Definition in file logger.c.


Define Documentation

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

Referenced by handle_logger_show_channels().

 
#define GETTID (  )     getpid()

Definition at line 72 of file logger.c.

Referenced by ast_log().

#define LOG_BUF_INIT_SIZE   256

Definition at line 215 of file logger.c.

Referenced by ast_log().

#define MAX_BACKTRACE_FRAMES   20

Definition at line 58 of file logger.c.

#define VERBOSE_BUF_INIT_SIZE   256

Definition at line 212 of file logger.c.

Referenced by __ast_verbose_ap().


Enumeration Type Documentation

enum logmsgtypes

Enumerator:
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 127 of file logger.c.

00127                  {
00128    LOGMSG_NORMAL = 0,
00129    LOGMSG_VERBOSE,
00130 };

enum logtypes

Enumerator:
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 98 of file logger.c.

00098               {
00099    LOGTYPE_SYSLOG,
00100    LOGTYPE_FILE,
00101    LOGTYPE_CONSOLE,
00102 };

enum rotatestrategy

Enumerator:
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 84 of file logger.c.

00084                            {
00085    SEQUENTIAL = 1 << 0,     /* Original method - create a new file, in order */
00086    ROTATE = 1 << 1,         /* Rotate all files, such that the oldest file has the highest suffix */
00087    TIMESTAMP = 1 << 2,      /* Append the epoch timestamp onto the end of the archived file */
00088 } rotatestrategy = SEQUENTIAL;


Function Documentation

void __ast_verbose ( const char *  file,
int  line,
const char *  func,
const char *  fmt,
  ... 
)

This works like ast_log, but prints verbose messages to the console depending on verbosity level set. ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing"); This will print the message to the console if the verbose level is set to a level >= 3 Note the abscence of a comma after the VERBOSE_PREFIX_3. This is important. VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined.

Send a verbose message (based on verbose level)

Definition at line 1526 of file logger.c.

References __ast_verbose_ap().

01527 {
01528    va_list ap;
01529 
01530    va_start(ap, fmt);
01531    __ast_verbose_ap(file, line, func, fmt, ap);
01532    va_end(ap);
01533 }

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

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

01491 {
01492    struct ast_str *buf = NULL;
01493    int res = 0;
01494 
01495    if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE)))
01496       return;
01497 
01498    if (ast_opt_timestamp) {
01499       struct timeval now;
01500       struct ast_tm tm;
01501       char date[40];
01502       char *datefmt;
01503 
01504       now = ast_tvnow();
01505       ast_localtime(&now, &tm, NULL);
01506       ast_strftime(date, sizeof(date), dateformat, &tm);
01507       datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1);
01508       sprintf(datefmt, "%c[%s] %s", 127, date, fmt);
01509       fmt = datefmt;
01510    } else {
01511       char *tmp = alloca(strlen(fmt) + 2);
01512       sprintf(tmp, "%c%s", 127, fmt);
01513       fmt = tmp;
01514    }
01515 
01516    /* Build string */
01517    res = ast_str_set_va(&buf, 0, fmt, ap);
01518 
01519    /* If the build failed then we can drop this allocated message */
01520    if (res == AST_DYNSTR_BUILD_FAILED)
01521       return;
01522 
01523    ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf));
01524 }

static void __init_log_buf ( void   )  [static]

Definition at line 214 of file logger.c.

00220 {

static void __init_verbose_buf ( void   )  [static]

Definition at line 211 of file logger.c.

00220 {

static void _handle_SIGXFSZ ( int  sig  )  [static]

Definition at line 937 of file logger.c.

00938 {
00939    /* Indicate need to reload */
00940    filesize_reload_needed = 1;
00941 }

void ast_backtrace ( void   ) 

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

01461 {
01462 #ifdef HAVE_BKTR
01463    struct ast_bt *bt;
01464    int i = 0;
01465    char **strings;
01466 
01467    if (!(bt = ast_bt_create())) {
01468       ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
01469       return;
01470    }
01471 
01472    if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
01473       ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' ');
01474       for (i = 3; i < bt->num_frames - 2; i++) {
01475          ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]);
01476       }
01477 
01478       /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */
01479 #undef free
01480       free(strings);
01481    } else {
01482       ast_debug(1, "Could not allocate memory for backtrace\n");
01483    }
01484    ast_bt_destroy(bt);
01485 #else
01486    ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
01487 #endif /* defined(HAVE_BKTR) */
01488 }

struct ast_bt* ast_bt_create ( void   ) 

Definition at line 1283 of file logger.c.

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

Referenced by ast_backtrace().

01284 {
01285    struct ast_bt *bt = ast_calloc(1, sizeof(*bt));
01286    if (!bt) {
01287       ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n");
01288       return NULL;
01289    }
01290 
01291    bt->alloced = 1;
01292 
01293    ast_bt_get_addresses(bt);
01294 
01295    return bt;
01296 }

void* ast_bt_destroy ( struct ast_bt bt  ) 

Definition at line 1305 of file logger.c.

References ast_bt::alloced, and ast_free.

Referenced by ast_backtrace().

01306 {
01307    if (bt->alloced) {
01308       ast_free(bt);
01309    }
01310 
01311    return NULL;
01312 }

int ast_bt_get_addresses ( struct ast_bt bt  ) 

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

01299 {
01300    bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES);
01301 
01302    return 0;
01303 }

char** ast_bt_get_symbols ( void **  addresses,
size_t  num_frames 
)

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

01315 {
01316    char **strings = NULL;
01317 #if defined(BETTER_BACKTRACES)
01318    int stackfr;
01319    bfd *bfdobj;           /* bfd.h */
01320    Dl_info dli;           /* dlfcn.h */
01321    long allocsize;
01322    asymbol **syms = NULL; /* bfd.h */
01323    bfd_vma offset;        /* bfd.h */
01324    const char *lastslash;
01325    asection *section;
01326    const char *file, *func;
01327    unsigned int line;
01328    char address_str[128];
01329    char msg[1024];
01330    size_t strings_size;
01331    size_t *eachlen;
01332 #endif
01333 
01334 #if defined(BETTER_BACKTRACES)
01335    strings_size = num_frames * sizeof(*strings);
01336    eachlen = ast_calloc(num_frames, sizeof(*eachlen));
01337 
01338    if (!(strings = ast_calloc(num_frames, sizeof(*strings)))) {
01339       return NULL;
01340    }
01341 
01342    for (stackfr = 0; stackfr < num_frames; stackfr++) {
01343       int found = 0, symbolcount;
01344 
01345       msg[0] = '\0';
01346 
01347       if (!dladdr(addresses[stackfr], &dli)) {
01348          continue;
01349       }
01350 
01351       if (strcmp(dli.dli_fname, "asterisk") == 0) {
01352          char asteriskpath[256];
01353          if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) {
01354             /* This will fail to find symbols */
01355             ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n");
01356             dli.dli_fname = "asterisk";
01357          }
01358       }
01359 
01360       lastslash = strrchr(dli.dli_fname, '/');
01361       if (  (bfdobj = bfd_openr(dli.dli_fname, NULL)) &&
01362             bfd_check_format(bfdobj, bfd_object) &&
01363             (allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 &&
01364             (syms = ast_malloc(allocsize)) &&
01365             (symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) {
01366 
01367          if (bfdobj->flags & DYNAMIC) {
01368             offset = addresses[stackfr] - dli.dli_fbase;
01369          } else {
01370             offset = addresses[stackfr] - (void *) 0;
01371          }
01372 
01373          for (section = bfdobj->sections; section; section = section->next) {
01374             if (  !bfd_get_section_flags(bfdobj, section) & SEC_ALLOC ||
01375                   section->vma > offset ||
01376                   section->size + section->vma < offset) {
01377                continue;
01378             }
01379 
01380             if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) {
01381                continue;
01382             }
01383 
01384             /* Stack trace output */
01385             found++;
01386             if ((lastslash = strrchr(file, '/'))) {
01387                const char *prevslash;
01388                for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--);
01389                if (prevslash >= file) {
01390                   lastslash = prevslash;
01391                }
01392             }
01393             if (dli.dli_saddr == NULL) {
01394                address_str[0] = '\0';
01395             } else {
01396                snprintf(address_str, sizeof(address_str), " (%p+%lX)",
01397                   dli.dli_saddr,
01398                   (unsigned long) (addresses[stackfr] - dli.dli_saddr));
01399             }
01400             snprintf(msg, sizeof(msg), "%s:%u %s()%s",
01401                lastslash ? lastslash + 1 : file, line,
01402                S_OR(func, "???"),
01403                address_str);
01404 
01405             break; /* out of section iteration */
01406          }
01407       }
01408       if (bfdobj) {
01409          bfd_close(bfdobj);
01410          if (syms) {
01411             ast_free(syms);
01412          }
01413       }
01414 
01415       /* Default output, if we cannot find the information within BFD */
01416       if (!found) {
01417          if (dli.dli_saddr == NULL) {
01418             address_str[0] = '\0';
01419          } else {
01420             snprintf(address_str, sizeof(address_str), " (%p+%lX)",
01421                dli.dli_saddr,
01422                (unsigned long) (addresses[stackfr] - dli.dli_saddr));
01423          }
01424          snprintf(msg, sizeof(msg), "%s %s()%s",
01425             lastslash ? lastslash + 1 : dli.dli_fname,
01426             S_OR(dli.dli_sname, "<unknown>"),
01427             address_str);
01428       }
01429 
01430       if (!ast_strlen_zero(msg)) {
01431          char **tmp;
01432          eachlen[stackfr] = strlen(msg);
01433          if (!(tmp = ast_realloc(strings, strings_size + eachlen[stackfr] + 1))) {
01434             ast_free(strings);
01435             strings = NULL;
01436             break; /* out of stack frame iteration */
01437          }
01438          strings = tmp;
01439          strings[stackfr] = (char *) strings + strings_size;
01440          ast_copy_string(strings[stackfr], msg, eachlen[stackfr] + 1);
01441          strings_size += eachlen[stackfr] + 1;
01442       }
01443    }
01444 
01445    if (strings) {
01446       /* Recalculate the offset pointers */
01447       strings[0] = (char *) strings + num_frames * sizeof(*strings);
01448       for (stackfr = 1; stackfr < num_frames; stackfr++) {
01449          strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1] + 1;
01450       }
01451    }
01452 #else /* !defined(BETTER_BACKTRACES) */
01453    strings = backtrace_symbols(addresses, num_frames);
01454 #endif /* defined(BETTER_BACKTRACES) */
01455    return strings;
01456 }

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

Definition at line 426 of file logger.c.

References ast_free, ast_malloc, and option_verbose.

Referenced by launch_script().

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

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

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

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

Definition at line 1189 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(), actual_load_config(), add_agent(), add_agi_cmd(), add_calltoken_ignore(), add_cc_call_info_to_response(), add_cfg_entry(), add_codec_to_answer(), add_content(), add_email_attachment(), add_event_to_list(), add_exten_to_pattern_tree(), add_extensions(), add_features_datastores(), add_header(), add_ie(), add_in_calls(), add_line(), add_out_calls(), add_priority(), add_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(), append_mailbox(), apply_general_options(), apply_option(), apply_options_full(), 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_do_pickup(), 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_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_run_args(), ast_pbx_start(), ast_pickup_call(), ast_pktccops_gate_alloc(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_queue_cc_frame(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), ast_redirecting_build_data(), ast_redirecting_parse_data(), ast_register_application2(), ast_register_feature(), ast_register_switch(), ast_remotecontrol(), ast_request(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_engine_register2(), ast_rtp_glue_register2(), ast_rtp_instance_bridge(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), ast_rtp_instance_new(), ast_rtp_new(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_write(), ast_safe_fork(), ast_safe_system(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_es(), ast_say_date_with_format_fr(), ast_say_date_with_format_gr(), ast_say_date_with_format_he(), ast_say_date_with_format_it(), ast_say_date_with_format_nl(), ast_say_date_with_format_pl(), ast_say_date_with_format_pt(), ast_say_date_with_format_th(), ast_say_date_with_format_vi(), ast_say_date_with_format_zh(), ast_say_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_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_close_session_file(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_tls_read_conf(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_tryconnect(), ast_udptl_bridge(), ast_udptl_new_with_bindaddr(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_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_cc_interfaces_chanvar(), 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_header_fmt(), check_includes(), check_key(), check_label(), check_macro_returns(), check_month(), check_password(), check_post(), check_pval_item(), check_rtp_timeout(), check_srcaddr(), check_timerange(), check_tx_freq(), check_user_full(), check_vars(), check_via(), cleanup_connection(), clear_caller(), clear_dialed_interfaces(), 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(), 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_dynamic_parkinglot(), create_jb(), create_match_char_tree(), create_new_socket(), create_queue_member(), create_video_frame(), create_vmaccount(), crement_function_read(), crypto_load(), csv_log(), csv_quote(), custom_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_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_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(), display_nat_warning(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_dtmf_local(), do_forward(), do_idle_thread(), do_magic_pickup(), do_message(), 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(), filestream_close(), 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_calleridname(), get_canmatch_exten(), get_comma(), get_crypto_attrib(), get_destination(), get_domain(), get_ewscal_ids_for(), get_in_brackets_full(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_mem_set(), get_member_penalty(), get_name_and_number(), get_params(), get_pattern_node(), get_range(), get_rdnis(), get_refer_info(), get_timerange(), get_to_address(), get_token(), get_unused_callno(), getdisplaybyname(), getflagbyname(), getkeybyname(), getstatebyname(), getsubbyname(), gosub_exec(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_function_write(), gsm_read(), gsm_seek(), gsm_write(), gsmtolin_framein(), gtalk_alloc(), gtalk_call(), gtalk_create_candidates(), gtalk_create_member(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_invite(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_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_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_info(), handle_request_invite(), handle_request_notify(), handle_request_options(), handle_request_publish(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_info(), handle_response_invite(), handle_response_message(), handle_response_notify(), handle_response_peerpoke(), handle_response_publish(), handle_response_refer(), handle_response_register(), handle_response_subscribe(), handle_response_update(), handle_soft_key_event_message(), handle_stimulus_message(), handle_t38_options(), handle_tcptls_connection(), handle_transfer_button(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hidthread(), hint_read(), 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_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_template_parse(), ic706_pltocode(), ical_load_calendar(), icalendar_add_event(), icalendar_update_events(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), ilbc_write(), ilbctolin_framein(), import_ch(), in_band_indication(), increase_call_count(), init_acf_query(), init_app_class(), init_jack_data(), init_req(), init_resp(), init_timing_thread(), initialize_cc_max_requests(), initialize_udptl(), 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(), 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_resource(), load_resource_list(), load_rpt_vars(), load_tech_calendars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_cleanup(), local_ast_moh_start(), local_call(), local_devicestate(), local_dtmf_helper(), local_fixup(), local_new(), local_setoption(), local_write(), log_exec(), log_jack_status(), logger_queue_init(), logger_queue_restart(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manage_parked_call(), manage_parkinglot(), manager_log(), manager_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_alloc(), 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_notify_message(), my_is_dialing(), my_is_off_hook(), my_new_pri_ast_channel(), my_pri_open_media(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), 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_space_reserve(), parkandannounce_exec(), parked_call_exec(), parkinglot_activate(), parkinglot_activate_cb(), parkinglot_config_read(), parkinglot_is_marked_cb(), parse(), parse_apps(), parse_args(), parse_buffers_policy(), parse_config(), 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(), parse_via(), ParseBookmark(), parsing(), party_id_build_data(), party_id_write(), party_name_build_data(), party_name_write(), party_number_build_data(), party_number_write(), party_subaddress_build_data(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_hangup(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_saynumber(), pbx_builtin_serialize_variables(), pbx_builtin_setvar(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_exec(), pbx_extension_helper(), pbx_find_extension(), pbx_load_config(), pbx_load_module(), pbx_load_users(), pbx_parseable_goto(), pbx_substitute_variables_helper_full(), pcm_read(), pcm_seek(), pcm_write(), peek_read(), peer_iphash_cb(), peer_set_srcaddr(), peercnt_add(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_by_exten(), pickup_by_group(), pickup_exec(), pickupchan_exec(), pidf_validate_presence(), pidf_validate_tuple(), pitchshift_helper(), pktccops_add_ippool(), play_message(), play_message_category(), play_message_datetime(), play_message_on_chan(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), policy_set_suite(), pop_exec(), post_raw(), 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_find_fixup_principle(), 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_applicationmap_line(), process_ast_dsp(), process_cn_rfc3389(), process_crypto(), process_dahdi(), process_dtmf_rfc2833(), process_echocancel(), process_message_callback(), process_opcode(), process_output(), process_request(), process_returncode(), process_sdp(), process_sdp_a_audio(), process_sdp_c(), process_sdp_o(), process_text_line(), process_via(), profile_set_param(), progress(), proxy_update(), pthread_timer_set_rate(), purge_old_messages(), pvalCheckType(), pvalGlobalsAddStatement(), pvalTopLevAddObject(), pw_cb(), ql_exec(), queue_exec(), queue_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_peer_by_addr(), realtime_peer_get_sippeer_helper(), 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_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(), respprep(), 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(), sdp_crypto_activate(), sdp_crypto_process(), sdp_crypto_setup(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_ews_request_and_parse(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_usb_txt(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendfax_exec(), sendfax_t38_init(), sendimage_exec(), sendkenwood(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), serial_remote_io(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_crypto_policy(), set_ctcss_mode_ic706(), set_destination(), set_fax_t38_caps(), set_format(), set_freq_ic706(), set_full_cmd(), set_ic706(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_mode_ic706(), set_moh_exec(), set_offset_ic706(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setdtr(), setflag(), setformat(), setrem(), setup_dahdi_int(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_srtp(), setup_stunaddr(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), shift_pop(), show_dialplan_helper(), showdisplay(), showkeys(), sig_pri_call(), sig_pri_digit_begin(), sig_pri_get_orig_dialstring(), sig_pri_handle_hold(), sig_pri_handle_retrieve(), sig_pri_handle_subcmds(), sig_pri_hangup(), sig_pri_indicate(), sig_pri_make_cc_dialstring(), sig_pri_request(), sig_pri_send_aoce_termination_request(), sig_pri_start_pri(), sip_acf_channel_read(), sip_addheader(), sip_call(), sip_cc_monitor_suspend(), sip_check_authtimeout(), sip_cli_notify(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_parse_host(), sip_parse_register_line(), 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_setoption(), sip_sipredirect(), sip_st_alloc(), sip_subscribe_mwi(), sip_tcptls_write(), sip_threadinfo_create(), sip_write(), sipsock_read(), siren14read(), siren14write(), siren7read(), siren7write(), skel_exec(), skinny_call(), skinny_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(), spandsp_modems(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite_log(), srv_datastore_setup(), srv_query_read(), srv_result_read(), ssl_close(), 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(), usage_context_add_ramp(), usage_context_add_spaces(), usbradio_fixup(), usbradio_indicate(), usbradio_new(), usbradio_read(), usbradio_request(), usbradio_text(), usbradio_write(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_check_password_shell(), vm_exec(), vm_execmain(), vm_intro(), vm_newuser(), vm_options(), vmsayname_exec(), volume_write(), vox_read(), vox_write(), wait_file(), wait_file2(), wait_for_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().

01190 {
01191    struct logmsg *logmsg = NULL;
01192    struct ast_str *buf = NULL;
01193    struct ast_tm tm;
01194    struct timeval now = ast_tvnow();
01195    int res = 0;
01196    va_list ap;
01197    char datestring[256];
01198 
01199    if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE)))
01200       return;
01201 
01202    if (level != __LOG_VERBOSE && AST_RWLIST_EMPTY(&logchannels)) {
01203       /*
01204        * we don't have the logger chain configured yet,
01205        * so just log to stdout
01206        */
01207       int result;
01208       va_start(ap, fmt);
01209       result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */
01210       va_end(ap);
01211       if (result != AST_DYNSTR_BUILD_FAILED) {
01212          term_filter_escapes(ast_str_buffer(buf));
01213          fputs(ast_str_buffer(buf), stdout);
01214       }
01215       return;
01216    }
01217    
01218    /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug
01219       are non-zero; LOG_DEBUG messages can still be displayed if option_debug
01220       is zero, if option_verbose is non-zero (this allows for 'level zero'
01221       LOG_DEBUG messages to be displayed, if the logmask on any channel
01222       allows it)
01223    */
01224    if (!option_verbose && !option_debug && (level == __LOG_DEBUG))
01225       return;
01226 
01227    /* Ignore anything that never gets logged anywhere */
01228    if (level != __LOG_VERBOSE && !(global_logmask & (1 << level)))
01229       return;
01230    
01231    /* Build string */
01232    va_start(ap, fmt);
01233    res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
01234    va_end(ap);
01235 
01236    /* If the build failed, then abort and free this structure */
01237    if (res == AST_DYNSTR_BUILD_FAILED)
01238       return;
01239 
01240    /* Create a new logging message */
01241    if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128)))
01242       return;
01243 
01244    /* Copy string over */
01245    ast_string_field_set(logmsg, message, ast_str_buffer(buf));
01246 
01247    /* Set type */
01248    if (level == __LOG_VERBOSE) {
01249       logmsg->type = LOGMSG_VERBOSE;
01250    } else {
01251       logmsg->type = LOGMSG_NORMAL;
01252    }
01253 
01254    /* Create our date/time */
01255    ast_localtime(&now, &tm, NULL);
01256    ast_strftime(datestring, sizeof(datestring), dateformat, &tm);
01257    ast_string_field_set(logmsg, date, datestring);
01258 
01259    /* Copy over data */
01260    logmsg->level = level;
01261    logmsg->line = line;
01262    ast_string_field_set(logmsg, level_name, levels[level]);
01263    ast_string_field_set(logmsg, file, file);
01264    ast_string_field_set(logmsg, function, function);
01265    logmsg->process_id = (long) GETTID();
01266 
01267    /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */
01268    if (logthread != AST_PTHREADT_NULL) {
01269       AST_LIST_LOCK(&logmsgs);
01270       AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
01271       ast_cond_signal(&logcond);
01272       AST_LIST_UNLOCK(&logmsgs);
01273    } else {
01274       logger_print_normal(logmsg);
01275       ast_free(logmsg);
01276    }
01277 
01278    return;
01279 }

static void ast_log_vsyslog ( struct logmsg msg  )  [static]

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

00949 {
00950    char buf[BUFSIZ];
00951    int syslog_level = ast_syslog_priority_from_loglevel(msg->level);
00952 
00953    if (syslog_level < 0) {
00954       /* we are locked here, so cannot ast_log() */
00955       fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level);
00956       return;
00957    }
00958 
00959    snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s",
00960        levels[msg->level], msg->process_id, msg->file, msg->line, msg->function, msg->message);
00961 
00962    term_strip(buf, buf, strlen(buf) + 1);
00963    syslog(syslog_level, "%s", buf);
00964 }

int ast_logger_register_level ( const char *  name  ) 

Register a new logger level.

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

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

01598 {
01599    unsigned int level;
01600    unsigned int available = 0;
01601 
01602    AST_RWLIST_WRLOCK(&logchannels);
01603 
01604    for (level = 0; level < ARRAY_LEN(levels); level++) {
01605       if ((level >= 16) && !available && !levels[level]) {
01606          available = level;
01607          continue;
01608       }
01609 
01610       if (levels[level] && !strcasecmp(levels[level], name)) {
01611          ast_log(LOG_WARNING,
01612             "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n",
01613             name);
01614          AST_RWLIST_UNLOCK(&logchannels);
01615 
01616          return -1;
01617       }
01618    }
01619 
01620    if (!available) {
01621       ast_log(LOG_WARNING,
01622          "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n",
01623          name);
01624       AST_RWLIST_UNLOCK(&logchannels);
01625 
01626       return -1;
01627    }
01628 
01629    levels[available] = ast_strdup(name);
01630 
01631    AST_RWLIST_UNLOCK(&logchannels);
01632 
01633    ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available);
01634 
01635    update_logchannels();
01636 
01637    return available;
01638 }

void ast_logger_unregister_level ( const char *  name  ) 

Unregister a previously registered logger level.

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

Definition at line 1640 of file logger.c.

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

Referenced by load_module(), and unload_module().

01641 {
01642    unsigned int found = 0;
01643    unsigned int x;
01644 
01645    AST_RWLIST_WRLOCK(&logchannels);
01646 
01647    for (x = 16; x < ARRAY_LEN(levels); x++) {
01648       if (!levels[x]) {
01649          continue;
01650       }
01651 
01652       if (strcasecmp(levels[x], name)) {
01653          continue;
01654       }
01655 
01656       found = 1;
01657       break;
01658    }
01659 
01660    if (found) {
01661       /* take this level out of the global_logmask, to ensure that no new log messages
01662        * will be queued for it
01663        */
01664 
01665       global_logmask &= ~(1 << x);
01666 
01667       ast_free(levels[x]);
01668       levels[x] = NULL;
01669       AST_RWLIST_UNLOCK(&logchannels);
01670 
01671       ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x);
01672 
01673       update_logchannels();
01674    } else {
01675       AST_RWLIST_UNLOCK(&logchannels);
01676    }
01677 }

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

Definition at line 475 of file logger.c.

References args, AST_APP_ARG, ast_check_realtime(), AST_DECLARE_APP_ARGS, ast_localtime(), AST_NONSTANDARD_APP_ARGS, ast_queue_log(), ast_realtime_require_field(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_store_realtime(), ast_strftime(), ast_tvnow(), logfiles, logger_queue_init(), qlog, RQ_CHAR, S_OR, and SENTINEL.

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

00476 {
00477    va_list ap;
00478    struct timeval tv;
00479    struct ast_tm tm;
00480    char qlog_msg[8192];
00481    int qlog_len;
00482    char time_str[30];
00483 
00484    if (!logger_initialized) {
00485       /* You are too early.  We are not open yet! */
00486       return;
00487    }
00488    if (!queuelog_init) {
00489       AST_RWLIST_WRLOCK(&logchannels);
00490       if (!queuelog_init) {
00491          /*
00492           * We have delayed initializing the queue logging system so
00493           * preloaded realtime modules can get up.  We must initialize
00494           * now since someone is trying to log something.
00495           */
00496          logger_queue_init();
00497          queuelog_init = 1;
00498          AST_RWLIST_UNLOCK(&logchannels);
00499          ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", "");
00500       } else {
00501          AST_RWLIST_UNLOCK(&logchannels);
00502       }
00503    }
00504 
00505    if (ast_check_realtime("queue_log")) {
00506       tv = ast_tvnow();
00507       ast_localtime(&tv, &tm, NULL);
00508       ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm);
00509       va_start(ap, fmt);
00510       vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
00511       va_end(ap);
00512       if (logfiles.queue_adaptive_realtime) {
00513          AST_DECLARE_APP_ARGS(args,
00514             AST_APP_ARG(data)[5];
00515          );
00516          AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|');
00517          /* Ensure fields are large enough to receive data */
00518          ast_realtime_require_field("queue_log",
00519             "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")),
00520             "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")),
00521             "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")),
00522             "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")),
00523             "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")),
00524             SENTINEL);
00525 
00526          /* Store the log */
00527          ast_store_realtime("queue_log", "time", time_str,
00528             "callid", callid,
00529             "queuename", queuename,
00530             "agent", agent,
00531             "event", event,
00532             "data1", S_OR(args.data[0], ""),
00533             "data2", S_OR(args.data[1], ""),
00534             "data3", S_OR(args.data[2], ""),
00535             "data4", S_OR(args.data[3], ""),
00536             "data5", S_OR(args.data[4], ""),
00537             SENTINEL);
00538       } else {
00539          ast_store_realtime("queue_log", "time", time_str,
00540             "callid", callid,
00541             "queuename", queuename,
00542             "agent", agent,
00543             "event", event,
00544             "data", qlog_msg,
00545             SENTINEL);
00546       }
00547 
00548       if (!logfiles.queue_log_to_file) {
00549          return;
00550       }
00551    }
00552 
00553    if (qlog) {
00554       va_start(ap, fmt);
00555       qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
00556       vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
00557       va_end(ap);
00558       AST_RWLIST_RDLOCK(&logchannels);
00559       if (qlog) {
00560          fprintf(qlog, "%s\n", qlog_msg);
00561          fflush(qlog);
00562       }
00563       AST_RWLIST_UNLOCK(&logchannels);
00564    }
00565 }

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

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

01548 {
01549    struct verb *verb;
01550 
01551    if (!(verb = ast_malloc(sizeof(*verb))))
01552       return -1;
01553 
01554    verb->verboser = v;
01555 
01556    AST_RWLIST_WRLOCK(&verbosers);
01557    AST_RWLIST_INSERT_HEAD(&verbosers, verb, list);
01558    AST_RWLIST_UNLOCK(&verbosers);
01559    
01560    return 0;
01561 }

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

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

01564 {
01565    struct verb *cur;
01566 
01567    AST_RWLIST_WRLOCK(&verbosers);
01568    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) {
01569       if (cur->verboser == v) {
01570          AST_RWLIST_REMOVE_CURRENT(list);
01571          ast_free(cur);
01572          break;
01573       }
01574    }
01575    AST_RWLIST_TRAVERSE_SAFE_END;
01576    AST_RWLIST_UNLOCK(&verbosers);
01577    
01578    return cur ? 0 : -1;
01579 }

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

Definition at line 1538 of file logger.c.

References __ast_verbose_ap().

01539 {
01540    va_list ap;
01541 
01542    va_start(ap, fmt);
01543    __ast_verbose_ap("", 0, "", fmt, ap);
01544    va_end(ap);
01545 }

void close_logger ( void   ) 

Provided by logger.c

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

01151 {
01152    struct logchannel *f = NULL;
01153 
01154    logger_initialized = 0;
01155 
01156    /* Stop logger thread */
01157    AST_LIST_LOCK(&logmsgs);
01158    close_logger_thread = 1;
01159    ast_cond_signal(&logcond);
01160    AST_LIST_UNLOCK(&logmsgs);
01161 
01162    if (logthread != AST_PTHREADT_NULL)
01163       pthread_join(logthread, NULL);
01164 
01165    AST_RWLIST_WRLOCK(&logchannels);
01166 
01167    if (qlog) {
01168       fclose(qlog);
01169       qlog = NULL;
01170    }
01171 
01172    AST_RWLIST_TRAVERSE(&logchannels, f, list) {
01173       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
01174          fclose(f->fileptr);
01175          f->fileptr = NULL;
01176       }
01177    }
01178 
01179    closelog(); /* syslog */
01180 
01181    AST_RWLIST_UNLOCK(&logchannels);
01182 
01183    return;
01184 }

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

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

00805 {
00806    switch (cmd) {
00807    case CLI_INIT:
00808       e->command = "logger reload";
00809       e->usage = 
00810          "Usage: logger reload\n"
00811          "       Reloads the logger subsystem state.  Use after restarting syslogd(8) if you are using syslog logging.\n";
00812       return NULL;
00813    case CLI_GENERATE:
00814       return NULL;
00815    }
00816    if (reload_logger(0)) {
00817       ast_cli(a->fd, "Failed to reload the logger\n");
00818       return CLI_FAILURE;
00819    }
00820    return CLI_SUCCESS;
00821 }

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

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

00824 {
00825    switch (cmd) {
00826    case CLI_INIT:
00827       e->command = "logger rotate";
00828       e->usage = 
00829          "Usage: logger rotate\n"
00830          "       Rotates and Reopens the log files.\n";
00831       return NULL;
00832    case CLI_GENERATE:
00833       return NULL;   
00834    }
00835    if (reload_logger(1)) {
00836       ast_cli(a->fd, "Failed to reload the logger and rotate log files\n");
00837       return CLI_FAILURE;
00838    } 
00839    return CLI_SUCCESS;
00840 }

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

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

00843 {
00844    int x;
00845    int state;
00846    int level = -1;
00847 
00848    switch (cmd) {
00849    case CLI_INIT:
00850       e->command = "logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}";
00851       e->usage = 
00852          "Usage: logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n"
00853          "       Set a specific log level to enabled/disabled for this console.\n";
00854       return NULL;
00855    case CLI_GENERATE:
00856       return NULL;
00857    }
00858 
00859    if (a->argc < 5)
00860       return CLI_SHOWUSAGE;
00861 
00862    AST_RWLIST_WRLOCK(&logchannels);
00863 
00864    for (x = 0; x < ARRAY_LEN(levels); x++) {
00865       if (levels[x] && !strcasecmp(a->argv[3], levels[x])) {
00866          level = x;
00867          break;
00868       }
00869    }
00870 
00871    AST_RWLIST_UNLOCK(&logchannels);
00872 
00873    state = ast_true(a->argv[4]) ? 1 : 0;
00874 
00875    if (level != -1) {
00876       ast_console_toggle_loglevel(a->fd, level, state);
00877       ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off");
00878    } else
00879       return CLI_SHOWUSAGE;
00880 
00881    return CLI_SUCCESS;
00882 }

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

00886 {
00887 #define FORMATL   "%-35.35s %-8.8s %-9.9s "
00888    struct logchannel *chan;
00889    switch (cmd) {
00890    case CLI_INIT:
00891       e->command = "logger show channels";
00892       e->usage = 
00893          "Usage: logger show channels\n"
00894          "       List configured logger channels.\n";
00895       return NULL;
00896    case CLI_GENERATE:
00897       return NULL;   
00898    }
00899    ast_cli(a->fd, FORMATL, "Channel", "Type", "Status");
00900    ast_cli(a->fd, "Configuration\n");
00901    ast_cli(a->fd, FORMATL, "-------", "----", "------");
00902    ast_cli(a->fd, "-------------\n");
00903    AST_RWLIST_RDLOCK(&logchannels);
00904    AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
00905       unsigned int level;
00906 
00907       ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"),
00908          chan->disabled ? "Disabled" : "Enabled");
00909       ast_cli(a->fd, " - ");
00910       for (level = 0; level < ARRAY_LEN(levels); level++) {
00911          if ((chan->logmask & (1 << level)) && levels[level]) {
00912             ast_cli(a->fd, "%s ", levels[level]);
00913          }
00914       }
00915       ast_cli(a->fd, "\n");
00916    }
00917    AST_RWLIST_UNLOCK(&logchannels);
00918    ast_cli(a->fd, "\n");
00919 
00920    return CLI_SUCCESS;
00921 }

int init_logger ( void   ) 

Provided by logger.c

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

01127 {
01128    /* auto rotate if sig SIGXFSZ comes a-knockin */
01129    sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL);
01130 
01131    /* start logger thread */
01132    ast_cond_init(&logcond, NULL);
01133    if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) {
01134       ast_cond_destroy(&logcond);
01135       return -1;
01136    }
01137 
01138    /* register the logger cli commands */
01139    ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger));
01140 
01141    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
01142 
01143    /* create log channels */
01144    init_logger_chain(0 /* locked */);
01145    logger_initialized = 1;
01146 
01147    return 0;
01148 }

static void init_logger_chain ( int  locked  )  [static]

Definition at line 303 of file logger.c.

References __LOG_ERROR, __LOG_NOTICE, __LOG_WARNING, ast_calloc, ast_config_load2(), ast_console_puts_mutable(), ast_copy_string(), ast_free, AST_RWLIST_INSERT_HEAD, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), ast_variable_browse(), ast_variable_retrieve(), config_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().

00304 {
00305    struct logchannel *chan;
00306    struct ast_config *cfg;
00307    struct ast_variable *var;
00308    const char *s;
00309    struct ast_flags config_flags = { 0 };
00310 
00311    if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
00312       return;
00313    }
00314 
00315    /* delete our list of log channels */
00316    if (!locked) {
00317       AST_RWLIST_WRLOCK(&logchannels);
00318    }
00319    while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) {
00320       ast_free(chan);
00321    }
00322    global_logmask = 0;
00323    if (!locked) {
00324       AST_RWLIST_UNLOCK(&logchannels);
00325    }
00326 
00327    errno = 0;
00328    /* close syslog */
00329    closelog();
00330 
00331    /* If no config file, we're fine, set default options. */
00332    if (!cfg) {
00333       if (errno) {
00334          fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno));
00335       } else {
00336          fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n");
00337       }
00338       if (!(chan = ast_calloc(1, sizeof(*chan)))) {
00339          return;
00340       }
00341       chan->type = LOGTYPE_CONSOLE;
00342       chan->logmask = __LOG_WARNING | __LOG_NOTICE | __LOG_ERROR;
00343       if (!locked) {
00344          AST_RWLIST_WRLOCK(&logchannels);
00345       }
00346       AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
00347       global_logmask |= chan->logmask;
00348       if (!locked) {
00349          AST_RWLIST_UNLOCK(&logchannels);
00350       }
00351       return;
00352    }
00353 
00354    if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) {
00355       if (ast_true(s)) {
00356          if (gethostname(hostname, sizeof(hostname) - 1)) {
00357             ast_copy_string(hostname, "unknown", sizeof(hostname));
00358             fprintf(stderr, "What box has no hostname???\n");
00359          }
00360       } else
00361          hostname[0] = '\0';
00362    } else
00363       hostname[0] = '\0';
00364    if ((s = ast_variable_retrieve(cfg, "general", "dateformat")))
00365       ast_copy_string(dateformat, s, sizeof(dateformat));
00366    else
00367       ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat));
00368    if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) {
00369       logfiles.queue_log = ast_true(s);
00370    }
00371    if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) {
00372       logfiles.queue_log_to_file = ast_true(s);
00373    }
00374    if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) {
00375       ast_copy_string(queue_log_name, s, sizeof(queue_log_name));
00376    }
00377    if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) {
00378       ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate));
00379    }
00380    if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) {
00381       if (strcasecmp(s, "timestamp") == 0) {
00382          rotatestrategy = TIMESTAMP;
00383       } else if (strcasecmp(s, "rotate") == 0) {
00384          rotatestrategy = ROTATE;
00385       } else if (strcasecmp(s, "sequential") == 0) {
00386          rotatestrategy = SEQUENTIAL;
00387       } else {
00388          fprintf(stderr, "Unknown rotatestrategy: %s\n", s);
00389       }
00390    } else {
00391       if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) {
00392          rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL;
00393          fprintf(stderr, "rotatetimestamp option has been deprecated.  Please use rotatestrategy instead.\n");
00394       }
00395    }
00396 
00397    if (!locked) {
00398       AST_RWLIST_WRLOCK(&logchannels);
00399    }
00400    var = ast_variable_browse(cfg, "logfiles");
00401    for (; var; var = var->next) {
00402       if (!(chan = make_logchannel(var->name, var->value, var->lineno))) {
00403          /* Print error message directly to the consoles since the lock is held
00404           * and we don't want to unlock with the list partially built */
00405          ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR);
00406          ast_console_puts_mutable(var->name, __LOG_ERROR);
00407          ast_console_puts_mutable("'\n", __LOG_ERROR);
00408          continue;
00409       }
00410       AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
00411       global_logmask |= chan->logmask;
00412    }
00413 
00414    if (qlog) {
00415       fclose(qlog);
00416       qlog = NULL;
00417    }
00418 
00419    if (!locked) {
00420       AST_RWLIST_UNLOCK(&logchannels);
00421    }
00422 
00423    ast_config_destroy(cfg);
00424 }

static void logger_print_normal ( struct logmsg logmsg  )  [static]

Print a normal log message to the channels.

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

00968 {
00969    struct logchannel *chan = NULL;
00970    char buf[BUFSIZ];
00971    struct verb *v = NULL;
00972 
00973    if (logmsg->level == __LOG_VERBOSE) {
00974       char *tmpmsg = ast_strdupa(logmsg->message + 1);
00975       /* Iterate through the list of verbosers and pass them the log message string */
00976       AST_RWLIST_RDLOCK(&verbosers);
00977       AST_RWLIST_TRAVERSE(&verbosers, v, list)
00978          v->verboser(logmsg->message);
00979       AST_RWLIST_UNLOCK(&verbosers);
00980       ast_string_field_set(logmsg, message, tmpmsg);
00981    }
00982 
00983    AST_RWLIST_RDLOCK(&logchannels);
00984 
00985    if (!AST_RWLIST_EMPTY(&logchannels)) {
00986       AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
00987          /* If the channel is disabled, then move on to the next one */
00988          if (chan->disabled)
00989             continue;
00990          /* Check syslog channels */
00991          if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) {
00992             ast_log_vsyslog(logmsg);
00993          /* Console channels */
00994          } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) {
00995             char linestr[128];
00996             char tmp1[80], tmp2[80], tmp3[80], tmp4[80];
00997 
00998             /* If the level is verbose, then skip it */
00999             if (logmsg->level == __LOG_VERBOSE)
01000                continue;
01001 
01002             /* Turn the numerical line number into a string */
01003             snprintf(linestr, sizeof(linestr), "%d", logmsg->line);
01004             /* Build string to print out */
01005             snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s",
01006                 logmsg->date,
01007                 term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)),
01008                 logmsg->process_id,
01009                 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)),
01010                 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
01011                 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)),
01012                 logmsg->message);
01013             /* Print out */
01014             ast_console_puts_mutable(buf, logmsg->level);
01015          /* File channels */
01016          } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) {
01017             int res = 0;
01018 
01019             /* If no file pointer exists, skip it */
01020             if (!chan->fileptr) {
01021                continue;
01022             }
01023 
01024             /* Print out to the file */
01025             res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s",
01026                      logmsg->date, logmsg->level_name, logmsg->process_id, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ));
01027             if (res <= 0 && !ast_strlen_zero(logmsg->message)) {
01028                fprintf(stderr, "**** Asterisk Logging Error: ***********\n");
01029                if (errno == ENOMEM || errno == ENOSPC)
01030                   fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename);
01031                else
01032                   fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno));
01033                manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno));
01034                chan->disabled = 1;
01035             } else if (res > 0) {
01036                fflush(chan->fileptr);
01037             }
01038          }
01039       }
01040    } else if (logmsg->level != __LOG_VERBOSE) {
01041       fputs(logmsg->message, stdout);
01042    }
01043 
01044    AST_RWLIST_UNLOCK(&logchannels);
01045 
01046    /* If we need to reload because of the file size, then do so */
01047    if (filesize_reload_needed) {
01048       reload_logger(-1);
01049       ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n");
01050    }
01051 
01052    return;
01053 }

static void logger_queue_init ( void   )  [static]

Definition at line 1102 of file logger.c.

References ast_config_AST_LOG_DIR, ast_log(), ast_unload_realtime(), errno, LOG_ERROR, logfiles, logger_queue_rt_start(), and qlog.

Referenced by ast_queue_log().

01103 {
01104    ast_unload_realtime("queue_log");
01105    if (logfiles.queue_log) {
01106       char qfname[PATH_MAX];
01107 
01108       if (logger_queue_rt_start()) {
01109          return;
01110       }
01111 
01112       /* Open the log file. */
01113       snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR,
01114          queue_log_name);
01115       if (qlog) {
01116          /* Just in case it was already open. */
01117          fclose(qlog);
01118       }
01119       qlog = fopen(qfname, "a");
01120       if (!qlog) {
01121          ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
01122       }
01123    }
01124 }

static int logger_queue_restart ( int  queue_rotate  )  [static]

Definition at line 703 of file logger.c.

References ast_config_AST_LOG_DIR, ast_log(), errno, LOG_ERROR, logger_queue_rt_start(), qlog, and rotate_file().

Referenced by reload_logger().

00704 {
00705    int res = 0;
00706    char qfname[PATH_MAX];
00707 
00708    if (logger_queue_rt_start()) {
00709       return res;
00710    }
00711 
00712    snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
00713    if (qlog) {
00714       /* Just in case it was still open. */
00715       fclose(qlog);
00716       qlog = NULL;
00717    }
00718    if (queue_rotate) {
00719       rotate_file(qfname);
00720    }
00721 
00722    /* Open the log file. */
00723    qlog = fopen(qfname, "a");
00724    if (!qlog) {
00725       ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
00726       res = -1;
00727    }
00728    return res;
00729 }

static int logger_queue_rt_start ( void   )  [static]

Definition at line 668 of file logger.c.

References ast_check_realtime(), ast_realtime_require_field(), logfiles, RQ_CHAR, RQ_DATETIME, and SENTINEL.

Referenced by logger_queue_init(), and logger_queue_restart().

00669 {
00670    if (ast_check_realtime("queue_log")) {
00671       if (!ast_realtime_require_field("queue_log",
00672          "time", RQ_DATETIME, 26,
00673          "data1", RQ_CHAR, 20,
00674          "data2", RQ_CHAR, 20,
00675          "data3", RQ_CHAR, 20,
00676          "data4", RQ_CHAR, 20,
00677          "data5", RQ_CHAR, 20,
00678          SENTINEL)) {
00679          logfiles.queue_adaptive_realtime = 1;
00680       } else {
00681          logfiles.queue_adaptive_realtime = 0;
00682       }
00683 
00684       if (!logfiles.queue_log_to_file) {
00685          /* Don't open the log file. */
00686          return 1;
00687       }
00688    }
00689    return 0;
00690 }

int logger_reload ( void   ) 

Reload logger without rotating log files.

Definition at line 796 of file logger.c.

References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.

00797 {
00798    if (reload_logger(0)) {
00799       return RESULT_FAILURE;
00800    }
00801    return RESULT_SUCCESS;
00802 }

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

Actual logging thread.

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

01057 {
01058    struct logmsg *next = NULL, *msg = NULL;
01059 
01060    for (;;) {
01061       /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */
01062       AST_LIST_LOCK(&logmsgs);
01063       if (AST_LIST_EMPTY(&logmsgs)) {
01064          if (close_logger_thread) {
01065             break;
01066          } else {
01067             ast_cond_wait(&logcond, &logmsgs.lock);
01068          }
01069       }
01070       next = AST_LIST_FIRST(&logmsgs);
01071       AST_LIST_HEAD_INIT_NOLOCK(&logmsgs);
01072       AST_LIST_UNLOCK(&logmsgs);
01073 
01074       /* Otherwise go through and process each message in the order added */
01075       while ((msg = next)) {
01076          /* Get the next entry now so that we can free our current structure later */
01077          next = AST_LIST_NEXT(msg, list);
01078 
01079          /* Depending on the type, send it to the proper function */
01080          logger_print_normal(msg);
01081 
01082          /* Free the data since we are done */
01083          ast_free(msg);
01084       }
01085 
01086       /* If we should stop, then stop */
01087       if (close_logger_thread)
01088          break;
01089    }
01090 
01091    return NULL;
01092 }

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

Definition at line 219 of file logger.c.

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

Referenced by make_logchannel(), and update_logchannels().

00220 {
00221    char *w;
00222    unsigned int res = 0;
00223    char *stringp = ast_strdupa(s);
00224    unsigned int x;
00225 
00226    while ((w = strsep(&stringp, ","))) {
00227       w = ast_skip_blanks(w);
00228 
00229       if (!strcmp(w, "*")) {
00230          res = 0xFFFFFFFF;
00231          break;
00232       } else for (x = 0; x < ARRAY_LEN(levels); x++) {
00233          if (levels[x] && !strcasecmp(w, levels[x])) {
00234             res |= (1 << x);
00235             break;
00236          }
00237       }
00238    }
00239 
00240    return res;
00241 }

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

Definition at line 243 of file logger.c.

References __LOG_ERROR, ast_calloc, ast_config_AST_LOG_DIR, ast_console_puts_mutable(), 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().

00244 {
00245    struct logchannel *chan;
00246    char *facility;
00247 
00248    if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1)))
00249       return NULL;
00250 
00251    strcpy(chan->components, components);
00252    chan->lineno = lineno;
00253 
00254    if (!strcasecmp(channel, "console")) {
00255       chan->type = LOGTYPE_CONSOLE;
00256    } else if (!strncasecmp(channel, "syslog", 6)) {
00257       /*
00258       * syntax is:
00259       *  syslog.facility => level,level,level
00260       */
00261       facility = strchr(channel, '.');
00262       if (!facility++ || !facility) {
00263          facility = "local0";
00264       }
00265 
00266       chan->facility = ast_syslog_facility(facility);
00267 
00268       if (chan->facility < 0) {
00269          fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
00270          ast_free(chan);
00271          return NULL;
00272       }
00273 
00274       chan->type = LOGTYPE_SYSLOG;
00275       ast_copy_string(chan->filename, channel, sizeof(chan->filename));
00276       openlog("asterisk", LOG_PID, chan->facility);
00277    } else {
00278       if (!ast_strlen_zero(hostname)) {
00279          snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s",
00280              channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname);
00281       } else {
00282          snprintf(chan->filename, sizeof(chan->filename), "%s/%s",
00283              channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel);
00284       }
00285       if (!(chan->fileptr = fopen(chan->filename, "a"))) {
00286          /* Can't do real logging here since we're called with a lock
00287           * so log to any attached consoles */
00288          ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR);
00289          ast_console_puts_mutable(chan->filename, __LOG_ERROR);
00290          ast_console_puts_mutable("': ", __LOG_ERROR);
00291          ast_console_puts_mutable(strerror(errno), __LOG_ERROR);
00292          ast_console_puts_mutable("'\n", __LOG_ERROR);
00293          ast_free(chan);
00294          return NULL;
00295       }
00296       chan->type = LOGTYPE_FILE;
00297    }
00298    chan->logmask = make_components(chan->components, lineno);
00299 
00300    return chan;
00301 }

static int reload_logger ( int  rotate  )  [static]

Definition at line 731 of file logger.c.

References ast_config_AST_LOG_DIR, ast_mkdir(), ast_queue_log(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_unload_realtime(), ast_verb, EVENT_FLAG_SYSTEM, f, init_logger_chain(), logchannel::list, logfiles, logger_queue_restart(), manager_event, qlog, and rotate_file().

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

00732 {
00733    int queue_rotate = rotate;
00734    struct logchannel *f;
00735    int res = 0;
00736 
00737    AST_RWLIST_WRLOCK(&logchannels);
00738 
00739    if (qlog) {
00740       if (rotate < 0) {
00741          /* Check filesize - this one typically doesn't need an auto-rotate */
00742          if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */
00743             fclose(qlog);
00744             qlog = NULL;
00745          } else {
00746             queue_rotate = 0;
00747          }
00748       } else {
00749          fclose(qlog);
00750          qlog = NULL;
00751       }
00752    } else {
00753       queue_rotate = 0;
00754    }
00755 
00756    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
00757 
00758    AST_RWLIST_TRAVERSE(&logchannels, f, list) {
00759       if (f->disabled) {
00760          f->disabled = 0;  /* Re-enable logging at reload */
00761          manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename);
00762       }
00763       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
00764          int rotate_this = 0;
00765          if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */
00766             /* Be more proactive about rotating massive log files */
00767             rotate_this = 1;
00768          }
00769          fclose(f->fileptr);  /* Close file */
00770          f->fileptr = NULL;
00771          if (rotate || rotate_this) {
00772             rotate_file(f->filename);
00773          }
00774       }
00775    }
00776 
00777    filesize_reload_needed = 0;
00778 
00779    init_logger_chain(1 /* locked */);
00780 
00781    ast_unload_realtime("queue_log");
00782    if (logfiles.queue_log) {
00783       res = logger_queue_restart(queue_rotate);
00784       AST_RWLIST_UNLOCK(&logchannels);
00785       ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", "");
00786       ast_verb(1, "Asterisk Queue Logger restarted\n");
00787    } else {
00788       AST_RWLIST_UNLOCK(&logchannels);
00789    }
00790 
00791    return res;
00792 }

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

Definition at line 567 of file logger.c.

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

Referenced by logger_queue_restart(), and reload_logger().

00568 {
00569    char old[PATH_MAX];
00570    char new[PATH_MAX];
00571    int x, y, which, found, res = 0, fd;
00572    char *suffixes[4] = { "", ".gz", ".bz2", ".Z" };
00573 
00574    switch (rotatestrategy) {
00575    case SEQUENTIAL:
00576       for (x = 0; ; x++) {
00577          snprintf(new, sizeof(new), "%s.%d", filename, x);
00578          fd = open(new, O_RDONLY);
00579          if (fd > -1)
00580             close(fd);
00581          else
00582             break;
00583       }
00584       if (rename(filename, new)) {
00585          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00586          res = -1;
00587       } else {
00588          filename = new;
00589       }
00590       break;
00591    case TIMESTAMP:
00592       snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL));
00593       if (rename(filename, new)) {
00594          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00595          res = -1;
00596       } else {
00597          filename = new;
00598       }
00599       break;
00600    case ROTATE:
00601       /* Find the next empty slot, including a possible suffix */
00602       for (x = 0; ; x++) {
00603          found = 0;
00604          for (which = 0; which < ARRAY_LEN(suffixes); which++) {
00605             snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]);
00606             fd = open(new, O_RDONLY);
00607             if (fd > -1) {
00608                close(fd);
00609                found = 1;
00610                break;
00611             }
00612          }
00613          if (!found) {
00614             break;
00615          }
00616       }
00617 
00618       /* Found an empty slot */
00619       for (y = x; y > 0; y--) {
00620          for (which = 0; which < ARRAY_LEN(suffixes); which++) {
00621             snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]);
00622             fd = open(old, O_RDONLY);
00623             if (fd > -1) {
00624                /* Found the right suffix */
00625                close(fd);
00626                snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]);
00627                if (rename(old, new)) {
00628                   fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new);
00629                   res = -1;
00630                }
00631                break;
00632             }
00633          }
00634       }
00635 
00636       /* Finally, rename the current file */
00637       snprintf(new, sizeof(new), "%s.0", filename);
00638       if (rename(filename, new)) {
00639          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00640          res = -1;
00641       } else {
00642          filename = new;
00643       }
00644    }
00645 
00646    if (!ast_strlen_zero(exec_after_rotate)) {
00647       struct ast_channel *c = ast_dummy_channel_alloc();
00648       char buf[512];
00649 
00650       pbx_builtin_setvar_helper(c, "filename", filename);
00651       pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf));
00652       if (c) {
00653          c = ast_channel_unref(c);
00654       }
00655       if (ast_safe_system(buf) == -1) {
00656          ast_log(LOG_WARNING, "error executing '%s'\n", buf);
00657       }
00658    }
00659    return res;
00660 }

static void update_logchannels ( void   )  [static]

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

01582 {
01583    struct logchannel *cur;
01584 
01585    AST_RWLIST_WRLOCK(&logchannels);
01586 
01587    global_logmask = 0;
01588 
01589    AST_RWLIST_TRAVERSE(&logchannels, cur, list) {
01590       cur->logmask = make_components(cur->components, cur->lineno);
01591       global_logmask |= cur->logmask;
01592    }
01593 
01594    AST_RWLIST_UNLOCK(&logchannels);
01595 }


Variable Documentation

struct ast_cli_entry cli_logger[] [static]

Definition at line 930 of file logger.c.

Referenced by init_logger().

int close_logger_thread = 0 [static]

Definition at line 150 of file logger.c.

Referenced by close_logger(), and logger_thread().

const int colors[32] [static]

Colors used in the console for logging.

Definition at line 176 of file logger.c.

Referenced by logger_print_normal().

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

Definition at line 74 of file logger.c.

Referenced by build_device().

char exec_after_rotate[256] = "" [static]

Definition at line 77 of file logger.c.

int filesize_reload_needed [static]

Definition at line 79 of file logger.c.

unsigned int global_logmask = 0xFFFF [static]

Definition at line 80 of file logger.c.

struct sigaction handle_SIGXFSZ [static]

Initial value:

 {
   .sa_handler = _handle_SIGXFSZ,
   .sa_flags = SA_RESTART,
}

Definition at line 943 of file logger.c.

char hostname[MAXHOSTNAMELEN] [static]

Definition at line 96 of file logger.c.

Referenced by app_exec(), ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), netconsole(), set_destination(), sip_parse_register_line(), 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 165 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]

Definition at line 214 of file logger.c.

Referenced by ast_log().

ast_cond_t logcond [static]

Definition at line 149 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(), logger_queue_rt_start(), and reload_logger().

int logger_initialized [static]

Definition at line 82 of file logger.c.

pthread_t logthread = AST_PTHREADT_NULL [static]

Definition at line 148 of file logger.c.

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

FILE* qlog [static]

Definition at line 152 of file logger.c.

Referenced by ast_queue_log(), close_logger(), logger_queue_init(), logger_queue_restart(), and reload_logger().

unsigned int queue_adaptive_realtime

Definition at line 93 of file logger.c.

unsigned int queue_log

Definition at line 91 of file logger.c.

char queue_log_name[256] = QUEUELOG [static]

Definition at line 76 of file logger.c.

unsigned int queue_log_to_file

Definition at line 92 of file logger.c.

int queuelog_init [static]

Definition at line 81 of file logger.c.

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

Definition at line 211 of file logger.c.

Referenced by __ast_verbose_ap().


Generated on Mon Mar 19 11:30:49 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7