86 size_t prefix_len = strlen(aor_id) +
sizeof(
";@") - 1;
87 char prefix[prefix_len + 1];
94 sprintf(prefix,
"%s;@", aor_id);
125 char *aor_separator =
NULL;
137 if ((aor_separator = strstr(
id,
";@")) || (aor_separator = strstr(
id,
"@@"))) {
138 *aor_separator =
'\0';
224 char prefix[prefix_len + 1];
424 user_agent, via_addr, via_port, call_id, 0, endpoint);
426 return contact ? 0 : -1;
438 via_addr, via_port, call_id,
461 ast_verb(3,
"Removed contact '%s' from AOR '%s' due to system boot\n",
462 contact->
uri, contact->
aor);
499 const char *right_key = obj_right;
531 int theres_a_port = 0;
539 if (!strncasecmp(contact,
"sip:", 4)) {
541 }
else if (!strncasecmp(contact,
"sips:", 5)) {
548 at = strchr(contact,
'@');
554 if (host[0] ==
'[') {
558 close_bracket = strchr(host,
']');
559 if (!close_bracket) {
563 if (*close_bracket ==
':') {
566 *close_bracket =
'\0';
569 host =
strsep(&host,
";?");
571 if (strchr(host,
':')) {
573 host =
strsep(&host,
":");
577 if (!theres_a_port) {
578 max_length -= strlen(
"_sips.tcp.");
581 if (strlen(host) > max_length) {
605 char contact_id[strlen(aor_id) +
sizeof(hash) + 2];
612 ast_log(
LOG_ERROR,
"Contact uri or hostname length exceeds pjproject limit or is not a sip(s) uri: %s\n", contact_uri);
625 snprintf(contact_id,
sizeof(contact_id),
"%s@@%s", aor_id, hash);
700 res = on_aor(aor, arg, 0);
745 if (!wrapper->contact_id) {
749 sprintf(wrapper->contact_id,
"%s/%s", aor_id,
contact->uri);
751 if (!wrapper->aor_id) {
758 if ((res = on_contact(wrapper, arg, 0))) {
793 for (i = objset; i; i = i->
next) {
796 if (strcmp(camel,
"Contact") == 0) {
825 return *buf ? 0 : -1;
855 total_contacts - num_permanent);
870 ami->
arg = (
void *)endpoint;
926 const char *right_key = arg;
934 cmp = strcmp(left_wrapper->
contact_id, right_key);
937 cmp = strncmp(left_wrapper->
contact_id, right_key, strlen(right_key));
951 const char *right_key = arg;
959 if (strcmp(left_wrapper->
contact_id, right_key) == 0) {;
964 if (strncmp(left_wrapper->
contact_id, right_key, strlen(right_key)) == 0) {
984 regex_t *regexbuf = arg;
1008 wrapper->contact_id =
ast_malloc(strlen(contact->
aor) + strlen(contact->
uri) + 2);
1009 if (!wrapper->contact_id) {
1012 sprintf(wrapper->contact_id,
"%s/%s", contact->
aor, contact->
uri);
1015 if (!wrapper->aor_id) {
1019 wrapper->contact =
ao2_bump(contact);
1044 if (!contacts_container) {
1050 ao2_ref(contacts_container, -1);
1058 ao2_ref(contacts_container, -1);
1065 if (regcomp(®exbuf, regex, REG_EXTENDED | REG_NOSUB)) {
1066 ao2_ref(contacts_container, -1);
1073 return contacts_container;
1100 "%*s: <Aor/ContactUri%*.*s> <Hash....> <Status> <RTT(ms)..>\n",
1114 const char *hash_start = contact_id + strlen(contact->
aor) + 2;
1129 flexwidth, flexwidth,
1165 "%*s: <Aor%*.*s> <MaxContact>\n",
1173 if (formatter_entry) {
1200 flexwidth, flexwidth,
1209 if (formatter_entry) {
1293 .
usage =
"Usage: pjsip list aors [ like <pattern> ]\n" 1294 " List the configured PJSIP Aors\n" 1295 " Optional regular expression pattern is used to filter the list.\n"),
1298 .
usage =
"Usage: pjsip show aors [ like <pattern> ]\n" 1299 " Show the configured PJSIP Aors\n" 1300 " Optional regular expression pattern is used to filter the list.\n"),
1303 .
usage =
"Usage: pjsip show aor <id>\n" 1304 " Show the configured PJSIP Aor\n"),
1307 .
command =
"pjsip list contacts",
1308 .
usage =
"Usage: pjsip list contacts [ like <pattern> ]\n" 1309 " List the configured PJSIP contacts\n" 1310 " Optional regular expression pattern is used to filter the list.\n"),
1312 .
command =
"pjsip show contacts",
1313 .
usage =
"Usage: pjsip show contacts [ like <pattern> ]\n" 1314 " Show the configured PJSIP contacts\n" 1315 " Optional regular expression pattern is used to filter the list.\n"),
1317 .
command =
"pjsip show contact",
1318 .
usage =
"Usage: pjsip show contact\n" 1319 " Show the configured PJSIP contact\n"),
1339 return status ? 0 : -1;
1422 if (!contact_formatter) {
1426 contact_formatter->
name =
"contact";
1435 if (!aor_formatter) {
1439 aor_formatter->
name =
"aor";
1460 for (i = 0; i <=
REMOVED; i++) {
static int contact_remove_unreachable(void *obj, void *arg, int flags)
Internal callback function which removes any contact which is unreachable.
struct ast_str * output_buffer
static int sip_aor_to_ami(const struct ast_sip_aor *aor, struct ast_str **buf)
struct ast_variable * next
static int expiration_str2struct(const struct aco_option *opt, struct ast_variable *var, void *obj)
Custom handler for translating from a string timeval to actual structure.
struct ao2_container *(* get_container)(const char *regex)
#define AST_CLI_DEFINE(fn, txt,...)
int ast_sip_contact_to_str(void *object, void *arg, int flags)
Handler used to convert a contact to a string.
void ast_statsd_log_full_va(const char *metric_name, const char *metric_type, intmax_t value, double sample_rate,...)
Send a stat to the configured statsd server.
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.
void astman_append(struct mansession *s, const char *fmt,...)
Asterisk main include file. File version handling, generic pbx functions.
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
void(* deleted)(const void *object)
Callback for when an object is deleted.
struct ast_sip_contact_status * ast_sip_get_contact_status(const struct ast_sip_contact *contact)
Retrieve the current status for a contact.
struct ast_sip_cli_formatter_entry * aor_formatter
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
static int ami_show_aors(struct mansession *s, const struct message *m)
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
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. ...
The arg parameter is a search key, but is not an object.
static struct ao2_container * cli_get_aors(void)
static int contact_expire(void *obj, void *arg, int flags)
Internal callback function which deletes and unlinks any expired contacts.
unsigned int max_contacts
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
descriptor for a cli entry.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
#define AST_TASKPROCESSOR_HIGH_WATER_LEVEL
#define ao2_callback(c, flags, cb_fn, arg)
struct ao2_container * ast_sip_location_retrieve_contacts_from_aor_list(const char *aor_list)
Retrieve all contacts from a list of AORs.
static void * aor_alloc(const char *name)
Allocator for AOR.
static struct stasis_rest_handlers mailboxes
REST handler for /api-docs/mailboxes.json.
static int prune_boot_contacts_cb(void *obj, void *arg, int flags)
static int cli_contact_iterate(void *container, ao2_callback_fn callback, void *args)
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
static int cli_filter_contacts(void *obj, void *arg, int flags)
Structure for variables, used for configurations and for channel variables.
static int cli_aor_print_body(void *obj, void *arg, int flags)
struct ast_sip_contact * ast_sip_location_create_contact(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, int prune_on_boot, struct ast_sip_endpoint *endpoint)
Create a new contact for an AOR without locking the AOR.
struct ast_sip_aor * ast_sip_location_retrieve_aor(const char *aor_name)
Retrieve a named AOR.
Perform no matching, return all objects.
int ast_sorcery_object_id_compare(void *obj, void *arg, int flags)
ao2 object comparator based on sorcery id.
static int format_ami_aorlist_handler(void *obj, void *arg, int flags)
void * ast_sorcery_lockable_alloc(size_t size, ao2_destructor_fn destructor, void *lockobj)
Allocate a generic sorcery capable object with locking.
Full structure for sorcery.
int(* iterate)(void *container, ao2_callback_fn callback, void *args)
Type for a default handler that should do nothing.
static int contact_link_static(void *obj, void *arg, int flags)
Internal callback function which links static contacts into another container.
static void * contact_alloc(const char *name)
Allocator for contact.
const char * ast_sip_get_contact_short_status_label(const enum ast_sip_contact_status_type status)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
#define ast_cli_register_multiple(e, len)
Register multiple commands.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
static int copy(char *infile, char *outfile)
Utility function to copy a file.
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Return all matching objects.
#define ao2_alloc_options(data_size, destructor_fn, options)
int ast_pjproject_get_buildopt(char *option, char *format_string,...)
Retrieve a pjproject build option.
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.
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
#define ast_strdup(str)
A wrapper for strdup()
static void contact_destroy(void *obj)
Destructor for contact.
struct ao2_container * ast_sorcery_retrieve_by_prefix(const struct ast_sorcery *sorcery, const char *type, const char *prefix, const size_t prefix_len)
Retrieve multiple objects whose id begins with the specified prefix.
void ast_sip_unregister_endpoint_formatter(struct ast_sip_endpoint_formatter *obj)
Unregister an endpoint formatter.
static int contacts_to_var_list(const void *obj, struct ast_variable **fields)
const ast_string_field outbound_proxy
struct ao2_container * ast_sip_location_retrieve_aor_contacts_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve all contacts currently available for an AOR and filter based on flags.
struct ast_sip_endpoint_formatter endpoint_aor_formatter
int ast_sip_location_add_contact_nolock(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, struct ast_sip_endpoint *endpoint)
Add a new contact to an AOR without locking the AOR.
int ast_get_timeval(const char *src, struct timeval *tv, struct timeval _default, int *consumed)
get values from config variables.
#define ast_to_camel_case(s)
static void aor_deleted_observer(const void *object)
#define ast_verb(level,...)
static void * cli_aor_retrieve_by_id(const char *id)
char * ast_sip_cli_traverse_objects(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int gather_contacts_for_aor(void *obj, void *arg, int flags)
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.
char * voicemail_extension
void ast_sip_location_retrieve_contact_and_aor_from_list(const char *aor_list, struct ast_sip_aor **aor, struct ast_sip_contact **contact)
Retrieve the first bound contact AND the AOR chosen from a list of AORs.
struct ast_sip_contact * ast_sip_location_retrieve_first_aor_contact_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve the first bound contact for an AOR and filter based on flags.
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
int ast_sorcery_object_set_congestion_levels(struct ast_sorcery *sorcery, const char *type, long low_water, long high_water)
Set the high and low alert water marks of the sorcery object type.
const char * ast_sorcery_object_get_type(const void *object)
Get the type of a sorcery object.
char * ast_str_truncate(struct ast_str *buf, ssize_t len)
Truncates the enclosed string to the given length.
const char * astman_get_header(const struct message *m, char *var)
Get header from mananger transaction.
#define ast_strlen_zero(foo)
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
int ast_sip_register_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Registers a CLI formatter.
static int cli_aor_iterate(void *container, ao2_callback_fn callback, void *args)
const char * ast_config_AST_SYSTEM_NAME
struct ao2_container * ast_sip_location_retrieve_aor_contacts_nolock(const struct ast_sip_aor *aor)
Retrieve all contacts currently available for an AOR without locking the AOR.
static int cli_contact_print_body(void *obj, void *arg, int flags)
Type for default option handler for bools (ast_true/ast_false)
unsigned int qualify_frequency
void ast_sip_register_endpoint_formatter(struct ast_sip_endpoint_formatter *obj)
Register an endpoint formatter.
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
#define EVENT_FLAG_SYSTEM
int() ao2_callback_fn(void *obj, void *arg, int flags)
Type of a generic callback function.
struct ao2_container * ast_sip_location_retrieve_aor_contacts(const struct ast_sip_aor *aor)
Retrieve all contacts currently available for an AOR.
int ast_sorcery_create(const struct ast_sorcery *sorcery, void *object)
Create and potentially persist an object using an available wizard.
#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.
The arg parameter is a partial search key similar to OBJ_SEARCH_KEY.
#define FLDSET(type,...)
Convert a struct and list of fields to an argument list of field offsets.
static int format_ami_endpoint_aor(const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
static int contact_to_var_list(void *object, void *arg, int flags)
Asterisk file paths, configured in asterisk.conf.
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Type for default option handler for unsigned integers.
static int permanent_uri_sort_fn(const void *obj_left, const void *obj_right, int flags)
static void aor_destroy(void *obj)
Destructor for AOR.
static int aor_apply_outbound_proxy(void *obj, void *arg, int flags)
int ast_sip_for_each_contact(const struct ast_sip_aor *aor, ao2_callback_fn on_contact, void *arg)
For every contact on an AOR call the given 'on_contact' handler.
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
#define CLI_INDENT_TO_SPACES(x)
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
static const struct ast_sorcery_observer aor_observer
Observer for contacts so state can be updated on respective endpoints.
#define ao2_ref(o, delta)
In case you didn't read that giant block of text above the mansession_session struct, the struct mansession is named this solely to keep the API the same in Asterisk. This structure really represents data that is different from Manager action to Manager action. The mansession_session pointer contained within points to session-specific data.
#define ast_strdupa(s)
duplicate a string in memory from the stack
int ast_sorcery_object_id_sort(const void *obj, const void *arg, int flags)
ao2 object sorter based on sorcery id.
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
void *(* retrieve_by_id)(const char *id)
#define ast_malloc(len)
A wrapper for malloc()
struct ao2_container * container
static int cli_contact_print_header(void *obj, void *arg, int flags)
int ast_sip_validate_uri_length(const char *contact_uri)
static int default_expiration
#define ast_variable_new(name, value, filename)
int ast_sip_unregister_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Unregisters a CLI formatter.
An entity with which Asterisk communicates.
unsigned int support_path
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
#define MAX_OBJECT_FIELD
Maximum length of an object field name.
struct ao2_container * ast_sip_location_retrieve_aor_contacts_nolock_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve all contacts currently available for an AOR without locking the AOR and filter based on flag...
static struct ao2_container * cli_contact_get_container(const char *regex)
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.
int ast_sip_initialize_sorcery_location(void)
Initialize sorcery with location support.
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
#define CLI_HEADER_FILLER
void ast_sip_location_prune_boot_contacts(void)
Prune the prune_on_boot contacts.
static const char * cli_aor_get_id(const void *obj)
int ast_sorcery_delete(const struct ast_sorcery *sorcery, void *object)
Delete an object.
static int cli_gather_contact(void *obj, void *arg, int flags)
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
static int permanent_uri_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
Custom handler for permanent URIs.
int ast_sip_location_delete_contact(struct ast_sip_contact *contact)
Delete a contact.
static void contact_wrapper_destroy(void *obj)
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.
static int voicemail_extension_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int cli_aor_gather_contacts(void *obj, void *arg, int flags)
Interface for a sorcery object type observer.
Type for default option handler for bools (ast_true/ast_false)
int ast_sip_destroy_sorcery_location(void)
#define ast_sorcery_apply_default(sorcery, type, name, data)
static int format_ami_aor_handler(void *obj, void *arg, int flags)
static int destroy_contact(void *obj, void *arg, int flags)
Internal callback function which destroys the specified contact.
#define ao2_iterator_next(iter)
#define ao2_alloc(data_size, destructor_fn)
void * ast_sorcery_alloc(const struct ast_sorcery *sorcery, const char *type, const char *id)
Allocate an object.
static int contacts_to_str(const void *obj, const intptr_t *args, char **buf)
static int contact_apply_handler(const struct ast_sorcery *sorcery, void *object)
Always create a contact_status for each contact.
static int aor_apply_handler(const struct ast_sorcery *sorcery, void *object)
struct ast_sip_contact * ast_sip_location_retrieve_contact_from_aor_list(const char *aor_list)
Retrieve the first bound contact from a list of AORs.
static int cli_aor_print_header(void *obj, void *arg, int flags)
static int regex(struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
int ast_sip_location_update_contact(struct ast_sip_contact *contact)
Update a contact.
static int expiration_struct2str(const void *obj, const intptr_t *args, char **buf)
Custom handler for translating from an actual structure timeval to string.
Type for default option handler for doubles.
struct ast_sip_contact * ast_sip_location_retrieve_first_aor_contact(const struct ast_sip_aor *aor)
Retrieve the first bound contact for an AOR.
struct ao2_container * permanent_contacts
#define STRFLDSET(type,...)
Convert a struct and a list of stringfield fields to an argument list of field offsets.
static struct ast_cli_entry cli_commands[]
#define ao2_find(container, arg, flags)
An API for managing task processing threads that can be shared across modules.
const char *(* get_id)(const void *obj)
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 cli_contact_compare(void *obj, void *arg, int flags)
Support for logging to various files, console and syslog Configuration in file logger.conf.
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.
static struct ao2_container * cli_aor_get_container(const char *regex)
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
static int cli_contact_populate_container(void *obj, void *arg, int flags)
#define AST_STATSD_GAUGE
Support for publishing to a statsd server.
The arg parameter is an object of the same type.
void ast_sorcery_observer_remove(const struct ast_sorcery *sorcery, const char *type, const struct ast_sorcery_observer *callbacks)
Remove an observer from a specific object type.
char * strsep(char **str, const char *delims)
static struct ast_sorcery * sorcery
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, struct ast_sip_endpoint *endpoint)
Add a new contact to an AOR.
Type for default option handler for stringfields.
ao2_callback_fn * print_header
Reject objects with duplicate keys in container.
struct ast_sip_cli_formatter_entry * ast_sip_lookup_cli_formatter(const char *name)
Looks up a CLI formatter by type.
Return only reachable or unknown contacts.
struct ast_sip_cli_formatter_entry * contact_formatter
Search option field mask.
static char context[AST_MAX_CONTEXT]
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
void ast_sip_location_retrieve_contact_and_aor_from_list_filtered(const char *aor_list, unsigned int flags, struct ast_sip_aor **aor, struct ast_sip_contact **contact)
Retrieve the first bound contact AND the AOR chosen from a list of AORs and filter based on flags...
static int pjsip_max_url_size
struct ast_sip_contact * ast_sip_location_retrieve_contact(const char *contact_name)
Retrieve a named contact.
const ast_string_field aors
static void * cli_contact_retrieve_by_id(const char *id)
#define ast_manager_register_xml(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
ao2_callback_fn * print_body
static const char * cli_contact_get_id(const void *obj)
void ast_md5_hash(char *output, const char *input)
Produces MD5 hash based on input string.
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
int ast_sip_cli_print_sorcery_objectset(void *obj, void *arg, int flags)
Prints a sorcery object's ast_variable list.
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
static int cli_contact_sort(const void *obj, const void *arg, int flags)
#define ast_variable_list_append(head, new_var)
#define ast_named_lock_get(lock_type, keyspace, key)
Geta named lock handle.
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
static int voicemail_extension_to_str(const void *obj, const intptr_t *args, char **buf)
Sorcery Data Access Layer API.
int ast_sorcery_update(const struct ast_sorcery *sorcery, void *object)
Update an object.
static char prefix[MAX_PREFIX]
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
static int pj_max_hostname
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager transaction to begin a list.
unsigned show_details_only_level_0
struct ast_sip_contact_status * ast_res_pjsip_find_or_create_contact_status(const struct ast_sip_contact *contact)
#define ao2_link(container, obj)