Tue Aug 20 16:35:06 2013

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)
struct 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,...)
 send log messages to syslog and/or the console
static void ast_log_vsyslog (struct logmsg *msg)
int ast_logger_register_level (const char *name)
 Register a new logger level.
void ast_logger_unregister_level (const char *name)
 Unregister a previously registered logger level.
void ast_queue_log (const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
int ast_register_verbose (void(*v)(const char *string))
int ast_unregister_verbose (void(*v)(const char *string))
void ast_verbose (const char *fmt,...)
void close_logger (void)
static char * handle_logger_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_logger_rotate (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_logger_set_level (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_logger_show_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command to show logging system configuration.
int init_logger (void)
static void init_logger_chain (int locked)
static void logger_print_normal (struct logmsg *logmsg)
 Print a normal log message to the channels.
static void logger_queue_init (void)
static int logger_queue_restart (int queue_rotate)
static int logger_queue_rt_start (void)
int logger_reload (void)
 Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload).
static void * logger_thread (void *data)
 Actual logging thread.
static unsigned int make_components (const char *s, int lineno)
static struct logchannelmake_logchannel (const char *channel, const char *components, int lineno)
static int reload_logger (int rotate)
static int rotate_file (const char *filename)
static void update_logchannels (void)

Variables

static struct ast_cli_entry cli_logger []
static int close_logger_thread = 0
static const int colors [NUMLOGLEVELS]
 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 [NUMLOGLEVELS]
 Logging channels used in the Asterisk logging system.
static struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , }
static ast_cond_t logcond
struct {
   unsigned int   queue_adaptive_realtime:1
   unsigned int   queue_log:1
   unsigned int   queue_log_to_file:1
logfiles
static int logger_initialized
static pthread_t logthread = AST_PTHREADT_NULL
static FILE * qlog
static char queue_log_name [256] = QUEUELOG
static int queuelog_init
static struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , }

Detailed Description

Asterisk Logger.

Logging routines

Author:
Mark Spencer <markster@digium.com>

Definition in file logger.c.


Define Documentation

#define FORMATL   "%-35.35s %-8.8s %-9.9s "
 
#define GETTID (  )     getpid()

Definition at line 76 of file logger.c.

Referenced by ast_log().

#define LOG_BUF_INIT_SIZE   256

Definition at line 219 of file logger.c.

Referenced by ast_log().

#define MAX_BACKTRACE_FRAMES   20

Definition at line 62 of file logger.c.

#define VERBOSE_BUF_INIT_SIZE   256

Definition at line 216 of file logger.c.

Referenced by __ast_verbose_ap().


Enumeration Type Documentation

Enumerator:
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 131 of file logger.c.

00131                  {
00132    LOGMSG_NORMAL = 0,
00133    LOGMSG_VERBOSE,
00134 };

enum logtypes
Enumerator:
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 102 of file logger.c.

00102               {
00103    LOGTYPE_SYSLOG,
00104    LOGTYPE_FILE,
00105    LOGTYPE_CONSOLE,
00106 };

Enumerator:
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 88 of file logger.c.

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

References __ast_verbose_ap().

01555 {
01556    va_list ap;
01557 
01558    va_start(ap, fmt);
01559    __ast_verbose_ap(file, line, func, fmt, ap);
01560    va_end(ap);
01561 }

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

Definition at line 1518 of file logger.c.

References __LOG_VERBOSE, ast_alloca, 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().

01519 {
01520    struct ast_str *buf = NULL;
01521    int res = 0;
01522 
01523    if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE)))
01524       return;
01525 
01526    if (ast_opt_timestamp) {
01527       struct timeval now;
01528       struct ast_tm tm;
01529       char date[40];
01530       char *datefmt;
01531 
01532       now = ast_tvnow();
01533       ast_localtime(&now, &tm, NULL);
01534       ast_strftime(date, sizeof(date), dateformat, &tm);
01535       datefmt = ast_alloca(strlen(date) + 3 + strlen(fmt) + 1);
01536       sprintf(datefmt, "%c[%s] %s", 127, date, fmt);
01537       fmt = datefmt;
01538    } else {
01539       char *tmp = ast_alloca(strlen(fmt) + 2);
01540       sprintf(tmp, "%c%s", 127, fmt);
01541       fmt = tmp;
01542    }
01543 
01544    /* Build string */
01545    res = ast_str_set_va(&buf, 0, fmt, ap);
01546 
01547    /* If the build failed then we can drop this allocated message */
01548    if (res == AST_DYNSTR_BUILD_FAILED)
01549       return;
01550 
01551    ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf));
01552 }

static void __init_log_buf ( void   )  [static]

Definition at line 218 of file logger.c.

00224 {

static void __init_verbose_buf ( void   )  [static]

Definition at line 215 of file logger.c.

00224 {

static void _handle_SIGXFSZ ( int  sig  )  [static]

Definition at line 941 of file logger.c.

00942 {
00943    /* Indicate need to reload */
00944    filesize_reload_needed = 1;
00945 }

void ast_backtrace ( void   ) 

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

01489 {
01490 #ifdef HAVE_BKTR
01491    struct ast_bt *bt;
01492    int i = 0;
01493    char **strings;
01494 
01495    if (!(bt = ast_bt_create())) {
01496       ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
01497       return;
01498    }
01499 
01500    if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
01501       ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' ');
01502       for (i = 3; i < bt->num_frames - 2; i++) {
01503          ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]);
01504       }
01505 
01506       /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */
01507 #undef free
01508       free(strings);
01509    } else {
01510       ast_debug(1, "Could not allocate memory for backtrace\n");
01511    }
01512    ast_bt_destroy(bt);
01513 #else
01514    ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
01515 #endif /* defined(HAVE_BKTR) */
01516 }

