Mon Jun 27 16:51:16 2011

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)
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 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 214 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 211 of file logger.c.

Referenced by __ast_verbose_ap().


Enumeration Type Documentation

enum logmsgtypes

Enumerator:
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 126 of file logger.c.

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

enum logtypes

Enumerator:
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 97 of file logger.c.

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

enum rotatestrategy

Enumerator:
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 83 of file logger.c.

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


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

References __ast_verbose_ap().

01440 {
01441    va_list ap;
01442 
01443    va_start(ap, fmt);
01444    __ast_verbose_ap(file, line, func, fmt, ap);
01445    va_end(ap);
01446 }

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

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

01404 {
01405    struct ast_str *buf = NULL;
01406    int res = 0;
01407 
01408    if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE)))
01409       return;
01410 
01411    if (ast_opt_timestamp) {
01412       struct timeval now;
01413       struct ast_tm tm;
01414       char date[40];
01415       char *datefmt;
01416 
01417       now = ast_tvnow();
01418       ast_localtime(&now, &tm, NULL);
01419       ast_strftime(date, sizeof(date), dateformat, &tm);
01420       datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1);
01421       sprintf(datefmt, "%c[%s] %s", 127, date, fmt);
01422       fmt = datefmt;
01423    } else {
01424       char *tmp = alloca(strlen(fmt) + 2);
01425       sprintf(tmp, "%c%s", 127, fmt);
01426       fmt = tmp;
01427    }
01428 
01429    /* Build string */
01430    res = ast_str_set_va(&buf, 0, fmt, ap);
01431 
01432    /* If the build failed then we can drop this allocated message */
01433    if (res == AST_DYNSTR_BUILD_FAILED)
01434       return;
01435 
01436    ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf));
01437 }

static void __init_log_buf ( void   )  [static]

Definition at line 213 of file logger.c.

00219 {

static void __init_verbose_buf ( void   )  [static]

Definition at line 210 of file logger.c.

00219 {

static void _handle_SIGXFSZ ( int  sig  )  [static]

Definition at line 867 of file logger.c.

00868 {
00869    /* Indicate need to reload */
00870    filesize_reload_needed = 1;
00871 }

void ast_backtrace ( void   ) 

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

01374 {
01375 #ifdef HAVE_BKTR
01376    struct ast_bt *bt;
01377    int i = 0;
01378    char **strings;
01379 
01380    if (!(bt = ast_bt_create())) {
01381       ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
01382       return;
01383    }
01384 
01385    if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
01386       ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' ');
01387       for (i = 3; i < bt->num_frames - 2; i++) {
01388          ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]);
01389       }
01390 
01391       /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */
01392 #undef free
01393       free(strings);
01394    } else {
01395       ast_debug(1, "Could not allocate memory for backtrace\n");
01396    }
01397    ast_bt_destroy(bt);
01398 #else
01399    ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
01400 #endif /* defined(HAVE_BKTR) */
01401 }

struct ast_bt* ast_bt_create ( void   ) 

Definition at line 1196 of file logger.c.

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

Referenced by ast_backtrace().

01197 {
01198    struct ast_bt *bt = ast_calloc(1, sizeof(*bt));
01199    if (!bt) {
01200       ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n");
01201       return NULL;
01202    }
01203 
01204    bt->alloced = 1;
01205 
01206    ast_bt_get_addresses(bt);
01207 
01208    return bt;
01209 }

void* ast_bt_destroy ( struct ast_bt bt  ) 

Definition at line 1218 of file logger.c.

References ast_bt::alloced, and ast_free.

Referenced by ast_backtrace().

01219 {
01220    if (bt->alloced) {
01221       ast_free(bt);
01222    }
01223 
01224    return NULL;
01225 }

int ast_bt_get_addresses ( struct ast_bt bt  ) 

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

01212 {
01213    bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES);
01214 
01215    return 0;
01216 }

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

Definition at line 1227 of file logger.c.

References ast_calloc, ast_log(), ast_malloc, ast_utils_which(), LOG_DEBUG, and S_OR.

Referenced by ao2_bt(), append_backtrace_information(), and ast_backtrace().

01228 {
01229    char **strings = NULL;
01230 #if defined(BETTER_BACKTRACES)
01231    int stackfr;
01232    bfd *bfdobj;           /* bfd.h */
01233    Dl_info dli;           /* dlfcn.h */
01234    long allocsize;
01235    asymbol **syms = NULL; /* bfd.h */
01236    bfd_vma offset;        /* bfd.h */
01237    const char *lastslash;
01238    asection *section;
01239    const char *file, *func;
01240    unsigned int line;
01241    char address_str[128];
01242    char msg[1024];
01243    size_t strings_size;
01244    size_t *eachlen;
01245 #endif
01246 
01247 #if defined(BETTER_BACKTRACES)
01248    strings_size = num_frames * sizeof(*strings);
01249    eachlen = ast_calloc(num_frames, sizeof(*eachlen));
01250 
01251    if (!(strings = ast_calloc(num_frames, sizeof(*strings)))) {
01252       return NULL;
01253    }
01254 
01255    for (stackfr = 0; stackfr < num_frames; stackfr++) {
01256       int found = 0, symbolcount;
01257 
01258       msg[0] = '\0';
01259 
01260       if (!dladdr(addresses[stackfr], &dli)) {
01261          continue;
01262       }
01263 
01264       if (strcmp(dli.dli_fname, "asterisk") == 0) {
01265          char asteriskpath[256];
01266          if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) {
01267             /* This will fail to find symbols */
01268             ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n");
01269             dli.dli_fname = "asterisk";
01270          }
01271       }
01272 
01273       lastslash = strrchr(dli.dli_fname, '/');
01274       if (  (bfdobj = bfd_openr(dli.dli_fname, NULL)) &&
01275             bfd_check_format(bfdobj, bfd_object) &&
01276             (allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 &&
01277             (syms = ast_malloc(allocsize)) &&
01278             (symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) {
01279 
01280          if (bfdobj->flags & DYNAMIC) {
01281             offset = addresses[stackfr] - dli.dli_fbase;
01282          } else {
01283             offset = addresses[stackfr] - (void *) 0;
01284          }
01285 
01286          for (section = bfdobj->sections; section; section = section->next) {
01287             if (  !bfd_get_section_flags(bfdobj, section) & SEC_ALLOC ||
01288                   section->vma > offset ||
01289                   section->size + section->vma < offset) {
01290                continue;
01291             }
01292 
01293             if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) {
01294                continue;
01295             }
01296 
01297             /* Stack trace output */
01298             found++;
01299             if ((lastslash = strrchr(file, '/'))) {
01300                const char *prevslash;
01301                for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--);
01302                if (prevslash >= file) {
01303                   lastslash = prevslash;
01304                }
01305             }
01306             if (dli.dli_saddr == NULL) {
01307                address_str[0] = '\0';
01308             } else {
01309                snprintf(address_str, sizeof(address_str), " (%p+%lX)",
01310                   dli.dli_saddr,
01311                   (unsigned long) (addresses[stackfr] - dli.dli_saddr));
01312             }
01313             snprintf(msg, sizeof(msg), "%s:%u %s()%s",
01314                lastslash ? lastslash + 1 : file, line,
01315                S_OR(func, "???"),
01316                address_str);
01317 
01318             break; /* out of section iteration */
01319          }
01320       }
01321       if (bfdobj) {
01322          bfd_close(bfdobj);
01323          if (syms) {
01324             ast_free(syms);
01325          }
01326       }
01327 
01328       /* Default output, if we cannot find the information within BFD */
01329       if (!found) {
01330          if (dli.dli_saddr == NULL) {
01331             address_str[0] = '\0';
01332          } else {
01333             snprintf(address_str, sizeof(address_str), " (%p+%lX)",
01334                dli.dli_saddr,
01335                (unsigned long) (addresses[stackfr] - dli.dli_saddr));
01336          }
01337          snprintf(msg, sizeof(msg), "%s %s()%s",
01338             lastslash ? lastslash + 1 : dli.dli_fname,
01339             S_OR(dli.dli_sname, "<unknown>"),
01340             address_str);
01341       }
01342 
01343       if (!ast_strlen_zero(msg)) {
01344          char **tmp;
01345          eachlen[stackfr] = strlen(msg);
01346          if (!(tmp = ast_realloc(strings, strings_size + eachlen[stackfr] + 1))) {
01347             ast_free(strings);
01348             strings = NULL;
01349             break; /* out of stack frame iteration */
01350          }
01351          strings = tmp;
01352          strings[stackfr] = (char *) strings + strings_size;
01353          ast_copy_string(strings[stackfr], msg, eachlen[stackfr] + 1);
01354          strings_size += eachlen[stackfr] + 1;
01355       }
01356    }
01357 
01358    if (strings) {
01359       /* Recalculate the offset pointers */
01360       strings[0] = (char *) strings + num_frames * sizeof(*strings);
01361       for (stackfr = 1; stackfr < num_frames; stackfr++) {
01362          strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1] + 1;
01363       }
01364    }
01365 #else /* !defined(BETTER_BACKTRACES) */
01366    strings = backtrace_symbols(addresses, num_frames);
01367 #endif /* defined(BETTER_BACKTRACES) */
01368    return strings;
01369 }

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

