Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Functions | Variables
pjsip_configuration.c File Reference
#include "asterisk.h"
#include <pjsip.h>
#include <pjsip_ua.h>
#include "asterisk/res_pjsip.h"
#include "include/res_pjsip_private.h"
#include "asterisk/res_pjsip_cli.h"
#include "asterisk/acl.h"
#include "asterisk/manager.h"
#include "asterisk/astobj2.h"
#include "asterisk/utils.h"
#include "asterisk/sorcery.h"
#include "asterisk/callerid.h"
#include "asterisk/test.h"
#include "asterisk/statsd.h"
#include "asterisk/pbx.h"
#include "asterisk/stream.h"
#include "asterisk/stasis.h"
#include "asterisk/security_events.h"
Include dependency graph for pjsip_configuration.c:

Go to the source code of this file.

Data Structures

struct  sip_persistent_endpoint
 Persistent endpoint information. More...
 

Macros

#define AMI_DEFAULT_STR_SIZE   512
 
#define AMI_SHOW_ENDPOINT   "PJSIPShowEndpoint"
 
#define AMI_SHOW_ENDPOINTS   "PJSIPShowEndpoints"
 
#define PERSISTENT_BUCKETS   53
 Number of buckets for persistent endpoint information. More...
 

Functions

static void acl_change_stasis_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static int acl_to_str (const void *obj, const intptr_t *args, char **buf)
 
static void active_channels_to_str (const struct ast_sip_endpoint *endpoint, struct ast_str **str)
 
static int active_channels_to_str_cb (void *object, void *arg, int flags)
 
static int add_to_regcontext (void *obj, void *arg, int flags)
 
static int ami_show_endpoint (struct mansession *s, const struct message *m)
 
static int ami_show_endpoints (struct mansession *s, const struct message *m)
 
void ast_res_pjsip_destroy_configuration (void)
 
int ast_res_pjsip_initialize_configuration (void)
 
int ast_res_pjsip_reload_configuration (void)
 
void ast_sip_auth_vector_destroy (struct ast_sip_auth_vector *auths)
 Free contents of an auth vector. More...
 
int ast_sip_auth_vector_init (struct ast_sip_auth_vector *auths, const char *value)
 Initialize an auth vector with the configured values. More...
 
int ast_sip_auths_to_str (const struct ast_sip_auth_vector *auths, char **buf)
 Converts an auths array to a string of comma separated values. More...
 
void ast_sip_cleanup_auths (struct ast_sip_auth *auths[], size_t num_auths)
 Clean up retrieved auth structures from memory. More...
 
struct ast_strast_sip_create_ami_event (const char *event, struct ast_sip_ami *ami)
 Creates a string to store AMI event data in. More...
 
struct ast_sip_endpointast_sip_default_outbound_endpoint (void)
 Retrieve the default outbound endpoint. More...
 
void * ast_sip_endpoint_alloc (const char *name)
 Allocate a new SIP endpoint. More...
 
int ast_sip_for_each_channel (const struct ast_sip_endpoint *endpoint, ao2_callback_fn on_channel_snapshot, void *arg)
 For every channel snapshot on an endpoint all the given 'on_channel_snapshot' handler. More...
 
int ast_sip_for_each_channel_snapshot (const struct ast_endpoint_snapshot *endpoint_snapshot, ao2_callback_fn on_channel_snapshot, void *arg)
 For every channel snapshot on an endpoint snapshot call the given 'on_channel_snapshot' handler. More...
 
const char * ast_sip_get_device_state (const struct ast_sip_endpoint *endpoint)
 Retrieve the device state for an endpoint. More...
 
struct ast_endpoint_snapshotast_sip_get_endpoint_snapshot (const struct ast_sip_endpoint *endpoint)
 Retrieve the endpoint snapshot for an endpoint. More...
 
struct ao2_containerast_sip_get_endpoints (void)
 Retrieve any endpoints available to sorcery. More...
 
struct ast_sorceryast_sip_get_sorcery (void)
 Get a pointer to the SIP sorcery structure. More...
 
int ast_sip_persistent_endpoint_add_to_regcontext (const char *regcontext)
 
void ast_sip_persistent_endpoint_publish_contact_state (const char *endpoint_name, const struct ast_sip_contact_status *contact_status)
 Publish the change of state for a contact. More...
 
int ast_sip_persistent_endpoint_update_state (const char *endpoint_name, enum ast_endpoint_state state)
 Change state of a persistent endpoint. More...
 
int ast_sip_retrieve_auths (const struct ast_sip_auth_vector *auths, struct ast_sip_auth **out)
 Retrieve relevant SIP auth structures from sorcery. More...
 
int ast_sip_retrieve_auths_vector (const struct ast_sip_auth_vector *auth_ids, struct ast_sip_auth_objects_vector *auth_objects)
 Retrieve relevant SIP auth structures from sorcery as a vector. More...
 
int ast_sip_sorcery_object_to_ami (const void *obj, struct ast_str **buf)
 Converts a sorcery object to a string of object properties. More...
 
static int call_offer_pref_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int caller_id_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int caller_id_privacy_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int caller_id_privacy_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int caller_id_tag_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int caller_id_tag_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int caller_id_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int callgroup_to_str (const void *obj, const intptr_t *args, char **buf)
 
static struct ao2_containercli_endpoint_get_container (const char *regex)
 
static int cli_endpoint_iterate (void *obj, ao2_callback_fn callback, void *args)
 
static int cli_endpoint_print_body (void *obj, void *arg, int flags)
 
static void cli_endpoint_print_child_body (char *type, const void *obj, struct ast_sip_cli_context *context)
 
static void cli_endpoint_print_child_header (char *type, struct ast_sip_cli_context *context)
 
static int cli_endpoint_print_header (void *obj, void *arg, int flags)
 
static void * cli_endpoint_retrieve_by_id (const char *id)
 
static int codec_prefs_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int codec_prefs_to_str (const struct ast_stream_codec_negotiation_prefs *prefs, const void *obj, const intptr_t *args, char **buf)
 
static int connected_line_method_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int connected_line_method_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int contact_acl_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int contact_user_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int contact_user_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int direct_media_glare_mitigation_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int direct_media_glare_mitigation_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int direct_media_method_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int direct_media_method_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtls_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int dtlsautogeneratecert_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlscafile_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlscapath_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlscertfile_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlscipher_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlsfingerprint_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlsprivatekey_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlsrekey_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlssetup_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlsverify_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtmf_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int dtmf_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int endpoint_acl_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static void endpoint_deleted_observer (const void *object)
 
static void endpoint_destructor (void *obj)
 
static int format_ami_endpoint (const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
 
static int format_ami_endpoints (void *obj, void *arg, int flags)
 
static int format_str_append_auth (const struct ast_sip_auth_vector *auths, struct ast_str **buf)
 
static int from_user_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int from_user_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int group_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int ident_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int ident_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int inbound_auth_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int inbound_auths_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int incoming_answer_codec_prefs_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int incoming_call_offer_pref_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int incoming_offer_codec_prefs_to_str (const void *obj, const intptr_t *args, char **buf)
 
static void info_configuration_destroy (struct ast_sip_endpoint_info_configuration *info)
 
static int init_info_configuration (struct ast_sip_endpoint_info_configuration *info)
 
static int init_media_configuration (struct ast_sip_endpoint_media_configuration *media)
 
static int init_subscription_configuration (struct ast_sip_endpoint_subscription_configuration *subscription)
 
static void load_all_endpoints (void)
 
static void media_configuration_destroy (struct ast_sip_endpoint_media_configuration *media)
 
static int media_encryption_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int media_encryption_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int named_callgroups_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int named_groups_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int named_pickupgroups_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int outbound_auth_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int outbound_auths_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int outgoing_answer_codec_prefs_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int outgoing_call_offer_pref_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int outgoing_offer_codec_prefs_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int persistent_endpoint_cmp (void *obj, void *arg, int flags)
 Comparison function for persistent endpoint information. More...
 
static void persistent_endpoint_destroy (void *obj)
 Destructor function for persistent endpoint information. More...
 
static struct ast_endpointpersistent_endpoint_find_or_create (const struct ast_sip_endpoint *endpoint)
 Internal function which finds (or creates) persistent endpoint information. More...
 
static int persistent_endpoint_hash (const void *obj, const int flags)
 Hashing function for persistent endpoint information. More...
 
static int pickupgroup_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int prack_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int prack_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int redirect_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int set_var_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int set_var_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int set_var_to_vl (const void *obj, struct ast_variable **fields)
 
static int sip_endpoint_apply_handler (const struct ast_sorcery *sorcery, void *obj)
 Callback function for when an object is finalized. More...
 
static int sip_endpoint_identifier_str2type (const char *str)
 
static const char * sip_endpoint_identifier_type2str (enum ast_sip_endpoint_identifier_type method)
 
static int sip_endpoint_to_ami (const struct ast_sip_endpoint *endpoint, struct ast_str **buf)
 
static int sip_endpoints_aors_ami (void *obj, void *arg, int flags)
 
static void * sip_nat_hook_alloc (const char *name)
 
static void sip_sorcery_object_ami_set_type_name (const void *obj, struct ast_str **buf)
 
static int stir_shaken_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int stir_shaken_to_str (const void *obj, const intptr_t *args, char **buf)
 
static void subscription_configuration_destroy (struct ast_sip_endpoint_subscription_configuration *subscription)
 
static int t38udptl_ec_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int t38udptl_ec_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int timers_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int timers_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int tos_audio_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int tos_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int tos_video_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int voicemail_extension_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int voicemail_extension_to_str (const void *obj, const intptr_t *args, char **buf)
 

Variables

static struct stasis_subscriptionacl_change_sub
 
static const char * ast_rtp_dtls_fingerprint_map []
 
static const char * ast_rtp_dtls_setup_map []
 
static const char * ast_t38_ec_modes_map []
 
struct ast_sip_cli_formatter_entrychannel_formatter
 
static struct ast_cli_entry cli_commands []
 
static const char * direct_media_glare_mitigation_map []
 
struct ast_sip_cli_formatter_entryendpoint_formatter
 
static const struct ast_sorcery_observer endpoint_observers
 
static const char * id_configuration_refresh_methods []
 
static const char * media_encryption_map []
 
static struct ao2_containerpersistent_endpoints
 Container for persistent endpoint information. More...
 
static struct ast_sorcerysip_sorcery
 
static const char * stir_shaken_map []
 

Macro Definition Documentation

◆ AMI_DEFAULT_STR_SIZE

#define AMI_DEFAULT_STR_SIZE   512

Definition at line 1620 of file pjsip_configuration.c.

◆ AMI_SHOW_ENDPOINT

#define AMI_SHOW_ENDPOINT   "PJSIPShowEndpoint"

Definition at line 1712 of file pjsip_configuration.c.

◆ AMI_SHOW_ENDPOINTS

#define AMI_SHOW_ENDPOINTS   "PJSIPShowEndpoints"

Definition at line 1711 of file pjsip_configuration.c.

◆ PERSISTENT_BUCKETS

#define PERSISTENT_BUCKETS   53

Number of buckets for persistent endpoint information.

Definition at line 41 of file pjsip_configuration.c.

Function Documentation

◆ acl_change_stasis_cb()

static void acl_change_stasis_cb ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Definition at line 2001 of file pjsip_configuration.c.

2003 {
2005  return;
2006  }
2007 
2009 }
struct stasis_message_type * ast_named_acl_change_type(void)
a stasis_message_type for changes against a named ACL or the set of all named ACLs
static struct ast_sorcery * sip_sorcery
void ast_sorcery_force_reload_object(const struct ast_sorcery *sorcery, const char *type)
Inform any wizards of a specific object type to reload persistent objects even if no changes determin...
Definition: sorcery.c:1457
struct stasis_message_type * stasis_message_type(const struct stasis_message *msg)
Get the message type for a stasis_message.

References ast_named_acl_change_type(), ast_sorcery_force_reload_object(), sip_sorcery, and stasis_message_type().

Referenced by ast_res_pjsip_initialize_configuration().

◆ acl_to_str()

static int acl_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 104 of file pjsip_configuration.c.

105 {
106  const struct ast_sip_endpoint *endpoint = obj;
107  struct ast_acl_list *acl_list;
108  struct ast_acl *first_acl;
109 
110  if (endpoint && !ast_acl_list_is_empty(acl_list=endpoint->acl)) {
111  AST_LIST_LOCK(acl_list);
112  first_acl = AST_LIST_FIRST(acl_list);
113  if (ast_strlen_zero(first_acl->name)) {
114  *buf = "deny/permit";
115  } else {
116  *buf = first_acl->name;
117  }
118  AST_LIST_UNLOCK(acl_list);
119  }
120 
121  *buf = ast_strdup(*buf);
122  return 0;
123 }
int ast_acl_list_is_empty(struct ast_acl_list *acl_list)
Determines if an ACL is empty or if it contains entries.
Definition: acl.c:541
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:40
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:140
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:421
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Wrapper for an ast_acl linked list.
Definition: acl.h:76
an ast_acl is a linked list node of ast_ha structs which may have names.
Definition: acl.h:67
char name[ACL_NAME_LENGTH]
Definition: acl.h:71
An entity with which Asterisk communicates.
Definition: res_pjsip.h:854
struct ast_acl_list * acl
Definition: res_pjsip.h:927

References ast_sip_endpoint::acl, ast_acl_list_is_empty(), AST_LIST_FIRST, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_strdup, ast_strlen_zero(), buf, and ast_acl::name.

Referenced by ast_res_pjsip_initialize_configuration().

◆ active_channels_to_str()

static void active_channels_to_str ( const struct ast_sip_endpoint endpoint,
struct ast_str **  str 
)
static

Definition at line 1604 of file pjsip_configuration.c.

1606 {
1607 
1608  RAII_VAR(struct ast_endpoint_snapshot *, endpoint_snapshot,
1610 
1611  if (endpoint_snapshot) {
1612  return;
1613  }
1614 
1615  ast_sip_for_each_channel_snapshot(endpoint_snapshot,
1617  ast_str_truncate(*str, -1);
1618 }
const char * str
Definition: app_jack.c:147
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
int ast_sip_for_each_channel_snapshot(const struct ast_endpoint_snapshot *endpoint_snapshot, ao2_callback_fn on_channel_snapshot, void *arg)
For every channel snapshot on an endpoint snapshot call the given 'on_channel_snapshot' handler.
static int active_channels_to_str_cb(void *object, void *arg, int flags)
struct ast_endpoint_snapshot * ast_sip_get_endpoint_snapshot(const struct ast_sip_endpoint *endpoint)
Retrieve the endpoint snapshot for an endpoint.
char * ast_str_truncate(struct ast_str *buf, ssize_t len)
Truncates the enclosed string to the given length.
Definition: strings.h:764
A snapshot of an endpoint's state.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:936

References active_channels_to_str_cb(), ao2_cleanup, ast_sip_for_each_channel_snapshot(), ast_sip_get_endpoint_snapshot(), ast_str_truncate(), RAII_VAR, and str.

Referenced by format_ami_endpoints(), and sip_endpoint_to_ami().

◆ active_channels_to_str_cb()

static int active_channels_to_str_cb ( void *  object,
void *  arg,
int  flags 
)
static

Definition at line 1596 of file pjsip_configuration.c.

1597 {
1598  const struct ast_channel_snapshot *snapshot = object;
1599  struct ast_str **buf = arg;
1600  ast_str_append(buf, 0, "%s,", snapshot->base->name);
1601  return 0;
1602 }
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1117
const ast_string_field name
Structure representing a snapshot of channel state.
struct ast_channel_snapshot_base * base
Support for dynamic strings.
Definition: strings.h:604

References ast_str_append(), ast_channel_snapshot::base, buf, and ast_channel_snapshot_base::name.

Referenced by active_channels_to_str().

◆ add_to_regcontext()

static int add_to_regcontext ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1334 of file pjsip_configuration.c.

1335 {
1336  struct sip_persistent_endpoint *persistent = obj;
1337  const char *regcontext = arg;
1338 
1339  if (ast_endpoint_get_state(persistent->endpoint) == AST_ENDPOINT_ONLINE) {
1341  persistent->endpoint), 1, NULL)) {
1343  "Noop", ast_strdup(ast_endpoint_get_resource(persistent->endpoint)), ast_free_ptr, "PJSIP");
1344  }
1345  }
1346 
1347  return 0;
1348 }
void ast_free_ptr(void *ptr)
free() wrapper
Definition: astmm.c:1739
static char regcontext[AST_MAX_CONTEXT]
Definition: chan_iax2.c:318
@ AST_ENDPOINT_ONLINE
Definition: endpoints.h:57
enum ast_endpoint_state ast_endpoint_get_state(const struct ast_endpoint *endpoint)
Gets the state of the given endpoint.
const char * ast_endpoint_get_resource(const struct ast_endpoint *endpoint)
Gets the resource name of the given endpoint.
int ast_add_extension(const char *context, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar)
Add and extension to an extension context.
int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Determine whether an extension exists.
Definition: pbx.c:4182
#define NULL
Definition: resample.c:96
Persistent endpoint information.
struct ast_endpoint * endpoint
Asterisk endpoint itself.

References ast_add_extension(), ast_endpoint_get_resource(), ast_endpoint_get_state(), AST_ENDPOINT_ONLINE, ast_exists_extension(), ast_free_ptr(), ast_strdup, sip_persistent_endpoint::endpoint, NULL, and regcontext.

Referenced by ast_sip_persistent_endpoint_add_to_regcontext().

◆ ami_show_endpoint()

