Wed Jan 8 2020 09:50:14

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
 

Macros

#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. More...
 
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 More...
 
static void ast_log_vsyslog (struct logmsg *msg)
 
int ast_logger_register_level (const char *name)
 Register a new logger level. More...
 
void ast_logger_unregister_level (const char *name)
 Unregister a previously registered logger level. More...
 
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. More...
 
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. More...
 
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) More...
 
static void * logger_thread (void *data)
 Actual logging thread. More...
 
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. More...
 
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. More...
 
static struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , }
 
static struct logchannels logchannels = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } , }
 
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 = { 1 }
 
static int logger_initialized
 
static struct logmsgs logmsgs = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, 1 } , }
 
static pthread_t logthread = AST_PTHREADT_NULL
 
static FILE * qlog
 
static char queue_log_name [256] = QUEUELOG
 
static int queuelog_init
 
static enum rotatestrategy rotatestrategy = SEQUENTIAL
 
static struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , }
 
static struct verbosers verbosers = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } , }
 

Detailed Description

Asterisk Logger.

Logging routines

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Definition in file logger.c.

Macro Definition 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.

122  {
123  LOGMSG_NORMAL = 0,
125 };
enum logtypes
Enumerator
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 93 of file logger.c.

Enumerator
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 79 of file logger.c.

79  {
80  SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */
81  ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */
82  TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */
Definition: logger.c:81
rotatestrategy
Definition: logger.c:79

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

1557 {
1558  va_list ap;
1559 
1560  va_start(ap, fmt);
1561  __ast_verbose_ap(file, line, func, fmt, ap);
1562  va_end(ap);
1563 }
void __ast_verbose_ap(const char *file, int line, const char *func, const char *fmt, va_list ap)
Definition: logger.c:1520
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().

1521 {
1522  struct ast_str *buf = NULL;
1523  int res = 0;
1524 
1526  return;
1527 
1528  if (ast_opt_timestamp) {
1529  struct timeval now;
1530  struct ast_tm tm;
1531  char date[40];
1532  char *datefmt;
1533 
1534  now = ast_tvnow();
1535  ast_localtime(&now, &tm, NULL);
1536  ast_strftime(date, sizeof(date), dateformat, &tm);
1537  datefmt = ast_alloca(strlen(date) + 3 + strlen(fmt) + 1);
1538  sprintf(datefmt, "%c[%s] %s", 127, date, fmt);
1539  fmt = datefmt;
1540  } else {
1541  char *tmp = ast_alloca(strlen(fmt) + 2);
1542  sprintf(tmp, "%c%s", 127, fmt);
1543  fmt = tmp;
1544  }
1545 
1546  /* Build string */
1547  res = ast_str_set_va(&buf, 0, fmt, ap);
1548 
1549  /* If the build failed then we can drop this allocated message */
1550  if (res == AST_DYNSTR_BUILD_FAILED)
1551  return;
1552 
1553  ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf));
1554 }
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: utils.h:653
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:497
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1570
int ast_str_set_va(struct ast_str **buf, ssize_t max_len, const char *fmt, va_list ap)
Set a dynamic string from a va_list.
Definition: strings.h:792
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:142
#define VERBOSE_BUF_INIT_SIZE
Definition: logger.c:207
#define ast_opt_timestamp
Definition: options.h:117
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:364
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2351
static char dateformat[256]
Definition: logger.c:69
#define __LOG_VERBOSE
Definition: logger.h:165
static struct ast_threadstorage verbose_buf
Definition: logger.c:206
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:669
static void __init_log_buf ( void  )
static

Definition at line 209 of file logger.c.

215 {
static void __init_verbose_buf ( void  )
static

Definition at line 206 of file logger.c.

215 {
static void _handle_SIGXFSZ ( int  sig)
static

Definition at line 941 of file logger.c.

942 {
943  /* Indicate need to reload */
945 }
static int filesize_reload_needed
Definition: logger.c:74
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.

1493 {
1494 #ifdef HAVE_BKTR
1495  struct ast_bt *bt;
1496  int i = 0;
1497  char **strings;
1498 
1499  if (!(bt = ast_bt_create())) {
1500  ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
1501  return;
1502  }
1503 
1504  if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
1505  ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' ');
1506  for (i = 3; i < bt->num_frames - 2; i++) {
1507  ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]);
1508  }
1509 
1510  ast_std_free(strings);
1511  } else {
1512  ast_debug(1, "Could not allocate memory for backtrace\n");
1513  }
1514  ast_bt_destroy(bt);
1515 #else
1516  ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
1517 #endif /* defined(HAVE_BKTR) */
1518 }
struct ast_bt * ast_bt_create(void)
Definition: logger.c:1304
void ast_std_free(void *ptr)
#define LOG_WARNING
Definition: logger.h:144
char ** ast_bt_get_symbols(void **addresses, size_t num_frames)
Definition: logger.c:1335
#define LOG_DEBUG
Definition: logger.h:122
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:236
Definition: logger.h:267
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
void * addresses[AST_MAX_BT_FRAMES]
Definition: logger.h:269
int num_frames
Definition: logger.h:271
void * ast_bt_destroy(struct ast_bt *bt)
Definition: logger.c:1326
struct ast_bt* ast_bt_create ( void  )

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

1305 {
1306  struct ast_bt *bt = ast_calloc(1, sizeof(*bt));
1307  if (!bt) {
1308  ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n");
1309  return NULL;
1310  }
1311 
1312  bt->alloced = 1;
1313 
1315 
1316  return bt;
1317 }
Definition: logger.h:267
unsigned int alloced
Definition: logger.h:273
#define LOG_ERROR
Definition: logger.h:155
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
#define ast_calloc(a, b)
Definition: astmm.h:82
int ast_bt_get_addresses(struct ast_bt *bt)
Definition: logger.c:1319
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().

1327 {
1328  if (bt->alloced) {
1329  ast_free(bt);
1330  }
1331 
1332  return NULL;
1333 }
unsigned int alloced
Definition: logger.h:273
#define ast_free(a)
Definition: astmm.h:97
int ast_bt_get_addresses ( struct ast_bt bt)

Definition at line 1319 of file logger.c.

References ast_bt::addresses, AST_MAX_BT_FRAMES, and ast_bt::num_frames.

Referenced by __ast_pthread_mutex_lock(), __ast_pthread_mutex_trylock(), __ast_rwlock_rdlock(), __ast_rwlock_timedrdlock(), __ast_rwlock_timedwrlock(), __ast_rwlock_tryrdlock(), __ast_rwlock_trywrlock(), __ast_rwlock_wrlock(), and ast_bt_create().

1320 {
1321  bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES);
1322 
1323  return 0;
1324 }
void * addresses[AST_MAX_BT_FRAMES]
Definition: logger.h:269
#define AST_MAX_BT_FRAMES
Definition: logger.h:261
int num_frames
Definition: logger.h:271
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, ast_bt::num_frames, and S_OR.

Referenced by ao2_bt(), and ast_backtrace().