struct ast_bt* ast_bt_create ( void   )  [read]

Definition at line 1308 of file logger.c.

References ast_bt::alloced, ast_bt_get_addresses(), ast_calloc, ast_log(), and LOG_ERROR.

Referenced by ast_backtrace().

01309 {
01310    struct ast_bt *bt = ast_calloc(1, sizeof(*bt));
01311    if (!bt) {
01312       ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n");
01313       return NULL;
01314    }
01315 
01316    bt->alloced = 1;
01317 
01318    ast_bt_get_addresses(bt);
01319 
01320    return bt;
01321 }

void* ast_bt_destroy ( struct ast_bt bt  ) 

Definition at line 1330 of file logger.c.

References ast_bt::alloced, and ast_free.

Referenced by ast_backtrace().

01331 {
01332    if (bt->alloced) {
01333       ast_free(bt);
01334    }
01335 
01336    return NULL;
01337 }

int ast_bt_get_addresses ( struct ast_bt bt  ) 
char** ast_bt_get_symbols ( void **  addresses,
size_t  num_frames 
)

Definition at line 1339 of file logger.c.

References ast_calloc, ast_copy_string(), ast_free, ast_log(), ast_malloc, ast_realloc, ast_strlen_zero(), ast_utils_which(), LOG_DEBUG, and S_OR.

Referenced by ao2_bt(), and ast_backtrace().

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

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

Definition at line 430 of file logger.c.

References ast_free, ast_malloc, and option_verbose.

Referenced by launch_script().

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

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

send log messages to syslog and/or the console

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