static int ami_show_endpoint ( struct mansession s,
const struct message m 
)
static

Definition at line 1714 of file pjsip_configuration.c.

1715 {
1716  struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"),
1717  .count = 0, };
1718  RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
1719  const char *endpoint_name = astman_get_header(m, "Endpoint");
1720  int count = 0;
1721 
1722  if (ast_strlen_zero(endpoint_name)) {
1723  astman_send_error_va(s, m, "%s requires an endpoint name\n",
1725  return 0;
1726  }
1727 
1728  if (!strncasecmp(endpoint_name, "pjsip/", 6)) {
1729  endpoint_name += 6;
1730  }
1731 
1732  if (!(endpoint = ast_sorcery_retrieve_by_id(
1733  ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
1734  astman_send_error_va(s, m, "Unable to retrieve endpoint %s\n",
1735  endpoint_name);
1736  return 0;
1737  }
1738 
1739  astman_send_listack(s, m, "Following are Events for each object associated with the Endpoint",
1740  "start");
1741 
1742  /* the endpoint detail needs to always come first so apply as such */
1743  if (format_ami_endpoint(endpoint, &ami) ||
1744  ast_sip_format_endpoint_ami(endpoint, &ami, &count)) {
1745  astman_send_error_va(s, m, "Unable to format endpoint %s\n",
1746  endpoint_name);
1747  }
1748 
1749  astman_send_list_complete_start(s, m, "EndpointDetailComplete", ami.count + 1);
1751 
1752  return 0;
1753 }
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager transaction to begin a list.
Definition: manager.c:3208
void astman_send_error_va(struct mansession *s, const struct message *m, const char *fmt,...)
Send error in manager transaction (with va_args support)
Definition: manager.c:3171
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
Definition: manager.c:3244
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
Definition: manager.c:3252
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
Definition: manager.c:2827
static int format_ami_endpoint(const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
#define AMI_SHOW_ENDPOINT
int ast_sip_format_endpoint_ami(struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami, int *count)
Formats the endpoint and sends over AMI.
Definition: res_pjsip.c:494
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
Definition: sorcery.c:1853
AMI variable container.
Definition: res_pjsip.h:2819
struct mansession * s
Definition: res_pjsip.h:2821
const struct message * m
Definition: res_pjsip.h:2823

References AMI_SHOW_ENDPOINT, ao2_cleanup, ast_sip_format_endpoint_ami(), ast_sip_get_sorcery(), ast_sorcery_retrieve_by_id(), ast_strlen_zero(), astman_get_header(), astman_send_error_va(), astman_send_list_complete_end(), astman_send_list_complete_start(), astman_send_listack(), ast_sip_ami::count, format_ami_endpoint(), ast_sip_ami::m, NULL, RAII_VAR, and ast_sip_ami::s.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ami_show_endpoints()

static int ami_show_endpoints ( struct mansession s,
const struct message m 
)
static

Definition at line 1807 of file pjsip_configuration.c.

1808 {
1809  struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
1811  int num;
1812 
1814  if (!endpoints) {
1815  astman_send_error(s, m, "Could not get endpoints\n");
1816  return 0;
1817  }
1818 
1819  if (!(num = ao2_container_count(endpoints))) {
1820  astman_send_error(s, m, "No endpoints found\n");
1821  return 0;
1822  }
1823 
1824  astman_send_listack(s, m, "A listing of Endpoints follows, presented as EndpointList events",
1825  "start");
1826 
1828 
1829  astman_send_list_complete_start(s, m, "EndpointListComplete", num);
1831  return 0;
1832 }
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container,...
Definition: astobj2.h:1693
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
@ OBJ_NODATA
Definition: astobj2.h:1044
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
Definition: manager.c:3166
static struct ao2_container * endpoints
struct ao2_container * ast_sip_get_endpoints(void)
Retrieve any endpoints available to sorcery.
static int format_ami_endpoints(void *obj, void *arg, int flags)
Generic container type.

References ao2_callback, ao2_cleanup, ao2_container_count(), ast_sip_get_endpoints(), astman_get_header(), astman_send_error(), astman_send_list_complete_end(), astman_send_list_complete_start(), astman_send_listack(), endpoints, format_ami_endpoints(), ast_sip_ami::m, NULL, OBJ_NODATA, RAII_VAR, and ast_sip_ami::s.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ast_res_pjsip_destroy_configuration()

void ast_res_pjsip_destroy_configuration ( void  )

Definition at line 2259 of file pjsip_configuration.c.

2260 {
2261  if (!sip_sorcery) {
2262  return;
2263  }
2264 
2271  sip_sorcery = NULL;
2279 }
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
int ast_sip_destroy_sorcery_auth(void)
Definition: config_auth.c:426
int ast_sip_destroy_sorcery_global(void)
int ast_sip_destroy_sorcery_transport(void)
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
Definition: manager.c:7268
static struct ast_cli_entry cli_commands[]
struct ast_sip_cli_formatter_entry * endpoint_formatter
static struct stasis_subscription * acl_change_sub
#define AMI_SHOW_ENDPOINTS
static struct ao2_container * persistent_endpoints
Container for persistent endpoint information.
int ast_sip_unregister_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Unregisters a CLI formatter.
Definition: pjsip_cli.c:326
void ast_sip_destroy_cli(void)
Definition: pjsip_cli.c:375
int ast_sip_destroy_sorcery_location(void)
Definition: location.c:1471
#define ast_sorcery_unref(sorcery)
Decrease the reference count of a sorcery structure.
Definition: sorcery.h:1500
struct stasis_subscription * stasis_unsubscribe_and_join(struct stasis_subscription *subscription)
Cancel a subscription, blocking until the last message is processed.
Definition: stasis.c:1136
#define ARRAY_LEN(a)
Definition: utils.h:661

References acl_change_sub, AMI_SHOW_ENDPOINT, AMI_SHOW_ENDPOINTS, ao2_cleanup, ARRAY_LEN, ast_cli_unregister_multiple(), ast_manager_unregister(), ast_sip_destroy_cli(), ast_sip_destroy_sorcery_auth(), ast_sip_destroy_sorcery_global(), ast_sip_destroy_sorcery_location(), ast_sip_destroy_sorcery_transport(), ast_sip_unregister_cli_formatter(), ast_sorcery_unref, cli_commands, endpoint_formatter, NULL, persistent_endpoints, sip_sorcery, and stasis_unsubscribe_and_join().

Referenced by unload_pjsip().

◆ ast_res_pjsip_initialize_configuration()

int ast_res_pjsip_initialize_configuration ( void  )

Definition at line 2011 of file pjsip_configuration.c.

2012 {
2015  return -1;
2016  }
2017 
2020  if (!persistent_endpoints) {
2021  return -1;
2022  }
2023 
2024  if (!(sip_sorcery = ast_sorcery_open())) {
2025  ast_log(LOG_ERROR, "Failed to open SIP sorcery failed to open\n");
2026  return -1;
2027  }
2028 
2030 
2032  ast_log(LOG_ERROR, "Failed to register SIP authentication support\n");
2034  sip_sorcery = NULL;
2035  return -1;
2036  }
2037 
2038  ast_sorcery_apply_default(sip_sorcery, "endpoint", "config", "pjsip.conf,criteria=type=endpoint");
2039  ast_sorcery_apply_default(sip_sorcery, "nat_hook", "memory", NULL);
2040 
2042  ast_log(LOG_ERROR, "Failed to register SIP endpoint object with sorcery\n");
2044  sip_sorcery = NULL;
2045  return -1;
2046  }
2047 
2049  ast_log(LOG_ERROR, "Failed to register nat_hook\n");
2050  }
2051 
2052  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "type", "", OPT_NOOP_T, 0, 0);
2053  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "context", "default", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, context));
2054  ast_sorcery_object_field_register_alias(sip_sorcery, "endpoint", "disallow", "", OPT_CODEC_T, 0, FLDSET(struct ast_sip_endpoint, media.codecs));
2055  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow", "", OPT_CODEC_T, 1, FLDSET(struct ast_sip_endpoint, media.codecs));
2056  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtmf_mode", "rfc4733", dtmf_handler, dtmf_to_str, NULL, 0, 0);
2057  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_ipv6", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.ipv6));
2058  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_symmetric", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.symmetric));
2059  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "ice_support", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.ice_support));
2060  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "use_ptime", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.use_ptime));
2061  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "force_rport", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, nat.force_rport));
2062  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rewrite_contact", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, nat.rewrite_contact));
2063  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "transport", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, transport));
2064  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "outbound_proxy", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, outbound_proxy));
2065  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "moh_suggest", "default", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, mohsuggest));
2068  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "timers_min_se", "90", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, extensions.timer.min_se));
2069  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "timers_sess_expires", "1800", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, extensions.timer.sess_expires));
2073  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "media_address", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.address));
2074  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "bind_rtp_to_media_address", "no", OPT_BOOL_T, 1, STRFLDSET(struct ast_sip_endpoint, media.bind_rtp_to_media_address));
2075  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "identify_by", "username,ip", ident_handler, ident_to_str, NULL, 0, 0);
2076  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "direct_media", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.direct_media.enabled));
2078  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "trust_connected_line", "yes", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, id.trust_connected_line));
2079  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_connected_line", "yes", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, id.send_connected_line));
2082  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "disable_direct_media_on_nat", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.direct_media.disable_on_nat));
2084  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "callerid_privacy", "allowed_not_screened", caller_id_privacy_handler, caller_id_privacy_to_str, NULL, 0, 0);
2086  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "trust_id_inbound", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.trust_inbound));
2087  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "trust_id_outbound", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.trust_outbound));
2088  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_pai", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_pai));
2089  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_rpid", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_rpid));
2090  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rpid_immediate", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.rpid_immediate));
2091  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_diversion", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_diversion));
2092  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_history_info", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_history_info));
2093  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "mailboxes", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, subscription.mwi.mailboxes));
2095  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "aggregate_mwi", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, subscription.mwi.aggregate));
2096  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "mwi_subscribe_replaces_unsolicited", "no", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, subscription.mwi.subscribe_replaces_unsolicited));
2098  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "use_avpf", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.use_avpf));
2099  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "force_avp", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.force_avp));
2100  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "media_use_received_transport", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.use_received_transport));
2101  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_keepalive", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.rtp.keepalive));
2102  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_timeout", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.rtp.timeout));
2103  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_timeout_hold", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.rtp.timeout_hold));
2104  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "one_touch_recording", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, info.recording.enabled));
2105  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "inband_progress", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, inband_progress));
2110  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "device_state_busy_at", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, devicestate_busy_at));
2111  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.enabled));
2113  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl_maxdatagram", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.t38.maxdatagram));
2114  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "fax_detect", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, faxdetect));
2115  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "fax_detect_timeout", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, faxdetect_timeout));
2116  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl_nat", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.nat));
2117  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl_ipv6", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.ipv6));
2118  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_bind_udptl_to_media_address", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.bind_udptl_to_media_address));
2119  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "tone_zone", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, zone));
2121  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "record_on_feature", "automixmon", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, info.recording.onfeature));
2122  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "record_off_feature", "automixmon", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, info.recording.offfeature));
2123  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_transfer", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allowtransfer));
2124  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "user_eq_phone", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, usereqphone));
2125  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "moh_passthrough", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, moh_passthrough));
2126  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "sdp_owner", "-", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.sdpowner));
2127  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "sdp_session", "Asterisk", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.sdpsession));
2130  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "cos_audio", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.cos_audio));
2131  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "cos_video", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.cos_video));
2132  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_subscribe", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, subscription.allow));
2133  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "sub_min_expiry", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, subscription.minexpiry));
2135  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "from_domain", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, fromdomain));
2136  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "mwi_from_user", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, subscription.mwi.fromuser));
2137  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_engine", "asterisk", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.rtp.engine));
2138  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_verify", "no", dtls_handler, dtlsverify_to_str, NULL, 0, 0);
2140  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_auto_generate_cert", "no", dtls_handler, dtlsautogeneratecert_to_str, NULL, 0, 0);
2142  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_private_key", "", dtls_handler, dtlsprivatekey_to_str, NULL, 0, 0);
2148  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "srtp_tag_32", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.srtp_tag_32));
2149  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "media_encryption_optimistic", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.encryption_optimistic));
2150  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "g726_non_standard", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.g726_non_standard));
2151  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "redirect_method", "user", redirect_handler, NULL, NULL, 0, 0);
2153  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "message_context", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, message_context));
2158  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_deny", "", endpoint_acl_handler, NULL, NULL, 0, 0);
2159  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_permit", "", endpoint_acl_handler, NULL, NULL, 0, 0);
2161  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "subscribe_context", "", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct ast_sip_endpoint, subscription.context));
2163  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "preferred_codec_only", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, preferred_codec_only));
2164  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "asymmetric_rtp_codec", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, asymmetric_rtp_codec));
2165  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtcp_mux", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtcp_mux));
2166  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_overlap", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allow_overlap));
2167  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "refer_blind_progress", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, refer_blind_progress));
2168  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "notify_early_inuse_ringing", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, notify_early_inuse_ringing));
2169  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "max_audio_streams", "1", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.max_audio_streams));
2170  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "max_video_streams", "1", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.max_video_streams));
2171  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "bundle", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.bundle));
2172  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "webrtc", "no", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, media.webrtc));
2173  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "incoming_mwi_mailbox", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, incoming_mwi_mailbox));
2174  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "follow_early_media_fork", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.follow_early_media_fork));
2175  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "accept_multiple_sdp_answers", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.accept_multiple_sdp_answers));
2176  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "suppress_q850_reason_headers", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, suppress_q850_reason_headers));
2177  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "ignore_183_without_sdp", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, ignore_183_without_sdp));
2178  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "incoming_call_offer_pref", "local",
2180  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "outgoing_call_offer_pref", "remote_merge",
2182  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "codec_prefs_incoming_offer",
2183  "prefer: pending, operation: intersect, keep: all, transcode: allow",
2185  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "codec_prefs_outgoing_offer",
2186  "prefer: pending, operation: union, keep: all, transcode: allow",
2188  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "codec_prefs_incoming_answer",
2189  "prefer: pending, operation: intersect, keep: all",
2191  ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "codec_prefs_outgoing_answer",
2192  "prefer: pending, operation: intersect, keep: all",
2196  ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_unauthenticated_options", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allow_unauthenticated_options));
2197 
2199  ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
2201  sip_sorcery = NULL;
2202  return -1;
2203  }
2204 
2206  ast_log(LOG_ERROR, "Failed to register SIP location support with sorcery\n");
2208  sip_sorcery = NULL;
2209  return -1;
2210  }
2211 
2213 
2215  ast_log(LOG_ERROR, "Failed to register SIP domain aliases support with sorcery\n");
2217  sip_sorcery = NULL;
2218  return -1;
2219  }
2220 
2222  ast_log(LOG_ERROR, "Failed to register SIP Global support\n");
2224  sip_sorcery = NULL;
2225  return -1;
2226  }
2227 
2229  if (!endpoint_formatter) {
2230  ast_log(LOG_ERROR, "Unable to allocate memory for endpoint_formatter\n");
2232  sip_sorcery = NULL;
2233  return -1;
2234  }
2235  endpoint_formatter->name = "endpoint";
2242 
2245 
2247 
2249 
2251 
2255 
2256  return 0;
2257 }
#define ast_log
Definition: astobj2.c:42
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition: astobj2.h:1303
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:120
static char language[MAX_LANGUAGE]
Definition: chan_alsa.c:121
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition: chan_iax2.c:425
static char mohsuggest[MAX_MUSICCLASS]
Definition: chan_iax2.c:427
static int nat
Definition: chan_mgcp.c:171
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
int ast_sip_initialize_sorcery_auth(void)
Initialize sorcery with auth support.
Definition: config_auth.c:370
int ast_sip_initialize_sorcery_domain_alias(void)
Initialize sorcery with domain alias support.
int ast_sip_initialize_sorcery_global(void)
#define STRFLDSET(type,...)
Convert a struct and a list of stringfield fields to an argument list of field offsets.
#define FLDSET(type,...)
Convert a struct and list of fields to an argument list of field offsets.
#define CHARFLDSET(type, field)
A helper macro to pass the appropriate arguments to aco_option_register for OPT_CHAR_ARRAY_T.
@ OPT_UINT_T
Type for default option handler for unsigned integers.
@ OPT_NOOP_T
Type for a default handler that should do nothing.
@ OPT_CODEC_T
Type for default option handler for format capabilities.
@ OPT_BOOL_T
Type for default option handler for bools (ast_true/ast_false)
@ OPT_CHAR_ARRAY_T
Type for default option handler for character array strings.
@ OPT_YESNO_T
Type for default option handler for bools (ast_true/ast_false)
@ OPT_STRINGFIELD_T
Type for default option handler for stringfields.
int ast_sip_initialize_sorcery_transport(void)
Initialize sorcery with transport support.
#define LOG_ERROR
struct stasis_topic * ast_security_topic(void)
A stasis_topic which publishes messages for security related issues.
#define EVENT_FLAG_SYSTEM
Definition: manager.h:75
#define ast_manager_register_xml(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
Definition: manager.h:191
def info(msg)
static int tos_video_to_str(const void *obj, const intptr_t *args, char **buf)
static int t38udptl_ec_to_str(const void *obj, const intptr_t *args, char **buf)
static int connected_line_method_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int outgoing_answer_codec_prefs_to_str(const void *obj, const intptr_t *args, char **buf)
static int codec_prefs_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static void load_all_endpoints(void)
static int from_user_to_str(const void *obj, const intptr_t *args, char **buf)
static int prack_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int set_var_to_vl(const void *obj, struct ast_variable **fields)
static int redirect_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int stir_shaken_to_str(const void *obj, const intptr_t *args, char **buf)
#define PERSISTENT_BUCKETS
Number of buckets for persistent endpoint information.
static int stir_shaken_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int incoming_offer_codec_prefs_to_str(const void *obj, const intptr_t *args, char **buf)
static int caller_id_privacy_to_str(const void *obj, const intptr_t *args, char **buf)
static int pickupgroup_to_str(const void *obj, const intptr_t *args, char **buf)
static int cli_endpoint_print_body(void *obj, void *arg, int flags)
static int contact_user_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int ident_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int tos_audio_to_str(const void *obj, const intptr_t *args, char **buf)
static int direct_media_method_to_str(const void *obj, const intptr_t *args, char **buf)
static struct ao2_container * cli_endpoint_get_container(const char *regex)
static int call_offer_pref_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int dtlsverify_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtls_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int media_encryption_to_str(const void *obj, const intptr_t *args, char **buf)
static int ami_show_endpoints(struct mansession *s, const struct message *m)
static int dtmf_to_str(const void *obj, const intptr_t *args, char **buf)
static int outbound_auth_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static const struct ast_sorcery_observer endpoint_observers
static int group_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int ami_show_endpoint(struct mansession *s, const struct message *m)
static int outgoing_offer_codec_prefs_to_str(const void *obj, const intptr_t *args, char **buf)
static int contact_user_to_str(const void *obj, const intptr_t *args, char **buf)
static int voicemail_extension_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlscapath_to_str(const void *obj, const intptr_t *args, char **buf)
static int contact_acl_to_str(const void *obj, const intptr_t *args, char **buf)
static int set_var_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int named_callgroups_to_str(const void *obj, const intptr_t *args, char **buf)
void * ast_sip_endpoint_alloc(const char *name)
Allocate a new SIP endpoint.
static int dtlscipher_to_str(const void *obj, const intptr_t *args, char **buf)
static int t38udptl_ec_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int named_pickupgroups_to_str(const void *obj, const intptr_t *args, char **buf)
static int caller_id_tag_to_str(const void *obj, const intptr_t *args, char **buf)
static int caller_id_to_str(const void *obj, const intptr_t *args, char **buf)
static int incoming_answer_codec_prefs_to_str(const void *obj, const intptr_t *args, char **buf)
static int cli_endpoint_iterate(void *obj, ao2_callback_fn callback, void *args)
static int prack_to_str(const void *obj, const intptr_t *args, char **buf)
static int caller_id_tag_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int cli_endpoint_print_header(void *obj, void *arg, int flags)
static int dtlsfingerprint_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlsautogeneratecert_to_str(const void *obj, const intptr_t *args, char **buf)
static int voicemail_extension_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int callgroup_to_str(const void *obj, const intptr_t *args, char **buf)
static int outbound_auths_to_str(const void *obj, const intptr_t *args, char **buf)
static int sip_endpoint_apply_handler(const struct ast_sorcery *sorcery, void *obj)
Callback function for when an object is finalized.
static int connected_line_method_to_str(const void *obj, const intptr_t *args, char **buf)
static void * cli_endpoint_retrieve_by_id(const char *id)
static int media_encryption_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int persistent_endpoint_cmp(void *obj, void *arg, int flags)
Comparison function for persistent endpoint information.
static int inbound_auth_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int incoming_call_offer_pref_to_str(const void *obj, const intptr_t *args, char **buf)
static int inbound_auths_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlsrekey_to_str(const void *obj, const intptr_t *args, char **buf)
static int outgoing_call_offer_pref_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtmf_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int endpoint_acl_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int from_user_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int set_var_to_str(const void *obj, const intptr_t *args, char **buf)
static int direct_media_glare_mitigation_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlssetup_to_str(const void *obj, const intptr_t *args, char **buf)
static int tos_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int caller_id_privacy_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int acl_to_str(const void *obj, const intptr_t *args, char **buf)
static void * sip_nat_hook_alloc(const char *name)
static int direct_media_glare_mitigation_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int ident_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlscafile_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlscertfile_to_str(const void *obj, const intptr_t *args, char **buf)
static int timers_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int direct_media_method_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
static int dtlsprivatekey_to_str(const void *obj, const intptr_t *args, char **buf)
static int persistent_endpoint_hash(const void *obj, const int flags)
Hashing function for persistent endpoint information.
static int named_groups_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int caller_id_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int timers_to_str(const void *obj, const intptr_t *args, char **buf)
void ast_sip_location_prune_boot_contacts(void)
Prune the prune_on_boot contacts.
Definition: location.c:469
int ast_sip_register_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Registers a CLI formatter.
Definition: pjsip_cli.c:310
int ast_sip_initialize_sorcery_location(void)
Initialize sorcery with location support.
Definition: location.c:1369
int ast_sip_initialize_cli(void)
Definition: pjsip_cli.c:360
void ast_sorcery_load(const struct ast_sorcery *sorcery)
Inform any wizards to load persistent objects.
Definition: sorcery.c:1377
#define ast_sorcery_object_field_register_alias(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object as an alias.
Definition: sorcery.h:971
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
Definition: sorcery.h:837
int ast_sorcery_observer_add(const struct ast_sorcery *sorcery, const char *type, const struct ast_sorcery_observer *callbacks)
Add an observer to a specific object type.
Definition: sorcery.c:2386
#define ast_sorcery_internal_object_register(sorcery, type, alloc, transform, apply)
Register an internal, hidden object type.
Definition: sorcery.h:867
#define ast_sorcery_object_field_register_custom(sorcery, type, name, default_val, config_handler, sorcery_handler, multiple_handler, flags,...)
Register a field within an object with custom handlers.
Definition: sorcery.h:1005
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Definition: sorcery.c:2312
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
Definition: sorcery.h:955
#define ast_sorcery_apply_default(sorcery, type, name, data)
Definition: sorcery.h:476
#define ast_sorcery_open()
Open a new sorcery structure.
Definition: sorcery.h:406
@ STASIS_SUBSCRIPTION_FILTER_SELECTIVE
Definition: stasis.h:297
int stasis_subscription_accept_message_type(struct stasis_subscription *subscription, const struct stasis_message_type *type)
Indicate to a subscription that we are interested in a message type.
Definition: stasis.c:1025
int stasis_subscription_set_filter(struct stasis_subscription *subscription, enum stasis_subscription_message_filter filter)
Set the message type filtering level on a subscription.
Definition: stasis.c:1079
#define stasis_subscribe(topic, callback, data)
Definition: stasis.h:649
CLI Formatter Registry Entry.
Definition: res_pjsip_cli.h:52
int(* iterate)(void *container, ao2_callback_fn callback, void *args)
Definition: res_pjsip_cli.h:66
ao2_callback_fn * print_header
Definition: res_pjsip_cli.h:60
const char *(* get_id)(const void *obj)
Definition: res_pjsip_cli.h:70
struct ao2_container *(* get_container)(const char *regex)
Definition: res_pjsip_cli.h:64
void *(* retrieve_by_id)(const char *id)
Definition: res_pjsip_cli.h:68
const char * name
Definition: res_pjsip_cli.h:58
ao2_callback_fn * print_body
Definition: res_pjsip_cli.h:62
const ast_string_field context
Definition: res_pjsip.h:883
const ast_string_field fromuser
Definition: res_pjsip.h:883
struct ast_sip_endpoint_nat_configuration nat
Definition: res_pjsip.h:891