1336 {
1337  char **strings;
1338 #if defined(BETTER_BACKTRACES)
1339  int stackfr;
1340  bfd *bfdobj; /* bfd.h */
1341  Dl_info dli; /* dlfcn.h */
1342  long allocsize;
1343  asymbol **syms = NULL; /* bfd.h */
1344  bfd_vma offset; /* bfd.h */
1345  const char *lastslash;
1346  asection *section;
1347  const char *file, *func;
1348  unsigned int line;
1349  char address_str[128];
1350  char msg[1024];
1351  size_t strings_size;
1352  size_t *eachlen;
1353 #endif
1354 
1355 #if defined(BETTER_BACKTRACES)
1356  strings_size = num_frames * sizeof(*strings);
1357 
1358  eachlen = ast_calloc(num_frames, sizeof(*eachlen));
1359  strings = ast_std_calloc(num_frames, sizeof(*strings));
1360  if (!eachlen || !strings) {
1361  ast_free(eachlen);
1362  ast_std_free(strings);
1363  return NULL;
1364  }
1365 
1366  for (stackfr = 0; stackfr < num_frames; stackfr++) {
1367  int found = 0, symbolcount;
1368 
1369  msg[0] = '\0';
1370 
1371  if (!dladdr(addresses[stackfr], &dli)) {
1372  continue;
1373  }
1374 
1375  if (strcmp(dli.dli_fname, "asterisk") == 0) {
1376  char asteriskpath[256];
1377 
1378  if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) {
1379  /* This will fail to find symbols */
1380  ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n");
1381  dli.dli_fname = "asterisk";
1382  }
1383  }
1384 
1385  lastslash = strrchr(dli.dli_fname, '/');
1386  if ((bfdobj = bfd_openr(dli.dli_fname, NULL)) &&
1387  bfd_check_format(bfdobj, bfd_object) &&
1388  (allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 &&
1389  (syms = ast_malloc(allocsize)) &&
1390  (symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) {
1391 
1392  if (bfdobj->flags & DYNAMIC) {
1393  offset = addresses[stackfr] - dli.dli_fbase;
1394  } else {
1395  offset = addresses[stackfr] - (void *) 0;
1396  }
1397 
1398  for (section = bfdobj->sections; section; section = section->next) {
1399  if (!bfd_get_section_flags(bfdobj, section) & SEC_ALLOC ||
1400  section->vma > offset ||
1401  section->size + section->vma < offset) {
1402  continue;
1403  }
1404 
1405  if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) {
1406  continue;
1407  }
1408 
1409  /* file can possibly be null even with a success result from bfd_find_nearest_line */
1410  file = file ? file : "";
1411 
1412  /* Stack trace output */
1413  found++;
1414  if ((lastslash = strrchr(file, '/'))) {
1415  const char *prevslash;
1416 
1417  for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--) {
1418  }
1419  if (prevslash >= file) {
1420  lastslash = prevslash;
1421  }
1422  }
1423  if (dli.dli_saddr == NULL) {
1424  address_str[0] = '\0';
1425  } else {
1426  snprintf(address_str, sizeof(address_str), " (%p+%lX)",
1427  dli.dli_saddr,
1428  (unsigned long) (addresses[stackfr] - dli.dli_saddr));
1429  }
1430  snprintf(msg, sizeof(msg), "%s:%u %s()%s",
1431  lastslash ? lastslash + 1 : file, line,
1432  S_OR(func, "???"),
1433  address_str);
1434 
1435  break; /* out of section iteration */
1436  }
1437  }
1438  if (bfdobj) {
1439  bfd_close(bfdobj);
1440  ast_free(syms);
1441  }
1442 
1443  /* Default output, if we cannot find the information within BFD */
1444  if (!found) {
1445  if (dli.dli_saddr == NULL) {
1446  address_str[0] = '\0';
1447  } else {
1448  snprintf(address_str, sizeof(address_str), " (%p+%lX)",
1449  dli.dli_saddr,
1450  (unsigned long) (addresses[stackfr] - dli.dli_saddr));
1451  }
1452  snprintf(msg, sizeof(msg), "%s %s()%s",
1453  lastslash ? lastslash + 1 : dli.dli_fname,
1454  S_OR(dli.dli_sname, "<unknown>"),
1455  address_str);
1456  }
1457 
1458  if (!ast_strlen_zero(msg)) {
1459  char **tmp;
1460 
1461  eachlen[stackfr] = strlen(msg) + 1;
1462  if (!(tmp = ast_std_realloc(strings, strings_size + eachlen[stackfr]))) {
1463  ast_std_free(strings);
1464  strings = NULL;
1465  break; /* out of stack frame iteration */
1466  }
1467  strings = tmp;
1468  strings[stackfr] = (char *) strings + strings_size;
1469  strcpy(strings[stackfr], msg);/* Safe since we just allocated the room. */
1470  strings_size += eachlen[stackfr];
1471  }
1472  }
1473 
1474  if (strings) {
1475  /* Recalculate the offset pointers because of the reallocs. */
1476  strings[0] = (char *) strings + num_frames * sizeof(*strings);
1477  for (stackfr = 1; stackfr < num_frames; stackfr++) {
1478  strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1];
1479  }
1480  }
1481  ast_free(eachlen);
1482 
1483 #else /* !defined(BETTER_BACKTRACES) */
1484 
1485  strings = backtrace_symbols(addresses, num_frames);
1486 #endif /* defined(BETTER_BACKTRACES) */
1487  return strings;
1488 }
void ast_std_free(void *ptr)
char * ast_utils_which(const char *binary, char *fullpath, size_t fullpath_size)
Resolve a binary to a full pathname.
Definition: utils.c:2364
void * ast_std_realloc(void *ptr, size_t size)
#define LOG_DEBUG
Definition: logger.h:122
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
#define ast_free(a)
Definition: astmm.h:97
void * ast_std_calloc(size_t nmemb, size_t size)
void * addresses[AST_MAX_BT_FRAMES]
Definition: logger.h:269
int num_frames
Definition: logger.h:271
#define ast_calloc(a, b)
Definition: astmm.h:82
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:77
#define ast_malloc(a)
Definition: astmm.h:91
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().

