Fri Aug 17 00:17:43 2018

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 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 LOG_BUF_INIT_SIZE   256

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

Referenced by __ast_verbose_ap().


Enumeration Type Documentation

Enumerator:
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 122 of file logger.c.

00122                  {
00123    LOGMSG_NORMAL = 0,
00124    LOGMSG_VERBOSE,
00125 };

enum logtypes
Enumerator:
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 93 of file logger.c.

00093               {
00094    LOGTYPE_SYSLOG,
00095    LOGTYPE_FILE,
00096    LOGTYPE_CONSOLE,
00097 };

Enumerator:
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 79 of file logger.c.

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

References __ast_verbose_ap().

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

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

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

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

static void __init_log_buf ( void   )  [static]

Definition at line 209 of file logger.c.

00215 {

static void __init_verbose_buf ( void   )  [static]

Definition at line 206 of file logger.c.

00215 {

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

References ast_bt::addresses, ast_bt_create(), ast_bt_destroy(), ast_bt_get_symbols(), ast_debug, ast_log(), ast_std_free(), LOG_DEBUG, LOG_WARNING, and ast_bt::num_frames.

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

struct ast_bt* ast_bt_create ( void   )  [read]

Definition at line 1304 of file logger.c.

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

Referenced by ast_backtrace().

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

void* ast_bt_destroy ( struct ast_bt bt  ) 

Definition at line 1326 of file logger.c.

References ast_bt::alloced, and ast_free.

Referenced by ast_backtrace().

01327 {
01328    if (bt->alloced) {
01329       ast_free(bt);
01330    }
01331 
01332    return NULL;
01333 }

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

Definition at line 1335 of file logger.c.

References ast_calloc, ast_free, ast_log(), ast_malloc, ast_std_calloc(), ast_std_free(), ast_std_realloc(), ast_strlen_zero(), ast_utils_which(), LOG_DEBUG, and S_OR.

Referenced by ao2_bt(), and ast_backtrace().

01336 {
01337    char **strings;
01338 #if defined(BETTER_BACKTRACES)
01339    int stackfr;
01340    bfd *bfdobj;           /* bfd.h */
01341    Dl_info dli;           /* dlfcn.h */
01342    long allocsize;
01343    asymbol **syms = NULL; /* bfd.h */
01344    bfd_vma offset;        /* bfd.h */
01345    const char *lastslash;
01346    asection *section;
01347    const char *file, *func;
01348    unsigned int line;
01349    char address_str[128];
01350    char msg[1024];
01351    size_t strings_size;
01352    size_t *eachlen;
01353 #endif
01354 
01355 #if defined(BETTER_BACKTRACES)
01356    strings_size = num_frames * sizeof(*strings);
01357 
01358    eachlen = ast_calloc(num_frames, sizeof(*eachlen));
01359    strings = ast_std_calloc(num_frames, sizeof(*strings));
01360    if (!eachlen || !strings) {
01361       ast_free(eachlen);
01362       ast_std_free(strings);
01363       return NULL;
01364    }
01365 
01366    for (stackfr = 0; stackfr < num_frames; stackfr++) {
01367       int found = 0, symbolcount;
01368 
01369       msg[0] = '\0';
01370 
01371       if (!dladdr(addresses[stackfr], &dli)) {
01372          continue;
01373       }
01374 
01375       if (strcmp(dli.dli_fname, "asterisk") == 0) {
01376          char asteriskpath[256];
01377 
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 
01417                for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--) {
01418                }
01419                if (prevslash >= file) {
01420                   lastslash = prevslash;
01421                }
01422             }
01423             if (dli.dli_saddr == NULL) {
01424                address_str[0] = '\0';
01425             } else {
01426                snprintf(address_str, sizeof(address_str), " (%p+%lX)",
01427                   dli.dli_saddr,
01428                   (unsigned long) (addresses[stackfr] - dli.dli_saddr));
01429             }
01430             snprintf(msg, sizeof(msg), "%s:%u %s()%s",
01431                lastslash ? lastslash + 1 : file, line,
01432                S_OR(func, "???"),
01433                address_str);
01434 
01435             break; /* out of section iteration */
01436          }
01437       }
01438       if (bfdobj) {
01439          bfd_close(bfdobj);
01440          ast_free(syms);
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 
01461          eachlen[stackfr] = strlen(msg) + 1;
01462          if (!(tmp = ast_std_realloc(strings, strings_size + eachlen[stackfr]))) {
01463             ast_std_free(strings);
01464             strings = NULL;
01465             break; /* out of stack frame iteration */
01466          }
01467          strings = tmp;
01468          strings[stackfr] = (char *) strings + strings_size;
01469          strcpy(strings[stackfr], msg);/* Safe since we just allocated the room. */
01470          strings_size += eachlen[stackfr];
01471       }
01472    }
01473 
01474    if (strings) {
01475       /* Recalculate the offset pointers because of the reallocs. */
01476       strings[0] = (char *) strings + num_frames * sizeof(*strings);
01477       for (stackfr = 1; stackfr < num_frames; stackfr++) {
01478          strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1];
01479       }
01480    }
01481    ast_free(eachlen);
01482 
01483 #else /* !defined(BETTER_BACKTRACES) */
01484 
01485    strings = backtrace_symbols(addresses, num_frames);
01486 #endif /* defined(BETTER_BACKTRACES) */
01487    return strings;
01488 }

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