References accountcode, acl_change_stasis_cb(), acl_change_sub, acl_to_str(), AMI_SHOW_ENDPOINT, ami_show_endpoint(), AMI_SHOW_ENDPOINTS, ami_show_endpoints(), ao2_alloc, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ARRAY_LEN, ast_cli_register_multiple, ast_log, ast_manager_register_xml, ast_named_acl_change_type(), ast_security_topic(), ast_sip_endpoint_alloc(), ast_sip_initialize_cli(), ast_sip_initialize_sorcery_auth(), ast_sip_initialize_sorcery_domain_alias(), ast_sip_initialize_sorcery_global(), ast_sip_initialize_sorcery_location(), ast_sip_initialize_sorcery_transport(), ast_sip_location_prune_boot_contacts(), ast_sip_register_cli_formatter(), ast_sorcery_apply_default, ast_sorcery_internal_object_register, ast_sorcery_load(), ast_sorcery_object_field_register, ast_sorcery_object_field_register_alias, ast_sorcery_object_field_register_custom, ast_sorcery_object_get_id(), ast_sorcery_object_register, ast_sorcery_observer_add(), ast_sorcery_open, ast_sorcery_unref, call_offer_pref_handler(), caller_id_handler(), caller_id_privacy_handler(), caller_id_privacy_to_str(), caller_id_tag_handler(), caller_id_tag_to_str(), caller_id_to_str(), callgroup_to_str(), CHARFLDSET, cli_commands, cli_endpoint_get_container(), cli_endpoint_iterate(), cli_endpoint_print_body(), cli_endpoint_print_header(), cli_endpoint_retrieve_by_id(), codec_prefs_handler(), connected_line_method_handler(), connected_line_method_to_str(), contact_acl_to_str(), contact_user_handler(), contact_user_to_str(), context, ast_sip_endpoint::context, direct_media_glare_mitigation_handler(), direct_media_glare_mitigation_to_str(), direct_media_method_handler(), direct_media_method_to_str(), dtls_handler(), dtlsautogeneratecert_to_str(), dtlscafile_to_str(), dtlscapath_to_str(), dtlscertfile_to_str(), dtlscipher_to_str(), dtlsfingerprint_to_str(), dtlsprivatekey_to_str(), dtlsrekey_to_str(), dtlssetup_to_str(), dtlsverify_to_str(), dtmf_handler(), dtmf_to_str(), endpoint_acl_handler(), endpoint_formatter, endpoint_observers, EVENT_FLAG_SYSTEM, FLDSET, from_user_handler(), from_user_to_str(), ast_sip_endpoint::fromuser, ast_sip_cli_formatter_entry::get_container, ast_sip_cli_formatter_entry::get_id, group_handler(), ident_handler(), ident_to_str(), inbound_auth_handler(), inbound_auths_to_str(), incoming_answer_codec_prefs_to_str(), incoming_call_offer_pref_to_str(), incoming_offer_codec_prefs_to_str(), sip_to_pjsip::info(), ast_sip_cli_formatter_entry::iterate, language, load_all_endpoints(), LOG_ERROR, media_encryption_handler(), media_encryption_to_str(), mohsuggest, ast_sip_cli_formatter_entry::name, named_callgroups_to_str(), named_groups_handler(), named_pickupgroups_to_str(), nat, ast_sip_endpoint::nat, NULL, OPT_BOOL_T, OPT_CHAR_ARRAY_T, OPT_CODEC_T, OPT_NOOP_T, OPT_STRINGFIELD_T, OPT_UINT_T, OPT_YESNO_T, outbound_auth_handler(), outbound_auths_to_str(), outgoing_answer_codec_prefs_to_str(), outgoing_call_offer_pref_to_str(), outgoing_offer_codec_prefs_to_str(), PERSISTENT_BUCKETS, persistent_endpoint_cmp(), persistent_endpoint_hash(), persistent_endpoints, pickupgroup_to_str(), prack_handler(), prack_to_str(), ast_sip_cli_formatter_entry::print_body, ast_sip_cli_formatter_entry::print_header, redirect_handler(), ast_sip_cli_formatter_entry::retrieve_by_id, set_var_handler(), set_var_to_str(), set_var_to_vl(), sip_endpoint_apply_handler(), sip_nat_hook_alloc(), sip_sorcery, stasis_subscribe, stasis_subscription_accept_message_type(), STASIS_SUBSCRIPTION_FILTER_SELECTIVE, stasis_subscription_set_filter(), stir_shaken_handler(), stir_shaken_to_str(), STRFLDSET, t38udptl_ec_handler(), t38udptl_ec_to_str(), timers_handler(), timers_to_str(), tos_audio_to_str(), tos_handler(), tos_video_to_str(), voicemail_extension_handler(), and voicemail_extension_to_str().

Referenced by load_module().

◆ ast_res_pjsip_reload_configuration()

int ast_res_pjsip_reload_configuration ( void  )

Definition at line 2281 of file pjsip_configuration.c.

2282 {
2283  if (sip_sorcery) {
2285  }
2286  return 0;
2287 }
void ast_sorcery_reload(const struct ast_sorcery *sorcery)
Inform any wizards to reload persistent objects.
Definition: sorcery.c:1408

References ast_sorcery_reload(), and sip_sorcery.

Referenced by reload_configuration_task().

◆ ast_sip_auth_vector_destroy()

void ast_sip_auth_vector_destroy ( struct ast_sip_auth_vector vector)

Free contents of an auth vector.

Parameters
vectorVector whose contents are to be freed

Definition at line 249 of file pjsip_configuration.c.

250 {
251  int i;
252  size_t size;
253 
254  if (!auths) {
255  return;
256  }
257 
258  size = AST_VECTOR_SIZE(auths);
259 
260  for (i = 0; i < size; ++i) {
261  const char *name = AST_VECTOR_REMOVE_UNORDERED(auths, 0);
262  ast_free((char *) name);
263  }
264  AST_VECTOR_FREE(auths);
265 }
#define ast_free(a)
Definition: astmm.h:180
static const char name[]
Definition: format_mp3.c:68
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition: vector.h:174
#define AST_VECTOR_REMOVE_UNORDERED(vec, idx)
Remove an element from an unordered vector by index.
Definition: vector.h:438

References ast_free, AST_VECTOR_FREE, AST_VECTOR_REMOVE_UNORDERED, AST_VECTOR_SIZE, and name.

Referenced by ast_sip_auth_vector_init(), endpoint_destructor(), handle_client_state_destruction(), sip_outbound_publish_destroy(), sip_outbound_registration_destroy(), and sip_outbound_registration_perform().

◆ ast_sip_auth_vector_init()

int ast_sip_auth_vector_init ( struct ast_sip_auth_vector vector,
const char *  auth_names 
)

Initialize an auth vector with the configured values.

Parameters
vectorVector to initialize
auth_namesComma-separated list of names to set in the array
Return values
0Success
non-zeroFailure

Definition at line 267 of file pjsip_configuration.c.

268 {
269  char *auth_names = ast_strdupa(value);
270  char *val;
271 
272  ast_assert(auths != NULL);
273 
274  if (AST_VECTOR_SIZE(auths)) {
276  }
277  if (AST_VECTOR_INIT(auths, 1)) {
278  return -1;
279  }
280 
281  while ((val = ast_strip(strsep(&auth_names, ",")))) {
282  if (ast_strlen_zero(val)) {
283  continue;
284  }
285 
286  val = ast_strdup(val);
287  if (!val) {
288  goto failure;
289  }
290  if (AST_VECTOR_APPEND(auths, val)) {
291  ast_free(val);
292 
293  goto failure;
294  }
295  }
296  return 0;
297 
298 failure:
300  return -1;
301 }
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
char * strsep(char **str, const char *delims)
void ast_sip_auth_vector_destroy(struct ast_sip_auth_vector *auths)
Free contents of an auth vector.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:223
Definition: ast_expr2.c:325
int value
Definition: syslog.c:37
#define ast_assert(a)
Definition: utils.h:734
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition: vector.h:113
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition: vector.h:256

References ast_assert, ast_free, ast_sip_auth_vector_destroy(), ast_strdup, ast_strdupa, ast_strip(), ast_strlen_zero(), AST_VECTOR_APPEND, AST_VECTOR_INIT, AST_VECTOR_SIZE, NULL, strsep(), and value.

Referenced by inbound_auth_handler(), and outbound_auth_handler().

◆ ast_sip_auths_to_str()

int ast_sip_auths_to_str ( const struct ast_sip_auth_vector auths,
char **  buf 
)

Converts an auths array to a string of comma separated values.

Parameters
authsan auth array
bufthe string buffer to write the object data
Return values
0Success, non-zero on failure

Definition at line 317 of file pjsip_configuration.c.

318 {
319  if (!auths || !AST_VECTOR_SIZE(auths)) {
320  return 0;
321  }
322 
323  if (!(*buf = ast_calloc(MAX_OBJECT_FIELD, sizeof(char)))) {
324  return -1;
325  }
326 
327  /* I feel like accessing the vector's elem array directly is cheating...*/
328  ast_join_delim(*buf, MAX_OBJECT_FIELD, auths->elems, AST_VECTOR_SIZE(auths), ',');
329  return 0;
330 }
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define MAX_OBJECT_FIELD
Maximum length of an object field name.
Definition: sorcery.h:110
void ast_join_delim(char *s, size_t len, const char *const w[], unsigned int size, char delim)
Join an array of strings into a single string.
Definition: main/utils.c:2276
const char ** elems
Definition: res_pjsip.h:488

References ast_calloc, ast_join_delim(), AST_VECTOR_SIZE, buf, ast_sip_auth_vector::elems, and MAX_OBJECT_FIELD.

Referenced by format_str_append_auth(), inbound_auths_to_str(), and outbound_auths_to_str().

◆ ast_sip_cleanup_auths()

void ast_sip_cleanup_auths ( struct ast_sip_auth auths[],
size_t  num_auths 
)

Clean up retrieved auth structures from memory.

Call this function once you have completed operating on auths retrieved from ast_sip_retrieve_auths

Parameters
authsAn array of auth object pointers to clean up
num_authsThe number of auths in the array