431 {
432  char *msg = NULL, *emsg = NULL, *sptr, *eptr;
433  va_list ap, aq;
434  int size;
435 
436  /* Don't bother, if the level isn't that high */
437  if (option_verbose < level) {
438  return;
439  }
440 
441  va_start(ap, fmt);
442  va_copy(aq, ap);
443  if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) {
444  va_end(ap);
445  va_end(aq);
446  return;
447  }
448  va_end(ap);
449 
450  if (!(msg = ast_malloc(size + 1))) {
451  va_end(aq);
452  return;
453  }
454 
455  vsnprintf(msg, size + 1, fmt, aq);
456  va_end(aq);
457 
458  if (!(emsg = ast_malloc(size * 2 + 1))) {
459  ast_free(msg);
460  return;
461  }
462 
463  for (sptr = msg, eptr = emsg; ; sptr++) {
464  if (*sptr == '"') {
465  *eptr++ = '\\';
466  }
467  *eptr++ = *sptr;
468  if (*sptr == '\0') {
469  break;
470  }
471  }
472  ast_free(msg);
473 
474  fprintf(stdout, "verbose \"%s\" %d\n", emsg, level);
475  fflush(stdout);
476  ast_free(emsg);
477 }
int option_verbose
Definition: asterisk.c:181
#define ast_free(a)
Definition: astmm.h:97
#define ast_malloc(a)
Definition: astmm.h:91
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_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(), 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_parse(), 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_xmldoc_load_documentation(), 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(), board_setup(), 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_esc_publish_handler(), cc_handle_publish_error(), cccancel_exec(), cdata(), cdr_handler(), cdr_merge_vars(), chan_misdn_log(), chan_ringing(), chanavail_exec(), channel_admin_exec(), channel_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_accept_r2_call_exec(), dahdi_answer(), dahdi_ast_cause_to_r2_cause(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_func_write(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_new_pri_nobch_channel(), dahdi_open(), dahdi_pri_error(), dahdi_pri_message(), dahdi_r2_disconnect_call(), dahdi_r2_get_channel_category(), dahdi_r2_get_link(), dahdi_r2_on_call_accepted(), dahdi_r2_on_call_init(), dahdi_r2_on_call_offered(), dahdi_r2_on_line_blocked(), dahdi_r2_on_line_idle(), dahdi_r2_on_os_error(), dahdi_r2_on_protocol_error(), dahdi_r2_set_context(), dahdi_r2_write_log(), dahdi_read(), dahdi_request(), dahdi_restart(), dahdi_ring_phone(), dahdi_send_callrerouting_facility_exec(), 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_idle_thread(), 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(), eventhandler(), evt_event_deliver_cb(), ewscal_load_calendar(), exchangecal_get_events_between(), exchangecal_load_calendar(), exchangecal_request(), exchangecal_write_event(), exec(), exec_exec(), execif_exec(), exists(), 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(), gui_init(), 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_mousedown(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_playtones(), handle_pri_service_generic(), 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(), keypad_cfg_read(), keypad_pick_up(), keypad_setup(), keypad_toggle(), kp_match_area(), kqueue_timer_open(), launch_asyncagi(), launch_ha_netscript(), launch_monitor_thread(), launch_netscript(), launch_script(), launch_service(), ldap_loadentry(), ldap_reconnect(), leave_voicemail(), linear_alloc(), linear_generator(), linear_release(), 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(), 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(), mfcr2_monitor(), mgcp_call(), mgcp_fixup(), mgcp_indicate(), mgcp_new(), mgcp_reload(), mgcp_request(), mgcp_rtp_read(), mgcp_senddigit_begin(), mgcp_senddigit_end(), mgcp_ss(), mgcp_write(), mgcpsock_read(), milliwatt_generate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_delete_exec(), minivm_greet_exec(), minivm_mwi_exec(), minivm_notify_exec(), minivm_record_exec(), misdn_answer(), misdn_bridge(), misdn_call(), misdn_cfg_get(), misdn_cfg_get_config_string(), misdn_cfg_init(), misdn_cfg_is_msn_valid(), misdn_cfg_update_ptp(), misdn_check_l2l1(), misdn_digit_end(), misdn_facility_exec(), misdn_hangup(), misdn_indication(), misdn_new(), misdn_request(), misdn_send_text(), misdn_set_opt_exec(), misdn_write(), mixmonitor_exec(), mixmonitor_thread(), mkif(), 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_dchan_exception(), my_handle_dtmf(), my_handle_notify_message(), my_is_dialing(), my_is_off_hook(), my_new_pri_ast_channel(), my_pri_dial_digits(), my_pri_ss7_open_media(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), my_start_cid_detect(), my_wink(), my_x_handler(), nbs_alloc(), nbs_call(), nbs_hangup(), nbs_new(), nbs_request(), nbs_xwrite(), NBScat_exec(), NBScatplay(), netconsole(), new_find_extension(), notify_new_message(), odbc_load_module(), odbc_log(), odbc_obj_connect(), odbc_obj_disconnect(), odbc_register_class(), odbc_release_obj2(), ogg_vorbis_open(), ogg_vorbis_read(), ogg_vorbis_rewrite(), ogg_vorbis_seek(), ogg_vorbis_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_saydate(), pbx_builtin_saynumber(), pbx_builtin_saytime(), 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(), pickup_by_exten(), pickup_by_group(), pickup_exec(), pickupchan_exec(), pidf_validate_presence(), pidf_validate_tuple(), pitchshift_helper(), pktccops_add_ippool(), play_message(), play_message_category(), play_message_datetime(), play_message_on_chan(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), policy_set_suite(), pop_exec(), post_raw(), powerof(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), prepare_pri(), pri_active_dchan_index(), pri_check_restart(), pri_create_spanmap(), pri_create_trunkgroup(), pri_dchannel(), pri_find_dchan(), pri_find_fixup_principle(), pri_fixup_principle(), pri_resolve_span(), pri_send_callrerouting_facility_exec(), pri_ss_thread(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_applicationmap_line(), process_ast_dsp(), process_cn_rfc3389(), process_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(), sdl_setup(), 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_filestack(), 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(), sig_pri_call(), sig_pri_digit_begin(), sig_pri_get_orig_dialstring(), sig_pri_handle_hold(), sig_pri_handle_retrieve(), sig_pri_handle_subcmds(), sig_pri_hangup(), sig_pri_indicate(), sig_pri_make_cc_dialstring(), sig_pri_request(), sig_pri_send_aoce_termination_request(), sig_pri_start_pri(), 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_pidf_validate(), 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(), switch(), switch_video_out(), 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(), turn_on_off(), tvfix(), txt_callback(), unalloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), unistim_request(), unistim_rtp_read(), unistim_senddigit_end(), unistim_sendtext(), unistim_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(), while(), write_header(), write_history(), write_password_to_file(), write_stream(), writefile(), xmldoc_build_field(), xmldoc_get_syntax_fun(), xmldoc_string_cleanup(), xmldoc_string_wrap(), and yyerror().

1208 {
1209  struct logmsg *logmsg = NULL;
1210  struct ast_str *buf = NULL;
1211  struct ast_tm tm;
1212  struct timeval now = ast_tvnow();
1213  int res = 0;
1214  va_list ap;
1215  char datestring[256];
1216 
1218  return;
1219 
1220  if (level != __LOG_VERBOSE && AST_RWLIST_EMPTY(&logchannels)) {
1221  /*
1222  * we don't have the logger chain configured yet,
1223  * so just log to stdout
1224  */
1225  int result;
1226  va_start(ap, fmt);
1227  result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */
1228  va_end(ap);
1229  if (result != AST_DYNSTR_BUILD_FAILED) {
1231  fputs(ast_str_buffer(buf), stdout);
1232  }
1233  return;
1234  }
1235 
1236  /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug
1237  are non-zero; LOG_DEBUG messages can still be displayed if option_debug
1238  is zero, if option_verbose is non-zero (this allows for 'level zero'
1239  LOG_DEBUG messages to be displayed, if the logmask on any channel
1240  allows it)
1241  */
1242  if (!option_verbose && !option_debug && (level == __LOG_DEBUG))
1243  return;
1244 
1245  /* Ignore anything that never gets logged anywhere */
1246  if (level != __LOG_VERBOSE && !(global_logmask & (1 << level)))
1247  return;
1248 
1249  /* Build string */
1250  va_start(ap, fmt);
1251  res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
1252  va_end(ap);
1253 
1254  /* If the build failed, then abort and free this structure */
1255  if (res == AST_DYNSTR_BUILD_FAILED)
1256  return;
1257 
1258  /* Create a new logging message */
1259  if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128)))
1260  return;
1261 
1262  /* Copy string over */
1264 
1265  /* Set type */
1266  if (level == __LOG_VERBOSE) {
1267  logmsg->type = LOGMSG_VERBOSE;
1268  } else {
1269  logmsg->type = LOGMSG_NORMAL;
1270  }
1271 
1272  /* Create our date/time */
1273  ast_localtime(&now, &tm, NULL);
1274  ast_strftime(datestring, sizeof(datestring), dateformat, &tm);
1275  ast_string_field_set(logmsg, date, datestring);
1276 
1277  /* Copy over data */
1278  logmsg->level = level;
1279  logmsg->line = line;
1280  ast_string_field_set(logmsg, level_name, levels[level]);
1281  ast_string_field_set(logmsg, file, file);
1282  ast_string_field_set(logmsg, function, function);
1283  logmsg->process_id = (long) ast_get_tid();
1284 
1285  /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */
1286  if (logthread != AST_PTHREADT_NULL) {
1288  if (close_logger_thread) {
1289  /* Logger is either closing or closed. We cannot log this message. */
1290  ast_free(logmsg);
1291  } else {
1292  AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
1294  }
1296  } else {
1297  logger_print_normal(logmsg);
1298  ast_free(logmsg);
1299  }
1300 }
static void logger_print_normal(struct logmsg *logmsg)
Print a normal log message to the channels.
Definition: logger.c:971
int line
Definition: logger.c:130
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
#define __LOG_DEBUG
Definition: logger.h:121
static unsigned int global_logmask
Definition: logger.c:75
static pthread_t logthread
Definition: logger.c:143
int option_debug
Definition: asterisk.c:182
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:497
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1570
#define LOG_BUF_INIT_SIZE
Definition: logger.c:210
int ast_str_set_va(struct ast_str **buf, ssize_t max_len, const char *fmt, va_list ap)
Set a dynamic string from a va_list.
Definition: strings.h:792
int option_verbose
Definition: asterisk.c:181
#define ast_calloc_with_stringfields(n, type, size)
Allocate a structure with embedded stringfields in a single allocation.
Definition: stringfields.h:275
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:160
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:142
#define ast_cond_signal(cond)
Definition: lock.h:169
static struct ast_threadstorage log_buf
Definition: logger.c:209
Definition: logger.c:127
int ast_get_tid(void)
Get current thread ID.
Definition: utils.c:2346
#define AST_PTHREADT_NULL
Definition: lock.h:65
void term_filter_escapes(char *line)
Definition: term.c:338
int level
Definition: logger.c:129
#define AST_RWLIST_EMPTY
Definition: linkedlists.h:451
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:716
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:364
#define ast_free(a)
Definition: astmm.h:97
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2351
enum logmsgtypes type
Definition: logger.c:128
static char dateformat[256]
Definition: logger.c:69
#define __LOG_VERBOSE
Definition: logger.h:165
long process_id
Definition: logger.c:131
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:669
static int close_logger_thread
Definition: logger.c:145
static ast_cond_t logcond
Definition: logger.c:144
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:344
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().

953 {
954  char buf[BUFSIZ];
955  int syslog_level = ast_syslog_priority_from_loglevel(msg->level);
956 
957  if (syslog_level < 0) {
958  /* we are locked here, so cannot ast_log() */
959  fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level);
960  return;
961  }
962 
963  snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s",
964  levels[msg->level], msg->process_id, msg->file, msg->line, msg->function, msg->message);
965 
966  term_strip(buf, buf, strlen(buf) + 1);
967  syslog(syslog_level, "%s", buf);
968 }
int line
Definition: logger.c:130
char * term_strip(char *outbuf, const char *inbuf, int maxout)
Definition: term.c:287
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:160
int ast_syslog_priority_from_loglevel(int level)
Maps an Asterisk log level (i.e. LOG_ERROR) to a syslog priority constant.
Definition: syslog.c:164
const ast_string_field function
Definition: logger.c:138
int level
Definition: logger.c:129
const ast_string_field message
Definition: logger.c:138
long process_id
Definition: logger.c:131
const ast_string_field file
Definition: logger.c:138
int ast_logger_register_level ( const char *  name)

Register a new logger level.

Parameters
nameThe name of the level to be registered
Return values
-1if an error occurs
non-zerolevel 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().