References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc_with_stringfields, ast_cond_signal, AST_DYNSTR_BUILD_FAILED, ast_free, ast_get_tid(), 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, 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(), __ssl_setup(), __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_cc_read(), acf_cc_write(), 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_fetch(), acf_iaxvar_read(), 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_exec_macro(), ast_app_exec_sub(), ast_app_expand_sub_args(), ast_app_group_match_get_count(), 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_config_text_file_save(), 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_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_thread_inhibit_escalations(), 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_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), astobj2_init(), 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(), balance_stack(), base64_helper(), base_encode(), blacklist_read(), 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(), can_ring_entry(), 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_lib(), close_mailbox(), close_mansession_file(), 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(), expand_gosub_args(), 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(), frame_trace_helper(), framein(), func_args(), func_channel_read(), func_channel_write(), func_channel_write_real(), func_channels_read(), func_check_sipdomain(), func_header_read(), func_inheritance_write(), func_mchan_read(), func_mchan_write(), func_mute_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(), gosub_run(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_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_invite_st(), 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(), hash_read(), hashkeys_read(), hashkeys_read2(), hint_read(), http_post_callback(), httpd_helper_thread(), 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_read(), 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_live_dangerously(), 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_queuememberpaused(), queue_function_queuememberstatus(), 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(), restore_conference(), restore_gains(), retrans_pkt(), retrydial_exec(), return_exec(), revert_fax_buffers(), ring_entry(), 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_park_thread(), 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_tcptls_read(), sip_tcptls_write(), sip_threadinfo_create(), 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_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(), 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(), tcptls_stream_close(), tdd_feed(), tdd_new(), tds_error_handler(), tds_load_module(), tds_log(), tds_message_handler(), testclient_exec(), testserver_exec(), thread_inhibits_escalations(), 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_set_rtp_peer(), 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(), 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_output(), 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().

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

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

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

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

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

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

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

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

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

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

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

Definition at line 1568 of file logger.c.

References __ast_verbose_ap().

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

void close_logger ( void   ) 

Provided by logger.c

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

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

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

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

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

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

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 
01092    return NULL;
01093 }

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

Definition at line 214 of file logger.c.

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

Referenced by make_logchannel(), and update_logchannels().

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

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

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

00239 {
00240    struct logchannel *chan;
00241    char *facility;
00242 
00243    if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1)))
00244       return NULL;
00245 
00246    strcpy(chan->components, components);
00247    chan->lineno = lineno;
00248 
00249    if (!strcasecmp(channel, "console")) {
00250       chan->type = LOGTYPE_CONSOLE;
00251    } else if (!strncasecmp(channel, "syslog", 6)) {
00252       /*
00253       * syntax is:
00254       *  syslog.facility => level,level,level
00255       */
00256       facility = strchr(channel, '.');
00257       if (!facility++ || !facility) {
00258          facility = "local0";
00259       }
00260 
00261       chan->facility = ast_syslog_facility(facility);
00262 
00263       if (chan->facility < 0) {
00264          fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
00265          ast_free(chan);
00266          return NULL;
00267       }
00268 
00269       chan->type = LOGTYPE_SYSLOG;
00270       ast_copy_string(chan->filename, channel, sizeof(chan->filename));
00271       openlog("asterisk", LOG_PID, chan->facility);
00272    } else {
00273       const char *log_dir_prefix = "";
00274       const char *log_dir_separator = "";
00275 
00276       if (channel[0] != '/') {
00277          log_dir_prefix = ast_config_AST_LOG_DIR;
00278          log_dir_separator = "/";
00279       }
00280 
00281       if (!ast_strlen_zero(hostname)) {
00282          snprintf(chan->filename, sizeof(chan->filename), "%s%s%s.%s",
00283             log_dir_prefix, log_dir_separator, channel, hostname);
00284       } else {
00285          snprintf(chan->filename, sizeof(chan->filename), "%s%s%s",
00286             log_dir_prefix, log_dir_separator, channel);
00287       }
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 145 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 171 of file logger.c.

Referenced by logger_print_normal().

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

Definition at line 69 of file logger.c.

Referenced by build_device().

char exec_after_rotate[256] = "" [static]

Definition at line 72 of file logger.c.

int filesize_reload_needed [static]

Definition at line 74 of file logger.c.

unsigned int global_logmask = 0xFFFF [static]

Definition at line 75 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 160 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 209 of file logger.c.

Referenced by ast_log().

ast_cond_t logcond [static]

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

pthread_t logthread = AST_PTHREADT_NULL [static]

Definition at line 143 of file logger.c.

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

FILE* qlog [static]

Definition at line 88 of file logger.c.

unsigned int queue_log

Definition at line 86 of file logger.c.

char queue_log_name[256] = QUEUELOG [static]

Definition at line 71 of file logger.c.

unsigned int queue_log_to_file

Definition at line 87 of file logger.c.

int queuelog_init [static]

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

Referenced by __ast_verbose_ap().


Generated on 17 Aug 2018 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1