Definition at line 2417 of file pjsip_configuration.c.

2418 {
2419  int i;
2420  for (i = 0; i < num_auths; ++i) {
2421  ao2_cleanup(auths[i]);
2422  }
2423 }

References ao2_cleanup.

Referenced by set_outbound_initial_authentication_credentials().

◆ ast_sip_create_ami_event()

struct ast_str* ast_sip_create_ami_event ( const char *  event,
struct ast_sip_ami ami 
)

Creates a string to store AMI event data in.

Parameters
eventthe event to set
amiAMI session and message container
Return values
aninitialized ast_str or NULL on error.

Definition at line 1622 of file pjsip_configuration.c.

1623 {
1625 
1626  if (!(buf)) {
1627  astman_send_error_va(ami->s, ami->m, "Unable create event "
1628  "for %s\n", event);
1629  return NULL;
1630  }
1631 
1632  ast_str_set(&buf, 0, "Event: %s\r\n", event);
1633  if (!ast_strlen_zero(ami->action_id)) {
1634  ast_str_append(&buf, 0, "ActionID: %s\r\n", ami->action_id);
1635  }
1636  return buf;
1637 }
#define AMI_DEFAULT_STR_SIZE
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:640
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1091
const char * action_id
Definition: res_pjsip.h:2825
Definition: astman.c:222

References ast_sip_ami::action_id, AMI_DEFAULT_STR_SIZE, ast_str_append(), ast_str_create, ast_str_set(), ast_strlen_zero(), astman_send_error_va(), buf, ast_sip_ami::m, NULL, and ast_sip_ami::s.

Referenced by ami_outbound_registration_task(), ami_registrations_aor(), ami_subscription_detail(), ast_sip_format_contact_ami(), format_ami_aor_handler(), format_ami_aorlist_handler(), format_ami_auth_handler(), format_ami_authlist_handler(), format_ami_contactlist_handler(), format_ami_endpoint(), format_ami_endpoints(), format_ami_resource_lists(), and send_identify_ami_event().

◆ ast_sip_default_outbound_endpoint()

struct ast_sip_endpoint* ast_sip_default_outbound_endpoint ( void  )

Retrieve the default outbound endpoint.

Return values
Thedefault outbound endpoint, NULL if not found.

Definition at line 2393 of file pjsip_configuration.c.

2394 {
2397  sip_sorcery, "endpoint", name);
2398 }
char * ast_sip_global_default_outbound_endpoint(void)

References ast_free, ast_sip_global_default_outbound_endpoint(), ast_sorcery_retrieve_by_id(), ast_strlen_zero(), name, NULL, RAII_VAR, and sip_sorcery.

Referenced by get_outbound_endpoint(), handle_atsign(), handle_single_token(), and notify_uri().

◆ ast_sip_endpoint_alloc()

void* ast_sip_endpoint_alloc ( const char *  name)

Allocate a new SIP endpoint.

This will return an endpoint with its refcount increased by one. This reference can be released using ao2_ref().

Parameters
nameThe name of the endpoint.
Return values
NULLEndpoint allocation failed
non-NULLThe newly allocated endpoint

Definition at line 2346 of file pjsip_configuration.c.

2347 {
2348  struct ast_sip_endpoint *endpoint = ast_sorcery_generic_alloc(sizeof(*endpoint), endpoint_destructor);
2349  if (!endpoint) {
2350  return NULL;
2351  }
2352  if (ast_string_field_init(endpoint, 64)) {
2353  ao2_cleanup(endpoint);
2354  return NULL;
2355  }
2356 
2358  ao2_cleanup(endpoint);
2359  return NULL;
2360  }
2362  ao2_cleanup(endpoint);
2363  return NULL;
2364  }
2365  if (init_info_configuration(&endpoint->info)) {
2366  ao2_cleanup(endpoint);
2367  return NULL;
2368  }
2369  if (init_media_configuration(&endpoint->media)) {
2370  ao2_cleanup(endpoint);
2371  return NULL;
2372  }
2373 
2374  ast_party_id_init(&endpoint->id.self);
2375  endpoint->id.self.tag = ast_strdup("");
2376 
2377  if (AST_VECTOR_INIT(&endpoint->ident_method_order, 1)) {
2378  return NULL;
2379  }
2380 
2381  return endpoint;
2382 }
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1751
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition: format_cap.h:38
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition: format_cap.h:49
static int init_info_configuration(struct ast_sip_endpoint_info_configuration *info)
static int init_media_configuration(struct ast_sip_endpoint_media_configuration *media)
static int init_subscription_configuration(struct ast_sip_endpoint_subscription_configuration *subscription)
static void endpoint_destructor(void *obj)
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
Definition: sorcery.c:1728
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
char * tag
User-set "tag".
Definition: channel.h:354
struct ast_party_id self
Definition: res_pjsip.h:663
struct ast_format_cap * codecs
Definition: res_pjsip.h:812
struct ast_sip_endpoint_id_configuration id
Definition: res_pjsip.h:893
struct ast_sip_identify_by_vector ident_method_order
Definition: res_pjsip.h:907
struct ast_sip_endpoint_media_configuration media
Definition: res_pjsip.h:887
struct ast_sip_endpoint_subscription_configuration subscription
Definition: res_pjsip.h:889
struct ast_sip_endpoint_info_configuration info
Definition: res_pjsip.h:895

References ao2_cleanup, ast_format_cap_alloc, AST_FORMAT_CAP_FLAG_DEFAULT, ast_party_id_init(), ast_sorcery_generic_alloc(), ast_strdup, ast_string_field_init, AST_VECTOR_INIT, ast_sip_endpoint_media_configuration::codecs, endpoint_destructor(), ast_sip_endpoint::id, ast_sip_endpoint::ident_method_order, ast_sip_endpoint::info, init_info_configuration(), init_media_configuration(), init_subscription_configuration(), ast_sip_endpoint::media, NULL, ast_sip_endpoint_id_configuration::self, ast_sip_endpoint::subscription, and ast_party_id::tag.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ast_sip_for_each_channel()

int ast_sip_for_each_channel ( const struct ast_sip_endpoint endpoint,
ao2_callback_fn  on_channel_snapshot,
void *  arg 
)

For every channel snapshot on an endpoint all the given 'on_channel_snapshot' handler.

Parameters
endpointendpoint
on_channel_snapshotcallback for each channel snapshot
arguser data passed to handler
Return values
0Success, non-zero on failure

Definition at line 1588 of file pjsip_configuration.c.

1591 {
1592  RAII_VAR(struct ast_endpoint_snapshot *, endpoint_snapshot, ast_sip_get_endpoint_snapshot(endpoint), ao2_cleanup);
1593  return ast_sip_for_each_channel_snapshot(endpoint_snapshot, on_channel_snapshot, arg);
1594 }

References ao2_cleanup, ast_sip_for_each_channel_snapshot(), ast_sip_get_endpoint_snapshot(), and RAII_VAR.

Referenced by cli_channel_iterate(), and cli_channelstats_iterate().

◆ ast_sip_for_each_channel_snapshot()

int ast_sip_for_each_channel_snapshot ( const struct ast_endpoint_snapshot endpoint_snapshot,
ao2_callback_fn  on_channel_snapshot,
void *  arg 
)

For every channel snapshot on an endpoint snapshot call the given 'on_channel_snapshot' handler.

Parameters
endpoint_snapshotsnapshot of an endpoint
on_channel_snapshotcallback for each channel snapshot
arguser data passed to handler
Return values
0Success, non-zero on failure

Definition at line 1561 of file pjsip_configuration.c.

1564 {
1565  int num, num_channels = endpoint_snapshot->num_channels;
1566 
1567  if (!on_channel_snapshot || !num_channels) {
1568  return 0;
1569  }
1570 
1571  for (num = 0; num < num_channels; ++num) {
1572  RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
1573  int res;
1574 
1575  snapshot = ast_channel_snapshot_get_latest(endpoint_snapshot->channel_ids[num]);
1576  if (!snapshot) {
1577  continue;
1578  }
1579 
1580  res = on_channel_snapshot(snapshot, arg, 0);
1581  if (res) {
1582  return -1;
1583  }
1584  }
1585  return 0;
1586 }
struct ast_channel_snapshot * ast_channel_snapshot_get_latest(const char *uniqueid)
Obtain the latest ast_channel_snapshot from the Stasis Message Bus API cache. This is an ao2 object,...

References ao2_cleanup, ast_channel_snapshot_get_latest(), ast_endpoint_snapshot::channel_ids, NULL, ast_endpoint_snapshot::num_channels, and RAII_VAR.

Referenced by active_channels_to_str(), and ast_sip_for_each_channel().

◆ ast_sip_get_device_state()

const char* ast_sip_get_device_state ( const struct ast_sip_endpoint endpoint)

Retrieve the device state for an endpoint.

Parameters
endpointThe endpoint whose state is to be retrieved.
Return values
Thedevice state.

Definition at line 1545 of file pjsip_configuration.c.

1546 {
1547  char device[MAX_OBJECT_FIELD];
1548 
1549  snprintf(device, MAX_OBJECT_FIELD, "PJSIP/%s", ast_sorcery_object_get_id(endpoint));
1550  return ast_devstate2str(ast_device_state(device));
1551 }
const char * ast_devstate2str(enum ast_device_state devstate) attribute_pure
Convert device state to text string for output.
Definition: devicestate.c:237
ast_device_state
Device States.
Definition: devicestate.h:52

References ast_devstate2str(), ast_sorcery_object_get_id(), and MAX_OBJECT_FIELD.

Referenced by format_ami_endpoints(), and sip_endpoint_to_ami().

◆ ast_sip_get_endpoint_snapshot()

struct ast_endpoint_snapshot* ast_sip_get_endpoint_snapshot ( const struct ast_sip_endpoint endpoint)

Retrieve the endpoint snapshot for an endpoint.

Parameters
endpointThe endpoint whose snapshot is to be retrieved.
Return values
Theendpoint snapshot

Definition at line 1553 of file pjsip_configuration.c.

1555 {
1557  ast_endpoint_get_tech(endpoint->persistent),
1559 }
const char * ast_endpoint_get_tech(const struct ast_endpoint *endpoint)
Gets the technology of the given endpoint.
struct ast_endpoint_snapshot * ast_endpoint_latest_snapshot(const char *tech, const char *resource)
Retrieve the most recent snapshot for the endpoint with the given name.
struct ast_endpoint * persistent
Definition: res_pjsip.h:911

References ast_endpoint_get_resource(), ast_endpoint_get_tech(), ast_endpoint_latest_snapshot(), and ast_sip_endpoint::persistent.

Referenced by active_channels_to_str(), and ast_sip_for_each_channel().

◆ ast_sip_get_endpoints()

struct ao2_container* ast_sip_get_endpoints ( void  )

Retrieve any endpoints available to sorcery.

Return values
Endpointsavailable to sorcery, NULL if no endpoints found.

Definition at line 2384 of file pjsip_configuration.c.

2385 {
2386  struct ao2_container *endpoints;
2387 
2389 
2390  return endpoints;
2391 }
@ AST_RETRIEVE_FLAG_MULTIPLE
Return all matching objects.
Definition: sorcery.h:120
@ AST_RETRIEVE_FLAG_ALL
Perform no matching, return all objects.
Definition: sorcery.h:123
void * ast_sorcery_retrieve_by_fields(const struct ast_sorcery *sorcery, const char *type, unsigned int flags, struct ast_variable *fields)
Retrieve an object or multiple objects using specific fields.
Definition: sorcery.c:1897

References AST_RETRIEVE_FLAG_ALL, AST_RETRIEVE_FLAG_MULTIPLE, ast_sorcery_retrieve_by_fields(), endpoints, NULL, and sip_sorcery.

Referenced by ami_registrations_endpoints(), ami_show_endpoints(), and load_module().

◆ ast_sip_get_sorcery()

struct ast_sorcery* ast_sip_get_sorcery ( void  )

Get a pointer to the SIP sorcery structure.

Return values
NULLsorcery has not been initialized
non-NULLsorcery structure

Definition at line 2444 of file pjsip_configuration.c.

2445 {
2446  return sip_sorcery;
2447 }

References sip_sorcery.

Referenced by acl_change_stasis_cb(), acl_on_rx_msg(), alloc_artificial_auth(), ami_show_endpoint(), ami_show_registration_contact_statuses(), ami_show_resource_lists(), ami_sip_qualify(), aor_deleted_observer(), ast_res_pjsip_cleanup_options_handling(), ast_sip_cli_print_sorcery_objectset(), ast_sip_destroy_sorcery_global(), ast_sip_destroy_sorcery_location(), ast_sip_destroy_transport_management(), ast_sip_for_each_auth(), ast_sip_initialize_distributor(), ast_sip_initialize_sorcery_auth(), ast_sip_initialize_sorcery_domain_alias(), ast_sip_initialize_sorcery_global(), ast_sip_initialize_sorcery_location(), ast_sip_initialize_sorcery_transport(), ast_sip_initialize_transport_management(), ast_sip_location_create_contact(), ast_sip_location_delete_contact(), ast_sip_location_prune_boot_contacts(), ast_sip_location_retrieve_aor(), ast_sip_location_retrieve_aor_contacts_nolock_filtered(), ast_sip_location_retrieve_contact(), ast_sip_location_update_contact(), ast_sip_retrieve_auths(), ast_sip_retrieve_auths_vector(), ast_sip_set_tpselector_from_transport_name(), ast_sip_sorcery_object_to_ami(), asterisk_publication_devicestate_state_change(), asterisk_publication_mwi_state_change(), asterisk_publication_new(), auth_observer(), can_reuse_registration(), chan_pjsip_devicestate(), check_expiration_thread(), check_state(), cli_aor_get_container(), cli_aor_retrieve_by_id(), cli_complete_endpoint(), cli_complete_registration(), cli_contact_get_container(), cli_endpoint_retrieve_by_id(), cli_get_aors(), cli_get_auths(), cli_get_container(), cli_iterate(), cli_iterator(), cli_qualify(), cli_reload_qualify_aor(), cli_reload_qualify_endpoint(), cli_retrieve_by_id(), cli_show_qualify_endpoint(), common_identify(), contact_observer_updated(), create_artificial_endpoint(), create_mwi_subscriptions(), create_rtp(), find_aor(), find_aor_name(), find_endpoint(), get_all_contacts(), get_publishes_and_update_state(), get_registrations(), get_write_timeout(), handle_atsign(), handle_single_token(), handle_slash(), load_module(), mwi_contact_changed(), mwi_contact_deleted(), mwi_subscription_shutdown(), on_rx_process_symmetric_transport(), permanent_uri_handler(), pjsip_acf_dial_contacts_read(), pjsip_outbound_registration_metrics_init(), pjsip_outbound_registration_metrics_unload_cb(), process_nat(), publish_request_initial(), reload_module(), request(), reregister_all(), retrieve_resource_list(), send_unsolicited_mwi_notify(), sip_aor_to_ami(), sip_cli_print_global(), sip_options_aor_observer_modified_task(), sip_options_apply_aor_configuration(), sip_options_contact_add_management_task(), sip_options_init_task(), sip_options_qualify_contact(), sip_options_synchronize_task(), sub_persistence_recreate(), subscription_persistence_create(), subscription_persistence_load(), subscription_persistence_recreate(), subscription_persistence_remove(), subscription_persistence_update(), t38_initialize_session(), transfer(), and unload_module().

◆ ast_sip_persistent_endpoint_add_to_regcontext()

int ast_sip_persistent_endpoint_add_to_regcontext ( const char *  regcontext)

Definition at line 1350 of file pjsip_configuration.c.

1351 {
1352  if (ast_strlen_zero(regcontext)) {
1353  return 0;
1354  }
1355 
1356  /* Make sure the regcontext exists */
1357  if (!ast_context_find_or_create(NULL, NULL, regcontext, "PJSIP")) {
1358  ast_log(LOG_ERROR, "Failed to create regcontext '%s'\n", regcontext);
1359  return -1;
1360  }
1361 
1362  /* Add any online endpoints */
1364  return 0;
1365 }
struct ast_context * ast_context_find_or_create(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *name, const char *registrar)
Register a new context or find an existing one.
static int add_to_regcontext(void *obj, void *arg, int flags)

References add_to_regcontext(), ao2_callback, ast_context_find_or_create(), ast_log, ast_strlen_zero(), LOG_ERROR, NULL, OBJ_NODATA, persistent_endpoints, and regcontext.

Referenced by check_regcontext().

◆ ast_sip_persistent_endpoint_publish_contact_state()

void ast_sip_persistent_endpoint_publish_contact_state ( const char *  endpoint_name,
const struct ast_sip_contact_status contact_status 
)

Publish the change of state for a contact.

Parameters
endpoint_nameThe SIP endpoint name.
contact_statusThe contact status.

Definition at line 1424 of file pjsip_configuration.c.