Definition at line 414 of file logger.c.

References ast_free, ast_malloc, and option_verbose.

Referenced by launch_script().

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

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

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

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

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

Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __analog_handle_event(), __analog_ss_thread(), __ast_answer(), __ast_bridge_technology_register(), __ast_channel_alloc_ap(), __ast_channel_masquerade(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_data_register(), __ast_data_unregister(), __ast_format_register(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_register_translator(), __ast_request_and_dial(), __ast_smoother_feed(), __ast_string_field_init(), __ast_udptl_reload(), __ast_verbose_ap(), __attempt_transmit(), __auto_congest(), __dahdi_exception(), __find_callno(), __iax2_poke_noanswer(), __init_manager(), __mgcp_xmit(), __oh323_destroy(), __oh323_new(), __oh323_rtp_create(), __oh323_update_info(), __set_address_from_contact(), __sip_autodestruct(), __sip_pretend_ack(), __sip_reliable_xmit(), __sip_xmit(), __transmit_response(), __unload_module(), _analog_get_index(), _ast_odbc_request_obj2(), _ast_sockaddr_from_sin(), _ast_sockaddr_port(), _ast_sockaddr_set_port(), _ast_sockaddr_to_sin(), _dahdi_get_index(), _enum_array_map(), _extension_match_core(), _get_mohbyname(), _lookup_timer(), _macro_exec(), _moh_register(), _sip_tcp_helper_thread(), _while_exec(), accept_thread(), access_counter_file(), acf_channel_read(), acf_curl_helper(), acf_curlopt_helper(), acf_curlopt_write(), acf_cut_exec(), acf_cut_exec2(), acf_faxopt_read(), acf_faxopt_write(), acf_iaxvar_write(), acf_if(), acf_isexten_exec(), acf_jabberreceive_read(), acf_jabberstatus_read(), acf_mailbox_exists(), acf_meetme_info(), acf_odbc_read(), acf_odbc_write(), acf_sort_exec(), acf_strftime(), acf_strptime(), acf_transaction_write(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_hangup(), add_agent(), add_agi_cmd(), add_calltoken_ignore(), add_cc_call_info_to_response(), add_cfg_entry(), add_codec_to_answer(), add_content(), add_email_attachment(), add_event_to_list(), add_exten_to_pattern_tree(), add_extensions(), add_features_datastores(), add_header(), add_ie(), add_in_calls(), add_line(), add_out_calls(), add_publish_event(), add_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_subscribe_event(), add_to_agi(), add_user_extension(), admin_exec(), adsi_begin(), adsi_careful_send(), adsi_process(), adsi_prog(), advanced_options(), ael2_print(), aes_helper(), agent_answer(), agent_call(), agent_fixup(), agent_get_base_channel(), agent_indicate(), agent_new(), agent_read(), agent_request(), agent_set_base_channel(), agentmonitoroutgoing_exec(), agi_exec_full(), aji_act_hook(), aji_client_connect(), aji_client_info_handler(), aji_create_buddy(), aji_create_client(), aji_delete_node_list(), aji_devstate_cb(), aji_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_message(), aji_handle_presence(), aji_handle_pubsub_error(), aji_handle_pubsub_event(), aji_handle_subscribe(), aji_initialize(), aji_join_exec(), aji_leave_exec(), aji_load_config(), aji_mwi_cb(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), aji_send_raw_chat(), aji_sendgroup_exec(), aji_set_group_presence(), aji_set_presence(), aji_start_sasl(), aji_status_exec(), alarmreceiver_exec(), alloc_expr_node(), alloc_resampler(), alloc_sub(), alsa_card_init(), alsa_indicate(), alsa_new(), alsa_read(), alsa_request(), alsa_write(), analog_answer(), analog_attempt_transfer(), analog_call(), analog_exception(), analog_handle_init_event(), analog_hangup(), analog_request(), analog_ss_thread(), analogsub_to_dahdisub(), announce_thread(), answer_call(), anti_injection(), aoc_append_ie(), aoc_parse_ie(), app_exec(), append_ie(), apply_general_options(), apply_option(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_adsi_get_cpeid(), ast_adsi_get_cpeinfo(), ast_adsi_load_session(), ast_adsi_transmit_message_full(), ast_agi_register(), ast_agi_send(), ast_agi_unregister(), ast_ais_clm_load_module(), ast_ais_clm_unload_module(), ast_ais_evt_load_module(), ast_ais_evt_unload_module(), ast_aji_create_chat(), ast_aji_invite_chat(), ast_alaw_init(), ast_aoc_create(), ast_aoc_decode(), ast_aoc_encode(), ast_app_dtget(), ast_app_group_match_get_count(), ast_app_run_macro(), ast_append_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_timelimit(), ast_bt_create(), ast_bt_get_symbols(), ast_calendar_register(), ast_call_forward(), ast_careful_fwrite(), ast_carefulwrite(), ast_cc_get_param(), ast_cc_set_param(), ast_cdr_alloc(), ast_cdr_end(), ast_cdr_engine_init(), ast_cdr_merge(), ast_cdr_register(), ast_cdr_serialize_variables(), ast_cdr_setvar(), ast_cdr_submit_batch(), ast_cel_fill_record(), ast_cel_get_ama_flag_name(), ast_channel_audiohook_count_by_source(), ast_channel_audiohook_count_by_source_running(), ast_channel_bridge(), ast_channel_destructor(), ast_channel_log(), ast_channel_make_compatible_helper(), ast_channel_queryoption(), ast_channel_register(), ast_channel_setoption(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_check_signature(), ast_check_signature_bin(), ast_check_timing2(), ast_cli_perms_init(), ast_codec_get_len(), ast_codec_get_samples(), ast_config_engine_register(), ast_config_internal_load(), ast_connected_line_build_data(), ast_connected_line_parse_data(), ast_context_find_or_create(), ast_context_remove_extension_callerid2(), ast_context_verify_includes(), ast_data_get(), ast_data_retrieve(), ast_db_get(), ast_db_gettree(), ast_db_put(), ast_decrypt_bin(), ast_device_state_engine_init(), ast_do_masquerade(), ast_dsp_busydetect(), ast_dsp_call_progress(), ast_dsp_noise(), ast_dsp_process(), ast_dsp_silence(), ast_dtmf_stream(), ast_el_read_char(), ast_enable_distributed_devstate(), ast_enable_packet_fragmentation(), ast_encrypt_bin(), ast_event_cb(), ast_event_check_subscriber(), ast_event_get_cached(), ast_event_get_ie_pltype(), ast_event_get_ie_type_name(), ast_event_get_type_name(), ast_event_new(), ast_event_queue(), ast_event_queue_and_cache(), ast_event_subscribe_new(), ast_extension_close(), ast_fax_log(), ast_fax_state_to_str(), ast_filehelper(), ast_find_ourip(), ast_format_str_reduce(), ast_format_unregister(), ast_framehook_attach(), ast_func_read(), ast_func_read2(), ast_func_write(), ast_get_encoded_char(), ast_get_enum(), ast_get_group(), ast_handle_cc_control_frame(), ast_hangup(), ast_heap_create(), ast_http_send(), ast_iax2_new(), ast_include_new(), ast_indicate_data(), ast_io_remove(), ast_ivr_menu_run_internal(), ast_jb_put(), ast_linear_stream(), ast_lock_path_flock(), ast_lock_path_lockfile(), ast_logger_register_level(), ast_makesocket(), ast_manager_register_struct(), ast_manager_unregister(), ast_module_reload(), ast_moh_files_next(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), ast_netsock_bindaddr(), ast_netsock_set_qos(), ast_odbc_direct_execute(), ast_odbc_find_table(), ast_odbc_prepare_and_execute(), ast_odbc_sanity_check(), ast_odbc_smart_execute(), ast_openstream_full(), ast_openvstream(), ast_ouraddrfor(), ast_parse_allow_disallow(), ast_parse_digest(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_run_app(), ast_pbx_start(), ast_pickup_call(), ast_pktccops_gate_alloc(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_queue_cc_frame(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), ast_redirecting_build_data(), ast_redirecting_parse_data(), ast_register_application2(), ast_register_feature(), ast_register_switch(), ast_remotecontrol(), ast_request(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_engine_register2(), ast_rtp_glue_register2(), ast_rtp_instance_bridge(), ast_rtp_instance_early_bridge(), ast_rtp_instance_new(), ast_rtp_new(), ast_rtp_read(), ast_rtp_write(), ast_safe_fork(), ast_safe_system(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_es(), ast_say_date_with_format_fr(), ast_say_date_with_format_gr(), ast_say_date_with_format_he(), ast_say_date_with_format_it(), ast_say_date_with_format_nl(), ast_say_date_with_format_pl(), ast_say_date_with_format_pt(), ast_say_date_with_format_th(), ast_say_date_with_format_vi(), ast_say_date_with_format_zh(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_se(), ast_say_number_full_ur(), ast_say_number_full_zh(), ast_sched_del(), ast_sched_runq(), ast_sched_thread_create(), ast_search_dns(), ast_security_event_report(), ast_set_cc_offer_timer(), ast_set_cc_recall_timer(), ast_set_ccbs_available_timer(), ast_set_ccnr_available_timer(), ast_set_owners_and_peers(), ast_set_priority(), ast_set_qos(), ast_sign_bin(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_sockaddr_hash(), ast_sockaddr_parse(), ast_sockaddr_resolve(), ast_sockaddr_split_hostport(), ast_sockaddr_stringify_fmt(), ast_speech_register(), ast_srtp_change_source(), ast_srtp_policy_alloc(), ast_srtp_protect(), ast_stopstream(), ast_str_substitute_variables_full(), ast_streamfile(), ast_stun_request(), ast_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_tls_read_conf(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_tryconnect(), ast_udptl_bridge(), ast_udptl_new_with_bindaddr(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_wait_for_output(), ast_waitfor_nandfds(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_reconnect(), attempt_thread(), attempt_transfer(), audiohook_read_frame_both(), auth_credentials(), auth_exec(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), background_detect_exec(), base64_helper(), base_encode(), birdbath(), blr_ebl(), blr_txt(), board_setup(), bridge_array_add(), bridge_call_thread(), bridge_exec(), bridge_make_compatible(), bridge_p2p_rtp_write(), build_alias(), build_calendar(), build_callno_limits(), build_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_includes(), check_key(), check_label(), check_macro_returns(), check_month(), check_password(), check_post(), check_pval_item(), check_rtp_timeout(), check_srcaddr(), check_timerange(), check_tx_freq(), check_user_full(), check_vars(), check_via(), cleanup_connection(), clear_caller(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), cli_fax_show_session(), cli_fax_show_sessions(), close_call(), close_client(), close_mailbox(), collect_function_digits(), commit_exec(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_span_helper(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), confbridge_exec(), config_curl(), config_device(), config_function_read(), config_handler(), config_ldap(), config_line(), config_load(), config_module(), config_odbc(), config_parse_variables(), config_pgsql(), config_text_file_load(), connect_link(), connectedline_read(), connectedline_write(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), convertcap(), cops_connect(), cops_gate_cmd(), cops_sendmsg(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), count_lines(), create_addr(), create_dirpath(), create_jb(), create_match_char_tree(), create_new_socket(), create_queue_member(), create_video_frame(), create_vmaccount(), crement_function_read(), crypto_load(), csv_log(), csv_quote(), custom_log(), custom_prepare(), cut_internal(), dahdi_accept_r2_call_exec(), dahdi_answer(), dahdi_ast_cause_to_r2_cause(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_func_write(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_open(), dahdi_pri_error(), dahdi_pri_message(), dahdi_r2_disconnect_call(), dahdi_r2_get_channel_category(), dahdi_r2_get_link(), dahdi_r2_on_call_accepted(), dahdi_r2_on_call_init(), dahdi_r2_on_call_offered(), dahdi_r2_on_line_blocked(), dahdi_r2_on_line_idle(), dahdi_r2_on_os_error(), dahdi_r2_on_protocol_error(), dahdi_r2_set_context(), dahdi_r2_write_log(), dahdi_read(), dahdi_request(), dahdi_ring_phone(), dahdi_send_callrerouting_facility_exec(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_status_data_provider_get(), dahdi_test_timer(), dahdi_timer_set_rate(), dahdi_train_ec(), dahdi_translate(), dahdi_version_data_provider_get(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dahdiscan_exec(), data_channels_provider_handler(), data_result_generate(), data_result_generate_node(), data_search_generate(), data_structure_compatible(), dbinit(), deadagi_exec(), dec_init(), del_exec(), delete_old_messages(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_pval_item(), destroy_session(), destroy_trans(), determine_starting_point(), device2chan(), device_state_cb(), devstate_cache_cb(), devstate_change_collector_cb(), devstate_write(), dial_exec_full(), dial_handle_playtones(), dialgroup_read(), dialgroup_write(), dialog_ref_debug(), dictate_exec(), digitcollect(), digitdirect(), directory_exec(), disa_exec(), disable_jack_hook(), disable_t38(), diskavail(), dispatch_thread_handler(), display_last_error(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_dtmf_local(), do_forward(), do_idle_thread(), do_magic_pickup(), do_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(), filter(), finalize_content(), find_account(), find_cache(), find_call_locked(), find_conf(), find_desc(), find_desc_usb(), find_details(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), find_or_create_details(), find_pval_goto_item(), find_queue_by_name_rt(), find_sdp(), find_speeddial_by_instance(), find_subchannel_and_lock(), find_subchannel_by_instance_reference(), find_subchannel_by_name(), find_subchannel_by_reference(), find_table(), find_transaction(), find_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), flush_telem(), fn_wrapper(), forkcdr_exec(), forward_message(), framein(), func_args(), func_channel_read(), func_channel_write_real(), func_channels_read(), func_check_sipdomain(), func_header_read(), func_inheritance_write(), function_agent(), function_autopatchup(), function_cop(), function_db_delete(), function_db_exists(), function_db_read(), function_db_write(), function_enum(), function_eval(), function_eval2(), function_fieldnum_helper(), function_ilink(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_remote(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g719read(), g719write(), g723_len(), g723_read(), g723_write(), g726_read(), g726_write(), g729_read(), g729_write(), generic_execute(), generic_fax_exec(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_canmatch_exten(), get_crypto_attrib(), get_destination(), get_domain(), get_ewscal_ids_for(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_mem_set(), get_member_penalty(), get_params(), get_range(), get_rdnis(), get_refer_info(), get_timerange(), get_to_address(), get_token(), get_unused_callno(), getdisplaybyname(), getflagbyname(), getkeybyname(), getstatebyname(), getsubbyname(), gosub_exec(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_function_write(), gsm_read(), gsm_seek(), gsm_write(), gsmtolin_framein(), gtalk_alloc(), gtalk_call(), gtalk_create_candidates(), gtalk_create_member(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_invite(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_ringing_ack(), gtalk_sendhtml(), gtalk_sendtext(), gtalk_show_channels(), gtalk_update_externip(), gtalk_update_stun(), gtalk_write(), gui_init(), h261_decap(), h263_decap(), h263_encap(), h263_open(), h263_read(), h263_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), h264_write(), handle_alarms(), handle_call_token(), handle_callforward_button(), handle_capabilities_res_message(), handle_cc_subscribe(), handle_clear_alarms(), handle_cli_agi_add_cmd(), handle_cli_h323_cycle_gk(), handle_cli_indication_add(), handle_cli_indication_remove(), handle_command_response(), handle_common_options(), handle_devstate_change(), handle_enbloc_call_message(), handle_error(), handle_exec(), handle_getoption(), handle_gosub(), handle_hd_hf(), handle_incoming(), handle_init_event(), handle_input(), handle_invite_replaces(), handle_jack_audio(), handle_keypad_button_message(), handle_link_data(), handle_message(), handle_mousedown(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_orig(), handle_playtones(), handle_recordfile(), handle_register_message(), handle_remote_data(), handle_remote_dtmf_digit(), handle_request(), handle_request_bye(), handle_request_do(), handle_request_info(), handle_request_invite(), handle_request_notify(), handle_request_options(), handle_request_publish(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_response_notify(), handle_response_peerpoke(), handle_response_publish(), handle_response_refer(), handle_response_register(), handle_response_subscribe(), handle_response_update(), handle_soft_key_event_message(), handle_stimulus_message(), handle_t38_options(), handle_tcptls_connection(), handle_transfer_button(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hidthread(), hint_read(), iax2_ack_registry(), iax2_call(), iax2_canmatch(), iax2_devicestate(), iax2_do_register(), iax2_dup_variable_datastore(), iax2_exec(), iax2_exists(), iax2_fixup(), iax2_hangup(), iax2_matchmore(), iax2_poke_peer(), iax2_prov_app(), iax2_read(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_template_parse(), ic706_pltocode(), ical_load_calendar(), icalendar_add_event(), icalendar_update_events(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), ilbc_write(), ilbctolin_framein(), import_ch(), in_band_indication(), increase_call_count(), init_acf_query(), init_app_class(), init_jack_data(), init_req(), init_resp(), init_timing_thread(), initialize_cc_max_requests(), inotify_daemon(), inprocess_count(), insert_penaltychange(), inspect_module(), internal_ao2_ref(), INTERNAL_OBJ(), invent_message(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jack_hook_callback(), jack_hook_write(), jb_error_output(), jb_get_and_deliver(), jb_warning_output(), jingle_alloc(), jingle_call(), jingle_create_candidates(), jingle_create_member(), jingle_digit(), jingle_free_pvt(), jingle_handle_dtmf(), jingle_hangup_farend(), jingle_indicate(), jingle_is_answered(), jingle_load_config(), jingle_new(), jingle_newcall(), jingle_parser(), jingle_request(), jingle_sendhtml(), jingle_sendtext(), jingle_show_channels(), jingle_write(), join_conference_bridge(), join_queue(), jpeg_read_image(), jpeg_write_image(), key_call(), Keyfavorite(), keypad_cfg_read(), keypad_pick_up(), keypad_setup(), keypad_toggle(), kickptt(), kp_match_area(), kqueue_timer_open(), launch_asyncagi(), launch_ha_netscript(), launch_monitor_thread(), launch_netscript(), launch_script(), launch_service(), ldap_loadentry(), ldap_reconnect(), leave_voicemail(), linear_alloc(), linear_generator(), linear_release(), linkcount(), lintogsm_framein(), lintolpc10_framein(), lintoulaw(), listener(), listfilter(), load_column_config(), load_config(), load_config_meetme(), load_dynamic_module(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_pktccops_config(), load_realtime_queue(), load_resource(), load_resource_list(), load_rpt_vars(), load_tech_calendars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_start(), local_call(), local_devicestate(), local_dtmf_helper(), local_fixup(), local_new(), local_queue_frame(), local_setoption(), local_write(), lock_info_destroy(), log_exec(), log_jack_status(), log_show_lock(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), lua_read_extensions_file(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manage_parkinglot(), manager_log(), manager_modulecheck(), manager_show_dialplan_helper(), manager_sipnotify(), map_video_codec(), masq_park_call(), matchmore(), math(), md5(), measurenoise(), meetmemute(), memcpy_decrypt(), memcpy_encrypt(), message_template_build(), message_template_parse_emailbody(), message_template_parse_filebody(), mfcr2_monitor(), mgcp_call(), mgcp_fixup(), mgcp_indicate(), mgcp_new(), mgcp_reload(), mgcp_request(), mgcp_rtp_read(), mgcp_senddigit_begin(), mgcp_senddigit_end(), mgcp_ss(), mgcp_write(), mgcpsock_read(), milliwatt_generate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_delete_exec(), minivm_greet_exec(), minivm_mwi_exec(), minivm_notify_exec(), minivm_record_exec(), misdn_answer(), misdn_bridge(), misdn_call(), misdn_cfg_get(), misdn_cfg_get_config_string(), misdn_cfg_init(), misdn_cfg_is_msn_valid(), misdn_cfg_update_ptp(), misdn_check_l2l1(), misdn_digit_end(), misdn_facility_exec(), misdn_hangup(), misdn_indication(), misdn_new(), misdn_request(), misdn_send_text(), misdn_set_opt_exec(), misdn_write(), mixmonitor_exec(), mixmonitor_thread(), mkif(), moh_alloc(), moh_class_destructor(), moh_files_generator(), moh_files_release(), moh_generate(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), mssql_connect(), multicast_rtp_write(), multicast_send_control_packet(), multiplexed_bridge_create(), multiplexed_nudge(), multiplexed_thread_function(), mute_add_audiohook(), mute_fragment(), mwi_send_init(), mwi_send_process_buffer(), mwi_send_process_event(), mwi_sub_event_cb(), mwi_thread(), my_all_subchannels_hungup(), my_callwait(), my_dial_digits(), my_distinctive_ring(), my_dsp_set_digitmode(), my_get_callerid(), my_handle_dchan_exception(), my_handle_dtmf(), my_handle_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_exec_full(), park_space_reserve(), parkandannounce_exec(), 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(), ParseBookmark(), parsing(), party_id_build_data(), party_id_write(), party_name_build_data(), party_name_write(), party_number_build_data(), party_number_write(), party_subaddress_build_data(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_hangup(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_saynumber(), pbx_builtin_serialize_variables(), pbx_builtin_setvar(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_exec(), pbx_extension_helper(), pbx_find_extension(), pbx_load_config(), pbx_load_module(), pbx_load_users(), pbx_parseable_goto(), pbx_substitute_variables_helper_full(), pcm_read(), pcm_seek(), pcm_write(), peek_read(), peer_iphash_cb(), peer_set_srcaddr(), peercnt_add(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_do(), pickup_exec(), pickupchan_exec(), pidf_validate_presence(), pidf_validate_tuple(), pitchshift_helper(), pktccops_add_ippool(), play_message(), play_message_category(), play_message_datetime(), play_message_in_bridged_call(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), policy_set_suite(), pop_exec(), post_raw(), powerof(), pp_each_extension_helper(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), prepare_pri(), pri_active_dchan_index(), pri_check_restart(), pri_create_spanmap(), pri_create_trunkgroup(), pri_dchannel(), pri_fixup_principle(), pri_resolve_span(), pri_send_callrerouting_facility_exec(), pri_ss_thread(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_ast_dsp(), process_cn_rfc3389(), process_crypto(), process_dahdi(), process_dtmf_rfc2833(), process_echocancel(), process_message_callback(), process_opcode(), process_request(), process_returncode(), process_sdp(), process_sdp_a_audio(), process_sdp_c(), process_sdp_o(), process_text_line(), 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_pgsql(), realtime_require_handler(), realtime_store_handler(), realtime_update2_handler(), realtime_update_handler(), realtimefield_read(), receive_digit(), receive_message(), receivefax_exec(), receivefax_t38_init(), record_exec(), redirecting_read(), redirecting_write(), refresh_list(), reg_source_db(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_config(), reload_firmware(), reload_followme(), reload_logger(), reload_module(), reload_queue_members(), reload_queue_rules(), reload_queues(), reload_single_member(), reload_single_queue(), remote_bridge_loop(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), replace(), replace_callno(), reply_digest(), require_curl(), require_odbc(), require_pgsql(), res_srtp_new(), resample_frame(), reset_conf(), resolve_first(), 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(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_ews_request_and_parse(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_usb_txt(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendfax_exec(), sendfax_t38_init(), sendimage_exec(), sendkenwood(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), serial_remote_io(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_ctcss_mode_ic706(), set_destination(), set_fax_t38_caps(), set_format(), set_freq_ic706(), set_full_cmd(), set_ic706(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_mode_ic706(), set_moh_exec(), set_offset_ic706(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setdtr(), setflag(), setformat(), setrem(), setup_dahdi_int(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_srtp(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), shift_pop(), show_dialplan_helper(), showdisplay(), showkeys(), sig_pri_call(), sig_pri_chan_alarm_notify(), sig_pri_digit_begin(), sig_pri_get_orig_dialstring(), sig_pri_handle_hold(), sig_pri_handle_subcmds(), sig_pri_hangup(), sig_pri_indicate(), sig_pri_request(), sig_pri_start_pri(), sip_addheader(), sip_alloc(), 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_park(), sip_park_thread(), sip_pidf_validate(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_read(), sip_reg_timeout(), sip_register(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_sipredirect(), sip_st_alloc(), sip_subscribe_mwi(), sip_tcptls_write(), sip_threadinfo_create(), sip_write(), sipsock_read(), siren14read(), siren14write(), siren7read(), siren7write(), skel_exec(), skinny_call(), skinny_fixup(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), skinny_transfer(), skinny_write(), sla_add_trunk_to_station(), sla_build_station(), sla_build_trunk(), sla_load_config(), sla_queue_event_conf(), sla_state(), sla_station_exec(), sla_trunk_exec(), slinear_read(), slinear_write(), smdi_load(), smdi_msg_read(), smdi_msg_retrieve_read(), smdi_read(), smdi_toggle_mwi(), smoother_frame_feed(), sms_exec(), sms_generate(), sms_handleincoming(), sms_messagerx2(), sms_process(), sms_readfile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), soundcard_init(), soundcard_writeframe(), span_message(), spandsp_fax_new(), spandsp_fax_start(), spandsp_fax_write(), spandsp_log(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite_log(), srv_datastore_setup(), srv_query_read(), srv_result_read(), ssl_lock(), ssl_verify(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_rtp(), start_session_timer(), start_spying(), start_stream(), startelm(), starttimer(), statpost(), stop_session_timer(), store_boost(), store_by_peercallno(), store_by_transfercallno(), store_config(), store_config_core(), store_curl(), store_digit(), store_mixer(), store_odbc(), store_pgsql(), store_rxcdtype(), store_rxdemod(), store_rxsdtype(), store_tone_zone_ring_cadence(), store_txmixa(), store_txmixb(), store_txtoctype(), str_to_agent_policy(), str_to_monitor_policy(), stun_monitor_request(), stun_start_monitor(), stun_stop_monitor(), subscribe_event_destroy(), subscript(), substitute_escapes(), swap_subs(), switch_video_out(), sysinfo_helper(), syslog_log(), system_exec_helper(), t38_tx_packet_handler(), tdd_feed(), tdd_new(), tds_error_handler(), tds_load_module(), tds_log(), tds_message_handler(), telem_lookup(), testclient_exec(), testserver_exec(), timed_read(), timeout_read(), timeout_write(), timerfd_timer_ack(), timerfd_timer_close(), timerfd_timer_disable_continuous(), timerfd_timer_enable_continuous(), timerfd_timer_get_event(), timerfd_timer_open(), timerfd_timer_set_rate(), timezone_add(), to_number(), to_string(), tonepair_alloc(), tonepair_generator(), tps_processing_function(), tps_taskprocessor_destroy(), tps_taskprocessor_pop(), transfer_exec(), TransferCallStep1(), transmit(), transmit_audio(), transmit_cc_notify(), transmit_invite(), transmit_refer(), transmit_register(), transmit_request_with_auth(), transmit_response(), transmit_response_using_temp(), transmit_response_with_auth(), transmit_response_with_sdp(), transmit_response_with_t38_sdp(), transmit_state_notify(), transmit_t38(), try_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), turn_on_off(), tvfix(), txt_callback(), unalloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), unistim_request(), unistim_rtp_read(), unistim_senddigit_end(), unistim_sendtext(), unistim_ss(), unistim_write(), unistimsock_read(), unload_module(), unlock_read(), unref_mansession(), unregister_exten(), unshift_push(), update2_curl(), update2_ldap(), update2_odbc(), update2_pgsql(), update2_prepare(), update_call_counter(), update_common_options(), update_config(), update_curl(), update_header(), update_key(), update_ldap(), update_modem_bits(), update_odbc(), update_pgsql(), update_registry(), update_scoreboard(), update_stats(), upqm_exec(), uridecode(), uriencode(), usbradio_fixup(), usbradio_indicate(), usbradio_new(), usbradio_read(), usbradio_request(), usbradio_text(), usbradio_write(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_check_password_shell(), vm_exec(), vm_execmain(), vm_intro(), vm_newuser(), vm_options(), vmsayname_exec(), vox_read(), vox_write(), wait_file(), wait_file2(), wait_for_winner(), wait_interval(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_write(), write_byte(), write_cdr(), write_header(), write_history(), write_password_to_file(), write_stream(), writefile(), xmldoc_build_field(), xmldoc_get_syntax_fun(), xmldoc_string_cleanup(), xmldoc_string_wrap(), xpmr_config(), yyerror(), and yyparse().

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

static void ast_log_vsyslog ( struct logmsg msg  )  [static]

Definition at line 878 of file logger.c.

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

Referenced by logger_print_normal().

00879 {
00880    char buf[BUFSIZ];
00881    int syslog_level = ast_syslog_priority_from_loglevel(msg->level);
00882 
00883    if (syslog_level < 0) {
00884       /* we are locked here, so cannot ast_log() */
00885       fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level);
00886       return;
00887    }
00888 
00889    snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s",
00890        levels[msg->level], msg->process_id, msg->file, msg->line, msg->function, msg->message);
00891 
00892    term_strip(buf, buf, strlen(buf) + 1);
00893    syslog(syslog_level, "%s", buf);
00894 }

int ast_logger_register_level ( const char *  name  ) 

Register a new logger level.

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 1510 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().

01511 {
01512    unsigned int level;
01513    unsigned int available = 0;
01514 
01515    AST_RWLIST_WRLOCK(&logchannels);
01516 
01517    for (level = 0; level < ARRAY_LEN(levels); level++) {
01518       if ((level >= 16) && !available && !levels[level]) {
01519          available = level;
01520          continue;
01521       }
01522 
01523       if (levels[level] && !strcasecmp(levels[level], name)) {
01524          ast_log(LOG_WARNING,
01525             "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n",
01526             name);
01527          AST_RWLIST_UNLOCK(&logchannels);
01528 
01529          return -1;
01530       }
01531    }
01532 
01533    if (!available) {
01534       ast_log(LOG_WARNING,
01535          "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n",
01536          name);
01537       AST_RWLIST_UNLOCK(&logchannels);
01538 
01539       return -1;
01540    }
01541 
01542    levels[available] = ast_strdup(name);
01543 
01544    AST_RWLIST_UNLOCK(&logchannels);
01545 
01546    ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available);
01547 
01548    update_logchannels();
01549 
01550    return available;
01551 }

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

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

Referenced by load_module(), and unload_module().

01554 {
01555    unsigned int found = 0;
01556    unsigned int x;
01557 
01558    AST_RWLIST_WRLOCK(&logchannels);
01559 
01560    for (x = 16; x < ARRAY_LEN(levels); x++) {
01561       if (!levels[x]) {
01562          continue;
01563       }
01564 
01565       if (strcasecmp(levels[x], name)) {
01566          continue;
01567       }
01568 
01569       found = 1;
01570       break;
01571    }
01572 
01573    if (found) {
01574       /* take this level out of the global_logmask, to ensure that no new log messages
01575        * will be queued for it
01576        */
01577 
01578       global_logmask &= ~(1 << x);
01579 
01580       free(levels[x]);
01581       levels[x] = NULL;
01582       AST_RWLIST_UNLOCK(&logchannels);
01583 
01584       ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x);
01585 
01586       update_logchannels();
01587    } else {
01588       AST_RWLIST_UNLOCK(&logchannels);
01589    }
01590 }

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

Definition at line 463 of file logger.c.

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

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

00464 {
00465    va_list ap;
00466    struct timeval tv;
00467    struct ast_tm tm;
00468    char qlog_msg[8192];
00469    int qlog_len;
00470    char time_str[30];
00471 
00472    if (!queuelog_init) {
00473       queuelog_init = 1;
00474       logger_queue_init();
00475    }
00476 
00477    if (ast_check_realtime("queue_log")) {
00478       tv = ast_tvnow();
00479       ast_localtime(&tv, &tm, NULL);
00480       ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm);
00481       va_start(ap, fmt);
00482       vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
00483       va_end(ap);
00484       if (logfiles.queue_adaptive_realtime) {
00485          AST_DECLARE_APP_ARGS(args,
00486             AST_APP_ARG(data)[5];
00487          );
00488          AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|');
00489          /* Ensure fields are large enough to receive data */
00490          ast_realtime_require_field("queue_log", "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")),
00491             "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")),
00492             "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")),
00493             "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")),
00494             "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")),
00495             SENTINEL);
00496 
00497          /* Store the log */
00498          ast_store_realtime("queue_log", "time", time_str,
00499             "callid", callid,
00500             "queuename", queuename,
00501             "agent", agent,
00502             "event", event,
00503             "data1", S_OR(args.data[0], ""),
00504             "data2", S_OR(args.data[1], ""),
00505             "data3", S_OR(args.data[2], ""),
00506             "data4", S_OR(args.data[3], ""),
00507             "data5", S_OR(args.data[4], ""),
00508             SENTINEL);
00509       } else {
00510          ast_store_realtime("queue_log", "time", time_str,
00511             "callid", callid,
00512             "queuename", queuename,
00513             "agent", agent,
00514             "event", event,
00515             "data", qlog_msg,
00516             SENTINEL);
00517       }
00518 
00519       if (!logfiles.queue_log_to_file) {
00520          return;
00521       }
00522    }
00523 
00524    if (qlog) {
00525       va_start(ap, fmt);
00526       qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
00527       vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
00528       va_end(ap);
00529       AST_RWLIST_RDLOCK(&logchannels);
00530       if (qlog) {
00531          fprintf(qlog, "%s\n", qlog_msg);
00532          fflush(qlog);
00533       }
00534       AST_RWLIST_UNLOCK(&logchannels);
00535    }
00536 }

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

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

01461 {
01462    struct verb *verb;
01463 
01464    if (!(verb = ast_malloc(sizeof(*verb))))
01465       return -1;
01466 
01467    verb->verboser = v;
01468 
01469    AST_RWLIST_WRLOCK(&verbosers);
01470    AST_RWLIST_INSERT_HEAD(&verbosers, verb, list);
01471    AST_RWLIST_UNLOCK(&verbosers);
01472    
01473    return 0;
01474 }

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

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

01477 {
01478    struct verb *cur;
01479 
01480    AST_RWLIST_WRLOCK(&verbosers);
01481    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) {
01482       if (cur->verboser == v) {
01483          AST_RWLIST_REMOVE_CURRENT(list);
01484          ast_free(cur);
01485          break;
01486       }
01487    }
01488    AST_RWLIST_TRAVERSE_SAFE_END;
01489    AST_RWLIST_UNLOCK(&verbosers);
01490    
01491    return cur ? 0 : -1;
01492 }

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

Definition at line 1451 of file logger.c.

References __ast_verbose_ap().

01452 {
01453    va_list ap;
01454 
01455    va_start(ap, fmt);
01456    __ast_verbose_ap("", 0, "", fmt, ap);
01457    va_end(ap);
01458 }

void close_logger ( void   ) 

Provided by logger.c

Definition at line 1065 of file logger.c.

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

Referenced by quit_handler().

01066 {
01067    struct logchannel *f = NULL;
01068 
01069    /* Stop logger thread */
01070    AST_LIST_LOCK(&logmsgs);
01071    close_logger_thread = 1;
01072    ast_cond_signal(&logcond);
01073    AST_LIST_UNLOCK(&logmsgs);
01074 
01075    if (logthread != AST_PTHREADT_NULL)
01076       pthread_join(logthread, NULL);
01077 
01078    AST_RWLIST_WRLOCK(&logchannels);
01079 
01080    if (qlog) {
01081       fclose(qlog);
01082       qlog = NULL;
01083    }
01084 
01085    AST_RWLIST_TRAVERSE(&logchannels, f, list) {
01086       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
01087          fclose(f->fileptr);
01088          f->fileptr = NULL;
01089       }
01090    }
01091 
01092    closelog(); /* syslog */
01093 
01094    AST_RWLIST_UNLOCK(&logchannels);
01095 
01096    return;
01097 }

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

Definition at line 734 of file logger.c.

References ast_cli(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, reload_logger(), and ast_cli_entry::usage.

00735 {
00736    switch (cmd) {
00737    case CLI_INIT:
00738       e->command = "logger reload";
00739       e->usage = 
00740          "Usage: logger reload\n"
00741          "       Reloads the logger subsystem state.  Use after restarting syslogd(8) if you are using syslog logging.\n";
00742       return NULL;
00743    case CLI_GENERATE:
00744       return NULL;
00745    }
00746    if (reload_logger(0)) {
00747       ast_cli(a->fd, "Failed to reload the logger\n");
00748       return CLI_FAILURE;
00749    }
00750    return CLI_SUCCESS;
00751 }

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

Definition at line 753 of file logger.c.

References ast_cli(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, reload_logger(), and ast_cli_entry::usage.

00754 {
00755    switch (cmd) {
00756    case CLI_INIT:
00757       e->command = "logger rotate";
00758       e->usage = 
00759          "Usage: logger rotate\n"
00760          "       Rotates and Reopens the log files.\n";
00761       return NULL;
00762    case CLI_GENERATE:
00763       return NULL;   
00764    }
00765    if (reload_logger(1)) {
00766       ast_cli(a->fd, "Failed to reload the logger and rotate log files\n");
00767       return CLI_FAILURE;
00768    } 
00769    return CLI_SUCCESS;
00770 }

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

Definition at line 772 of file logger.c.

References ast_cli_args::argc, ast_cli_args::argv, ARRAY_LEN, ast_cli(), ast_console_toggle_loglevel(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, levels, and ast_cli_entry::usage.

00773 {
00774    int x;
00775    int state;
00776    int level = -1;
00777 
00778    switch (cmd) {
00779    case CLI_INIT:
00780       e->command = "logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}";
00781       e->usage = 
00782          "Usage: logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n"
00783          "       Set a specific log level to enabled/disabled for this console.\n";
00784       return NULL;
00785    case CLI_GENERATE:
00786       return NULL;
00787    }
00788 
00789    if (a->argc < 5)
00790       return CLI_SHOWUSAGE;
00791 
00792    AST_RWLIST_WRLOCK(&logchannels);
00793 
00794    for (x = 0; x < ARRAY_LEN(levels); x++) {
00795       if (levels[x] && !strcasecmp(a->argv[3], levels[x])) {
00796          level = x;
00797          break;
00798       }
00799    }
00800 
00801    AST_RWLIST_UNLOCK(&logchannels);
00802 
00803    state = ast_true(a->argv[4]) ? 1 : 0;
00804 
00805    if (level != -1) {
00806       ast_console_toggle_loglevel(a->fd, level, state);
00807       ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off");
00808    } else
00809       return CLI_SHOWUSAGE;
00810 
00811    return CLI_SUCCESS;
00812 }

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

CLI command to show logging system configuration.

Definition at line 815 of file logger.c.

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

00816 {
00817 #define FORMATL   "%-35.35s %-8.8s %-9.9s "
00818    struct logchannel *chan;
00819    switch (cmd) {
00820    case CLI_INIT:
00821       e->command = "logger show channels";
00822       e->usage = 
00823          "Usage: logger show channels\n"
00824          "       List configured logger channels.\n";
00825       return NULL;
00826    case CLI_GENERATE:
00827       return NULL;   
00828    }
00829    ast_cli(a->fd, FORMATL, "Channel", "Type", "Status");
00830    ast_cli(a->fd, "Configuration\n");
00831    ast_cli(a->fd, FORMATL, "-------", "----", "------");
00832    ast_cli(a->fd, "-------------\n");
00833    AST_RWLIST_RDLOCK(&logchannels);
00834    AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
00835       unsigned int level;
00836 
00837       ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"),
00838          chan->disabled ? "Disabled" : "Enabled");
00839       ast_cli(a->fd, " - ");
00840       for (level = 0; level < ARRAY_LEN(levels); level++) {
00841          if ((chan->logmask & (1 << level)) && levels[level]) {
00842             ast_cli(a->fd, "%s ", levels[level]);
00843          }
00844       }
00845       ast_cli(a->fd, "\n");
00846    }
00847    AST_RWLIST_UNLOCK(&logchannels);
00848    ast_cli(a->fd, "\n");
00849 
00850    return CLI_SUCCESS;
00851 }

int init_logger ( void   ) 

Provided by logger.c

Definition at line 1042 of file logger.c.

References ARRAY_LEN, ast_cli_register_multiple(), ast_cond_destroy, ast_cond_init, ast_config_AST_LOG_DIR, ast_mkdir(), ast_pthread_create, cli_logger, init_logger_chain(), logcond, logger_thread(), and logthread.

Referenced by main().

01043 {
01044    /* auto rotate if sig SIGXFSZ comes a-knockin */
01045    sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL);
01046 
01047    /* start logger thread */
01048    ast_cond_init(&logcond, NULL);
01049    if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) {
01050       ast_cond_destroy(&logcond);
01051       return -1;
01052    }
01053 
01054    /* register the logger cli commands */
01055    ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger));
01056 
01057    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
01058 
01059    /* create log channels */
01060    init_logger_chain(0 /* locked */);
01061 
01062    return 0;
01063 }

static void init_logger_chain ( int  locked  )  [static]

Definition at line 295 of file logger.c.

References __LOG_ERROR, __LOG_NOTICE, __LOG_WARNING, ast_calloc, ast_config_load2(), ast_copy_string(), ast_free, AST_RWLIST_INSERT_HEAD, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), ast_variable_browse(), ast_variable_retrieve(), config_flags, CONFIG_STATUS_FILEINVALID, errno, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ROTATE, SEQUENTIAL, TIMESTAMP, and var.

Referenced by init_logger(), and reload_logger().

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

static void logger_print_normal ( struct logmsg logmsg  )  [static]

Print a normal log message to the channels.

Definition at line 897 of file logger.c.

References __LOG_VERBOSE, ast_console_puts_mutable(), ast_log_vsyslog(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdupa, ast_string_field_set, ast_strlen_zero(), ast_verb, COLOR_BRWHITE, colors, logmsg::date, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, logmsg::file, logchannel::filename, logchannel::fileptr, logmsg::function, logmsg::level, logmsg::level_name, logmsg::line, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::message, logmsg::process_id, reload_logger(), term_color(), term_strip(), logchannel::type, and verb::verboser.

Referenced by ast_log(), and logger_thread().

00898 {
00899    struct logchannel *chan = NULL;
00900    char buf[BUFSIZ];
00901    struct verb *v = NULL;
00902 
00903    if (logmsg->level == __LOG_VERBOSE) {
00904       char *tmpmsg = ast_strdupa(logmsg->message + 1);
00905       /* Iterate through the list of verbosers and pass them the log message string */
00906       AST_RWLIST_RDLOCK(&verbosers);
00907       AST_RWLIST_TRAVERSE(&verbosers, v, list)
00908          v->verboser(logmsg->message);
00909       AST_RWLIST_UNLOCK(&verbosers);
00910       ast_string_field_set(logmsg, message, tmpmsg);
00911    }
00912 
00913    AST_RWLIST_RDLOCK(&logchannels);
00914 
00915    if (!AST_RWLIST_EMPTY(&logchannels)) {
00916       AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
00917          /* If the channel is disabled, then move on to the next one */
00918          if (chan->disabled)
00919             continue;
00920          /* Check syslog channels */
00921          if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) {
00922             ast_log_vsyslog(logmsg);
00923          /* Console channels */
00924          } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) {
00925             char linestr[128];
00926             char tmp1[80], tmp2[80], tmp3[80], tmp4[80];
00927 
00928             /* If the level is verbose, then skip it */
00929             if (logmsg->level == __LOG_VERBOSE)
00930                continue;
00931 
00932             /* Turn the numerical line number into a string */
00933             snprintf(linestr, sizeof(linestr), "%d", logmsg->line);
00934             /* Build string to print out */
00935             snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s",
00936                 logmsg->date,
00937                 term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)),
00938                 logmsg->process_id,
00939                 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)),
00940                 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
00941                 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)),
00942                 logmsg->message);
00943             /* Print out */
00944             ast_console_puts_mutable(buf, logmsg->level);
00945          /* File channels */
00946          } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) {
00947             int res = 0;
00948 
00949             /* If no file pointer exists, skip it */
00950             if (!chan->fileptr) {
00951                continue;
00952             }
00953 
00954             /* Print out to the file */
00955             res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s",
00956                      logmsg->date, logmsg->level_name, logmsg->process_id, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ));
00957             if (res <= 0 && !ast_strlen_zero(logmsg->message)) {
00958                fprintf(stderr, "**** Asterisk Logging Error: ***********\n");
00959                if (errno == ENOMEM || errno == ENOSPC)
00960                   fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename);
00961                else
00962                   fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno));
00963                manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno));
00964                chan->disabled = 1;
00965             } else if (res > 0) {
00966                fflush(chan->fileptr);
00967             }
00968          }
00969       }
00970    } else if (logmsg->level != __LOG_VERBOSE) {
00971       fputs(logmsg->message, stdout);
00972    }
00973 
00974    AST_RWLIST_UNLOCK(&logchannels);
00975 
00976    /* If we need to reload because of the file size, then do so */
00977    if (filesize_reload_needed) {
00978       reload_logger(-1);
00979       ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n");
00980    }
00981 
00982    return;
00983 }

static void logger_queue_init ( void   )  [static]

Definition at line 1024 of file logger.c.

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

Referenced by ast_queue_log().

01025 {
01026    /* Preloaded modules are up. */
01027    ast_unload_realtime("queue_log");
01028    if (logfiles.queue_log && ast_check_realtime("queue_log")) {
01029       if (!ast_realtime_require_field("queue_log",
01030             "time", RQ_DATETIME, 26, "data1", RQ_CHAR, 20,
01031             "data2", RQ_CHAR, 20, "data3", RQ_CHAR, 20,
01032             "data4", RQ_CHAR, 20, "data5", RQ_CHAR, 20, SENTINEL)) {
01033          logfiles.queue_adaptive_realtime = 1;
01034       } else {
01035          logfiles.queue_adaptive_realtime = 0;
01036       }
01037    }
01038 
01039    ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", "");
01040 }

int logger_reload ( void   ) 

Reload logger without rotating log files.

Definition at line 726 of file logger.c.

References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.

00727 {
00728    if (reload_logger(0)) {
00729       return RESULT_FAILURE;
00730    }
00731    return RESULT_SUCCESS;
00732 }

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

Actual logging thread.

Definition at line 986 of file logger.c.

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

Referenced by init_logger().

00987 {
00988    struct logmsg *next = NULL, *msg = NULL;
00989 
00990    for (;;) {
00991       /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */
00992       AST_LIST_LOCK(&logmsgs);
00993       if (AST_LIST_EMPTY(&logmsgs)) {
00994          if (close_logger_thread) {
00995             break;
00996          } else {
00997             ast_cond_wait(&logcond, &logmsgs.lock);
00998          }
00999       }
01000       next = AST_LIST_FIRST(&logmsgs);
01001       AST_LIST_HEAD_INIT_NOLOCK(&logmsgs);
01002       AST_LIST_UNLOCK(&logmsgs);
01003 
01004       /* Otherwise go through and process each message in the order added */
01005       while ((msg = next)) {
01006          /* Get the next entry now so that we can free our current structure later */
01007          next = AST_LIST_NEXT(msg, list);
01008 
01009          /* Depending on the type, send it to the proper function */
01010          logger_print_normal(msg);
01011 
01012          /* Free the data since we are done */
01013          ast_free(msg);
01014       }
01015 
01016       /* If we should stop, then stop */
01017       if (close_logger_thread)
01018          break;
01019    }
01020 
01021    return NULL;
01022 }

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

Definition at line 218 of file logger.c.

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

Referenced by make_logchannel(), and update_logchannels().

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

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

Definition at line 242 of file logger.c.

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

Referenced by init_logger_chain().

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

static int reload_logger ( int  rotate  )  [static]

Definition at line 628 of file logger.c.

References ast_check_realtime(), ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_queue_log(), ast_realtime_require_field(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_unload_realtime(), ast_verb, errno, EVENT_FLAG_SYSTEM, f, init_logger_chain(), logchannel::list, LOG_ERROR, logfiles, manager_event, qlog, rotate_file(), RQ_CHAR, RQ_DATETIME, and SENTINEL.

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

00629 {
00630    char old[PATH_MAX] = "";
00631    int queue_rotate = rotate;
00632    struct logchannel *f;
00633    int res = 0;
00634 
00635    AST_RWLIST_WRLOCK(&logchannels);
00636 
00637    if (qlog) {
00638       if (rotate < 0) {
00639          /* Check filesize - this one typically doesn't need an auto-rotate */
00640          if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */
00641             fclose(qlog);
00642             qlog = NULL;
00643          } else {
00644             queue_rotate = 0;
00645          }
00646       } else {
00647          fclose(qlog);
00648          qlog = NULL;
00649       }
00650    } else {
00651       queue_rotate = 0;
00652    }
00653 
00654    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
00655 
00656    AST_RWLIST_TRAVERSE(&logchannels, f, list) {
00657       if (f->disabled) {
00658          f->disabled = 0;  /* Re-enable logging at reload */
00659          manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename);
00660       }
00661       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
00662          int rotate_this = 0;
00663          if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */
00664             /* Be more proactive about rotating massive log files */
00665             rotate_this = 1;
00666          }
00667          fclose(f->fileptr);  /* Close file */
00668          f->fileptr = NULL;
00669          if (rotate || rotate_this) {
00670             rotate_file(f->filename);
00671          }
00672       }
00673    }
00674 
00675    filesize_reload_needed = 0;
00676 
00677    init_logger_chain(1 /* locked */);
00678 
00679    if (logfiles.queue_log) {
00680       do {
00681          ast_unload_realtime("queue_log");
00682          if (ast_check_realtime("queue_log")) {
00683             if (!ast_realtime_require_field("queue_log",
00684                   "time", RQ_DATETIME, 26, "data1", RQ_CHAR, 20,
00685                   "data2", RQ_CHAR, 20, "data3", RQ_CHAR, 20,
00686                   "data4", RQ_CHAR, 20, "data5", RQ_CHAR, 20, SENTINEL)) {
00687                logfiles.queue_adaptive_realtime = 1;
00688             } else {
00689                logfiles.queue_adaptive_realtime = 0;
00690             }
00691 
00692             if (!logfiles.queue_log_to_file) {
00693                /* Skip the following section */
00694                break;
00695             }
00696          }
00697          if (qlog) {
00698             fclose(qlog);
00699             qlog = NULL;
00700          }
00701          snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
00702          if (queue_rotate) {
00703             rotate_file(old);
00704          }
00705 
00706          qlog = fopen(old, "a");
00707          if (qlog) {
00708             AST_RWLIST_UNLOCK(&logchannels);
00709             ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", "");
00710             AST_RWLIST_WRLOCK(&logchannels);
00711             ast_verb(1, "Asterisk Queue Logger restarted\n");
00712          } else {
00713             ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
00714             res = -1;
00715          }
00716       } while (0);
00717    }
00718 
00719    AST_RWLIST_UNLOCK(&logchannels);
00720 
00721    return res;
00722 }

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

Definition at line 538 of file logger.c.

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

Referenced by reload_logger().

00539 {
00540    char old[PATH_MAX];
00541    char new[PATH_MAX];
00542    int x, y, which, found, res = 0, fd;
00543    char *suffixes[4] = { "", ".gz", ".bz2", ".Z" };
00544 
00545    switch (rotatestrategy) {
00546    case SEQUENTIAL:
00547       for (x = 0; ; x++) {
00548          snprintf(new, sizeof(new), "%s.%d", filename, x);
00549          fd = open(new, O_RDONLY);
00550          if (fd > -1)
00551             close(fd);
00552          else
00553             break;
00554       }
00555       if (rename(filename, new)) {
00556          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00557          res = -1;
00558       } else {
00559          filename = new;
00560       }
00561       break;
00562    case TIMESTAMP:
00563       snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL));
00564       if (rename(filename, new)) {
00565          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00566          res = -1;
00567       } else {
00568          filename = new;
00569       }
00570       break;
00571    case ROTATE:
00572       /* Find the next empty slot, including a possible suffix */
00573       for (x = 0; ; x++) {
00574          found = 0;
00575          for (which = 0; which < ARRAY_LEN(suffixes); which++) {
00576             snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]);
00577             fd = open(new, O_RDONLY);
00578             if (fd > -1) {
00579                close(fd);
00580                found = 1;
00581                break;
00582             }
00583          }
00584          if (!found) {
00585             break;
00586          }
00587       }
00588 
00589       /* Found an empty slot */
00590       for (y = x; y > 0; y--) {
00591          for (which = 0; which < ARRAY_LEN(suffixes); which++) {
00592             snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]);
00593             fd = open(old, O_RDONLY);
00594             if (fd > -1) {
00595                /* Found the right suffix */
00596                close(fd);
00597                snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]);
00598                if (rename(old, new)) {
00599                   fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new);
00600                   res = -1;
00601                }
00602                break;
00603             }
00604          }
00605       }
00606 
00607       /* Finally, rename the current file */
00608       snprintf(new, sizeof(new), "%s.0", filename);
00609       if (rename(filename, new)) {
00610          fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
00611          res = -1;
00612       }
00613    }
00614 
00615    if (!ast_strlen_zero(exec_after_rotate)) {
00616       struct ast_channel *c = ast_dummy_channel_alloc();
00617       char buf[512];
00618       pbx_builtin_setvar_helper(c, "filename", filename);
00619       pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf));
00620       if (ast_safe_system(buf) == -1) {
00621          ast_log(LOG_WARNING, "error executing '%s'\n", buf);
00622       }
00623       c = ast_channel_release(c);
00624    }
00625    return res;
00626 }

