Asterisk - The Open Source Telephony Project GIT-master-754dea3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Functions
res_pjproject.h File Reference
#include <pj/types.h>
#include <pj/pool.h>
Include dependency graph for res_pjproject.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void ast_pjproject_caching_pool_destroy (pj_caching_pool *cp)
 Destroy caching pool factory and all cached pools. More...
 
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. More...
 
int ast_pjproject_get_buildopt (char *option, char *format_string,...)
 Retrieve a pjproject build option. More...
 
void ast_pjproject_log_intercept_begin (int fd)
 Begin PJPROJECT log interception for CLI output. More...
 
void ast_pjproject_log_intercept_end (void)
 End PJPROJECT log interception for CLI output. More...
 
int ast_sockaddr_from_pj_sockaddr (struct ast_sockaddr *addr, const pj_sockaddr *pjaddr)
 Fill an ast_sockaddr from a pj_sockaddr. More...
 
int ast_sockaddr_pj_sockaddr_cmp (const struct ast_sockaddr *addr, const pj_sockaddr *pjaddr)
 Compare an ast_sockaddr to a pj_sockaddr. More...
 
int ast_sockaddr_to_pj_sockaddr (const struct ast_sockaddr *addr, pj_sockaddr *pjaddr)
 Fill a pj_sockaddr from an ast_sockaddr. More...
 

Function Documentation

◆ ast_pjproject_caching_pool_destroy()

void ast_pjproject_caching_pool_destroy ( pj_caching_pool *  cp)

Destroy caching pool factory and all cached pools.

Since
13.21.0
Parameters
cpCaching pool factory to destroy

Definition at line 529 of file res_pjproject.c.

530{
531 pj_caching_pool_destroy(cp);
532}

Referenced by unload_module(), and unload_pjsip().

◆ ast_pjproject_caching_pool_init()

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.

Since
13.21.0
Parameters
cpCaching pool factory to initialize
policyPool factory policy
max_capacityTotal capacity to be retained in the cache. Zero disables caching.

Definition at line 522 of file res_pjproject.c.

524{
525 /* Passing a max_capacity of zero disables caching pools */
526 pj_caching_pool_init(cp, policy, ast_option_pjproject_cache_pools ? max_capacity : 0);
527}
int ast_option_pjproject_cache_pools
Definition: options.c:75

References ast_option_pjproject_cache_pools.

Referenced by load_module(), and load_pjsip().

◆ ast_pjproject_get_buildopt()

int ast_pjproject_get_buildopt ( char *  option,
char *  format_string,
  ... 
)

Retrieve a pjproject build option.

Parameters
optionThe build option requested
format_stringA scanf-style format string to parse the option value into
...Pointers to variables to receive the values parsed
Return values
Thenumber of values parsed
Since
13.8.0
Note
The option requested must be from those returned by pj_dump_config() which can be displayed with the 'pjsip show buildopts' CLI command.

Sample Usage:

int max_hostname;
ast_sip_get_pjproject_buildopt("PJ_MAX_HOSTNAME", "%d", &max_hostname);

Definition at line 281 of file res_pjproject.c.

282{
283 int res = 0;
284 char *format_temp;
285 int i;
286
287 format_temp = ast_alloca(strlen(option) + strlen(" : ") + strlen(format_string) + 1);
288 sprintf(format_temp, "%s : %s", option, format_string);
289
290 for (i = 0; i < AST_VECTOR_SIZE(&buildopts); i++) {
291 va_list arg_ptr;
292 va_start(arg_ptr, format_string);
293 res = vsscanf(AST_VECTOR_GET(&buildopts, i), format_temp, arg_ptr);
294 va_end(arg_ptr);
295 if (res) {
296 break;
297 }
298 }
299
300 return res;
301}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680

References ast_alloca, AST_VECTOR_GET, and AST_VECTOR_SIZE.

Referenced by ast_sip_initialize_sorcery_location(), and load_module().

◆ ast_pjproject_log_intercept_begin()

void ast_pjproject_log_intercept_begin ( int  fd)

Begin PJPROJECT log interception for CLI output.

Since
13.8.0
Parameters
fdCLI file descriptior to send intercepted output.
Note
ast_pjproject_log_intercept_begin() and ast_pjproject_log_intercept_end() must always be called in pairs.

Definition at line 304 of file res_pjproject.c.

305{
306 /* Protect from other CLI instances trying to do this at the same time. */
308
309 pjproject_log_intercept.thread = pthread_self();
311}
#define ast_mutex_lock(a)
Definition: lock.h:193
static struct pjproject_log_intercept_data pjproject_log_intercept
static ast_mutex_t pjproject_log_intercept_lock