1425 {
1426  struct sip_persistent_endpoint *persistent;
1427  struct ast_json *blob;
1428  char rtt[32];
1429 
1430  persistent = ao2_find(persistent_endpoints, endpoint_name, OBJ_SEARCH_KEY);
1431  if (!persistent) {
1432  return;
1433  }
1434 
1435  snprintf(rtt, sizeof(rtt), "%" PRId64, contact_status->rtt);
1436  blob = ast_json_pack("{s: s, s: s, s: s, s: s, s: s}",
1437  "contact_status", ast_sip_get_contact_status_label(contact_status->status),
1438  "aor", contact_status->aor,
1439  "uri", contact_status->uri,
1440  "roundtrip_usec", rtt,
1441  "endpoint_name", ast_endpoint_get_resource(persistent->endpoint));
1442  if (blob) {
1444  ast_json_unref(blob);
1445  }
1446 
1447  ao2_ref(persistent, -1);
1448 }
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
@ OBJ_SEARCH_KEY
The arg parameter is a search key, but is not an object.
Definition: astobj2.h:1101
void ast_endpoint_blob_publish(struct ast_endpoint *endpoint, struct stasis_message_type *type, struct ast_json *blob)
Creates and publishes a ast_endpoint_blob message.
struct stasis_message_type * ast_endpoint_contact_state_type(void)
Message type for endpoint contact state changes.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
const char * ast_sip_get_contact_status_label(const enum ast_sip_contact_status_type status)
translate ast_sip_contact_status_type to character string.
Abstract JSON element (object, array, string, int, ...).
const ast_string_field uri
Definition: res_pjsip.h:362
enum ast_sip_contact_status_type status
Definition: res_pjsip.h:366
const ast_string_field aor
Definition: res_pjsip.h:362

References ao2_find, ao2_ref, ast_sip_contact_status::aor, ast_endpoint_blob_publish(), ast_endpoint_contact_state_type(), ast_endpoint_get_resource(), ast_json_pack(), ast_json_unref(), ast_sip_get_contact_status_label(), sip_persistent_endpoint::endpoint, OBJ_SEARCH_KEY, persistent_endpoints, ast_sip_contact_status::rtt, ast_sip_contact_status::status, and ast_sip_contact_status::uri.

Referenced by sip_options_publish_contact_state().

◆ ast_sip_persistent_endpoint_update_state()

int ast_sip_persistent_endpoint_update_state ( const char *  endpoint_name,
enum ast_endpoint_state  state 
)

Change state of a persistent endpoint.

Parameters
endpoint_nameThe SIP endpoint name to change state.
stateThe new state
Return values
0Success
-1Endpoint not found

Definition at line 1367 of file pjsip_configuration.c.

1368 {
1369  struct sip_persistent_endpoint *persistent;
1370  struct ast_json *blob;
1371  char *regcontext;
1372 
1373  persistent = ao2_find(persistent_endpoints, endpoint_name, OBJ_SEARCH_KEY);
1374  if (!persistent) {
1375  return -1;
1376  }
1377 
1378  /* If there was no state change, don't publish anything. */
1379  if (ast_endpoint_get_state(persistent->endpoint) == state) {
1380  ao2_ref(persistent, -1);
1381  return 0;
1382  }
1383 
1385 
1386  if (state == AST_ENDPOINT_ONLINE) {
1388  blob = ast_json_pack("{s: s}", "peer_status", "Reachable");
1389 
1390  if (!ast_strlen_zero(regcontext)) {
1393  "Noop", ast_strdup(ast_endpoint_get_resource(persistent->endpoint)), ast_free_ptr, "PJSIP");
1394  }
1395  }
1396 
1397  ast_verb(2, "Endpoint %s is now Reachable\n", ast_endpoint_get_resource(persistent->endpoint));
1398  } else {
1400  blob = ast_json_pack("{s: s}", "peer_status", "Unreachable");
1401 
1402  if (!ast_strlen_zero(regcontext)) {
1403  struct pbx_find_info q = { .stacklen = 0 };
1404 
1407  }
1408  }
1409 
1410  ast_verb(2, "Endpoint %s is now Unreachable\n", ast_endpoint_get_resource(persistent->endpoint));
1411  }
1412 
1414 
1416  ast_json_unref(blob);
1418 
1419  ao2_ref(persistent, -1);
1420 
1421  return 0;
1422 }
@ AST_DEVSTATE_CACHABLE
Definition: devicestate.h:70
int ast_devstate_changed(enum ast_device_state state, enum ast_devstate_cache cachable, const char *fmt,...)
Tells Asterisk the State for Device is changed.
Definition: devicestate.c:510
@ AST_DEVICE_UNKNOWN
Definition: devicestate.h:53
@ AST_ENDPOINT_OFFLINE
Definition: endpoints.h:55
void ast_endpoint_set_state(struct ast_endpoint *endpoint, enum ast_endpoint_state state)
Updates the state of the given endpoint.
@ E_MATCH
Definition: extconf.h:218
struct stasis_message_type * ast_endpoint_state_type(void)
Message type for endpoint state changes.
#define ast_verb(level,...)
int ast_context_remove_extension(const char *context, const char *extension, int priority, const char *registrar)
Simply remove extension from context.
Definition: pbx.c:4955
struct ast_exten * pbx_find_extension(struct ast_channel *chan, struct ast_context *bypass, struct pbx_find_info *q, const char *context, const char *exten, int priority, const char *label, const char *callerid, enum ext_match_t action)
Definition: ael_main.c:152
char * ast_sip_get_regcontext(void)
Retrieve the global regcontext setting.
int stacklen
Definition: extconf.h:238

References ao2_find, ao2_ref, ast_add_extension(), ast_context_remove_extension(), AST_DEVICE_UNKNOWN, AST_DEVSTATE_CACHABLE, ast_devstate_changed(), ast_endpoint_blob_publish(), ast_endpoint_get_resource(), ast_endpoint_get_state(), AST_ENDPOINT_OFFLINE, AST_ENDPOINT_ONLINE, ast_endpoint_set_state(), ast_endpoint_state_type(), ast_exists_extension(), ast_free, ast_free_ptr(), ast_json_pack(), ast_json_unref(), ast_sip_get_regcontext(), ast_strdup, ast_strlen_zero(), ast_verb, E_MATCH, sip_persistent_endpoint::endpoint, NULL, OBJ_SEARCH_KEY, pbx_find_extension(), persistent_endpoints, regcontext, and pbx_find_info::stacklen.

Referenced by sip_options_synchronize_endpoint(), sip_options_unused_endpoint_state_compositor(), and sip_options_update_endpoint_state_compositor_aor().

◆ ast_sip_retrieve_auths()

int ast_sip_retrieve_auths ( const struct ast_sip_auth_vector auths,
struct ast_sip_auth **  out 
)

Retrieve relevant SIP auth structures from sorcery.

Parameters
authsVector of sorcery IDs of auth credentials to retrieve
[out]outThe retrieved auths are stored here

Definition at line 2400 of file pjsip_configuration.c.

2401 {
2402  int i;
2403 
2404  for (i = 0; i < AST_VECTOR_SIZE(auths); ++i) {
2405  /* Using AST_VECTOR_GET is safe since the vector is immutable */
2406  const char *name = AST_VECTOR_GET(auths, i);
2408  if (!out[i]) {
2409  ast_log(LOG_NOTICE, "Couldn't find auth '%s'. Cannot authenticate\n", name);
2410  return -1;
2411  }
2412  }
2413 
2414  return 0;
2415 }
#define LOG_NOTICE
#define SIP_SORCERY_AUTH_TYPE
Definition: res_pjsip.h:461
FILE * out
Definition: utils/frame.c:33
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680

References ast_log, ast_sip_get_sorcery(), ast_sorcery_retrieve_by_id(), AST_VECTOR_GET, AST_VECTOR_SIZE, LOG_NOTICE, name, out, and SIP_SORCERY_AUTH_TYPE.

Referenced by set_outbound_initial_authentication_credentials().

◆ ast_sip_retrieve_auths_vector()

int ast_sip_retrieve_auths_vector ( const struct ast_sip_auth_vector auth_ids,
struct ast_sip_auth_objects_vector auth_objects 
)

Retrieve relevant SIP auth structures from sorcery as a vector.

Parameters
auth_idsVector of sorcery IDs of auth credentials to retrieve
[out]auth_objectsA pointer ast_sip_auth_objects_vector to hold the objects
Return values
0Success
-1Number of auth objects found is less than the number of names supplied.
Warning
The number of auth objects retrieved may be less than the number of auth ids supplied if auth objects couldn't be found for some of them.
Note
Since the ref count on all auth objects returned has been bumped, you must call ast_sip_cleanup_auth_objects_vector() to decrement the ref count on all of the auth objects in the vector, then call AST_VECTOR_FREE() on the vector itself.

Definition at line 2425 of file pjsip_configuration.c.

2427 {
2428  int i;
2429 
2430  for (i = 0; i < AST_VECTOR_SIZE(auth_ids); ++i) {
2431  /* Using AST_VECTOR_GET is safe since the vector is immutable */
2432  const char *name = AST_VECTOR_GET(auth_ids, i);
2434  if (!auth_object) {
2435  ast_log(LOG_WARNING, "Auth object '%s' could not be found\n", name);
2436  } else {
2437  AST_VECTOR_APPEND(auth_objects, auth_object);
2438  }
2439  }
2440 
2441  return AST_VECTOR_SIZE(auth_objects) == AST_VECTOR_SIZE(auth_ids) ? 0 : -1;
2442 }
#define LOG_WARNING

References ast_log, ast_sip_get_sorcery(), ast_sorcery_retrieve_by_id(), AST_VECTOR_APPEND, AST_VECTOR_GET, AST_VECTOR_SIZE, LOG_WARNING, name, and SIP_SORCERY_AUTH_TYPE.

◆ ast_sip_sorcery_object_to_ami()

int ast_sip_sorcery_object_to_ami ( const void *  obj,
struct ast_str **  buf 
)

Converts a sorcery object to a string of object properties.

Parameters
objthe sorcery object to convert
bufthe string buffer to write the object data
Return values
0Success, non-zero on failure

Definition at line 1647 of file pjsip_configuration.c.

1648 {
1651  struct ast_variable *i;
1652 
1653  if (!objset) {
1654  return -1;
1655  }
1656 
1658 
1659  for (i = objset; i; i = i->next) {
1660  RAII_VAR(char *, camel, ast_to_camel_case(i->name), ast_free);
1661  ast_str_append(buf, 0, "%s: %s\r\n", camel, i->value);
1662  }
1663 
1664  return 0;
1665 }
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition: extconf.c:1262
static void sip_sorcery_object_ami_set_type_name(const void *obj, struct ast_str **buf)
@ AST_HANDLER_ONLY_STRING
Use string handler only.
Definition: sorcery.h:137
struct ast_variable * ast_sorcery_objectset_create2(const struct ast_sorcery *sorcery, const void *object, enum ast_sorcery_field_handler_flags flags)
Create an object set (KVP list) for an object.
Definition: sorcery.c:1511
#define ast_to_camel_case(s)
Attempts to convert the given string to camel case using an underscore as the specified delimiter.
Definition: strings.h:527
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next

References ast_free, AST_HANDLER_ONLY_STRING, ast_sip_get_sorcery(), ast_sorcery_objectset_create2(), ast_str_append(), ast_to_camel_case, ast_variables_destroy(), buf, ast_variable::name, ast_variable::next, RAII_VAR, sip_sorcery_object_ami_set_type_name(), and ast_variable::value.

Referenced by ami_outbound_registration_task(), ami_registrations_aor(), format_ami_resource_lists(), sip_auth_to_ami(), sip_contact_to_ami(), sip_endpoint_to_ami(), sip_identify_to_ami(), and sip_transport_to_ami().

◆ call_offer_pref_handler()

static int call_offer_pref_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1162 of file pjsip_configuration.c.

1164 {
1165  struct ast_sip_endpoint *endpoint = obj;
1166  struct ast_flags pref = { 0, };
1167  int outgoing = strcmp(var->name, "outgoing_call_offer_pref") == 0;
1168 
1169  int res = ast_sip_call_codec_str_to_pref(&pref, var->value, outgoing);
1170  if (res != 0) {
1171  return -1;
1172  }
1173 
1174  if (outgoing) {
1175  endpoint->media.outgoing_call_offer_pref = pref;
1176  } else {
1177  endpoint->media.incoming_call_offer_pref = pref;
1178  }
1179 
1180  return 0;
1181 }
#define var
Definition: ast_expr2f.c:614
int ast_sip_call_codec_str_to_pref(struct ast_flags *pref, const char *pref_str, int is_outgoing)
Convert a call codec preference string to preference flags.
Definition: res_pjsip.c:2380
Structure used to handle boolean flags.
Definition: utils.h:199
struct ast_flags incoming_call_offer_pref
Definition: res_pjsip.h:838
struct ast_flags outgoing_call_offer_pref
Definition: res_pjsip.h:840

References ast_sip_call_codec_str_to_pref(), ast_sip_endpoint_media_configuration::incoming_call_offer_pref, ast_sip_endpoint::media, ast_sip_endpoint_media_configuration::outgoing_call_offer_pref, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_handler()

static int caller_id_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 592 of file pjsip_configuration.c.