1628 {
1629  unsigned int level;
1630  unsigned int available = 0;
1631 
1633 
1634  for (level = 0; level < ARRAY_LEN(levels); level++) {
1635  if ((level >= 16) && !available && !levels[level]) {
1636  available = level;
1637  continue;
1638  }
1639 
1640  if (levels[level] && !strcasecmp(levels[level], name)) {
1642  "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n",
1643  name);
1645 
1646  return -1;
1647  }
1648  }
1649 
1650  if (!available) {
1652  "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n",
1653  name);
1655 
1656  return -1;
1657  }
1658 
1660 
1662 
1663  ast_debug(1, "Registered dynamic logger level '%s' with index %u.\n", name, available);
1664 
1666 
1667  return available;
1668 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define ast_strdup(a)
Definition: astmm.h:109
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define LOG_WARNING
Definition: logger.h:144
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:160
static void update_logchannels(void)
Definition: logger.c:1611
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:236
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
static const char name[]
static int available(struct dahdi_pvt **pvt, int is_specific_channel)
Definition: chan_dahdi.c:13288
void ast_logger_unregister_level ( const char *  name)

Unregister a previously registered logger level.

Parameters
nameThe 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().

1671 {
1672  unsigned int found = 0;
1673  unsigned int x;
1674 
1676 
1677  for (x = 16; x < ARRAY_LEN(levels); x++) {
1678  if (!levels[x]) {
1679  continue;
1680  }
1681 
1682  if (strcasecmp(levels[x], name)) {
1683  continue;
1684  }
1685 
1686  found = 1;
1687  break;
1688  }
1689 
1690  if (found) {
1691  /* take this level out of the global_logmask, to ensure that no new log messages
1692  * will be queued for it
1693  */
1694 
1695  global_logmask &= ~(1 << x);
1696 
1697  ast_free(levels[x]);
1698  levels[x] = NULL;
1700 
1701  ast_debug(1, "Unregistered dynamic logger level '%s' with index %u.\n", name, x);
1702 
1704  } else {
1706  }
1707 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static unsigned int global_logmask
Definition: logger.c:75
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:160
static void update_logchannels(void)
Definition: logger.c:1611
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:236
static const char name[]
#define ast_free(a)
Definition: astmm.h:97
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().

480 {
481  va_list ap;
482  struct timeval tv;
483  struct ast_tm tm;
484  char qlog_msg[8192];
485  int qlog_len;
486  char time_str[30];
487 
488  if (!logger_initialized) {
489  /* You are too early. We are not open yet! */
490  return;
491  }
492  if (!queuelog_init) {
494  if (!queuelog_init) {
495  /*
496  * We have delayed initializing the queue logging system so
497  * preloaded realtime modules can get up. We must initialize
498  * now since someone is trying to log something.
499  */
501  queuelog_init = 1;
503  ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", "");
504  } else {
506  }
507  }
508 
509  if (ast_check_realtime("queue_log")) {
510  tv = ast_tvnow();
511  ast_localtime(&tv, &tm, NULL);
512  ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm);
513  va_start(ap, fmt);
514  vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
515  va_end(ap);
516  if (logfiles.queue_adaptive_realtime) {
518  AST_APP_ARG(data)[5];
519  );
520  AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|');
521  /* Ensure fields are large enough to receive data */
522  ast_realtime_require_field("queue_log",
523  "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")),
524  "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")),
525  "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")),
526  "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")),
527  "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")),
528  SENTINEL);
529 
530  /* Store the log */
531  ast_store_realtime("queue_log", "time", time_str,
532  "callid", callid,
533  "queuename", queuename,
534  "agent", agent,
535  "event", event,
536  "data1", S_OR(args.data[0], ""),
537  "data2", S_OR(args.data[1], ""),
538  "data3", S_OR(args.data[2], ""),
539  "data4", S_OR(args.data[3], ""),
540  "data5", S_OR(args.data[4], ""),
541  SENTINEL);
542  } else {
543  ast_store_realtime("queue_log", "time", time_str,
544  "callid", callid,
545  "queuename", queuename,
546  "agent", agent,
547  "event", event,
548  "data", qlog_msg,
549  SENTINEL);
550  }
551 
552  if (!logfiles.queue_log_to_file) {
553  return;
554  }
555  }
556 
557  if (qlog) {
558  va_start(ap, fmt);
559  qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
560  vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
561  va_end(ap);
563  if (qlog) {
564  fprintf(qlog, "%s\n", qlog_msg);
565  fflush(qlog);
566  }
568  }
569 }
int ast_store_realtime(const char *family,...) attribute_sentinel
Create realtime configuration.
Definition: config.c:2726
static int queuelog_init
Definition: logger.c:76
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1570
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application&#39;s arguments.
Definition: app.h:572
void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
Definition: logger.c:479
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:142
static FILE * qlog
Definition: logger.c:147
static struct @282 logfiles
static int logger_initialized
Definition: logger.c:77
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
Definition: config.h:68
#define SENTINEL
Definition: compiler.h:75
static struct @350 args
static void logger_queue_init(void)
Definition: logger.c:1103
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2351
int ast_realtime_require_field(const char *family,...) attribute_sentinel
Inform realtime what fields that may be stored.
Definition: config.c:2606
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:77
struct timeval tv
#define AST_APP_ARG(name)
Define an application argument.
Definition: app.h:555
#define AST_NONSTANDARD_APP_ARGS(args, parse, sep)
Performs the &#39;nonstandard&#39; argument separation process for an application.
Definition: app.h:619
int ast_check_realtime(const char *family)
Check if realtime engine is configured for family.
Definition: config.c:2587
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().

1578 {
1579  struct verb *verb;
1580 
1581  if (!(verb = ast_malloc(sizeof(*verb))))
1582  return -1;
1583 
1584  verb->verboser = v;
1585 
1589 
1590  return 0;
1591 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:703
struct verb::@285 list
Definition: logger.c:927
void(* verboser)(const char *string)
Definition: logger.c:928
#define ast_malloc(a)
Definition: astmm.h:91
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.

1594 {
1595  struct verb *cur;
1596 
1599  if (cur->verboser == v) {
1601  ast_free(cur);
1602  break;
1603  }
1604  }
1607 
1608  return cur ? 0 : -1;
1609 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
struct verb::@285 list
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:565
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:542
Definition: logger.c:927
void(* verboser)(const char *string)
Definition: logger.c:928
#define ast_free(a)
Definition: astmm.h:97
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:602
void ast_verbose ( const char *  fmt,
  ... 
)

Definition at line 1568 of file logger.c.

References __ast_verbose_ap().

Referenced by __agent_start_monitoring(), __ast_bridge_technology_register(), __ast_str_helper(), __sip_destroy(), add_codec_to_sdp(), add_noncodec_to_sdp(), add_sdp(), add_tcodec_to_sdp(), add_vcodec_to_sdp(), aji_handle_presence(), aji_handle_subscribe(), aji_log_hook(), aji_receive_node_list(), alsa_answer(), alsa_call(), alsa_digit(), alsa_hangup(), alsa_indicate(), alsa_text(), ao2_bt(), ast_agi_send(), ast_bridge_technology_unregister(), ast_frame_dump(), ast_module_reload(), ast_readconfig(), ast_remotecontrol(), 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_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_say_enumeration_full_he(), ast_say_number_full_he(), ast_set_priority(), ast_stun_handle_packet(), astman_append(), auth_headers(), bridge_p2p_rtp_write(), can_safely_quit(), chan_misdn_log(), check_peer_ok(), check_via(), conf_run(), console_answer(), dahdi_pri_message(), dahdi_r2_on_billing_pulse_received(), dahdi_r2_on_call_accepted(), dahdi_r2_on_call_answered(), dahdi_r2_on_call_disconnect(), dahdi_r2_on_call_end(), dahdi_r2_on_call_init(), dahdi_r2_on_call_offered(), dahdi_r2_write_log(), dahdi_softhangup_all(), dialout(), do_register_auth(), dumpchan_exec(), dundi_debug_output(), find_gtalk(), find_transcoders(), get_also_info(), get_destination(), get_rdnis(), get_refer_info(), gtalk_handle_dtmf(), h323_reload(), handle_cli_misdn_send_facility(), handle_frame(), handle_incoming(), handle_offhook_message(), handle_request_do(), handle_request_info(), handle_request_invite(), handle_request_message(), handle_request_refer(), handle_request_subscribe(), handle_response(), handle_transfer_button(), hook_event_cb(), iax_debug_output(), init_files_class(), initialize_initreq(), ivr_demo_func(), jb_debug_output(), jingle_handle_dtmf(), list_route(), load_config(), load_module(), main(), mgcp_reload(), moh_files_release(), oss_answer(), oss_call(), oss_digit_end(), oss_hangup(), oss_indicate(), oss_text(), parse_register_contact(), phone_check_exception(), phone_exception(), play_record_review(), pri_dchannel(), print_frame(), print_intro_message(), process_dtmf_rfc2833(), process_sdp(), process_sdp_a_audio(), process_sdp_a_text(), process_sdp_a_video(), really_quit(), receive_message(), retrans_pkt(), run_agi(), send_request(), send_response(), set_destination(), sip_new(), sip_read(), sip_reload(), sip_rtp_read(), sip_scheddestroy(), sip_sendtext(), start_resource(), stun_process_attr(), timeout_write(), timing_read(), transmit_register(), transmit_softkeysetres(), and verbose_exec().

1569 {
1570  va_list ap;
1571 
1572  va_start(ap, fmt);
1573  __ast_verbose_ap("", 0, "", fmt, ap);
1574  va_end(ap);
1575 }
void __ast_verbose_ap(const char *file, int line, const char *func, const char *fmt, va_list ap)
Definition: logger.c:1520
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().

1161 {
1162  struct logchannel *f = NULL;
1163  struct verb *cur = NULL;
1164 
1166 
1167  logger_initialized = 0;
1168 
1169  /* Stop logger thread */
1171  close_logger_thread = 1;
1174 
1176  pthread_join(logthread, NULL);
1177 
1179  while ((cur = AST_LIST_REMOVE_HEAD(&verbosers, list))) {
1180  ast_free(cur);
1181  }
1183 
1185 
1186  if (qlog) {
1187  fclose(qlog);
1188  qlog = NULL;
1189  }
1190 
1191  while ((f = AST_LIST_REMOVE_HEAD(&logchannels, list))) {
1192  if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
1193  fclose(f->fileptr);
1194  f->fileptr = NULL;
1195  }
1196  ast_free(f);
1197  }
1198 
1199  closelog(); /* syslog */
1200 
1202 }
static struct ast_cli_entry cli_logger[]
Definition: logger.c:934
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: cli.c:2177
static pthread_t logthread
Definition: logger.c:143
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_cond_signal(cond)
Definition: lock.h:169
static FILE * qlog
Definition: logger.c:147
static int logger_initialized
Definition: logger.c:77
struct verb::@285 list
#define AST_PTHREADT_NULL
Definition: lock.h:65
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:818
Definition: logger.c:927
#define ast_free(a)
Definition: astmm.h:97
static struct ast_format f[]
Definition: format_g726.c:181
FILE * fileptr
Definition: logger.c:109
static int close_logger_thread
Definition: logger.c:145
static ast_cond_t logcond
Definition: logger.c:144
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.