References ast_mutex_lock, pjproject_log_intercept_data::fd, pjproject_log_intercept, pjproject_log_intercept_lock, and pjproject_log_intercept_data::thread.

Referenced by do_cli_dump_endpt().

◆ ast_pjproject_log_intercept_end()

void ast_pjproject_log_intercept_end ( void  )

End PJPROJECT log interception for CLI output.

Since
13.8.0
Note
ast_pjproject_log_intercept_begin() and ast_pjproject_log_intercept_end() must always be called in pairs.

Definition at line 313 of file res_pjproject.c.

314{
317
319}
#define AST_PTHREADT_NULL
Definition: lock.h:70
#define ast_mutex_unlock(a)
Definition: lock.h:194

References ast_mutex_unlock, AST_PTHREADT_NULL, pjproject_log_intercept_data::fd, pjproject_log_intercept, pjproject_log_intercept_lock, and pjproject_log_intercept_data::thread.

Referenced by do_cli_dump_endpt().

◆ ast_sockaddr_from_pj_sockaddr()

int ast_sockaddr_from_pj_sockaddr ( struct ast_sockaddr addr,
const pj_sockaddr *  pjaddr 
)

Fill an ast_sockaddr from a pj_sockaddr.

Since
13.24.0
Parameters
addrThe target address to receive the copied address
pjaddrThe source address to copy
Return values
0Success
-1Failure

Definition at line 559 of file res_pjproject.c.

560{
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);
565#endif
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;
569#else
570 sin->sin_addr.s_addr = pjaddr->ipv4.sin_addr.s_addr;
571#endif
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);
579#endif
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);
586 } else {
587 memset(addr, 0, sizeof(*addr));
588 return -1;
589 }
590 return 0;
591}
struct sockaddr_storage ss
Definition: netsock2.h:98
socklen_t len
Definition: netsock2.h:99

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_sockaddr_pj_sockaddr_cmp().

◆ ast_sockaddr_pj_sockaddr_cmp()

int ast_sockaddr_pj_sockaddr_cmp ( const struct ast_sockaddr addr,
const pj_sockaddr *  pjaddr 
)

Compare an ast_sockaddr to a pj_sockaddr.

Parameters
addrpointer to ast_sockaddr structure
pjaddrpointer to pj_sockaddr structure
Return values
-1addr is lexicographically smaller than pjaddr
0addr is equal to pjaddr
1pjaddr is lexicographically smaller than addr

Definition at line 593 of file res_pjproject.c.

595{
596 struct ast_sockaddr temp_pjaddr;
597 int rc = 0;
598
599 rc = ast_sockaddr_from_pj_sockaddr(&temp_pjaddr, pjaddr);
600 if (rc != 0) {
601 return -1;
602 }
603
604 rc = ast_sockaddr_cmp(addr, &temp_pjaddr);
605 if (DEBUG_ATLEAST(4)) {
606 char *a_str = ast_strdupa(ast_sockaddr_stringify(addr));
607 char *pj_str = ast_strdupa(ast_sockaddr_stringify(&temp_pjaddr));
608 ast_debug(4, "Comparing %s -> %s rc: %d\n", a_str, pj_str, rc);
609 }
610
611 return rc;
612}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define DEBUG_ATLEAST(level)
#define ast_debug(level,...)
Log a DEBUG message.
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition: netsock2.h:256
int ast_sockaddr_cmp(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares two ast_sockaddr structures.
Definition: netsock2.c:388
int ast_sockaddr_from_pj_sockaddr(struct ast_sockaddr *addr, const pj_sockaddr *pjaddr)
Fill an ast_sockaddr from a pj_sockaddr.
Socket address structure.
Definition: netsock2.h:97

References ast_debug, ast_sockaddr_cmp(), ast_sockaddr_from_pj_sockaddr(), ast_sockaddr_stringify(), ast_strdupa, and DEBUG_ATLEAST.

Referenced by __rtp_recvfrom().

◆ ast_sockaddr_to_pj_sockaddr()

int ast_sockaddr_to_pj_sockaddr ( const struct ast_sockaddr addr,
pj_sockaddr *  pjaddr 
)

Fill a pj_sockaddr from an ast_sockaddr.

Since
13.24.0
Parameters
addrThe source address to copy
pjaddrThe target address to receive the copied address
Return values
0Success
-1Failure

Definition at line 534 of file res_pjproject.c.

535{
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;
541#else
542 pjaddr->ipv4.sin_addr.s_addr = sin->sin_addr.s_addr;
543#endif
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));
552 } else {
553 memset(pjaddr, 0, sizeof(*pjaddr));
554 return -1;
555 }
556 return 0;
557}

References ast_sockaddr::ss.