593 {
594  struct ast_sip_endpoint *endpoint = obj;
595  char cid_name[80] = { '\0' };
596  char cid_num[80] = { '\0' };
597 
598  ast_free(endpoint->id.self.name.str);
599  endpoint->id.self.name.str = NULL;
600  endpoint->id.self.name.valid = 0;
601  ast_free(endpoint->id.self.number.str);
602  endpoint->id.self.number.str = NULL;
603  endpoint->id.self.number.valid = 0;
604 
605  ast_callerid_split(var->value, cid_name, sizeof(cid_name), cid_num, sizeof(cid_num));
606  if (!ast_strlen_zero(cid_name)) {
607  endpoint->id.self.name.str = ast_strdup(cid_name);
608  if (!endpoint->id.self.name.str) {
609  return -1;
610  }
611  endpoint->id.self.name.valid = 1;
612  }
613  if (!ast_strlen_zero(cid_num)) {
614  endpoint->id.self.number.str = ast_strdup(cid_num);
615  if (!endpoint->id.self.number.str) {
616  return -1;
617  }
618  endpoint->id.self.number.valid = 1;
619  }
620  return 0;
621 }
int ast_callerid_split(const char *src, char *name, int namelen, char *num, int numlen)
Definition: callerid.c:1092
static char cid_num[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:167
static char cid_name[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:168
struct ast_party_name name
Subscriber name.
Definition: channel.h:340
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:342
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:279
char * str
Subscriber name (Malloced)
Definition: channel.h:264
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:297
char * str
Subscriber phone number (Malloced)
Definition: channel.h:291

References ast_callerid_split(), ast_free, ast_strdup, ast_strlen_zero(), cid_name, cid_num, ast_sip_endpoint::id, ast_party_id::name, NULL, ast_party_id::number, ast_sip_endpoint_id_configuration::self, ast_party_name::str, ast_party_number::str, ast_party_name::valid, ast_party_number::valid, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_privacy_handler()

static int caller_id_privacy_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 646 of file pjsip_configuration.c.

647 {
648  struct ast_sip_endpoint *endpoint = obj;
649  int callingpres = ast_parse_caller_presentation(var->value);
650  if (callingpres == -1 && sscanf(var->value, "%d", &callingpres) != 1) {
651  return -1;
652  }
653  endpoint->id.self.number.presentation = callingpres;
654  endpoint->id.self.name.presentation = callingpres;
655  return 0;
656 }
int ast_parse_caller_presentation(const char *data)
Convert caller ID text code to value (used in config file parsing)
Definition: callerid.c:1143
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:277
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:295

References ast_parse_caller_presentation(), ast_sip_endpoint::id, ast_party_id::name, ast_party_id::number, ast_party_name::presentation, ast_party_number::presentation, ast_sip_endpoint_id_configuration::self, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_privacy_to_str()

static int caller_id_privacy_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 658 of file pjsip_configuration.c.

659 {
660  const struct ast_sip_endpoint *endpoint = obj;
661  const char *presentation = ast_named_caller_presentation(
662  endpoint->id.self.name.presentation);
663 
664  *buf = ast_strdup(presentation);
665  return 0;
666 }
const char * ast_named_caller_presentation(int data)
Convert caller ID pres value to text code.
Definition: callerid.c:1182

References ast_named_caller_presentation(), ast_strdup, buf, ast_sip_endpoint::id, ast_party_id::name, ast_party_name::presentation, and ast_sip_endpoint_id_configuration::self.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_tag_handler()

static int caller_id_tag_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 668 of file pjsip_configuration.c.

669 {
670  struct ast_sip_endpoint *endpoint = obj;
671 
672  ast_free(endpoint->id.self.tag);
673  endpoint->id.self.tag = ast_strdup(var->value);
674 
675  return endpoint->id.self.tag ? 0 : -1;
676 }

References ast_free, ast_strdup, ast_sip_endpoint::id, ast_sip_endpoint_id_configuration::self, ast_party_id::tag, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_tag_to_str()

static int caller_id_tag_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 678 of file pjsip_configuration.c.

679 {
680  const struct ast_sip_endpoint *endpoint = obj;
681  *buf = ast_strdup(endpoint->id.self.tag);
682  return 0;
683 }

References ast_strdup, buf, ast_sip_endpoint::id, ast_sip_endpoint_id_configuration::self, and ast_party_id::tag.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_to_str()

static int caller_id_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 623 of file pjsip_configuration.c.

624 {
625  const struct ast_sip_endpoint *endpoint = obj;
626  const char *name = S_COR(endpoint->id.self.name.valid,
627  endpoint->id.self.name.str, NULL);
628  const char *number = S_COR(endpoint->id.self.number.valid,
629  endpoint->id.self.number.str, NULL);
630 
631  /* make sure size is at least 10 - that should cover the "<unknown>"
632  case as well as any additional formatting characters added in
633  the name and/or number case. */
634  int size = 10;
635  size += name ? strlen(name) : 0;
636  size += number ? strlen(number) : 0;
637 
638  if (!(*buf = ast_calloc(size + 1, sizeof(char)))) {
639  return -1;
640  }
641 
642  ast_callerid_merge(*buf, size + 1, name, number, NULL);
643  return 0;
644 }
char * ast_callerid_merge(char *buf, int bufsiz, const char *name, const char *num, const char *unknown)
Definition: callerid.c:1073
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:87
Number structure.
Definition: app_followme.c:154

References ast_callerid_merge(), ast_calloc, buf, ast_sip_endpoint::id, name, ast_party_id::name, NULL, ast_party_id::number, S_COR, ast_sip_endpoint_id_configuration::self, ast_party_name::str, ast_party_number::str, ast_party_name::valid, and ast_party_number::valid.

Referenced by ast_res_pjsip_initialize_configuration().

◆ callgroup_to_str()

static int callgroup_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 774 of file pjsip_configuration.c.

775 {
776  const struct ast_sip_endpoint *endpoint = obj;
777 
778  if (!(*buf = ast_calloc(MAX_OBJECT_FIELD, sizeof(char)))) {
779  return -1;
780  }
781 
783  return 0;
784 }
char * ast_print_group(char *buf, int buflen, ast_group_t group)
Print call and pickup groups into buffer.
Definition: channel.c:8114
struct ast_sip_endpoint_pickup_configuration pickup
Definition: res_pjsip.h:897

References ast_calloc, ast_print_group(), buf, ast_sip_endpoint_pickup_configuration::callgroup, MAX_OBJECT_FIELD, and ast_sip_endpoint::pickup.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_get_container()

static struct ao2_container* cli_endpoint_get_container ( const char *  regex)
static

Definition at line 1834 of file pjsip_configuration.c.

1835 {
1837  struct ao2_container *s_container;
1838 
1840  if (!container) {
1841  return NULL;
1842  }
1843 
1846  if (!s_container) {
1847  return NULL;
1848  }
1849 
1850  if (ao2_container_dup(s_container, container, 0)) {
1851  ao2_ref(s_container, -1);
1852  return NULL;
1853  }
1854 
1855  return s_container;
1856 }
int ao2_container_dup(struct ao2_container *dest, struct ao2_container *src, enum search_flags flags)
Copy all object references in the src container into the dest container.
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
Definition: astobj2.h:1327
static int regex(struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
struct ao2_container * container
Definition: res_fax.c:501
struct ao2_container * ast_sorcery_retrieve_by_regex(const struct ast_sorcery *sorcery, const char *type, const char *regex)
Retrieve multiple objects using a regular expression on their id.
Definition: sorcery.c:1949
int ast_sorcery_object_id_compare(void *obj, void *arg, int flags)
ao2 object comparator based on sorcery id.
Definition: sorcery.c:2459
int ast_sorcery_object_id_sort(const void *obj, const void *arg, int flags)
ao2 object sorter based on sorcery id.
Definition: sorcery.c:2435

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_cleanup, ao2_container_alloc_list, ao2_container_dup(), ao2_ref, ast_sorcery_object_id_compare(), ast_sorcery_object_id_sort(), ast_sorcery_retrieve_by_regex(), container, NULL, RAII_VAR, regex(), and sip_sorcery.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_iterate()

static int cli_endpoint_iterate ( void *  obj,
ao2_callback_fn  callback,
void *  args 
)
static

Definition at line 1858 of file pjsip_configuration.c.

1859 {
1860  ao2_callback(obj, OBJ_NODATA, callback, args);
1861 
1862  return 0;
1863 }
const char * args

References ao2_callback, args, and OBJ_NODATA.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_print_body()

static int cli_endpoint_print_body ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1912 of file pjsip_configuration.c.

1913 {
1914  struct ast_sip_endpoint *endpoint = obj;
1915  RAII_VAR(struct ast_endpoint_snapshot *, endpoint_snapshot, ast_sip_get_endpoint_snapshot(endpoint), ao2_cleanup);
1916  struct ast_sip_cli_context *context = arg;
1917  const char *id = ast_sorcery_object_get_id(endpoint);
1918  char *print_name = NULL;
1919  int print_name_len;
1920  char *number = S_COR(endpoint->id.self.number.valid,
1921  endpoint->id.self.number.str, NULL);
1922  int indent;
1923  int flexwidth;
1924 
1925  ast_assert(context->output_buffer != NULL);
1926 
1927  if (number) {
1928  print_name_len = strlen(id) + strlen(number) + 2;
1929  print_name = ast_alloca(print_name_len);
1930  snprintf(print_name, print_name_len, "%s/%s", id, number);
1931  }
1932 
1933  indent = CLI_INDENT_TO_SPACES(context->indent_level);
1934  flexwidth = CLI_LAST_TABSTOP - indent - 2;
1935 
1936  ast_str_append(&context->output_buffer, 0, "%*s: %-*.*s %-12.12s %d of %.0f\n",
1937  indent, "Endpoint",
1938  flexwidth, flexwidth, print_name ? print_name : id,
1939  ast_sip_get_device_state(endpoint),
1940  endpoint_snapshot->num_channels,
1941  (double) endpoint->devicestate_busy_at ? endpoint->devicestate_busy_at :
1942  INFINITY
1943  );
1944 
1945  if (context->recurse) {
1946  context->indent_level++;
1947 
1948  context->auth_direction = "Out";
1950  context->auth_direction = "In";
1952 
1953  cli_endpoint_print_child_body("aor", endpoint->aors, context);
1954  cli_endpoint_print_child_body("transport", endpoint, context);
1955  cli_endpoint_print_child_body("identify", endpoint, context);
1956  cli_endpoint_print_child_body("channel", endpoint, context);
1957 
1958  context->indent_level--;
1959 
1960  if (context->indent_level == 0) {
1961  ast_str_append(&context->output_buffer, 0, "\n");
1962  }
1963  }
1964 
1965  if (context->show_details || (context->show_details_only_level_0 && context->indent_level == 0)) {
1966  ast_str_append(&context->output_buffer, 0, "\n");
1968  }
1969 
1970  return 0;
1971 }
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
#define INFINITY
static void cli_endpoint_print_child_body(char *type, const void *obj, struct ast_sip_cli_context *context)
const char * ast_sip_get_device_state(const struct ast_sip_endpoint *endpoint)
Retrieve the device state for an endpoint.
int ast_sip_cli_print_sorcery_objectset(void *obj, void *arg, int flags)
Prints a sorcery object's ast_variable list.
Definition: pjsip_cli.c:36
#define CLI_LAST_TABSTOP
Definition: res_pjsip_cli.h:27
#define CLI_INDENT_TO_SPACES(x)
Definition: res_pjsip_cli.h:29
CLI Formatter Context passed to all formatters.
Definition: res_pjsip_cli.h:34
struct ast_sip_auth_vector outbound_auths
Definition: res_pjsip.h:901
const ast_string_field aors
Definition: res_pjsip.h:883
struct ast_sip_auth_vector inbound_auths
Definition: res_pjsip.h:899
unsigned int devicestate_busy_at
Definition: res_pjsip.h:913

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_print_child_body()

static void cli_endpoint_print_child_body ( char *  type,
const void *  obj,
struct ast_sip_cli_context context 
)
static

Definition at line 1902 of file pjsip_configuration.c.

1903 {
1904  RAII_VAR(struct ast_sip_cli_formatter_entry *, formatter_entry, NULL, ao2_cleanup);
1905 
1906  formatter_entry = ast_sip_lookup_cli_formatter(type);
1907  if (formatter_entry) {
1908  formatter_entry->iterate((void *)obj, formatter_entry->print_body, context);
1909  }
1910 }
static const char type[]
Definition: chan_ooh323.c:109
struct ast_sip_cli_formatter_entry * ast_sip_lookup_cli_formatter(const char *name)
Looks up a CLI formatter by type.
Definition: pjsip_cli.c:305

References ao2_cleanup, ast_sip_lookup_cli_formatter(), context, NULL, RAII_VAR, and type.

◆ cli_endpoint_print_child_header()

static void cli_endpoint_print_child_header ( char *  type,
struct ast_sip_cli_context context 
)
static

Definition at line 1870 of file pjsip_configuration.c.

1871 {
1872  RAII_VAR(struct ast_sip_cli_formatter_entry *, formatter_entry, NULL, ao2_cleanup);
1873 
1874  formatter_entry = ast_sip_lookup_cli_formatter(type);
1875  if (formatter_entry) {
1876  formatter_entry->print_header(NULL, context, 0);
1877  }
1878 }

References ao2_cleanup, ast_sip_lookup_cli_formatter(), context, NULL, RAII_VAR, and type.

Referenced by cli_endpoint_print_header().

◆ cli_endpoint_print_header()

static int cli_endpoint_print_header ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1880 of file pjsip_configuration.c.

1881 {
1882  struct ast_sip_cli_context *context = arg;
1883 
1884  ast_assert(context->output_buffer != NULL);
1885 
1886  ast_str_append(&context->output_buffer, 0,
1887  " Endpoint: <Endpoint/CID.....................................> <State.....> <Channels.>\n");
1888 
1889  if (context->recurse) {
1890  context->indent_level++;
1896  context->indent_level--;
1897  }
1898 
1899  return 0;
1900 }
static void cli_endpoint_print_child_header(char *type, struct ast_sip_cli_context *context)

References ast_assert, ast_str_append(), cli_endpoint_print_child_header(), context, and NULL.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_retrieve_by_id()

static void* cli_endpoint_retrieve_by_id ( const char *  id)
static

Definition at line 1865 of file pjsip_configuration.c.

1866 {
1867  return ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id);
1868 }

References ast_sip_get_sorcery(), and ast_sorcery_retrieve_by_id().

Referenced by ast_res_pjsip_initialize_configuration().

◆ codec_prefs_handler()

static int codec_prefs_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1207 of file pjsip_configuration.c.

1209 {
1210  struct ast_sip_endpoint *endpoint = obj;
1211  struct ast_stream_codec_negotiation_prefs *option_prefs;
1213  struct ast_str *error_message = ast_str_create(128);
1216  int res = 0;
1217 
1218  res = ast_stream_codec_prefs_parse(var->value, &prefs, &error_message);
1219  if (res < 0) {
1220  ast_log(LOG_ERROR, "Endpoint '%s': %s for option '%s'\n",
1221  ast_sorcery_object_get_id(endpoint), ast_str_buffer(error_message), var->name);
1222  ast_free(error_message);
1223  return -1;
1224  }
1225  ast_free(error_message);
1226 
1227  if (strcmp(var->name, "codec_prefs_incoming_offer") == 0) {
1228  if (prefs.operation == CODEC_NEGOTIATION_OPERATION_UNION) {
1229  ast_log(LOG_ERROR, "Endpoint '%s': Codec preference '%s' has invalid value '%s' for option: '%s'",
1230  ast_sorcery_object_get_id(endpoint),
1233  var->name);
1234  return -1;
1235  }
1236  option_prefs = &endpoint->media.codec_prefs_incoming_offer;
1237  default_prefer = CODEC_NEGOTIATION_PREFER_PENDING;
1238  default_operation = CODEC_NEGOTIATION_OPERATION_INTERSECT;
1239  } else if (strcmp(var->name, "codec_prefs_outgoing_offer") == 0) {
1240  option_prefs = &endpoint->media.codec_prefs_outgoing_offer;
1241  default_prefer = CODEC_NEGOTIATION_PREFER_PENDING;
1242  default_operation = CODEC_NEGOTIATION_OPERATION_UNION;
1243  } else if (strcmp(var->name, "codec_prefs_incoming_answer") == 0) {
1244  option_prefs = &endpoint->media.codec_prefs_incoming_answer;
1245  default_prefer = CODEC_NEGOTIATION_PREFER_PENDING;
1246  default_operation = CODEC_NEGOTIATION_OPERATION_INTERSECT;
1247  } else if (strcmp(var->name, "codec_prefs_outgoing_answer") == 0) {
1248  option_prefs = &endpoint->media.codec_prefs_outgoing_answer;
1249  default_prefer = CODEC_NEGOTIATION_PREFER_PENDING;
1250  default_operation = CODEC_NEGOTIATION_OPERATION_INTERSECT;
1251  } else {
1252  ast_log(LOG_ERROR, "Endpoint '%s': Unsupported option '%s'\n",
1253  ast_sorcery_object_get_id(endpoint),
1254  var->name);
1255  return -1;
1256  }
1257 
1258  if (prefs.prefer == CODEC_NEGOTIATION_PREFER_UNSPECIFIED) {
1259  prefs.prefer = default_prefer;
1260  }
1261 
1262  if (prefs.operation == CODEC_NEGOTIATION_OPERATION_UNSPECIFIED) {
1263  prefs.operation = default_operation;
1264  }
1265 
1266  if (prefs.keep == CODEC_NEGOTIATION_KEEP_UNSPECIFIED) {
1267  prefs.keep = CODEC_NEGOTIATION_KEEP_ALL;
1268  }
1269 
1270  if (prefs.transcode == CODEC_NEGOTIATION_TRANSCODE_UNSPECIFIED) {
1271  prefs.transcode = CODEC_NEGOTIATION_TRANSCODE_ALLOW;
1272  }
1273 
1274  /* Now that defaults have been applied as needed we apply the full codec
1275  * preference configuration to the option.
1276  */
1277  *option_prefs = prefs;
1278 
1279  return 0;
1280 }
ast_stream_codec_negotiation_prefs_operation_values
The "operation" values.
Definition: stream.h:159
@ CODEC_NEGOTIATION_OPERATION_UNSPECIFIED
Definition: stream.h:160
@ CODEC_NEGOTIATION_OPERATION_UNION
Definition: stream.h:164
@ CODEC_NEGOTIATION_OPERATION_INTERSECT
Definition: stream.h:162
@ CODEC_NEGOTIATION_KEEP_UNSPECIFIED
Definition: stream.h:178
@ CODEC_NEGOTIATION_KEEP_ALL
Definition: stream.h:180
int ast_stream_codec_prefs_parse(const char *pref_string, struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **error_message)
Parses a string representing the codec prefs into a ast_stream_codec_negotiation_pref structure.
Definition: stream.c:181
#define ast_stream_codec_operation_to_str(value)
Safely get the name of an "operation" parameter value.
Definition: stream.h:264
@ CODEC_NEGOTIATION_TRANSCODE_UNSPECIFIED
Definition: stream.h:192
@ CODEC_NEGOTIATION_TRANSCODE_ALLOW
Definition: stream.h:194
@ CODEC_NEGOTIATION_PARAM_OPERATION
Definition: stream.h:132
ast_stream_codec_negotiation_prefs_prefer_values
The "prefer" values.
Definition: stream.h:145
@ CODEC_NEGOTIATION_PREFER_UNSPECIFIED
Definition: stream.h:146
@ CODEC_NEGOTIATION_PREFER_PENDING
Definition: stream.h:148
#define ast_stream_codec_param_to_str(value)
Safely get the name of a preference parameter.
Definition: stream.h:244
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:739
struct ast_stream_codec_negotiation_prefs codec_prefs_incoming_offer
Definition: res_pjsip.h:842
struct ast_stream_codec_negotiation_prefs codec_prefs_incoming_answer
Definition: res_pjsip.h:846
struct ast_stream_codec_negotiation_prefs codec_prefs_outgoing_offer
Definition: res_pjsip.h:844
struct ast_stream_codec_negotiation_prefs codec_prefs_outgoing_answer
Definition: res_pjsip.h:848

References ast_free, ast_log, ast_sorcery_object_get_id(), ast_str_buffer(), ast_str_create, ast_stream_codec_operation_to_str, ast_stream_codec_param_to_str, ast_stream_codec_prefs_parse(), CODEC_NEGOTIATION_KEEP_ALL, CODEC_NEGOTIATION_KEEP_UNSPECIFIED, CODEC_NEGOTIATION_OPERATION_INTERSECT, CODEC_NEGOTIATION_OPERATION_UNION, CODEC_NEGOTIATION_OPERATION_UNSPECIFIED, CODEC_NEGOTIATION_PARAM_OPERATION, CODEC_NEGOTIATION_PREFER_PENDING, CODEC_NEGOTIATION_PREFER_UNSPECIFIED, CODEC_NEGOTIATION_TRANSCODE_ALLOW, CODEC_NEGOTIATION_TRANSCODE_UNSPECIFIED, ast_sip_endpoint_media_configuration::codec_prefs_incoming_answer, ast_sip_endpoint_media_configuration::codec_prefs_incoming_offer, ast_sip_endpoint_media_configuration::codec_prefs_outgoing_answer, ast_sip_endpoint_media_configuration::codec_prefs_outgoing_offer, ast_stream_codec_negotiation_prefs::keep, LOG_ERROR, ast_sip_endpoint::media, ast_stream_codec_negotiation_prefs::operation, ast_stream_codec_negotiation_prefs::prefer, ast_stream_codec_negotiation_prefs::transcode, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ codec_prefs_to_str()

static int codec_prefs_to_str ( const struct ast_stream_codec_negotiation_prefs prefs,
const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1282 of file pjsip_configuration.c.

1284 {
1286 
1287  if (!codecs) {
1288  return -1;
1289  }
1290 
1292  ast_free(codecs);
1293 
1294  return 0;
1295 }
static struct ao2_container * codecs
Registered codecs.
Definition: codec.c:48
#define AST_STREAM_MAX_CODEC_PREFS_LENGTH
Define for allocating buffer space for to_str() functions.
Definition: stream.h:307
const char * ast_stream_codec_prefs_to_str(const struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **buf)
Return a string representing the codec preferences.
Definition: stream.c:132

References ast_free, ast_str_create, ast_strdup, ast_stream_codec_prefs_to_str(), AST_STREAM_MAX_CODEC_PREFS_LENGTH, buf, and codecs.

Referenced by incoming_answer_codec_prefs_to_str(), incoming_offer_codec_prefs_to_str(), outgoing_answer_codec_prefs_to_str(), and outgoing_offer_codec_prefs_to_str().

◆ connected_line_method_handler()

static int connected_line_method_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 534 of file pjsip_configuration.c.

535 {
536  struct ast_sip_endpoint *endpoint = obj;
537 
538  if (!strcasecmp(var->value, "invite") || !strcasecmp(var->value, "reinvite")) {
540  } else if (!strcasecmp(var->value, "update")) {
542  } else {
543  ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n",
544  var->value, var->name, ast_sorcery_object_get_id(endpoint));
545  return -1;
546  }
547  return 0;
548 }
@ AST_SIP_SESSION_REFRESH_METHOD_UPDATE
Definition: res_pjsip.h:509
@ AST_SIP_SESSION_REFRESH_METHOD_INVITE
Definition: res_pjsip.h:507
enum ast_sip_session_refresh_method refresh_method
Definition: res_pjsip.h:681

References ast_log, AST_SIP_SESSION_REFRESH_METHOD_INVITE, AST_SIP_SESSION_REFRESH_METHOD_UPDATE, ast_sorcery_object_get_id(), ast_sip_endpoint::id, LOG_NOTICE, ast_sip_endpoint_id_configuration::refresh_method, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ connected_line_method_to_str()

static int connected_line_method_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 550 of file pjsip_configuration.c.

551 {
552  const struct ast_sip_endpoint *endpoint = obj;
554  return 0;
555 }
static const char * id_configuration_refresh_methods[]

References ast_strdup, buf, ast_sip_endpoint::id, id_configuration_refresh_methods, and ast_sip_endpoint_id_configuration::refresh_method.

Referenced by ast_res_pjsip_initialize_configuration().

◆ contact_acl_to_str()

static int contact_acl_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 125 of file pjsip_configuration.c.

126 {
127  const struct ast_sip_endpoint *endpoint = obj;
128  struct ast_acl_list *acl_list;
129  struct ast_acl *first_acl;
130 
131  if (endpoint && !ast_acl_list_is_empty(acl_list=endpoint->contact_acl)) {
132  AST_LIST_LOCK(acl_list);
133  first_acl = AST_LIST_FIRST(acl_list);
134  if (ast_strlen_zero(first_acl->name)) {
135  *buf = "deny/permit";
136  } else {
137  *buf = first_acl->name;
138  }
139  AST_LIST_UNLOCK(acl_list);
140  }
141 
142  *buf = ast_strdup(*buf);
143  return 0;
144 }
struct ast_acl_list * contact_acl
Definition: res_pjsip.h:929

References ast_acl_list_is_empty(), AST_LIST_FIRST, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_strdup, ast_strlen_zero(), buf, ast_sip_endpoint::contact_acl, and ast_acl::name.

Referenced by ast_res_pjsip_initialize_configuration().

◆ contact_user_handler()

static int contact_user_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1139 of file pjsip_configuration.c.

1141 {
1142  struct ast_sip_endpoint *endpoint = obj;
1143 
1144  ast_free(endpoint->contact_user);
1145  endpoint->contact_user = ast_strdup(var->value);
1146 
1147  return endpoint->contact_user ? 0 : -1;
1148 }
char * contact_user
Definition: res_pjsip.h:933

References ast_free, ast_strdup, ast_sip_endpoint::contact_user, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ contact_user_to_str()

static int contact_user_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1150 of file pjsip_configuration.c.

1151 {
1152  const struct ast_sip_endpoint *endpoint = obj;
1153 
1154  *buf = ast_strdup(endpoint->contact_user);
1155  if (!(*buf)) {
1156  return -1;
1157  }
1158 
1159  return 0;
1160 }

References ast_strdup, buf, and ast_sip_endpoint::contact_user.

Referenced by ast_res_pjsip_initialize_configuration().

◆ direct_media_glare_mitigation_handler()

static int direct_media_glare_mitigation_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 557 of file pjsip_configuration.c.

558 {
559  struct ast_sip_endpoint *endpoint = obj;
560 
561  if (!strcasecmp(var->value, "none")) {
563  } else if (!strcasecmp(var->value, "outgoing")) {
565  } else if (!strcasecmp(var->value, "incoming")) {
567  } else {
568  ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n",
569  var->value, var->name, ast_sorcery_object_get_id(endpoint));
570  return -1;
571  }
572 
573  return 0;
574 }
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE
Definition: res_pjsip.h:514
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING
Definition: res_pjsip.h:522
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING
Definition: res_pjsip.h:518
enum ast_sip_direct_media_glare_mitigation glare_mitigation
Definition: res_pjsip.h:773
struct ast_sip_direct_media_configuration direct_media
Definition: res_pjsip.h:808

References ast_log, AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING, AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE, AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING, ast_sorcery_object_get_id(), ast_sip_endpoint_media_configuration::direct_media, ast_sip_direct_media_configuration::glare_mitigation, LOG_NOTICE, ast_sip_endpoint::media, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ direct_media_glare_mitigation_to_str()

static int direct_media_glare_mitigation_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 582 of file pjsip_configuration.c.

583 {
584  const struct ast_sip_endpoint *endpoint = obj;
587  }
588 
589  return 0;
590 }
static const char * direct_media_glare_mitigation_map[]
#define ARRAY_IN_BOUNDS(v, a)
Checks to see if value is within the bounds of the given array.
Definition: utils.h:682