Definition at line 1211 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(), close_logger_thread, GETTID, logmsg::level, levels, logmsg::line, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, LOGMSG_VERBOSE, logthread, option_debug, option_verbose, logmsg::process_id, term_filter_escapes(), and logmsg::type.

Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __analog_handle_event(), __analog_ss_thread(), __ast_answer(), __ast_bridge_technology_register(), __ast_channel_alloc_ap(), __ast_channel_masquerade(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_data_register(), __ast_data_unregister(), __ast_dsp_call_progress(), __ast_format_register(), __ast_http_load(), __ast_mm_init_phase_2(), __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(), _dsp_init(), _enum_array_map(), _extension_match_core(), _get_mohbyname(), _lookup_timer(), _macro_exec(), _moh_register(), _sip_show_peers(), _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_sprintf(), acf_strftime(), acf_strptime(), acf_transaction_write(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_hangup(), actual_load_config(), add_agent(), add_agi_cmd(), add_calltoken_ignore(), add_cc_call_info_to_response(), add_cfg_entry(), add_codec_to_answer(), add_content(), add_email_attachment(), add_event_to_list(), add_exten_to_pattern_tree(), add_extensions(), add_features_datastore(), add_header(), add_ie(), add_in_calls(), add_line(), add_out_calls(), add_priority(), add_publish_event(), add_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_subscribe_event(), add_to_agi(), add_user_extension(), admin_exec(), adsi_begin(), adsi_careful_send(), adsi_get_cpeid(), adsi_get_cpeinfo(), adsi_load_session(), adsi_process(), adsi_prog(), adsi_transmit_message_full(), advanced_options(), ael2_print(), aes_helper(), agent_answer(), agent_call(), agent_fixup(), agent_get_base_channel(), agent_new(), agent_read(), agentmonitoroutgoing_exec(), agi_exec_full(), aji_act_hook(), aji_client_connect(), aji_client_info_handler(), aji_create_buddy(), aji_create_client(), aji_delete_node_list(), aji_devstate_cb(), aji_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_message(), aji_handle_presence(), aji_handle_pubsub_error(), aji_handle_pubsub_event(), aji_handle_subscribe(), aji_initialize(), aji_join_exec(), aji_leave_exec(), aji_load_config(), aji_mwi_cb(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), aji_send_raw_chat(), aji_sendgroup_exec(), aji_set_group_presence(), aji_set_presence(), aji_start_sasl(), aji_status_exec(), alarmreceiver_exec(), alloc_expr_node(), alloc_resampler(), alloc_sub(), alsa_card_init(), alsa_indicate(), alsa_new(), alsa_read(), alsa_request(), alsa_write(), analog_answer(), analog_attempt_transfer(), analog_call(), analog_exception(), analog_handle_init_event(), analog_hangup(), analog_request(), analog_ss_thread(), analogsub_to_dahdisub(), announce_thread(), answer_call(), anti_injection(), aoc_append_ie(), aoc_parse_ie(), app_exec(), append_ie(), append_mailbox(), apply_general_options(), apply_option(), apply_options_full(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_adsi_install_funcs(), 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_apply_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_end_dtmf(), 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_check_retire_linkedid(), ast_cel_fill_record(), ast_cel_get_ama_flag_name(), ast_cel_linkedid_ref(), 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_codec_pref_getsize(), 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_gettree(), ast_db_put(), ast_decrypt_bin(), ast_device_state_engine_init(), ast_do_masquerade(), ast_do_pickup(), ast_dsp_busydetect(), ast_dsp_call_progress(), ast_dsp_noise(), ast_dsp_process(), ast_dsp_silence(), ast_dtmf_stream(), ast_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_get_post_vars(), ast_http_send(), ast_iax2_new(), ast_include_new(), ast_indicate_data(), ast_io_remove(), ast_ivr_menu_run_internal(), ast_jb_put(), ast_linear_stream(), ast_lock_path_flock(), ast_lock_path_lockfile(), ast_logger_register_level(), ast_makesocket(), ast_manager_register_struct(), ast_module_reload(), ast_moh_files_next(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), ast_netsock_bindaddr(), ast_netsock_set_qos(), ast_odbc_direct_execute(), ast_odbc_find_table(), ast_odbc_prepare_and_execute(), ast_odbc_sanity_check(), ast_odbc_smart_execute(), ast_openstream_full(), ast_openvstream(), ast_ouraddrfor(), ast_parse_allow_disallow(), ast_parse_digest(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_run_app(), ast_pbx_run_args(), ast_pbx_start(), ast_pickup_call(), ast_pktccops_gate_alloc(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_queue_cc_frame(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), ast_redirecting_build_data(), ast_redirecting_parse_data(), ast_register_application2(), ast_register_feature(), ast_register_switch(), ast_remotecontrol(), ast_request(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_engine_register2(), ast_rtp_glue_register2(), ast_rtp_instance_bridge(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), ast_rtp_instance_new(), ast_rtp_new(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_write(), ast_safe_fork(), ast_safe_system(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_es(), ast_say_date_with_format_fr(), ast_say_date_with_format_gr(), ast_say_date_with_format_he(), ast_say_date_with_format_it(), ast_say_date_with_format_nl(), ast_say_date_with_format_pl(), ast_say_date_with_format_pt(), ast_say_date_with_format_th(), ast_say_date_with_format_vi(), ast_say_date_with_format_zh(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_se(), ast_say_number_full_ur(), ast_say_number_full_zh(), ast_sched_del(), ast_sched_runq(), ast_sched_thread_create(), ast_search_dns(), ast_security_event_report(), ast_set_cc_offer_timer(), ast_set_cc_recall_timer(), ast_set_ccbs_available_timer(), ast_set_ccnr_available_timer(), ast_set_owners_and_peers(), ast_set_priority(), ast_set_qos(), ast_sign_bin(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_sockaddr_hash(), ast_sockaddr_parse(), ast_sockaddr_resolve(), ast_sockaddr_split_hostport(), ast_sockaddr_stringify_fmt(), ast_speech_register(), ast_srtp_add_stream(), ast_srtp_change_source(), ast_srtp_policy_alloc(), ast_srtp_protect(), ast_srtp_unprotect(), ast_stopstream(), ast_str_substitute_variables_full(), ast_streamfile(), ast_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_close_session_file(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_tls_read_conf(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_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_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_thread(), attempt_transfer(), au_seek(), au_trunc(), audiohook_read_frame_both(), auth_credentials(), auth_exec(), auth_http_callback(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), background_detect_exec(), base64_helper(), base_encode(), blr_ebl(), blr_txt(), bridge_array_add(), bridge_call_thread(), bridge_call_thread_launch(), 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_gateway(), build_mapping(), build_parkinglot(), build_peer(), build_route(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), bump_gains(), cache_get_callno_locked(), calc_cost(), calc_metric(), 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_handle_publish_error(), cccancel_exec(), cdata(), cdr_handler(), cdr_merge_vars(), chan_misdn_log(), chan_ringing(), chanavail_exec(), channel_admin_exec(), channel_spy(), channel_to_session(), chanspy_exec(), check_abstract_reference(), check_access(), check_app_args(), check_auth(), check_break(), check_compat(), check_context_names(), check_continue(), check_day(), check_dow(), check_event_type(), check_expr2_input(), check_for_conference(), check_goto(), check_header(), check_header_fmt(), check_includes(), check_key(), check_label(), check_macro_returns(), check_month(), check_password(), check_post(), check_pval_item(), check_rtp_timeout(), check_srcaddr(), check_switch_expr(), check_timerange(), check_user_full(), check_vars(), check_via(), cleanup_connection(), clear_caller(), clear_dialed_interfaces(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), cli_fax_show_session(), cli_fax_show_sessions(), close_call(), close_client(), close_mailbox(), commit_exec(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), confbridge_exec(), config_curl(), config_device(), config_function_read(), config_handler(), config_ldap(), config_line(), config_load(), config_module(), config_odbc(), config_parse_variables(), config_pgsql(), config_text_file_load(), connectedline_read(), connectedline_write(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), cops_connect(), cops_gate_cmd(), cops_sendmsg(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), count_lines(), create_addr(), create_dirpath(), create_dynamic_parkinglot(), create_jb(), create_match_char_tree(), create_new_socket(), create_queue_member(), create_video_frame(), create_vmaccount(), crement_function_read(), crypto_load(), csv_log(), csv_quote(), custom_log(), custom_prepare(), cut_internal(), dahdi_answer(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_func_write(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_open(), dahdi_read(), dahdi_request(), dahdi_restart(), dahdi_ring_phone(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_show_channel(), dahdi_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(), db_get_common(), 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(), dispatch_thread_handler(), display_last_error(), display_nat_warning(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_forward(), do_magic_pickup(), do_message(), do_monitor(), do_notify(), do_pktccops(), do_register(), do_reload(), do_say(), do_waiting(), dump_queue(), dump_queue_members(), dundi_answer_entity(), dundi_answer_query(), dundi_discover(), dundi_encrypt(), dundi_error_output(), dundi_exec(), dundi_helper(), dundi_lookup_internal(), dundi_precache_full(), dundi_precache_internal(), dundi_prop_precache(), dundi_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), duplicate_pseudo(), eagi_exec(), ebl_callback(), enable_jack_hook(), encode_open_type(), endelm(), enum_callback(), enum_query_read(), enum_result_read(), event_channel_destroy(), 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_cmp_pattern_pos(), 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(), filename_parse(), filestream_close(), filter(), finalize_content(), find_account(), find_cache(), find_call_locked(), find_conf(), find_conf_realtime(), find_desc(), find_details(), find_engine(), 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(), 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_db_delete(), function_db_exists(), function_db_read(), function_db_write(), function_enum(), function_eval(), function_eval2(), function_fieldnum_helper(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g719read(), g719seek(), g719trunc(), g719write(), g723_len(), g723_read(), g723_trunc(), g723_write(), g726_read(), g726_write(), g729_read(), g729_trunc(), g729_write(), generic_execute(), generic_fax_exec(), generic_http_callback(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_calleridname(), get_canmatch_exten(), get_comma(), get_crypto_attrib(), get_destination(), get_domain(), get_ewscal_ids_for(), get_in_brackets_const(), get_in_brackets_full(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_member_penalty(), get_name_and_number(), get_params(), get_pattern_node(), get_range(), get_rdnis(), get_refer_info(), get_timerange(), get_to_address(), get_token(), get_unused_callno(), getdisplaybyname(), getflagbyname(), getkeybyname(), getstatebyname(), getsubbyname(), gosub_exec(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_function_write(), gsm_read(), gsm_seek(), gsm_tell(), gsm_trunc(), 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(), h261_decap(), h263_decap(), h263_encap(), h263_open(), h263_read(), h263_trunc(), h263_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), h264_trunc(), h264_write(), handle_alarms(), handle_call_token(), handle_callforward_button(), handle_capabilities_res_message(), handle_cc_subscribe(), handle_clear_alarms(), handle_cli_h323_cycle_gk(), handle_cli_indication_add(), handle_cli_indication_remove(), handle_command_response(), handle_common_options(), handle_devstate_change(), handle_enbloc_call_message(), handle_error(), handle_exec(), handle_getoption(), handle_gosub(), handle_hd_hf(), handle_incoming(), handle_init_event(), handle_input(), handle_invite_replaces(), handle_jack_audio(), handle_keypad_button_message(), handle_message(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_playtones(), handle_recordfile(), handle_register_message(), handle_request(), handle_request_bye(), handle_request_info(), handle_request_invite(), handle_request_notify(), handle_request_options(), handle_request_publish(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_info(), handle_response_invite(), handle_response_message(), handle_response_notify(), handle_response_peerpoke(), handle_response_publish(), handle_response_refer(), handle_response_register(), handle_response_subscribe(), handle_response_update(), handle_soft_key_event_message(), handle_stimulus_message(), handle_t38_options(), handle_tcptls_connection(), handle_transfer_button(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hint_read(), http_post_callback(), iax2_ack_registry(), iax2_bridge(), iax2_call(), iax2_canmatch(), iax2_devicestate(), iax2_do_register(), iax2_dup_variable_datastore(), iax2_exec(), iax2_exists(), iax2_fixup(), iax2_hangup(), iax2_matchmore(), iax2_poke_peer(), iax2_prov_app(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_provision_version(), iax_template_parse(), ical_load_calendar(), icalendar_add_event(), icalendar_update_events(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), ilbc_trunc(), ilbc_write(), ilbctolin_framein(), import_ch(), in_band_indication(), increase_call_count(), init_acf_query(), init_app_class(), init_jack_data(), init_req(), init_resp(), init_timing_thread(), initialize_cc_max_requests(), initialize_udptl(), inotify_daemon(), inprocess_count(), insert_penaltychange(), inspect_module(), internal_ao2_ref(), INTERNAL_OBJ(), invent_message(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jack_hook_callback(), jack_hook_write(), jb_error_output(), jb_get_and_deliver(), jb_warning_output(), jingle_alloc(), jingle_call(), jingle_create_candidates(), jingle_create_member(), jingle_digit(), jingle_free_pvt(), jingle_handle_dtmf(), jingle_hangup_farend(), jingle_indicate(), jingle_is_answered(), jingle_load_config(), jingle_new(), jingle_newcall(), jingle_parser(), jingle_request(), jingle_sendhtml(), jingle_sendtext(), jingle_show_channels(), jingle_write(), join_conference_bridge(), join_queue(), jpeg_read_image(), jpeg_write_image(), key_call(), Keyfavorite(), 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(), lintogsm_framein(), lintolpc10_framein(), lintoulaw(), listener(), listfilter(), load_column_config(), load_config(), load_config_meetme(), load_dynamic_module(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_pktccops_config(), load_resource(), load_resource_list(), load_tech_calendars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_cleanup(), local_ast_moh_start(), local_call(), local_devicestate(), local_fixup(), local_new(), local_setoption(), local_write(), log_exec(), log_jack_status(), logger_queue_init(), logger_queue_restart(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manage_parked_call(), manage_parkinglot(), manager_log(), manager_modulecheck(), manager_show_dialplan_helper(), manager_sipnotify(), map_video_codec(), masq_park_call(), matchmore(), math(), md5(), measurenoise(), meetme_menu_admin_extended(), meetmemute(), memcpy_decrypt(), memcpy_encrypt(), message_template_build(), message_template_parse_emailbody(), message_template_parse_filebody(), mgcp_call(), mgcp_fixup(), mgcp_indicate(), mgcp_new(), mgcp_reload(), mgcp_request(), mgcp_rtp_read(), mgcp_senddigit_begin(), mgcp_senddigit_end(), mgcp_ss(), mgcp_write(), mgcpsock_read(), milliwatt_generate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_delete_exec(), minivm_greet_exec(), minivm_mwi_exec(), minivm_notify_exec(), minivm_record_exec(), misdn_answer(), misdn_bridge(), misdn_call(), misdn_cfg_get(), misdn_cfg_get_config_string(), misdn_cfg_init(), misdn_cfg_is_msn_valid(), misdn_cfg_update_ptp(), misdn_check_l2l1(), misdn_digit_end(), misdn_facility_exec(), misdn_hangup(), misdn_indication(), misdn_new(), misdn_request(), misdn_send_text(), misdn_set_opt_exec(), misdn_write(), mixmonitor_exec(), mixmonitor_thread(), mkif(), mkintf(), moh_alloc(), moh_class_destructor(), moh_files_alloc(), moh_files_generator(), moh_files_release(), moh_generate(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), mssql_connect(), multicast_rtp_write(), multicast_send_control_packet(), multiplexed_bridge_create(), multiplexed_nudge(), multiplexed_thread_function(), mute_add_audiohook(), mute_fragment(), mwi_send_init(), mwi_send_process_buffer(), mwi_send_process_event(), mwi_sub_event_cb(), mwi_thread(), mwi_unsub_event_cb(), my_all_subchannels_hungup(), my_callwait(), my_dial_digits(), my_distinctive_ring(), my_dsp_set_digitmode(), my_get_callerid(), my_handle_dtmf(), my_handle_notify_message(), my_is_dialing(), my_is_off_hook(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), my_start_cid_detect(), my_wink(), nbs_alloc(), nbs_call(), nbs_hangup(), nbs_new(), nbs_request(), nbs_xwrite(), NBScat_exec(), NBScatplay(), netconsole(), new_find_extension(), notify_new_message(), odbc_load_module(), odbc_log(), odbc_obj_connect(), odbc_obj_disconnect(), odbc_register_class(), odbc_release_obj2(), ogg_vorbis_open(), ogg_vorbis_read(), ogg_vorbis_rewrite(), ogg_vorbis_seek(), ogg_vorbis_trunc(), ogg_vorbis_write(), oh323_alloc(), oh323_call(), oh323_digit_begin(), oh323_digit_end(), oh323_fixup(), oh323_hangup(), oh323_indicate(), oh323_read(), oh323_request(), oh323_rtp_read(), oh323_set_rtp_peer(), oh323_write(), old_milliwatt_exec(), onevent(), op_colon(), op_div(), op_eq(), op_eqtilde(), op_func(), op_minus(), op_negate(), op_plus(), op_rem(), op_times(), open_mailbox(), open_stream(), OpenHistory(), 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(), osplookup_exec(), ospnext_exec(), oss_indicate(), oss_new(), oss_request(), page_exec(), park_call_exec(), park_call_full(), park_space_reserve(), parkandannounce_exec(), parked_call_exec(), parkinglot_activate(), parkinglot_activate_cb(), parkinglot_config_read(), parkinglot_is_marked_cb(), parse(), parse_apps(), parse_args(), parse_buffers_policy(), parse_config(), parse_empty_options(), parse_events(), parse_gain_value(), parse_ie(), parse_minse(), parse_moved_contact(), parse_naptr(), parse_options(), parse_register_contact(), parse_request(), parse_session_expires(), parse_srv(), parse_tag(), parse_tone_zone(), parse_via(), ParseBookmark(), parsing(), party_id_build_data(), party_id_write(), party_name_build_data(), party_name_write(), party_number_build_data(), party_number_write(), party_subaddress_build_data(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_hangup(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_saynumber(), pbx_builtin_serialize_variables(), pbx_builtin_setvar(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_exec(), pbx_extension_helper(), pbx_find_extension(), pbx_load_config(), pbx_load_module(), pbx_load_users(), pbx_parseable_goto(), pbx_substitute_variables_helper_full(), pcm_read(), pcm_seek(), pcm_trunc(), pcm_write(), peek_read(), peer_iphash_cb(), peer_set_srcaddr(), peercnt_add(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_by_exten(), pickup_by_group(), pickup_exec(), pickupchan_exec(), pitchshift_helper(), pktccops_add_ippool(), play_message(), play_message_category(), play_message_datetime(), play_message_on_chan(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), policy_set_suite(), pop_exec(), post_raw(), powerof(), pp_each_extension_helper(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_applicationmap_line(), process_ast_dsp(), process_cn_rfc3389(), process_config(), process_crypto(), process_dahdi(), process_dtmf_rfc2833(), process_echocancel(), process_message_callback(), process_opcode(), process_output(), process_request(), process_returncode(), process_sdp(), process_sdp_a_audio(), process_sdp_c(), process_sdp_o(), process_text_line(), process_via(), profile_set_param(), progress(), proxy_from_config(), 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(), radius_log(), rcv_mac_addr(), rcvfax_exec(), read_agent_config(), read_config(), read_config_maps(), read_exec(), read_password_from_file(), readexten_exec(), readfile_exec(), readmimefile(), realtime_curl(), realtime_destroy_handler(), realtime_directory(), realtime_exec(), realtime_handler(), realtime_ldap_base_ap(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_odbc(), realtime_peer(), realtime_peer_by_addr(), realtime_peer_get_sippeer_helper(), realtime_pgsql(), realtime_require_handler(), realtime_store_handler(), realtime_update2_handler(), realtime_update_handler(), realtime_user(), realtimefield_read(), receive_digit(), receive_message(), receivefax_exec(), receivefax_t38_init(), record_exec(), redirecting_read(), redirecting_write(), refresh_list(), reg_source_db(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_config(), reload_firmware(), reload_followme(), reload_module(), reload_queue_members(), reload_queue_rules(), reload_queues(), reload_single_member(), reload_single_queue(), remote_bridge_loop(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), replace(), replace_callno(), reply_digest(), require_curl(), require_odbc(), require_pgsql(), res_srtp_init(), res_srtp_new(), resample_frame(), reset_conf(), resolve_first(), respprep(), restart_monitor(), restart_pktc_thread(), restart_session_timer(), restore_conference(), restore_gains(), retrans_pkt(), retrydial_exec(), return_exec(), revert_fax_buffers(), rollback_exec(), rotate_file(), 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(), saycountedadj_exec(), saycountednoun_exec(), scan_service(), scan_thread(), schedule(), scheduled_destroy(), sdp_crypto_activate(), sdp_crypto_offer(), sdp_crypto_process(), sdp_crypto_setup(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_ews_request_and_parse(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendfax_exec(), sendfax_t38_init(), sendimage_exec(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_crypto_policy(), set_destination(), set_fax_t38_caps(), set_format(), set_full_cmd(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_moh_exec(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setflag(), setformat(), setup_dahdi_int(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_srtp(), setup_stunaddr(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), shift_pop(), show_chanstats_cb(), show_dialplan_helper(), showdisplay(), showkeys(), signal_pipe(), sip_acf_channel_read(), sip_addheader(), sip_call(), sip_cc_monitor_suspend(), sip_check_authtimeout(), sip_cli_notify(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_parse_host(), sip_parse_register_line(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_read(), sip_reg_timeout(), sip_register(), sip_reload(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_setoption(), sip_sipredirect(), sip_st_alloc(), sip_subscribe_mwi(), sip_tcp_read(), sip_tcptls_write(), sip_threadinfo_create(), sip_tls_read(), sip_write(), sipsock_read(), siren14read(), siren14seek(), siren14trunc(), siren14write(), siren7read(), siren7seek(), siren7trunc(), siren7write(), skel_exec(), skinny_call(), skinny_fixup(), skinny_hangup(), skinny_hold(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), skinny_transfer(), skinny_unhold(), 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_seek(), slinear_trunc(), slinear_write(), smdi_load(), smdi_msg_read(), smdi_msg_retrieve_read(), smdi_read(), smdi_toggle_mwi(), smoother_frame_feed(), sms_exec(), sms_generate(), sms_handleincoming(), sms_log(), sms_messagerx2(), sms_process(), sms_readfile(), sms_writefile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), softmix_bridge_thread(), soundcard_init(), soundcard_writeframe(), span_message(), spandsp_fax_new(), spandsp_fax_read(), spandsp_fax_start(), spandsp_fax_write(), spandsp_log(), spandsp_modems(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite_log(), srv_datastore_setup(), srv_query_read(), srv_result_read(), ssl_close(), ssl_lock(), ssl_verify(), stackpeek_read(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_poll_thread(), start_rtp(), start_session_timer(), start_spying(), start_stream(), startelm(), starttimer(), 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_tone_zone_ring_cadence(), 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(), 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(), 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(), timing_read(), 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_calling(), try_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), 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(), unsignal_pipe(), update2_curl(), update2_ldap(), update2_odbc(), update2_pgsql(), update2_prepare(), update_call_counter(), update_common_options(), update_config(), update_curl(), update_header(), update_key(), update_ldap(), update_modem_bits(), update_odbc(), update_pgsql(), update_registry(), update_scoreboard(), update_stats(), upqm_exec(), uridecode(), uriencode(), usage_context_add_ramp(), usage_context_add_spaces(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_check_password_shell(), vm_exec(), vm_execmain(), vm_intro(), vm_newuser(), vm_options(), vmsayname_exec(), volume_write(), vox_read(), vox_seek(), vox_trunc(), vox_write(), wait_file(), wait_file2(), wait_for_answer(), wait_for_winner(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_trunc(), wav_write(), 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(), yyerror(), and yyparse().

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

static void ast_log_vsyslog ( struct logmsg msg  )  [static]

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

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

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

01626 {
01627    unsigned int level;
01628    unsigned int available = 0;
01629 
01630    AST_RWLIST_WRLOCK(&logchannels);
01631 
01632    for (level = 0; level < ARRAY_LEN(levels); level++) {
01633       if ((level >= 16) && !available && !levels[level]) {
01634          available = level;
01635          continue;
01636       }
01637 
01638       if (levels[level] && !strcasecmp(levels[level], name)) {
01639          ast_log(LOG_WARNING,
01640             "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n",
01641             name);
01642          AST_RWLIST_UNLOCK(&logchannels);
01643 
01644          return -1;
01645       }
01646    }
01647 
01648    if (!available) {
01649       ast_log(LOG_WARNING,
01650          "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n",
01651          name);
01652       AST_RWLIST_UNLOCK(&logchannels);
01653 
01654       return -1;
01655    }
01656 
01657    levels[available] = ast_strdup(name);
01658 
01659    AST_RWLIST_UNLOCK(&logchannels);
01660 
01661    ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available);
01662 
01663    update_logchannels();
01664 
01665    return available;
01666 }

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

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

Referenced by cc_shutdown(), load_module(), and unload_module().

01669 {
01670    unsigned int found = 0;
01671    unsigned int x;
01672 
01673    AST_RWLIST_WRLOCK(&logchannels);
01674 
01675    for (x = 16; x < ARRAY_LEN(levels); x++) {
01676       if (!levels[x]) {
01677          continue;
01678       }
01679 
01680       if (strcasecmp(levels[x], name)) {
01681          continue;
01682       }
01683 
01684       found = 1;
01685       break;
01686    }
01687 
01688    if (found) {
01689       /* take this level out of the global_logmask, to ensure that no new log messages
01690        * will be queued for it
01691        */
01692 
01693       global_logmask &= ~(1 << x);
01694 
01695       ast_free(levels[x]);
01696       levels[x] = NULL;
01697       AST_RWLIST_UNLOCK(&logchannels);
01698 
01699       ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x);
01700 
01701       update_logchannels();
01702    } else {
01703       AST_RWLIST_UNLOCK(&logchannels);
01704    }
01705 }

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

Definition at line 479 of file logger.c.

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

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

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

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

Definition at line 1575 of file logger.c.

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

Referenced by ast_makesocket(), and print_intro_message().

01576 {
01577    struct verb *verb;
01578 
01579    if (!(verb = ast_malloc(sizeof(*verb))))
01580       return -1;
01581 
01582    verb->verboser = v;
01583 
01584    AST_RWLIST_WRLOCK(&verbosers);
01585    AST_RWLIST_INSERT_HEAD(&verbosers, verb, list);
01586    AST_RWLIST_UNLOCK(&verbosers);
01587    
01588    return 0;
01589 }

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

Definition at line 1591 of file logger.c.

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

01592 {
01593    struct verb *cur;
01594 
01595    AST_RWLIST_WRLOCK(&verbosers);
01596    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) {
01597       if (cur->verboser == v) {
01598          AST_RWLIST_REMOVE_CURRENT(list);
01599          ast_free(cur);
01600          break;
01601       }
01602    }
01603    AST_RWLIST_TRAVERSE_SAFE_END;
01604    AST_RWLIST_UNLOCK(&verbosers);
01605    
01606    return cur ? 0 : -1;
01607 }

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

Definition at line 1566 of file logger.c.

References __ast_verbose_ap().

01567 {
01568    va_list ap;
01569 
01570    va_start(ap, fmt);
01571    __ast_verbose_ap("", 0, "", fmt, ap);
01572    va_end(ap);
01573 }

void close_logger ( void   ) 

Provided by logger.c

Definition at line 1164 of file logger.c.

References ARRAY_LEN, ast_cli_unregister_multiple(), ast_cond_signal, ast_free, AST_LIST_LOCK, AST_LIST_REMOVE_HEAD, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, cli_logger, close_logger_thread, f, logchannel::fileptr, logchannel::list, logcond, logthread, and qlog.

Referenced by really_quit().

01165 {
01166    struct logchannel *f = NULL;
01167    struct verb *cur = NULL;
01168 
01169    ast_cli_unregister_multiple(cli_logger, ARRAY_LEN(cli_logger));
01170 
01171    logger_initialized = 0;
01172 
01173    /* Stop logger thread */
01174    AST_LIST_LOCK(&logmsgs);
01175    close_logger_thread = 1;
01176    ast_cond_signal(&logcond);
01177    AST_LIST_UNLOCK(&logmsgs);
01178 
01179    if (logthread != AST_PTHREADT_NULL)
01180       pthread_join(logthread, NULL);
01181 
01182    AST_RWLIST_WRLOCK(&verbosers);
01183    while ((cur = AST_LIST_REMOVE_HEAD(&verbosers, list))) {
01184       ast_free(cur);
01185    }
01186    AST_RWLIST_UNLOCK(&verbosers);
01187 
01188    AST_RWLIST_WRLOCK(&logchannels);
01189 
01190    if (qlog) {
01191       fclose(qlog);
01192       qlog = NULL;
01193    }
01194 
01195    while ((f = AST_LIST_REMOVE_HEAD(&logchannels, list))) {
01196       if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
01197          fclose(f->fileptr);
01198          f->fileptr = NULL;
01199       }
01200       ast_free(f);
01201    }
01202 
01203    closelog(); /* syslog */
01204 
01205    AST_RWLIST_UNLOCK(&logchannels);
01206 }

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

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

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

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

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

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

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

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

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

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

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

int init_logger ( void   ) 

Provided by logger.c

Definition at line 1131 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_mutex_destroy, ast_mutex_init, ast_pthread_create, cli_logger, handle_SIGXFSZ, init_logger_chain(), logcond, logger_thread(), and logthread.

Referenced by main().

01132 {
01133    /* auto rotate if sig SIGXFSZ comes a-knockin */
01134    sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL);
01135 
01136    /* Re-initialize the logmsgs mutex.  The recursive mutex can be accessed prior
01137     * to Asterisk being forked into the background, which can cause the thread
01138     * ID tracked by the underlying pthread mutex to be different than the ID of
01139     * the thread that unlocks the mutex.  Since init_logger is called after the
01140     * fork, it is safe to initialize the mutex here for future accesses.
01141     */
01142    ast_mutex_destroy(&logmsgs.lock);
01143    ast_mutex_init(&logmsgs.lock);
01144    ast_cond_init(&logcond, NULL);
01145 
01146    /* start logger thread */
01147    if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) {
01148       ast_cond_destroy(&logcond);
01149       return -1;
01150    }
01151 
01152    /* register the logger cli commands */
01153    ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger));
01154 
01155    ast_mkdir(ast_config_AST_LOG_DIR, 0777);
01156 
01157    /* create log channels */
01158    init_logger_chain(0 /* locked */);
01159    logger_initialized = 1;
01160 
01161    return 0;
01162 }

static void init_logger_chain ( int  locked  )  [static]

Definition at line 307 of file logger.c.

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

Referenced by init_logger(), and reload_logger().

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

static void logger_print_normal ( struct logmsg logmsg  )  [static]

Print a normal log message to the channels.

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

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

static void logger_queue_init ( void   )  [static]

Definition at line 1107 of file logger.c.

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

Referenced by ast_queue_log().

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

static int logger_queue_restart ( int  queue_rotate  )  [static]

Definition at line 707 of file logger.c.

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

Referenced by reload_logger().

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

static int logger_queue_rt_start ( void   )  [static]

Definition at line 672 of file logger.c.

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

Referenced by logger_queue_init(), and logger_queue_restart().

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

int logger_reload ( void   ) 

Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload).

Reload logger without rotating log files.

Definition at line 800 of file logger.c.

References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.

00801 {
00802    if (reload_logger(0)) {
00803       return RESULT_FAILURE;
00804    }
00805    return RESULT_SUCCESS;
00806 }

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

Actual logging thread.

Definition at line 1060 of file logger.c.

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

Referenced by init_logger().

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

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

Definition at line 223 of file logger.c.

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

Referenced by make_logchannel(), and update_logchannels().

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

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

Definition at line 247 of file logger.c.

References __LOG_ERROR, ast_calloc, ast_config_AST_LOG_DIR, ast_console_puts_mutable(), ast_copy_string(), ast_free, ast_strlen_zero(), ast_syslog_facility(), logchannel::components, errno, logchannel::facility, logchannel::filename, logchannel::fileptr, logchannel::lineno, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, make_components(), and logchannel::type.

Referenced by init_logger_chain().

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

static int reload_logger ( int  rotate  )  [static]

Definition at line 735 of file logger.c.

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

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

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

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

Definition at line 571 of file logger.c.

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

Referenced by logger_queue_restart(), and reload_logger().

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

static void update_logchannels ( void   )  [static]

Variable Documentation

struct ast_cli_entry cli_logger[] [static]

Definition at line 934 of file logger.c.

Referenced by close_logger(), and init_logger().

int close_logger_thread = 0 [static]

Definition at line 154 of file logger.c.

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

const int colors[NUMLOGLEVELS] [static]

Colors used in the console for logging.

Definition at line 180 of file logger.c.

Referenced by logger_print_normal().

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

Definition at line 78 of file logger.c.

Referenced by build_device().

char exec_after_rotate[256] = "" [static]

Definition at line 81 of file logger.c.

int filesize_reload_needed [static]

Definition at line 83 of file logger.c.

unsigned int global_logmask = 0xFFFF [static]

Definition at line 84 of file logger.c.

struct sigaction handle_SIGXFSZ [static]
Initial value:
 {
   .sa_handler = _handle_SIGXFSZ,
   .sa_flags = SA_RESTART,
}

Definition at line 947 of file logger.c.

Referenced by init_logger().

char hostname[MAXHOSTNAMELEN] [static]
char* levels[NUMLOGLEVELS] [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 169 of file logger.c.

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

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

Definition at line 218 of file logger.c.

Referenced by ast_log().

ast_cond_t logcond [static]

Definition at line 153 of file logger.c.

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

struct { ... } logfiles [static]
int logger_initialized [static]

Definition at line 86 of file logger.c.

pthread_t logthread = AST_PTHREADT_NULL [static]

Definition at line 152 of file logger.c.

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

FILE* qlog [static]

Definition at line 97 of file logger.c.

unsigned int queue_log

Definition at line 95 of file logger.c.

char queue_log_name[256] = QUEUELOG [static]

Definition at line 80 of file logger.c.

unsigned int queue_log_to_file

Definition at line 96 of file logger.c.

int queuelog_init [static]

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

Referenced by __ast_verbose_ap().


Generated on 20 Aug 2013 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1