201#define __LOG_SUPPRESS -1
214 l =
'0' + fmin(pj_level, 9);
216 if (strchr(
mappings->asterisk_error, l)) {
218 }
else if (strchr(
mappings->asterisk_warning, l)) {
220 }
else if (strchr(
mappings->asterisk_notice, l)) {
222 }
else if (strchr(
mappings->asterisk_verbose, l)) {
224 }
else if (strchr(
mappings->asterisk_debug, l)) {
226 }
else if (strchr(
mappings->asterisk_trace, l)) {
240 const char * log_source =
"pjproject";
242 const char *log_func =
"<?>";
263 ast_log(ast_level, log_source, log_line, log_func,
"\t%s\n", data);
270 if (strstr(data,
"Teluu") || strstr(data,
"Dumping")) {
280#pragma GCC diagnostic ignored "-Wformat-nonliteral"
287 format_temp =
ast_alloca(strlen(option) + strlen(
" : ") + strlen(format_string) + 1);
288 sprintf(format_temp,
"%s : %s", option, format_string);
292 va_start(arg_ptr, format_string);
302#pragma GCC diagnostic warning "-Wformat-nonliteral"
327 e->
command =
"pjproject show buildopts";
329 "Usage: pjproject show buildopts\n"
330 " Show the compile time config of the pjproject that Asterisk is\n"
331 " running against.\n";
337 ast_cli(
a->fd,
"PJPROJECT compile time config currently running against:\n");
343#ifdef HAVE_PJSIP_AUTH_NEW_DIGESTS
349 if (pjsip_auth_is_algorithm_supported(i)) {
360 ast_cli(
a->fd,
"Supported Digest Algorithms (IANA name/OpenSSL name): MD5/MD5\n");
392 e->
command =
"pjproject show log mappings";
394 "Usage: pjproject show log mappings\n"
395 " Show pjproject to Asterisk log mappings\n";
401 ast_cli(
a->fd,
"PJPROJECT to Asterisk log mappings:\n");
402 ast_cli(
a->fd,
"Asterisk Level : PJPROJECT log levels\n");
416 for (i = objset; i; i = i->
next) {
440 e->
command =
"pjproject set log level {default|0|1|2|3|4|5|6}";
442 "Usage: pjproject set log level {default|<level>}\n"
444 " Set the maximum active pjproject logging level.\n"
445 " See pjproject.conf.sample for additional information\n"
446 " about the various levels pjproject uses.\n"
447 " Note: setting this level at 4 or above may result in\n"
448 " raw packet logging.\n";
458 if (!strcasecmp(
a->argv[4],
"default")) {
461 if (sscanf(
a->argv[4],
"%30d", &level_new) != 1
471 "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d.\n"
472 "Lowering request to the max supported level.\n",
476 if (level_old == level_new) {
477 ast_cli(
a->fd,
"pjproject log level is still %d.\n", level_old);
479 ast_cli(
a->fd,
"pjproject log level was %d and is now %d.\n",
480 level_old, level_new);
482 pj_log_set_level(level_new);
492 e->
command =
"pjproject show log level";
494 "Usage: pjproject show log level\n"
496 " Show the current maximum active pjproject logging level.\n"
497 " See pjproject.conf.sample for additional information\n"
498 " about the various levels pjproject uses.\n";
508 ast_cli(
a->fd,
"pjproject log level is %d.%s\n",
523 const pj_pool_factory_policy *policy, pj_size_t max_capacity)
531 pj_caching_pool_destroy(cp);
536 if (addr->
ss.ss_family == AF_INET) {
537 struct sockaddr_in *sin = (
struct sockaddr_in *) &addr->
ss;
538 pjaddr->ipv4.sin_family = pj_AF_INET();
539#if defined(HAVE_PJPROJECT_BUNDLED) && !defined(HAVE_PJPROJECT_BUNDLED_OOT)
540 pjaddr->ipv4.sin_addr = sin->sin_addr;
542 pjaddr->ipv4.sin_addr.s_addr = sin->sin_addr.s_addr;
544 pjaddr->ipv4.sin_port = sin->sin_port;
545 }
else if (addr->
ss.ss_family == AF_INET6) {
546 struct sockaddr_in6 *sin = (
struct sockaddr_in6 *) &addr->
ss;
547 pjaddr->ipv6.sin6_family = pj_AF_INET6();
548 pjaddr->ipv6.sin6_port = sin->sin6_port;
549 pjaddr->ipv6.sin6_flowinfo = sin->sin6_flowinfo;
550 pjaddr->ipv6.sin6_scope_id = sin->sin6_scope_id;
551 memcpy(&pjaddr->ipv6.sin6_addr, &sin->sin6_addr,
sizeof(pjaddr->ipv6.sin6_addr));
553 memset(pjaddr, 0,
sizeof(*pjaddr));
561 if (pjaddr->addr.sa_family == pj_AF_INET()) {
562 struct sockaddr_in *sin = (
struct sockaddr_in *) &addr->
ss;
563#
if defined(HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
564 sin->sin_len =
sizeof(
struct sockaddr_in);
566 sin->sin_family = AF_INET;
567#if defined(HAVE_PJPROJECT_BUNDLED) && !defined(HAVE_PJPROJECT_BUNDLED_OOT)
568 sin->sin_addr = pjaddr->ipv4.sin_addr;
570 sin->sin_addr.s_addr = pjaddr->ipv4.sin_addr.s_addr;
572 sin->sin_port = pjaddr->ipv4.sin_port;
573 memset(sin->sin_zero, 0,
sizeof(sin->sin_zero));
574 addr->
len =
sizeof(
struct sockaddr_in);
575 }
else if (pjaddr->addr.sa_family == pj_AF_INET6()) {
576 struct sockaddr_in6 *sin = (
struct sockaddr_in6 *) &addr->
ss;
577#
if defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN)
578 sin->sin6_len =
sizeof(
struct sockaddr_in6);
580 sin->sin6_family = AF_INET6;
581 sin->sin6_port = pjaddr->ipv6.sin6_port;
582 sin->sin6_flowinfo = pjaddr->ipv6.sin6_flowinfo;
583 sin->sin6_scope_id = pjaddr->ipv6.sin6_scope_id;
584 memcpy(&sin->sin6_addr, &pjaddr->ipv6.sin6_addr,
sizeof(sin->sin6_addr));
585 addr->
len =
sizeof(
struct sockaddr_in6);
587 memset(addr, 0,
sizeof(*addr));
594 const pj_sockaddr *pjaddr)
608 ast_debug(4,
"Comparing %s -> %s rc: %d\n", a_str, pj_str, rc);
615static void fill_with_garbage(
void *x, ssize_t
len)
617 unsigned char *w = x;
620 memcpy(w, &r,
len >
sizeof(r) ?
sizeof(r) :
len);
628 char *candidates[] = {
635 }, **candidate = candidates;
639 info->name =
"ast_sockaddr_to_pj_sockaddr_test";
640 info->category =
"/res/res_pjproject/";
641 info->summary =
"Validate conversions from an ast_sockaddr to a pj_sockaddr";
642 info->description =
"This test converts an ast_sockaddr to a pj_sockaddr and validates\n"
643 "that the two evaluate to the same string when formatted.";
654 fill_with_garbage(&pjaddr,
sizeof(pj_sockaddr));
666 pj_sockaddr_print(&pjaddr, buffer,
sizeof(buffer), 1 | 2);
668 if (strcmp(*candidate, buffer)) {
683 char *candidates[] = {
690 }, **candidate = candidates;
694 info->name =
"ast_sockaddr_from_pj_sockaddr_test";
695 info->category =
"/res/res_pjproject/";
696 info->summary =
"Validate conversions from a pj_sockaddr to an ast_sockaddr";
697 info->description =
"This test converts a pj_sockaddr to an ast_sockaddr and validates\n"
698 "that the two evaluate to the same string when formatted.";
710 fill_with_garbage(&addr,
sizeof(addr));
712 pj_strset(&t, *candidate, strlen(*candidate));
714 if (pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &t, &pjaddr) != PJ_SUCCESS) {
726 if (strcmp(*candidate, buffer)) {
742 ast_debug(3,
"Starting PJPROJECT logging to Asterisk logger\n");
751 ast_log(
LOG_WARNING,
"Failed to register pjproject log_mappings object with sorcery\n");
767 ast_log(
LOG_ERROR,
"Unable to allocate memory for pjproject log_mappings\n");
794 pj_log_set_decor(PJ_LOG_HAS_SENDER | PJ_LOG_HAS_INDENT);
798 "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d which is too low for startup level: %d.\n",
805 "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d which is too low to get buildopts.\n",
817#define NOT_EQUALS(a, b) (a != b)
828 ast_debug(3,
"Stopped PJPROJECT logging to Asterisk logger\n");
858 .
requires =
"res_sorcery_config",
Asterisk main include file. File version handling, generic pbx functions.
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Standard Command Line Interface.
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
#define AST_CLI_DEFINE(fn, txt,...)
void ast_cli(int fd, const char *fmt,...)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
#define STRFLDSET(type,...)
Convert a struct and a list of stringfield fields to an argument list of field offsets.
@ OPT_NOOP_T
Type for a default handler that should do nothing.
@ OPT_STRINGFIELD_T
Type for default option handler for stringfields.
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
int ast_pjproject_max_log_level
int ast_option_pjproject_log_level
int ast_option_pjproject_cache_pools
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Support for logging to various files, console and syslog Configuration in file logger....
#define DEBUG_ATLEAST(level)
#define ast_debug(level,...)
Log a DEBUG message.
#define AST_PTHREADT_NULL
#define ast_mutex_unlock(a)
#define ast_mutex_lock(a)
#define AST_MUTEX_DEFINE_STATIC(mutex)
Asterisk module definitions.
@ AST_MODFLAG_GLOBAL_SYMBOLS
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
@ AST_MODPRI_CHANNEL_DEPEND
@ AST_MODULE_SUPPORT_CORE
#define ASTERISK_GPL_KEY
The text the key() function should return.
@ AST_MODULE_LOAD_SUCCESS
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
int ast_sockaddr_cmp(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares two ast_sockaddr structures.
Options provided by main asterisk program.
#define MAX_PJ_LOG_MAX_LEVEL
#define AST_PJPROJECT_INIT_LOG_LEVEL()
Get maximum log level pjproject was compiled with.
#define DEFAULT_PJ_LOG_MAX_LEVEL
static struct mappings mappings
static struct ast_sorcery * pjproject_sorcery
static char * handle_pjproject_show_buildopts(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
void ast_pjproject_log_intercept_begin(int fd)
Begin PJPROJECT log interception for CLI output.
void ast_pjproject_log_intercept_end(void)
End PJPROJECT log interception for CLI output.
static pj_log_func * log_cb_orig
int ast_sockaddr_to_pj_sockaddr(const struct ast_sockaddr *addr, pj_sockaddr *pjaddr)
Fill a pj_sockaddr from an ast_sockaddr.
static unsigned decor_orig
void ast_pjproject_caching_pool_destroy(pj_caching_pool *cp)
Destroy caching pool factory and all cached pools.
static void mapping_destroy(void *object)
int ast_sockaddr_pj_sockaddr_cmp(const struct ast_sockaddr *addr, const pj_sockaddr *pjaddr)
Compare an ast_sockaddr to a pj_sockaddr.
static struct pjproject_log_intercept_data pjproject_log_intercept
static void * mapping_alloc(const char *name)
static char * handle_pjproject_show_log_level(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void capture_buildopts_cb(int level, const char *data, int len)
static char * handle_pjproject_show_log_mappings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int reload_module(void)
static struct buildopts buildopts
static struct ast_cli_entry pjproject_cli[]
void ast_pjproject_caching_pool_init(pj_caching_pool *cp, const pj_pool_factory_policy *policy, pj_size_t max_capacity)
Initialize the caching pool factory.
int ast_pjproject_get_buildopt(char *option, char *format_string,...)
Retrieve a pjproject build option.
static ast_mutex_t pjproject_log_intercept_lock
int ast_sockaddr_from_pj_sockaddr(struct ast_sockaddr *addr, const pj_sockaddr *pjaddr)
Fill an ast_sockaddr from a pj_sockaddr.
static int get_log_level(int pj_level)
static void log_forwarder(int level, const char *data, int len)
static int load_module(void)
static struct log_mappings * default_log_mappings
static struct log_mappings * get_log_mappings(void)
static int unload_module(void)
static char * handle_pjproject_set_log_level(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
@ PJSIP_AUTH_ALGORITHM_COUNT
@ PJSIP_AUTH_ALGORITHM_NOT_SET
Sorcery Data Access Layer API.
#define ast_sorcery_unref(sorcery)
Decrease the reference count of a sorcery structure.
#define ast_sorcery_objectset_create(sorcery, object)
Create an object set (KVP list) for an object.
void ast_sorcery_load(const struct ast_sorcery *sorcery)
Inform any wizards to load persistent objects.
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
void ast_sorcery_reload(const struct ast_sorcery *sorcery)
Inform any wizards to reload persistent objects.
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
void * ast_sorcery_alloc(const struct ast_sorcery *sorcery, const char *type, const char *id)
Allocate an object.
#define ast_sorcery_apply_default(sorcery, type, name, data)
#define ast_sorcery_open()
Open a new sorcery structure.
#define AST_DECLARE_STRING_FIELDS(field_list)
Declare the fields needed in a structure.
#define AST_STRING_FIELD(name)
Declare a string field.
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
char * ast_str_truncate(struct ast_str *buf, ssize_t len)
Truncates the enclosed string to the given length.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
#define ast_str_alloca(init_len)
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
descriptor for a cli entry.
Socket address structure.
struct sockaddr_storage ss
Full structure for sorcery.
Support for dynamic strings.
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
const ast_string_field asterisk_debug
const ast_string_field asterisk_trace
const ast_string_field asterisk_error
const ast_string_field asterisk_verbose
const ast_string_field asterisk_warning
const ast_string_field asterisk_notice
char check[1/(6==MAX_PJ_LOG_MAX_LEVEL)]
const char * openssl_name
#define AST_TEST_REGISTER(cb)
#define ast_test_status_update(a, b, c...)
#define AST_TEST_UNREGISTER(cb)
#define AST_TEST_DEFINE(hdr)
long int ast_random(void)
Vector container support.
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
#define AST_VECTOR_ADD_SORTED(vec, elem, cmp)
Add an element into a sorted vector.
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
#define AST_VECTOR_CALLBACK_VOID(vec, callback,...)
Execute a callback on every element in a vector disregarding callback return.
#define AST_VECTOR(name, type)
Define a vector structure.
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.