References ARRAY_IN_BOUNDS, ast_strdup, buf, ast_sip_endpoint_media_configuration::direct_media, direct_media_glare_mitigation_map, ast_sip_direct_media_configuration::glare_mitigation, and ast_sip_endpoint::media.

Referenced by ast_res_pjsip_initialize_configuration().

◆ direct_media_method_handler()

static int direct_media_method_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 504 of file pjsip_configuration.c.

505 {
506  struct ast_sip_endpoint *endpoint = obj;
507 
508  if (!strcasecmp(var->value, "invite") || !strcasecmp(var->value, "reinvite")) {
510  } else if (!strcasecmp(var->value, "update")) {
512  } else {
513  ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n",
514  var->value, var->name, ast_sorcery_object_get_id(endpoint));
515  return -1;
516  }
517  return 0;
518 }
enum ast_sip_session_refresh_method method
Definition: res_pjsip.h:771

References ast_log, AST_SIP_SESSION_REFRESH_METHOD_INVITE, AST_SIP_SESSION_REFRESH_METHOD_UPDATE, ast_sorcery_object_get_id(), ast_sip_endpoint_media_configuration::direct_media, LOG_NOTICE, ast_sip_endpoint::media, ast_sip_direct_media_configuration::method, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ direct_media_method_to_str()

static int direct_media_method_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtls_handler()

static int dtls_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 846 of file pjsip_configuration.c.

848 {
849  struct ast_sip_endpoint *endpoint = obj;
850  char *name = ast_strdupa(var->name);
851  char *front = NULL;
852  char *back = NULL;
853  char *buf = name;
854 
855  /* strip out underscores in the name */
856  front = strtok_r(buf, "_", &back);
857  while (front) {
858  int size = strlen(front);
859  ast_copy_string(buf, front, size + 1);
860  buf += size;
861  front = strtok_r(NULL, "_", &back);
862  }
863 
864  return ast_rtp_dtls_cfg_parse(&endpoint->media.rtp.dtls_cfg, name, var->value);
865 }
int ast_rtp_dtls_cfg_parse(struct ast_rtp_dtls_cfg *dtls_cfg, const char *name, const char *value)
Parse DTLS related configuration options.
Definition: rtp_engine.c:3012
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:406
struct ast_sip_media_rtp_configuration rtp
Definition: res_pjsip.h:806
struct ast_rtp_dtls_cfg dtls_cfg
DTLS-SRTP configuration information.
Definition: res_pjsip.h:745

References ast_copy_string(), ast_rtp_dtls_cfg_parse(), ast_strdupa, buf, ast_sip_media_rtp_configuration::dtls_cfg, ast_sip_endpoint::media, name, NULL, ast_sip_endpoint_media_configuration::rtp, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtlsautogeneratecert_to_str()

static int dtlsautogeneratecert_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 882 of file pjsip_configuration.c.

883 {
884  const struct ast_sip_endpoint *endpoint = obj;
886  return 0;
887 }
#define AST_YESNO(x)
return Yes or No depending on the argument.
Definition: strings.h:143
unsigned int ephemeral_cert
Definition: rtp_engine.h:566

References ast_strdup, AST_YESNO, buf, ast_sip_media_rtp_configuration::dtls_cfg, ast_rtp_dtls_cfg::ephemeral_cert, ast_sip_endpoint::media, and ast_sip_endpoint_media_configuration::rtp.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtlscafile_to_str()

static int dtlscafile_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlscapath_to_str()

static int dtlscapath_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlscertfile_to_str()

static int dtlscertfile_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlscipher_to_str()

static int dtlscipher_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlsfingerprint_to_str()

static int dtlsfingerprint_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlsprivatekey_to_str()

static int dtlsprivatekey_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlsrekey_to_str()

static int dtlsrekey_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 874 of file pjsip_configuration.c.

875 {
876  const struct ast_sip_endpoint *endpoint = obj;
877 
878  return ast_asprintf(
879  buf, "%u", endpoint->media.rtp.dtls_cfg.rekey) >=0 ? 0 : -1;
880 }
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
unsigned int rekey
Definition: rtp_engine.h:556

References ast_asprintf, buf, ast_sip_media_rtp_configuration::dtls_cfg, ast_sip_endpoint::media, ast_rtp_dtls_cfg::rekey, and ast_sip_endpoint_media_configuration::rtp.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtlssetup_to_str()

static int dtlssetup_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlsverify_to_str()

static int dtlsverify_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 867 of file pjsip_configuration.c.

868 {
869  const struct ast_sip_endpoint *endpoint = obj;
871  return 0;
872 }
enum ast_rtp_dtls_verify verify
Definition: rtp_engine.h:560

References ast_strdup, AST_YESNO, buf, ast_sip_media_rtp_configuration::dtls_cfg, ast_sip_endpoint::media, ast_sip_endpoint_media_configuration::rtp, and ast_rtp_dtls_cfg::verify.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtmf_handler()

static int dtmf_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 146 of file pjsip_configuration.c.

147 {
148  struct ast_sip_endpoint *endpoint = obj;
149  int dtmf = ast_sip_str_to_dtmf(var->value);
150 
151  if (dtmf == -1) {
152  return -1;
153  }
154 
155  endpoint->dtmf = dtmf;
156  return 0;
157 }
int ast_sip_str_to_dtmf(const char *dtmf_mode)
Convert the DTMF mode name into an enum.
Definition: res_pjsip.c:2336
enum ast_sip_dtmf_mode dtmf
Definition: res_pjsip.h:903

References ast_sip_str_to_dtmf(), ast_sip_endpoint::dtmf, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtmf_to_str()

static int dtmf_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 159 of file pjsip_configuration.c.

160 {
161  const struct ast_sip_endpoint *endpoint = obj;
162  char dtmf_str[20];
163  int result = -1;
164 
165  result = ast_sip_dtmf_to_str(endpoint->dtmf, dtmf_str, sizeof(dtmf_str));
166 
167  if (result == 0) {
168  *buf = ast_strdup(dtmf_str);
169  } else {
170  *buf = ast_strdup("none");
171  }
172  return 0;
173 }
static PGresult * result
Definition: cel_pgsql.c:84
int ast_sip_dtmf_to_str(const enum ast_sip_dtmf_mode dtmf, char *buf, size_t buf_len)
Convert the DTMF mode enum value into a string.
Definition: res_pjsip.c:2307

References ast_sip_dtmf_to_str(), ast_strdup, buf, ast_sip_endpoint::dtmf, and result.

Referenced by ast_res_pjsip_initialize_configuration().

◆ endpoint_acl_handler()

static int endpoint_acl_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 87 of file pjsip_configuration.c.

88 {
89  struct ast_sip_endpoint *endpoint = obj;
90  int error = 0;
91  int ignore;
92 
93  if (ast_strlen_zero(var->value)) return 0;
94 
95  if (!strncmp(var->name, "contact_", 8)) {
96  ast_append_acl(var->name + 8, var->value, &endpoint->contact_acl, &error, &ignore);
97  } else {
98  ast_append_acl(var->name, var->value, &endpoint->acl, &error, &ignore);
99  }
100 
101  return error;
102 }
void ast_append_acl(const char *sense, const char *stuff, struct ast_acl_list **path, int *error, int *named_acl_flag)
Add a rule to an ACL struct.
Definition: acl.c:430
def ignore(key=None, val=None, section=None, pjsip=None, nmapped=None, type='endpoint')
Definition: sip_to_pjsip.py:48
int error(const char *format,...)
Definition: utils/frame.c:999

References ast_sip_endpoint::acl, ast_append_acl(), ast_strlen_zero(), ast_sip_endpoint::contact_acl, error(), sip_to_pjsip::ignore(), and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ endpoint_deleted_observer()

static void endpoint_deleted_observer ( const void *  object)
static

◆ endpoint_destructor()

static void endpoint_destructor ( void *  obj)
static

Definition at line 2307 of file pjsip_configuration.c.

2308 {
2309  struct ast_sip_endpoint *endpoint = obj;
2310 
2311  ast_string_field_free_memory(endpoint);
2312 
2313  ao2_cleanup(endpoint->media.codecs);
2316  info_configuration_destroy(&endpoint->info);
2317  media_configuration_destroy(&endpoint->media);
2320  ast_party_id_free(&endpoint->id.self);
2323  ao2_cleanup(endpoint->persistent);
2325  AST_VECTOR_FREE(&endpoint->ident_method_order);
2326  ast_free(endpoint->contact_user);
2327  ast_free_acl_list(endpoint->contact_acl);
2328  ast_free_acl_list(endpoint->acl);
2329 }
struct ast_acl_list * ast_free_acl_list(struct ast_acl_list *acl)
Free a list of ACLs.
Definition: acl.c:233
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1805
struct ast_namedgroups * ast_unref_namedgroups(struct ast_namedgroups *groups)
Definition: channel.c:7815
static void media_configuration_destroy(struct ast_sip_endpoint_media_configuration *media)
static void info_configuration_destroy(struct ast_sip_endpoint_info_configuration *info)
static void subscription_configuration_destroy(struct ast_sip_endpoint_subscription_configuration *subscription)
void ast_stream_topology_free(struct ast_stream_topology *topology)
Unreference and destroy a stream topology.
Definition: stream.c:743
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374
struct ast_stream_topology * topology
Definition: res_pjsip.h:814
struct ast_namedgroups * named_pickupgroups
Definition: res_pjsip.h:697
struct ast_namedgroups * named_callgroups
Definition: res_pjsip.h:695
struct ast_variable * channel_vars
Definition: res_pjsip.h:921

References ast_sip_endpoint::acl, ao2_cleanup, ast_free, ast_free_acl_list(), ast_party_id_free(), ast_sip_auth_vector_destroy(), ast_stream_topology_free(), ast_string_field_free_memory, ast_unref_namedgroups(), ast_variables_destroy(), AST_VECTOR_FREE, ast_sip_endpoint::channel_vars, ast_sip_endpoint_media_configuration::codecs, ast_sip_endpoint::contact_acl, ast_sip_endpoint::contact_user, ast_sip_endpoint::id, ast_sip_endpoint::ident_method_order, ast_sip_endpoint::inbound_auths, ast_sip_endpoint::info, info_configuration_destroy(), ast_sip_endpoint::media, media_configuration_destroy(), ast_sip_endpoint_pickup_configuration::named_callgroups, ast_sip_endpoint_pickup_configuration::named_pickupgroups, ast_sip_endpoint::outbound_auths, ast_sip_endpoint::persistent, ast_sip_endpoint::pickup, ast_sip_endpoint_id_configuration::self, ast_sip_endpoint::subscription, subscription_configuration_destroy(), and ast_sip_endpoint_media_configuration::topology.

Referenced by ast_sip_endpoint_alloc().

◆ format_ami_endpoint()

static int format_ami_endpoint ( const struct ast_sip_endpoint endpoint,
struct ast_sip_ami ami 
)
static

Definition at line 1696 of file pjsip_configuration.c.

1698 {
1699  RAII_VAR(struct ast_str *, buf,
1700  ast_sip_create_ami_event("EndpointDetail", ami), ast_free);
1701 
1702  if (!buf) {
1703  return -1;
1704  }
1705 
1706  sip_endpoint_to_ami(endpoint, &buf);
1707  astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
1708  return 0;
1709 }
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:3087
struct ast_str * ast_sip_create_ami_event(const char *event, struct ast_sip_ami *ami)
Creates a string to store AMI event data in.
static int sip_endpoint_to_ami(const struct ast_sip_endpoint *endpoint, struct ast_str **buf)

References ast_free, ast_sip_create_ami_event(), ast_str_buffer(), astman_append(), buf, RAII_VAR, ast_sip_ami::s, and sip_endpoint_to_ami().

Referenced by ami_show_endpoint().

◆ format_ami_endpoints()

static int format_ami_endpoints ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1767 of file pjsip_configuration.c.