809 {
810  switch (cmd) {
811  case CLI_INIT:
812  e->command = "logger reload";
813  e->usage =
814  "Usage: logger reload\n"
815  " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n";
816  return NULL;
817  case CLI_GENERATE:
818  return NULL;
819  }
820  if (reload_logger(0)) {
821  ast_cli(a->fd, "Failed to reload the logger\n");
822  return CLI_FAILURE;
823  }
824  return CLI_SUCCESS;
825 }
Definition: cli.h:146
void ast_cli(int fd, const char *fmt,...)
Definition: cli.c:105
const int fd
Definition: cli.h:153
#define CLI_FAILURE
Definition: cli.h:45
char * command
Definition: cli.h:180
const char * usage
Definition: cli.h:171
#define CLI_SUCCESS
Definition: cli.h:43
static int reload_logger(int rotate)
Definition: logger.c:735
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.

828 {
829  switch (cmd) {
830  case CLI_INIT:
831  e->command = "logger rotate";
832  e->usage =
833  "Usage: logger rotate\n"
834  " Rotates and Reopens the log files.\n";
835  return NULL;
836  case CLI_GENERATE:
837  return NULL;
838  }
839  if (reload_logger(1)) {
840  ast_cli(a->fd, "Failed to reload the logger and rotate log files\n");
841  return CLI_FAILURE;
842  }
843  return CLI_SUCCESS;
844 }
Definition: cli.h:146
void ast_cli(int fd, const char *fmt,...)
Definition: cli.c:105
const int fd
Definition: cli.h:153
#define CLI_FAILURE
Definition: cli.h:45
char * command
Definition: cli.h:180
const char * usage
Definition: cli.h:171
#define CLI_SUCCESS
Definition: cli.h:43
static int reload_logger(int rotate)
Definition: logger.c:735
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, state, and ast_cli_entry::usage.

847 {
848  int x;
849  int state;
850  int level = -1;
851 
852  switch (cmd) {
853  case CLI_INIT:
854  e->command = "logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}";
855  e->usage =
856  "Usage: logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n"
857  " Set a specific log level to enabled/disabled for this console.\n";
858  return NULL;
859  case CLI_GENERATE:
860  return NULL;
861  }
862 
863  if (a->argc < 5)
864  return CLI_SHOWUSAGE;
865 
867 
868  for (x = 0; x < ARRAY_LEN(levels); x++) {
869  if (levels[x] && !strcasecmp(a->argv[3], levels[x])) {
870  level = x;
871  break;
872  }
873  }
874 
876 
877  state = ast_true(a->argv[4]) ? 1 : 0;
878 
879  if (level != -1) {
880  ast_console_toggle_loglevel(a->fd, level, state);
881  ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off");
882  } else
883  return CLI_SHOWUSAGE;
884 
885  return CLI_SUCCESS;
886 }
enum sip_cc_notify_state state
Definition: chan_sip.c:842
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
const int argc
Definition: cli.h:154
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition: cli.h:146
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:160
void ast_console_toggle_loglevel(int fd, int level, int state)
enables or disables logging of a specified level to the console fd specifies the index of the console...
Definition: asterisk.c:1136
void ast_cli(int fd, const char *fmt,...)
Definition: cli.c:105
const int fd
Definition: cli.h:153
const char *const * argv
Definition: cli.h:155
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is &quot;true&quot;. This function checks to see whether a string passed to it is an indication of an &quot;true&quot; value. It checks to see if the string is &quot;yes&quot;, &quot;true&quot;, &quot;y&quot;, &quot;t&quot;, &quot;on&quot; or &quot;1&quot;.
Definition: utils.c:1533
#define CLI_SHOWUSAGE
Definition: cli.h:44
char * command
Definition: cli.h:180
const char * usage
Definition: cli.h:171
#define CLI_SUCCESS
Definition: cli.h:43
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.

890 {
891 #define FORMATL "%-35.35s %-8.8s %-9.9s "
892  struct logchannel *chan;
893  switch (cmd) {
894  case CLI_INIT:
895  e->command = "logger show channels";
896  e->usage =
897  "Usage: logger show channels\n"
898  " List configured logger channels.\n";
899  return NULL;
900  case CLI_GENERATE:
901  return NULL;
902  }
903  ast_cli(a->fd, FORMATL, "Channel", "Type", "Status");
904  ast_cli(a->fd, "Configuration\n");
905  ast_cli(a->fd, FORMATL, "-------", "----", "------");
906  ast_cli(a->fd, "-------------\n");
909  unsigned int level;
910 
911  ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"),
912  chan->disabled ? "Disabled" : "Enabled");
913  ast_cli(a->fd, " - ");
914  for (level = 0; level < ARRAY_LEN(levels); level++) {
915  if ((chan->logmask & (1 << level)) && levels[level]) {
916  ast_cli(a->fd, "%s ", levels[level]);
917  }
918  }
919  ast_cli(a->fd, "\n");
920  }
922  ast_cli(a->fd, "\n");
923 
924  return CLI_SUCCESS;
925 }
#define FORMATL
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
struct logchannel::@283 list
Definition: cli.h:146
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:160
void ast_cli(int fd, const char *fmt,...)
Definition: cli.c:105
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
const int fd
Definition: cli.h:153
unsigned int logmask
Definition: logger.c:101
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:103
enum logtypes type
Definition: logger.c:107
char * command
Definition: cli.h:180
const char * usage
Definition: cli.h:171
char filename[PATH_MAX]
Definition: logger.c:111
#define CLI_SUCCESS
Definition: cli.h:43
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(), logmsgs::lock, logcond, logger_thread(), and logthread.

Referenced by main().