static void update_logchannels ( void   )  [static]

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

01495 {
01496    struct logchannel *cur;
01497 
01498    AST_RWLIST_WRLOCK(&logchannels);
01499 
01500    global_logmask = 0;
01501 
01502    AST_RWLIST_TRAVERSE(&logchannels, cur, list) {
01503       cur->logmask = make_components(cur->components, cur->lineno);
01504       global_logmask |= cur->logmask;
01505    }
01506 
01507    AST_RWLIST_UNLOCK(&logchannels);
01508 }


Variable Documentation

struct ast_cli_entry cli_logger[] [static]

Definition at line 860 of file logger.c.

Referenced by init_logger().

int close_logger_thread = 0 [static]

Definition at line 149 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 175 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 873 of file logger.c.

char hostname[MAXHOSTNAMELEN] [static]

Definition at line 95 of file logger.c.

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

char* levels[32] [static]

Logging channels used in the Asterisk logging system.

The first 16 levels are reserved for system usage, and the remaining levels are reserved for usage by dynamic levels registered via ast_logger_register_level.

Definition at line 164 of file logger.c.

Referenced by ast_console_toggle_loglevel(), ast_log(), ast_log_vsyslog(), ast_logger_register_level(), ast_logger_unregister_level(), ast_network_puts_mutable(), handle_logger_set_level(), handle_logger_show_channels(), and make_components().

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

Definition at line 213 of file logger.c.

Referenced by ast_log().

ast_cond_t logcond [static]

Definition at line 148 of file logger.c.

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

struct { ... } logfiles [static]

Referenced by ast_queue_log(), init_logger_chain(), logger_queue_init(), and reload_logger().

pthread_t logthread = AST_PTHREADT_NULL [static]

Definition at line 147 of file logger.c.

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

FILE* qlog [static]

Definition at line 151 of file logger.c.

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

unsigned int queue_adaptive_realtime

Definition at line 92 of file logger.c.

unsigned int queue_log

Definition at line 90 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 91 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 210 of file logger.c.

Referenced by __ast_verbose_ap().


Generated on Mon Jun 27 16:51:16 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7