1768 {
1769 
1770  struct ast_sip_endpoint *endpoint = obj;
1771  struct ast_sip_ami *ami = arg;
1772  RAII_VAR(struct ast_str *, buf,
1773  ast_sip_create_ami_event("EndpointList", ami), ast_free);
1774 
1775  if (!buf) {
1776  return CMP_STOP;
1777  }
1778 
1780  ast_str_append(&buf, 0, "Transport: %s\r\n",
1781  endpoint->transport);
1782  ast_str_append(&buf, 0, "Aor: %s\r\n",
1783  endpoint->aors);
1784 
1785  ast_str_append(&buf, 0, "Auths: ");
1787  ast_str_append(&buf, 0, "\r\n");
1788 
1789  ast_str_append(&buf, 0, "OutboundAuths: ");
1791  ast_str_append(&buf, 0, "\r\n");
1792 
1793  ast_sip_for_each_aor(endpoint->aors,
1795 
1796  ast_str_append(&buf, 0, "DeviceState: %s\r\n",
1797  ast_sip_get_device_state(endpoint));
1798 
1799  ast_str_append(&buf, 0, "ActiveChannels: ");
1800  active_channels_to_str(endpoint, &buf);
1801  ast_str_append(&buf, 0, "\r\n");
1802 
1803  astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
1804  return 0;
1805 }
@ CMP_STOP
Definition: astobj2.h:1028
static int format_str_append_auth(const struct ast_sip_auth_vector *auths, struct ast_str **buf)
static int sip_endpoints_aors_ami(void *obj, void *arg, int flags)
static void active_channels_to_str(const struct ast_sip_endpoint *endpoint, struct ast_str **str)
int ast_sip_for_each_aor(const char *aors, ao2_callback_fn on_aor, void *arg)
For every aor in the comma separated aors string call the given 'on_aor' handler.
Definition: location.c:687
void * arg
Definition: res_pjsip.h:2827
const ast_string_field transport
Definition: res_pjsip.h:883

References active_channels_to_str(), ast_sip_endpoint::aors, ast_sip_ami::arg, ast_free, ast_sip_create_ami_event(), ast_sip_for_each_aor(), ast_sip_get_device_state(), ast_str_append(), ast_str_buffer(), astman_append(), buf, CMP_STOP, format_str_append_auth(), ast_sip_endpoint::inbound_auths, ast_sip_endpoint::outbound_auths, RAII_VAR, ast_sip_ami::s, sip_endpoints_aors_ami(), sip_sorcery_object_ami_set_type_name(), and ast_sip_endpoint::transport.

Referenced by ami_show_endpoints().

◆ format_str_append_auth()

static int format_str_append_auth ( const struct ast_sip_auth_vector auths,
struct ast_str **  buf 
)
static

Definition at line 1755 of file pjsip_configuration.c.

1757 {
1758  char *str = NULL;
1759  if (ast_sip_auths_to_str(auths, &str)) {
1760  return -1;
1761  }
1762  ast_str_append(buf, 0, "%s", str ? str : "");
1763  ast_free(str);
1764  return 0;
1765 }
int ast_sip_auths_to_str(const struct ast_sip_auth_vector *auths, char **buf)
Converts an auths array to a string of comma separated values.

References ast_free, ast_sip_auths_to_str(), ast_str_append(), buf, NULL, and str.

Referenced by format_ami_endpoints().

◆ from_user_handler()

static int from_user_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1033 of file pjsip_configuration.c.

1035 {
1036  struct ast_sip_endpoint *endpoint = obj;
1037  /* Valid non-alphanumeric characters for URI */
1038  char *valid_uri_marks = "-._~%!$&'()*+,;=:";
1039  const char *val;
1040 
1041  for (val = var->value; *val; val++) {
1042  if (!isalpha(*val) && !isdigit(*val) && !strchr(valid_uri_marks, *val)) {
1043  ast_log(LOG_ERROR, "Error configuring endpoint '%s' - '%s' field "
1044  "contains invalid character '%c'\n",
1045  ast_sorcery_object_get_id(endpoint), var->name, *val);
1046  return -1;
1047  }
1048  }
1049 
1050  ast_string_field_set(endpoint, fromuser, var->value);
1051 
1052  return 0;
1053 }
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521

References ast_log, ast_sorcery_object_get_id(), ast_string_field_set, ast_sip_endpoint::fromuser, LOG_ERROR, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ from_user_to_str()

static int from_user_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1055 of file pjsip_configuration.c.

1056 {
1057  const struct ast_sip_endpoint *endpoint = obj;
1058 
1059  *buf = ast_strdup(endpoint->fromuser);
1060 
1061  return 0;
1062 }

References ast_strdup, buf, and ast_sip_endpoint::fromuser.

Referenced by ast_res_pjsip_initialize_configuration().

◆ group_handler()

static int group_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 758 of file pjsip_configuration.c.

760 {
761  struct ast_sip_endpoint *endpoint = obj;
762 
763  if (!strncmp(var->name, "call_group", 10)) {
764  endpoint->pickup.callgroup = ast_get_group(var->value);
765  } else if (!strncmp(var->name, "pickup_group", 12)) {
766  endpoint->pickup.pickupgroup = ast_get_group(var->value);
767  } else {
768  return -1;
769  }
770 
771  return 0;
772 }
ast_group_t ast_get_group(const char *s)
Definition: channel.c:7701

References ast_get_group(), ast_sip_endpoint_pickup_configuration::callgroup, ast_sip_endpoint::pickup, ast_sip_endpoint_pickup_configuration::pickupgroup, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ident_handler()

static int ident_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 400 of file pjsip_configuration.c.

401 {
402  struct ast_sip_endpoint *endpoint = obj;
403  char *idents = ast_strdupa(var->value);
404  char *val;
405  int method;
406 
407  /*
408  * If there's already something in the vector when we get here,
409  * it's the default value so we need to clean it out.
410  */
411  if (AST_VECTOR_SIZE(&endpoint->ident_method_order)) {
413  endpoint->ident_method = 0;
414  }
415 
416  while ((val = ast_strip(strsep(&idents, ",")))) {
417  if (ast_strlen_zero(val)) {
418  continue;
419  }
420 
422  if (method == -1) {
423  ast_log(LOG_ERROR, "Unrecognized identification method %s specified for endpoint %s\n",
424  val, ast_sorcery_object_get_id(endpoint));
426  endpoint->ident_method = 0;
427  return -1;
428  }
429  if (endpoint->ident_method & method) {
430  /* We are already identifying by this method. No need to do it again. */
431  continue;
432  }
433 
434  endpoint->ident_method |= method;
436  }
437 
438  return 0;
439 }
static int sip_endpoint_identifier_str2type(const char *str)
const char * method
Definition: res_pjsip.c:1130
enum ast_sip_endpoint_identifier_type ident_method
Definition: res_pjsip.h:905
#define AST_VECTOR_RESET(vec, cleanup)
Reset vector.
Definition: vector.h:625
#define AST_VECTOR_ELEM_CLEANUP_NOOP(elem)
Vector element cleanup that does nothing.
Definition: vector.h:571

References ast_log, ast_sorcery_object_get_id(), ast_strdupa, ast_strip(), ast_strlen_zero(), AST_VECTOR_APPEND, AST_VECTOR_ELEM_CLEANUP_NOOP, AST_VECTOR_RESET, AST_VECTOR_SIZE, ast_sip_endpoint::ident_method, ast_sip_endpoint::ident_method_order, LOG_ERROR, method, sip_endpoint_identifier_str2type(), strsep(), and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ident_to_str()

static int ident_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 441 of file pjsip_configuration.c.

442 {
443  const struct ast_sip_endpoint *endpoint = obj;
444  int methods;
445  int idx;
446  int buf_used = 0;
447  int buf_size = MAX_OBJECT_FIELD;
448 
450  if (!methods) {
451  return 0;
452  }
453 
454  *buf = ast_malloc(buf_size);
455  if (!*buf) {
456  return -1;
457  }
458 
459  for (idx = 0; idx < methods; ++idx) {
461  const char *method_str;
462 
463  method = AST_VECTOR_GET(&endpoint->ident_method_order, idx);
465 
466  /* Should never have an "<unknown>" method string */
467  ast_assert(strcmp(method_str, "<unknown>"));
468  if (!strcmp(method_str, "<unknown>")) {
469  continue;
470  }
471 
472  buf_used += snprintf(*buf + buf_used, buf_size - buf_used, "%s%s",
473  method_str, idx < methods - 1 ? "," : "");
474  if (buf_size <= buf_used) {
475  /* Need more room than available, truncating. */
476  *(*buf + (buf_size - 1)) = '\0';
477  ast_log(LOG_WARNING, "Truncated identify_by string: %s\n", *buf);
478  break;
479  }
480  }
481 
482  return 0;
483 }
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
static const char * sip_endpoint_identifier_type2str(enum ast_sip_endpoint_identifier_type method)
static struct @485 methods[]
ast_sip_endpoint_identifier_type
Different methods by which incoming requests can be matched to endpoints.
Definition: res_pjsip.h:493

References ast_assert, ast_log, ast_malloc, AST_VECTOR_GET, AST_VECTOR_SIZE, buf, ast_sip_endpoint::ident_method_order, LOG_WARNING, MAX_OBJECT_FIELD, method, methods, and sip_endpoint_identifier_type2str().

Referenced by ast_res_pjsip_initialize_configuration().

◆ inbound_auth_handler()

static int inbound_auth_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 303 of file pjsip_configuration.c.

304 {
305  struct ast_sip_endpoint *endpoint = obj;
306 
307  return ast_sip_auth_vector_init(&endpoint->inbound_auths, var->value);
308 }
int ast_sip_auth_vector_init(struct ast_sip_auth_vector *auths, const char *value)
Initialize an auth vector with the configured values.

References ast_sip_auth_vector_init(), ast_sip_endpoint::inbound_auths, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ inbound_auths_to_str()

static int inbound_auths_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 332 of file pjsip_configuration.c.

333 {
334  const struct ast_sip_endpoint *endpoint = obj;
335  return ast_sip_auths_to_str(&endpoint->inbound_auths, buf);
336 }

References ast_sip_auths_to_str(), buf, and ast_sip_endpoint::inbound_auths.

Referenced by ast_res_pjsip_initialize_configuration().

◆ incoming_answer_codec_prefs_to_str()

static int incoming_answer_codec_prefs_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1309 of file pjsip_configuration.c.

1310 {
1311  const struct ast_sip_endpoint *endpoint = obj;
1312  return codec_prefs_to_str(&endpoint->media.codec_prefs_incoming_answer, obj, args, buf);
1313 }
static int codec_prefs_to_str(const struct ast_stream_codec_negotiation_prefs *prefs, const void *obj, const intptr_t *args, char **buf)

References args, buf, ast_sip_endpoint_media_configuration::codec_prefs_incoming_answer, codec_prefs_to_str(), and ast_sip_endpoint::media.

Referenced by ast_res_pjsip_initialize_configuration().

◆ incoming_call_offer_pref_to_str()

static int incoming_call_offer_pref_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1183 of file pjsip_configuration.c.

1184 {
1185  const struct ast_sip_endpoint *endpoint = obj;
1186 
1188  if (!(*buf)) {
1189  return -1;
1190  }
1191 
1192  return 0;
1193 }
const char * ast_sip_call_codec_pref_to_str(struct ast_flags pref)
Convert the call codec preference flags to a string.
Definition: res_pjsip.c:2357

References ast_sip_call_codec_pref_to_str(), ast_strdup, buf, ast_sip_endpoint_media_configuration::incoming_call_offer_pref, and ast_sip_endpoint::media.

Referenced by ast_res_pjsip_initialize_configuration().

◆ incoming_offer_codec_prefs_to_str()

static int incoming_offer_codec_prefs_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ info_configuration_destroy()

static void info_configuration_destroy ( struct ast_sip_endpoint_info_configuration info)
static

Definition at line 2295 of file pjsip_configuration.c.

2296 {
2297  ast_string_field_free_memory(&info->recording);
2298 }

References ast_string_field_free_memory, and sip_to_pjsip::info().

Referenced by endpoint_destructor().

◆ init_info_configuration()

static int init_info_configuration ( struct ast_sip_endpoint_info_configuration info)
static

Definition at line 2336 of file pjsip_configuration.c.

2337 {
2338  return ast_string_field_init(&info->recording, 32);
2339 }

References ast_string_field_init, and sip_to_pjsip::info().

Referenced by ast_sip_endpoint_alloc().

◆ init_media_configuration()

static int init_media_configuration ( struct ast_sip_endpoint_media_configuration media)
static

Definition at line 2341 of file pjsip_configuration.c.

2342 {
2343  return ast_string_field_init(media, 64) || ast_string_field_init(&media->rtp, 32);
2344 }

References ast_string_field_init, ast_sip_endpoint::media, and ast_sip_endpoint_media_configuration::rtp.

Referenced by ast_sip_endpoint_alloc().

◆ init_subscription_configuration()

static int init_subscription_configuration ( struct ast_sip_endpoint_subscription_configuration subscription)
static

Definition at line 2331 of file pjsip_configuration.c.

2332 {
2333  return ast_string_field_init(&subscription->mwi, 64);
2334 }
struct ast_sip_mwi_configuration mwi
Definition: res_pjsip.h:642

References ast_string_field_init, ast_sip_endpoint_subscription_configuration::mwi, and ast_sip_endpoint::subscription.

Referenced by ast_sip_endpoint_alloc().

◆ load_all_endpoints()

static void load_all_endpoints ( void  )
static

◆ media_configuration_destroy()

static void media_configuration_destroy ( struct ast_sip_endpoint_media_configuration media)
static

Definition at line 2300 of file pjsip_configuration.c.

2301 {
2305 }
void ast_rtp_dtls_cfg_free(struct ast_rtp_dtls_cfg *dtls_cfg)
Free contents of a DTLS configuration structure.
Definition: rtp_engine.c:3123

References ast_rtp_dtls_cfg_free(), ast_string_field_free_memory, ast_sip_media_rtp_configuration::dtls_cfg, and ast_sip_endpoint_media_configuration::rtp.

Referenced by endpoint_destructor().

◆ media_encryption_handler()

static int media_encryption_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 685 of file pjsip_configuration.c.

686 {
687  struct ast_sip_endpoint *endpoint = obj;
688 
689  if (!strcasecmp("no", var->value)) {
691  } else if (!strcasecmp("sdes", var->value)) {
693  } else if (!strcasecmp("dtls", var->value)) {
695  return ast_rtp_dtls_cfg_parse(&endpoint->media.rtp.dtls_cfg, "dtlsenable", "yes");
696  } else {
697  return -1;
698  }
699 
700  return 0;
701 }
@ AST_SIP_MEDIA_ENCRYPT_SDES
Definition: res_pjsip.h:531
@ AST_SIP_MEDIA_ENCRYPT_NONE
Definition: res_pjsip.h:529
@ AST_SIP_MEDIA_ENCRYPT_DTLS
Definition: res_pjsip.h:533
enum ast_sip_session_media_encryption encryption
Definition: res_pjsip.h:749

References ast_rtp_dtls_cfg_parse(), AST_SIP_MEDIA_ENCRYPT_DTLS, AST_SIP_MEDIA_ENCRYPT_NONE, AST_SIP_MEDIA_ENCRYPT_SDES, ast_sip_media_rtp_configuration::dtls_cfg, ast_sip_media_rtp_configuration::encryption, ast_sip_endpoint::media, ast_sip_endpoint_media_configuration::rtp, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ media_encryption_to_str()

static int media_encryption_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 710 of file pjsip_configuration.c.

711 {
712  const struct ast_sip_endpoint *endpoint = obj;
715  endpoint->media.rtp.encryption]);
716  }
717  return 0;
718 }
static const char * media_encryption_map[]

References ARRAY_IN_BOUNDS, ast_strdup, buf, ast_sip_media_rtp_configuration::encryption, ast_sip_endpoint::media, media_encryption_map, and ast_sip_endpoint_media_configuration::rtp.

Referenced by ast_res_pjsip_initialize_configuration().

◆ named_callgroups_to_str()

static int named_callgroups_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 826 of file pjsip_configuration.c.

827 {
828  const struct ast_sip_endpoint *endpoint = obj;
830 
833  return 0;
834 }
char * ast_print_namedgroups(struct ast_str **buf, struct ast_namedgroups *groups)
Print named call groups and named pickup groups.
Definition: channel.c:8139

References ast_free, ast_print_namedgroups(), ast_str_buffer(), ast_str_create, ast_strdup, buf, MAX_OBJECT_FIELD, ast_sip_endpoint_pickup_configuration::named_callgroups, ast_sip_endpoint::pickup, RAII_VAR, and str.

Referenced by ast_res_pjsip_initialize_configuration().

◆ named_groups_handler()

static int named_groups_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 798 of file pjsip_configuration.c.

800 {
801  struct ast_sip_endpoint *endpoint = obj;
802 
803  if (!strncmp(var->name, "named_call_group", 16)) {
804  if (ast_strlen_zero(var->value)) {
805  endpoint->pickup.named_callgroups =
807  } else if (!(endpoint->pickup.named_callgroups =
808  ast_get_namedgroups(var->value))) {
809  return -1;
810  }
811  } else if (!strncmp(var->name, "named_pickup_group", 18)) {
812  if (ast_strlen_zero(var->value)) {
813  endpoint->pickup.named_pickupgroups =
815  } else if (!(endpoint->pickup.named_pickupgroups =
816  ast_get_namedgroups(var->value))) {
817  return -1;
818  }
819  } else {
820  return -1;
821  }
822 
823  return 0;
824 }
struct ast_namedgroups * ast_get_namedgroups(const char *s)