1128 {
1129  /* auto rotate if sig SIGXFSZ comes a-knockin */
1130  sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL);
1131 
1132  /* Re-initialize the logmsgs mutex. The recursive mutex can be accessed prior
1133  * to Asterisk being forked into the background, which can cause the thread
1134  * ID tracked by the underlying pthread mutex to be different than the ID of
1135  * the thread that unlocks the mutex. Since init_logger is called after the
1136  * fork, it is safe to initialize the mutex here for future accesses.
1137  */
1140  ast_cond_init(&logcond, NULL);
1141 
1142  /* start logger thread */
1143  if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) {
1145  return -1;
1146  }
1147 
1148  /* register the logger cli commands */
1150 
1152 
1153  /* create log channels */
1154  init_logger_chain(0 /* locked */);
1155  logger_initialized = 1;
1156 
1157  return 0;
1158 }
static struct ast_cli_entry cli_logger[]
Definition: logger.c:934
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static struct sigaction handle_SIGXFSZ
Definition: logger.c:947
static pthread_t logthread
Definition: logger.c:143
#define ast_cond_init(cond, attr)
Definition: lock.h:167
static int logger_initialized
Definition: logger.c:77
#define ast_cond_destroy(cond)
Definition: lock.h:168
const char * ast_config_AST_LOG_DIR
Definition: asterisk.c:263
static void * logger_thread(void *data)
Actual logging thread.
Definition: logger.c:1060
#define ast_pthread_create(a, b, c, d)
Definition: utils.h:418
int ast_cli_register_multiple(struct ast_cli_entry *e, int len)
Register multiple commands.
Definition: cli.c:2167
#define ast_mutex_init(pmutex)
Definition: lock.h:152
static void init_logger_chain(int locked)
Definition: logger.c:307
#define ast_mutex_destroy(a)
Definition: lock.h:154
ast_mutex_t lock
Definition: logger.c:142
static ast_cond_t logcond
Definition: logger.c:144
int ast_mkdir(const char *path, int mode)
Recursively create directory path.
Definition: utils.c:2151
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().

308 {
309  struct logchannel *chan;
310  struct ast_config *cfg;
311  struct ast_variable *var;
312  const char *s;
313  struct ast_flags config_flags = { 0 };
314 
315  if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
316  return;
317  }
318 
319  /* delete our list of log channels */
320  if (!locked) {
322  }
323  while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) {
324  ast_free(chan);
325  }
326  global_logmask = 0;
327  if (!locked) {
329  }
330 
331  errno = 0;
332  /* close syslog */
333  closelog();
334 
335  /* If no config file, we're fine, set default options. */
336  if (!cfg) {
337  if (errno) {
338  fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno));
339  } else {
340  fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n");
341  }
342  if (!(chan = ast_calloc(1, sizeof(*chan)))) {
343  return;
344  }
345  chan->type = LOGTYPE_CONSOLE;
347  if (!locked) {
349  }
350  AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
351  global_logmask |= chan->logmask;
352  if (!locked) {
354  }
355  return;
356  }
357 
358  if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) {
359  if (ast_true(s)) {
360  if (gethostname(hostname, sizeof(hostname) - 1)) {
361  ast_copy_string(hostname, "unknown", sizeof(hostname));
362  fprintf(stderr, "What box has no hostname???\n");
363  }
364  } else
365  hostname[0] = '\0';
366  } else
367  hostname[0] = '\0';
368  if ((s = ast_variable_retrieve(cfg, "general", "dateformat")))
370  else
371  ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat));
372  if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) {
373  logfiles.queue_log = ast_true(s);
374  }
375  if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) {
376  logfiles.queue_log_to_file = ast_true(s);
377  }
378  if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) {
380  }
381  if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) {
383  }
384  if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) {
385  if (strcasecmp(s, "timestamp") == 0) {
387  } else if (strcasecmp(s, "rotate") == 0) {
389  } else if (strcasecmp(s, "sequential") == 0) {
391  } else {
392  fprintf(stderr, "Unknown rotatestrategy: %s\n", s);
393  }
394  } else {
395  if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) {
397  fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n");
398  }
399  }
400 
401  if (!locked) {
403  }
404  var = ast_variable_browse(cfg, "logfiles");
405  for (; var; var = var->next) {
406  if (!(chan = make_logchannel(var->name, var->value, var->lineno))) {
407  /* Print error message directly to the consoles since the lock is held
408  * and we don't want to unlock with the list partially built */
409  ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR);
412  continue;
413  }
414  AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
415  global_logmask |= chan->logmask;
416  }
417 
418  if (qlog) {
419  fclose(qlog);
420  qlog = NULL;
421  }
422 
423  if (!locked) {
425  }
426 
427  ast_config_destroy(cfg);
428 }
const char * ast_variable_retrieve(const struct ast_config *config, const char *category, const char *variable)
Gets a variable.
Definition: config.c:625
static unsigned int global_logmask
Definition: logger.c:75
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category)
Goes through variables.
Definition: config.c:597
int lineno
Definition: config.h:87
static struct logchannel * make_logchannel(const char *channel, const char *components, int lineno)
Definition: logger.c:238
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Structure for variables, used for configurations and for channel variables.
Definition: config.h:75
#define var
Definition: ast_expr2f.c:606
#define __LOG_WARNING
Definition: logger.h:143
#define __LOG_ERROR
Definition: logger.h:154
struct ast_config * ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags)
Load a config file.
Definition: config.c:2499
static FILE * qlog
Definition: logger.c:147
void ast_config_destroy(struct ast_config *config)
Destroys a config.
Definition: config.c:1037
static struct @282 logfiles
Definition: logger.c:81
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:703
const char * value
Definition: config.h:79
unsigned int logmask
Definition: logger.c:101
static char queue_log_name[256]
Definition: logger.c:71
const char * name
Definition: config.h:77
static char exec_after_rotate[256]
Definition: logger.c:72
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is &quot;true&quot;. This function checks to see whether a string passed to it is an indication of an &quot;true&quot; value. It checks to see if the string is &quot;yes&quot;, &quot;true&quot;, &quot;y&quot;, &quot;t&quot;, &quot;on&quot; or &quot;1&quot;.
Definition: utils.c:1533
enum logtypes type
Definition: logger.c:107
int errno
#define ast_free(a)
Definition: astmm.h:97
#define AST_RWLIST_REMOVE_HEAD
Definition: linkedlists.h:829
void ast_console_puts_mutable(const char *string, int level)
log the string to the console, and all attached console clients
Definition: asterisk.c:1199
Structure used to handle boolean flags.
Definition: utils.h:200
#define __LOG_NOTICE
Definition: logger.h:132
static char dateformat[256]
Definition: logger.c:69
rotatestrategy
Definition: logger.c:79
#define ast_calloc(a, b)
Definition: astmm.h:82
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:223
struct ast_variable * next
Definition: config.h:82
#define CONFIG_STATUS_FILEINVALID
Definition: config.h:52
static char hostname[MAXHOSTNAMELEN]
Definition: logger.c:91
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().

972 {
973  struct logchannel *chan = NULL;
974  char buf[BUFSIZ];
975  struct verb *v = NULL;
976 
977  if (logmsg->level == __LOG_VERBOSE) {
978  char *tmpmsg = ast_strdupa(logmsg->message + 1);
979  /* Iterate through the list of verbosers and pass them the log message string */
982  v->verboser(logmsg->message);
984  ast_string_field_set(logmsg, message, tmpmsg);
985  }
986 
988 
989  if (!AST_RWLIST_EMPTY(&logchannels)) {
990  AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
991  /* If the channel is disabled, then move on to the next one */
992  if (chan->disabled)
993  continue;
994  /* Check syslog channels */
995  if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) {
996  ast_log_vsyslog(logmsg);
997  /* Console channels */
998  } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) {
999  char linestr[128];
1000  char tmp1[80], tmp2[80], tmp3[80], tmp4[80];
1001 
1002  /* If the level is verbose, then skip it */
1003  if (logmsg->level == __LOG_VERBOSE)
1004  continue;
1005 
1006  /* Turn the numerical line number into a string */
1007  snprintf(linestr, sizeof(linestr), "%d", logmsg->line);
1008  /* Build string to print out */
1009  snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s",
1010  logmsg->date,
1011  term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)),
1012  logmsg->process_id,
1013  term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)),
1014  term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
1015  term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)),
1016  logmsg->message);
1017  /* Print out */
1018  ast_console_puts_mutable(buf, logmsg->level);
1019  /* File channels */
1020  } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) {
1021  int res = 0;
1022 
1023  /* If no file pointer exists, skip it */
1024  if (!chan->fileptr) {
1025  continue;
1026  }
1027 
1028  /* Print out to the file */
1029  res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s",
1030  logmsg->date, logmsg->level_name, logmsg->process_id, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ));
1031  if (res <= 0 && !ast_strlen_zero(logmsg->message)) {
1032  fprintf(stderr, "**** Asterisk Logging Error: ***********\n");
1033  if (errno == ENOMEM || errno == ENOSPC)
1034  fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename);
1035  else
1036  fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno));
1037  manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno));
1038  chan->disabled = 1;
1039  } else if (res > 0) {
1040  fflush(chan->fileptr);
1041  }
1042  }
1043  }
1044  } else if (logmsg->level != __LOG_VERBOSE) {
1045  fputs(logmsg->message, stdout);
1046  }
1047 
1048  AST_RWLIST_UNLOCK(&logchannels);
1049 
1050  /* If we need to reload because of the file size, then do so */
1051  if (filesize_reload_needed) {
1052  reload_logger(-1);
1053  ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n");
1054  }
1055 
1056  return;
1057 }
static const int colors[NUMLOGLEVELS]
Colors used in the console for logging.
Definition: logger.c:171
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
char * term_strip(char *outbuf, const char *inbuf, int maxout)
Definition: term.c:287
#define COLOR_BRWHITE
Definition: term.h:62
#define ast_verb(level,...)
Definition: logger.h:243
static int filesize_reload_needed
Definition: logger.c:74
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define EVENT_FLAG_SYSTEM
Definition: manager.h:71
struct verb::@285 list
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
unsigned int logmask
Definition: logger.c:101
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int level
Definition: logger.c:129
int disabled
Definition: logger.c:103
Definition: logger.c:927
char * term_color(char *outbuf, const char *inbuf, int fgcolor, int bgcolor, int maxout)
Definition: term.c:184
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: utils.h:663
#define AST_RWLIST_EMPTY
Definition: linkedlists.h:451
static void ast_log_vsyslog(struct logmsg *msg)
Definition: logger.c:952
enum logtypes type
Definition: logger.c:107
void(* verboser)(const char *string)
Definition: logger.c:928
int errno
void ast_console_puts_mutable(const char *string, int level)
log the string to the console, and all attached console clients
Definition: asterisk.c:1199
if(yyss+yystacksize-1<=yyssp)
Definition: ast_expr2.c:1874
FILE * fileptr
Definition: logger.c:109
char filename[PATH_MAX]
Definition: logger.c:111
#define __LOG_VERBOSE
Definition: logger.h:165
const ast_string_field message
Definition: logger.c:138
static int reload_logger(int rotate)
Definition: logger.c:735
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:219
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:344
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().

1104 {
1105  ast_unload_realtime("queue_log");
1106  if (logfiles.queue_log) {
1107  char qfname[PATH_MAX];
1108 
1109  if (logger_queue_rt_start()) {
1110  return;
1111  }
1112 
1113  /* Open the log file. */
1114  snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR,
1115  queue_log_name);
1116  if (qlog) {
1117  /* Just in case it was already open. */
1118  fclose(qlog);
1119  }
1120  qlog = fopen(qfname, "a");
1121  if (!qlog) {
1122  ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
1123  }
1124  }
1125 }
int ast_unload_realtime(const char *family)
Release any resources cached for a realtime family.
Definition: config.c:2630
static FILE * qlog
Definition: logger.c:147
static struct @282 logfiles
static int logger_queue_rt_start(void)
Definition: logger.c:672
static char queue_log_name[256]
Definition: logger.c:71
#define LOG_ERROR
Definition: logger.h:155
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
const char * ast_config_AST_LOG_DIR
Definition: asterisk.c:263
int errno
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().

708 {
709  int res = 0;
710  char qfname[PATH_MAX];
711 
712  if (logger_queue_rt_start()) {
713  return res;
714  }
715 
716  snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
717  if (qlog) {
718  /* Just in case it was still open. */
719  fclose(qlog);
720  qlog = NULL;
721  }
722  if (queue_rotate) {
723  rotate_file(qfname);
724  }
725 
726  /* Open the log file. */
727  qlog = fopen(qfname, "a");
728  if (!qlog) {
729  ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
730  res = -1;
731  }
732  return res;
733 }
static int rotate_file(const char *filename)
Definition: logger.c:571
static FILE * qlog
Definition: logger.c:147
static int logger_queue_rt_start(void)
Definition: logger.c:672
static char queue_log_name[256]
Definition: logger.c:71
#define LOG_ERROR
Definition: logger.h:155
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
const char * ast_config_AST_LOG_DIR
Definition: asterisk.c:263
int errno
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().

673 {
674  if (ast_check_realtime("queue_log")) {
675  if (!ast_realtime_require_field("queue_log",
676  "time", RQ_DATETIME, 26,
677  "data1", RQ_CHAR, 20,
678  "data2", RQ_CHAR, 20,
679  "data3", RQ_CHAR, 20,
680  "data4", RQ_CHAR, 20,
681  "data5", RQ_CHAR, 20,
682  SENTINEL)) {
683  logfiles.queue_adaptive_realtime = 1;
684  } else {
685  logfiles.queue_adaptive_realtime = 0;
686  }
687 
688  if (!logfiles.queue_log_to_file) {
689  /* Don't open the log file. */
690  return 1;
691  }
692  }
693  return 0;
694 }
static struct @282 logfiles
Definition: config.h:68
#define SENTINEL
Definition: compiler.h:75
int ast_realtime_require_field(const char *family,...) attribute_sentinel
Inform realtime what fields that may be stored.
Definition: config.c:2606
int ast_check_realtime(const char *family)
Check if realtime engine is configured for family.
Definition: config.c:2587
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.

801 {
802  if (reload_logger(0)) {
803  return RESULT_FAILURE;
804  }
805  return RESULT_SUCCESS;
806 }
static int reload_logger(int rotate)
Definition: logger.c:735
#define RESULT_SUCCESS
Definition: cli.h:39
#define RESULT_FAILURE
Definition: cli.h:41
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, logmsgs::lock, logcond, logger_print_normal(), and logchannel::next.

Referenced by init_logger().

1061 {
1062  struct logmsg *next = NULL, *msg = NULL;
1063 
1064  for (;;) {
1065  /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */
1067  if (AST_LIST_EMPTY(&logmsgs)) {
1068  if (close_logger_thread) {
1070  break;
1071  } else {
1073  }
1074  }
1075  next = AST_LIST_FIRST(&logmsgs);
1078 
1079  /* Otherwise go through and process each message in the order added */
1080  while ((msg = next)) {
1081  /* Get the next entry now so that we can free our current structure later */
1082  next = AST_LIST_NEXT(msg, list);
1083 
1084  /* Depending on the type, send it to the proper function */
1085  logger_print_normal(msg);
1086 
1087  /* Free the data since we are done */
1088  ast_free(msg);
1089  }
1090  }
1091 
1092  return NULL;
1093 }
static void logger_print_normal(struct logmsg *logmsg)
Print a normal log message to the channels.
Definition: logger.c:971
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:420
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:438
struct logmsg * next
Definition: logger.c:139
#define ast_cond_wait(cond, mutex)
Definition: lock.h:171
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:449
Definition: logger.c:127
#define ast_free(a)
Definition: astmm.h:97
struct logmsg::@284 list
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:666
static int close_logger_thread
Definition: logger.c:145
ast_mutex_t lock
Definition: logger.c:142
static ast_cond_t logcond
Definition: logger.c:144
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, levels, and strsep().

Referenced by make_logchannel(), and update_logchannels().

215 {
216  char *w;
217  unsigned int res = 0;
218  char *stringp = ast_strdupa(s);
219  unsigned int x;
220 
221  while ((w = strsep(&stringp, ","))) {
222  w = ast_skip_blanks(w);
223 
224  if (!strcmp(w, "*")) {
225  res = 0xFFFFFFFF;
226  break;
227  } else for (x = 0; x < ARRAY_LEN(levels); x++) {
228  if (levels[x] && !strcasecmp(w, levels[x])) {
229  res |= (1 << x);
230  break;
231  }
232  }
233  }
234 
235  return res;
236 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
char * strsep(char **str, const char *delims)
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:160
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: utils.h:663
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition: strings.h:97
static struct logchannel* make_logchannel ( const char *  channel,
const char *  components,
int  lineno 
)
static

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

239 {
240  struct logchannel *chan;
241  char *facility;
242 
243  if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1)))
244  return NULL;
245 
246  strcpy(chan->components, components);
247  chan->lineno = lineno;
248 
249  if (!strcasecmp(channel, "console")) {
250  chan->type = LOGTYPE_CONSOLE;
251  } else if (!strncasecmp(channel, "syslog", 6)) {
252  /*
253  * syntax is:
254  * syslog.facility => level,level,level
255  */
256  facility = strchr(channel, '.');
257  if (!facility++ || !facility) {
258  facility = "local0";
259  }
260 
261  chan->facility = ast_syslog_facility(facility);
262 
263  if (chan->facility < 0) {
264  fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
265  ast_free(chan);
266  return NULL;
267  }
268 
269  chan->type = LOGTYPE_SYSLOG;
270  ast_copy_string(chan->filename, channel, sizeof(chan->filename));
271  openlog("asterisk", LOG_PID, chan->facility);
272  } else {
273  const char *log_dir_prefix = "";
274  const char *log_dir_separator = "";
275 
276  if (channel[0] != '/') {
277  log_dir_prefix = ast_config_AST_LOG_DIR;
278  log_dir_separator = "/";
279  }
280 
281  if (!ast_strlen_zero(hostname)) {
282  snprintf(chan->filename, sizeof(chan->filename), "%s%s%s.%s",
283  log_dir_prefix, log_dir_separator, channel, hostname);
284  } else {
285  snprintf(chan->filename, sizeof(chan->filename), "%s%s%s",
286  log_dir_prefix, log_dir_separator, channel);
287  }
288 
289  if (!(chan->fileptr = fopen(chan->filename, "a"))) {
290  /* Can't do real logging here since we're called with a lock
291  * so log to any attached consoles */
292  ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR);
297  ast_free(chan);
298  return NULL;
299  }
300  chan->type = LOGTYPE_FILE;
301  }
302  chan->logmask = make_components(chan->components, lineno);
303 
304  return chan;
305 }
int facility
Definition: logger.c:105
char components[0]
Definition: logger.c:117
static unsigned int make_components(const char *s, int lineno)
Definition: logger.c:214
#define __LOG_ERROR
Definition: logger.h:154
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
unsigned int logmask
Definition: logger.c:101
enum logtypes type
Definition: logger.c:107
const char * ast_config_AST_LOG_DIR
Definition: asterisk.c:263
int errno
#define ast_free(a)
Definition: astmm.h:97
void ast_console_puts_mutable(const char *string, int level)
log the string to the console, and all attached console clients
Definition: asterisk.c:1199
FILE * fileptr
Definition: logger.c:109
char filename[PATH_MAX]
Definition: logger.c:111
int lineno
Definition: logger.c:115
#define ast_calloc(a, b)
Definition: astmm.h:82
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:223
int ast_syslog_facility(const char *facility)
Maps a syslog facility name from a string to a syslog facility constant.
Definition: syslog.c:87
static char hostname[MAXHOSTNAMELEN]
Definition: logger.c:91
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().

736 {
737  int queue_rotate = rotate;
738  struct logchannel *f;
739  int res = 0;
740 
742 
743  if (qlog) {
744  if (rotate < 0) {
745  /* Check filesize - this one typically doesn't need an auto-rotate */
746  if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */
747  fclose(qlog);
748  qlog = NULL;
749  } else {
750  queue_rotate = 0;
751  }
752  } else {
753  fclose(qlog);
754  qlog = NULL;
755  }
756  } else {
757  queue_rotate = 0;
758  }
759 
761 
763  if (f->disabled) {
764  f->disabled = 0; /* Re-enable logging at reload */
765  manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename);
766  }
767  if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
768  int rotate_this = 0;
769  if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */
770  /* Be more proactive about rotating massive log files */
771  rotate_this = 1;
772  }
773  fclose(f->fileptr); /* Close file */
774  f->fileptr = NULL;
775  if (rotate || rotate_this) {
776  rotate_file(f->filename);
777  }
778  }
779  }
780 
782 
783  init_logger_chain(1 /* locked */);
784 
785  ast_unload_realtime("queue_log");
786  if (logfiles.queue_log) {
787  res = logger_queue_restart(queue_rotate);
789  ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", "");
790  ast_verb(1, "Asterisk Queue Logger restarted\n");
791  } else {
793  }
794 
795  return res;
796 }
int ast_unload_realtime(const char *family)
Release any resources cached for a realtime family.
Definition: config.c:2630
static int rotate_file(const char *filename)
Definition: logger.c:571
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
struct logchannel::@283 list
void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
Definition: logger.c:479
static FILE * qlog
Definition: logger.c:147
#define ast_verb(level,...)
Definition: logger.h:243
static struct @282 logfiles
static int filesize_reload_needed
Definition: logger.c:74
#define EVENT_FLAG_SYSTEM
Definition: manager.h:71
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:103
const char * ast_config_AST_LOG_DIR
Definition: asterisk.c:263
static struct ast_format f[]
Definition: format_g726.c:181
FILE * fileptr
Definition: logger.c:109
char filename[PATH_MAX]
Definition: logger.c:111
static void init_logger_chain(int locked)
Definition: logger.c:307
static int logger_queue_restart(int queue_rotate)
Definition: logger.c:707
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:219
int ast_mkdir(const char *path, int mode)
Recursively create directory path.
Definition: utils.c:2151
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().

572 {
573  char old[PATH_MAX];
574  char new[PATH_MAX];
575  int x, y, which, found, res = 0, fd;
576  char *suffixes[4] = { "", ".gz", ".bz2", ".Z" };
577 
578  switch (rotatestrategy) {
579  case SEQUENTIAL:
580  for (x = 0; ; x++) {
581  snprintf(new, sizeof(new), "%s.%d", filename, x);
582  fd = open(new, O_RDONLY);
583  if (fd > -1)
584  close(fd);
585  else
586  break;
587  }
588  if (rename(filename, new)) {
589  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
590  res = -1;
591  } else {
592  filename = new;
593  }
594  break;
595  case TIMESTAMP:
596  snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL));
597  if (rename(filename, new)) {
598  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
599  res = -1;
600  } else {
601  filename = new;
602  }
603  break;
604  case ROTATE:
605  /* Find the next empty slot, including a possible suffix */
606  for (x = 0; ; x++) {
607  found = 0;
608  for (which = 0; which < ARRAY_LEN(suffixes); which++) {
609  snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]);
610  fd = open(new, O_RDONLY);
611  if (fd > -1) {
612  close(fd);
613  found = 1;
614  break;
615  }
616  }
617  if (!found) {
618  break;
619  }
620  }
621 
622  /* Found an empty slot */
623  for (y = x; y > 0; y--) {
624  for (which = 0; which < ARRAY_LEN(suffixes); which++) {
625  snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]);
626  fd = open(old, O_RDONLY);
627  if (fd > -1) {
628  /* Found the right suffix */
629  close(fd);
630  snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]);
631  if (rename(old, new)) {
632  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new);
633  res = -1;
634  }
635  break;
636  }
637  }
638  }
639 
640  /* Finally, rename the current file */
641  snprintf(new, sizeof(new), "%s.0", filename);
642  if (rename(filename, new)) {
643  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
644  res = -1;
645  } else {
646  filename = new;
647  }
648  }
649 
651  struct ast_channel *c = ast_dummy_channel_alloc();
652  char buf[512];
653 
654  pbx_builtin_setvar_helper(c, "filename", filename);
656  if (c) {
657  c = ast_channel_unref(c);
658  }
659  if (ast_safe_system(buf) == -1) {
660  ast_log(LOG_WARNING, "error executing '%s'\n", buf);
661  }
662  }
663  return res;
664 }
void pbx_substitute_variables_helper(struct ast_channel *c, const char *cp1, char *cp2, int count)
Definition: pbx.c:4676
Main Channel structure associated with a channel.
Definition: channel.h:742
int ast_safe_system(const char *s)
Safely spawn an external program while closing file descriptors.
Definition: asterisk.c:1077
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2502
#define LOG_WARNING
Definition: logger.h:144
Definition: logger.c:81
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
static char exec_after_rotate[256]
Definition: logger.c:72
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name...
Definition: pbx.c:10546
char filename[PATH_MAX]
Definition: logger.c:111
rotatestrategy
Definition: logger.c:79
struct ast_channel * ast_dummy_channel_alloc(void)
Create a fake channel structure.
Definition: channel.c:1391
static void update_logchannels ( void  )
static

Definition at line 1611 of file logger.c.

References AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::components, logchannel::lineno, logchannel::list, logchannel::logmask, and make_components().

Referenced by ast_logger_register_level(), and ast_logger_unregister_level().

1612 {
1613  struct logchannel *cur;
1614 
1616 
1617  global_logmask = 0;
1618 
1620  cur->logmask = make_components(cur->components, cur->lineno);
1621  global_logmask |= cur->logmask;
1622  }
1623 
1625 }
static unsigned int global_logmask
Definition: logger.c:75
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
char components[0]
Definition: logger.c:117
static unsigned int make_components(const char *s, int lineno)
Definition: logger.c:214
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
struct logchannel::@283 list
unsigned int logmask
Definition: logger.c:101
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int lineno
Definition: logger.c:115

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,
}
static void _handle_SIGXFSZ(int sig)
Definition: logger.c:941

Definition at line 947 of file logger.c.

Referenced by init_logger().

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

struct logchannels logchannels = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } , }
static
ast_cond_t logcond
static

Definition at line 144 of file logger.c.

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

int logger_initialized
static

Definition at line 77 of file logger.c.

struct logmsgs logmsgs = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, 1 } , }
static
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
unsigned int queue_adaptive_realtime

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

struct verbosers verbosers = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } , }
static