92 }
else if (!strcmp(field,
"video")) {
99 if (!media || !media->
rtp) {
105 if (!strcmp(
type,
"src")) {
108 }
else if (!strcmp(
type,
"dest")) {
111 }
else if (!strcmp(
type,
"direct")) {
113 }
else if (!strcmp(
type,
"secure")) {
117 snprintf(
buf, buflen,
"%d",
flag ? 1 : 0);
119 snprintf(
buf, buflen,
"%d", 0);
121 }
else if (!strcmp(
type,
"hold")) {
158 }
else if (!strcmp(field,
"video")) {
165 if (!media || !media->
rtp) {
171 if (!strncasecmp(
type,
"all", 3)) {
174 if (!strcasecmp(
type,
"all_jitter")) {
176 }
else if (!strcasecmp(
type,
"all_rtt")) {
178 }
else if (!strcasecmp(
type,
"all_loss")) {
180 }
else if (!strcasecmp(
type,
"all_mes")) {
193 enum { INT, DBL }
type;
199 {
"txcount", INT, { .i4 = &stats.
txcount, }, },
200 {
"rxcount", INT, { .i4 = &stats.
rxcount, }, },
201 {
"txjitter", DBL, { .d8 = &stats.
txjitter, }, },
202 {
"rxjitter", DBL, { .d8 = &stats.
rxjitter, }, },
211 {
"txploss", INT, { .i4 = &stats.
txploss, }, },
212 {
"rxploss", INT, { .i4 = &stats.
rxploss, }, },
221 {
"rtt", DBL, { .d8 = &stats.
rtt, }, },
222 {
"maxrtt", DBL, { .d8 = &stats.
maxrtt, }, },
223 {
"minrtt", DBL, { .d8 = &stats.
minrtt, }, },
224 {
"normdevrtt", DBL, { .d8 = &stats.
normdevrtt, }, },
225 {
"stdevrtt", DBL, { .d8 = &stats.
stdevrtt, }, },
226 {
"local_ssrc", INT, { .i4 = &stats.
local_ssrc, }, },
227 {
"remote_ssrc", INT, { .i4 = &stats.
remote_ssrc, }, },
228 {
"txmes", DBL, { .d8 = &stats.
txmes, }, },
229 {
"rxmes", DBL, { .d8 = &stats.
rxmes, }, },
234 {
"local_maxmes", DBL, { .d8 = &stats.
local_maxmes, }, },
235 {
"local_minmes", DBL, { .d8 = &stats.
local_minmes, }, },
247 if (!strcasecmp(
type, lookup[i].
name)) {
248 if (lookup[i].
type == INT) {
249 snprintf(
buf, buflen,
"%u", *lookup[i].i4);
251 snprintf(
buf, buflen,
"%f", *lookup[i].d8);
264 pjsip_uri_context_e
context,
const void *uri,
char *
buf,
size_t size)
269 res = pjsip_uri_print(
context, uri,
buf, size);
271 ast_log(
LOG_ERROR,
"Channel %s: Unescaped %s too long for %d byte buffer\n",
304 }
else if (!strcmp(
type,
"call-id")) {
305 snprintf(
buf, buflen,
"%.*s", (
int) pj_strlen(&dlg->call_id->id), pj_strbuf(&dlg->call_id->id));
306 }
else if (!strcmp(
type,
"secure")) {
307#ifdef HAVE_PJSIP_GET_DEST_INFO
308 pjsip_host_info dest;
310 pjsip_get_dest_info(dlg->target,
NULL, pool, &dest);
311 snprintf(
buf, buflen,
"%d", dest.flag & PJSIP_TRANSPORT_SECURE ? 1 : 0);
314 ast_log(
LOG_WARNING,
"Asterisk has been built against a version of pjproject which does not have the required functionality to support the 'secure' argument. Please upgrade to version 2.3 or later.\n");
317 }
else if (!strcmp(
type,
"target_uri")) {
320 }
else if (!strcmp(
type,
"local_uri")) {
323 }
else if (!strcmp(
type,
"local_tag")) {
327 }
else if (!strcmp(
type,
"remote_uri")) {
329 dlg->remote.info->uri,
buf, buflen);
330 }
else if (!strcmp(
type,
"remote_tag")) {
334 }
else if (!strcmp(
type,
"request_uri")) {
339 }
else if (!strcmp(
type,
"t38state")) {
341 }
else if (!strcmp(
type,
"local_addr")) {
350 transport_data = datastore->data;
352 if (pj_sockaddr_has_addr(&transport_data->
local_addr)) {
353 pj_sockaddr_print(&transport_data->
local_addr,
buf, buflen, 3);
355 }
else if (!strcmp(
type,
"remote_addr")) {
364 transport_data = datastore->data;
366 if (pj_sockaddr_has_addr(&transport_data->
remote_addr)) {
401 }
else if (!strcmp(
func_args->param,
"rtcp")) {
409 }
else if (!strcmp(
func_args->param,
"endpoint")) {
417 }
else if (!strcmp(
func_args->param,
"contact")) {
422 }
else if (!strcmp(
func_args->param,
"aor")) {
427 }
else if (!strcmp(
func_args->param,
"pjsip")) {
514 const char *aor_name;
526 ast_log(
LOG_WARNING,
"An endpoint name must be specified when using the '%s' dialplan function\n", cmd);
533 aor_name =
S_OR(
args.aor_name, endpoint->aors);
536 ast_log(
LOG_WARNING,
"No AOR has been provided and no AORs are configured on endpoint '%s'\n",
args.endpoint_name);
600 .
type =
"pjsip_session_refresh",
612 return datastore->data;
621 state = datastore->data;
623 if (!
state->media_state) {
628 if (!
state->media_state->topology) {
633 datastore->data =
state;
652 pjsip_name_addr *
uri;
653 pjsip_sip_uri *sip_uri;
665 pj_strdup2_with_null(pool, &
tmp,
args->uri);
666 uri = (pjsip_name_addr *)pjsip_parse_uri(pool,
tmp.ptr,
tmp.slen, PJSIP_PARSE_URI_AS_NAMEADDR);
667 if (!
uri || (!PJSIP_URI_SCHEME_IS_SIP(
uri) && !PJSIP_URI_SCHEME_IS_SIPS(
uri))) {
674 if (!strcmp(
args->type,
"scheme")) {
678 }
else if (!strcmp(
args->type,
"display")) {
684 sip_uri = pjsip_uri_get_uri(
uri);
692 if (!strcmp(
args->type,
"user")) {
694 }
else if (!strcmp(
args->type,
"passwd")) {
696 }
else if (!strcmp(
args->type,
"host")) {
698 }
else if (!strcmp(
args->type,
"port")) {
699 snprintf(
args->buf,
args->buflen,
"%d", sip_uri->port);
700 }
else if (!strcmp(
args->type,
"user_param")) {
702 }
else if (!strcmp(
args->type,
"method_param")) {
704 }
else if (!strcmp(
args->type,
"transport_param")) {
706 }
else if (!strcmp(
args->type,
"ttl_param")) {
707 snprintf(
args->buf,
args->buflen,
"%d", sip_uri->ttl_param);
708 }
else if (!strcmp(
args->type,
"lr_param")) {
709 snprintf(
args->buf,
args->buflen,
"%d", sip_uri->lr_param);
710 }
else if (!strcmp(
args->type,
"maddr_param")) {
727 int reading_uri_from_var;
736 reading_uri_from_var = !strcasecmp(cmd,
"PJSIP_PARSE_URI_FROM");
738 if (reading_uri_from_var) {
742 ast_log(
LOG_WARNING,
"The name of a variable containing a URI must be specified when using the '%s' dialplan function\n", cmd);
754 if (reading_uri_from_var) {
755 ast_log(
LOG_WARNING,
"The variable provided to the '%s' dialplan function must contain a URI\n", cmd);
757 ast_log(
LOG_WARNING,
"A URI must be specified when using the '%s' dialplan function\n", cmd);
763 ast_log(
LOG_WARNING,
"A type part of the URI must be specified when using the '%s' dialplan function\n", cmd);
790 if (
session->inv_session->dlg->state == PJSIP_DIALOG_STATE_ESTABLISHED) {
798 topology =
state->media_state->topology;
801 if (!
session->pending_media_state->topology) {
803 if (!
session->pending_media_state->topology) {
807 topology =
session->pending_media_state->topology;
853 buf[accum - 1] =
',';
857 buf[accum ? accum - 1 : 0] =
'\0';
882 topology =
state->media_state->topology;
937 if (!strcmp(data,
"audio")) {
939 }
else if (!strcmp(data,
"video")) {
969 if (!strcmp(data,
"audio")) {
971 }
else if (!strcmp(data,
"video")) {
1083 int dsp_features = 0;
1123 if (media && media->
rtp) {
1157 dsp_features &= ~DSP_FEATURE_DIGIT_DETECT;
1245 if (!strcmp(
value,
"invite")) {
1247 }
else if (!strcmp(
value,
"update")) {
1265 pjsip_tx_data *packet =
NULL;
1279 const char *response) {
1287 " Defaulting to 603 DECLINE\n",
1288 channel_name, response);
1289 return PJSIP_SC_DECLINE;
1293 if (response_code < 400 || response_code > 699) {
1295 " Defaulting to 603 DECLINE\n",
1297 return PJSIP_SC_DECLINE;
Access Control of various sorts.
Asterisk main include file. File version handling, generic pbx functions.
static struct ast_mansession session
#define ast_strdupa(s)
duplicate a string in memory from the stack
void ast_free_ptr(void *ptr)
free() wrapper
#define ast_calloc(num, len)
A wrapper for calloc()
#define ao2_iterator_next(iter)
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
PJSIP Channel Driver shared data structures.
General Asterisk PBX channel definitions.
const char * ast_channel_name(const struct ast_channel *chan)
void * ast_channel_tech_pvt(const struct ast_channel *chan)
#define ast_channel_lock(chan)
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
ast_channel_state
ast_channel states
ast_media_type
Types of media.
Conversion utility functions.
int ast_str_to_int(const char *str, int *res)
Convert the given string to a signed integer.
int pjsip_acf_moh_passthrough_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
PJSIP_MOH_PASSTHROUGH function read callback.
int pjsip_acf_media_offer_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
PJSIP_MEDIA_OFFER function read callback.
int pjsip_acf_media_offer_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
PJSIP_MEDIA_OFFER function write callback.
static int read_pjsip(void *data)
static int pjsip_hangup(void *obj)
Serializer task to hangup channel.
static int response_code_validator(const char *channel_name, const char *response)
Callback that validates the response code.
static int refresh_write_cb(void *obj)
int pjsip_acf_dtmf_mode_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
PJSIP_DTMF_MODE function write callback.
int pjsip_acf_session_refresh_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
PJSIP_SEND_SESSION_REFRESH function write callback.
static int media_offer_read_av(struct ast_sip_session *session, char *buf, size_t len, enum ast_media_type media_type)
static int media_offer_write_av(void *obj)
static void pjsip_app_hangup_handler(struct ast_channel *chan, int response_code)
Called by pjsip_app_hangup and pjsip_action_hangup to actually perform the hangup.
static int sip_session_response_cb(struct ast_sip_session *session, pjsip_rx_data *rdata)
static int channel_read_rtp(struct ast_channel *chan, const char *type, const char *field, char *buf, size_t buflen)
static void session_refresh_state_destroy(void *obj)
Destructor for session refresh information.
static struct session_refresh_state * session_refresh_state_get_or_alloc(struct ast_sip_session *session)
Helper function which retrieves or allocates a session refresh state information datastore.
static int print_escaped_uri(struct ast_channel *chan, const char *type, pjsip_uri_context_e context, const void *uri, char *buf, size_t size)
int pjsip_app_hangup(struct ast_channel *chan, const char *data)
PJSIPHangup Dialplan App.
static const char * t38state_to_string[T38_MAX_ENUM]
String representations of the T.38 state enum.
int pjsip_acf_moh_passthrough_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
PJSIP_MOH_PASSTHROUGH function write callback.
static int dtmf_mode_refresh_cb(void *obj)
int pjsip_action_hangup(struct mansession *s, const struct message *m)
PJSIPHangup Manager Action.
int pjsip_acf_channel_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
CHANNEL function read callback.
static int channel_read_pjsip(struct ast_channel *chan, const char *type, const char *field, char *buf, size_t buflen)
int pjsip_acf_dtmf_mode_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
PJSIP_DTMF_MODE function read callback.
int pjsip_acf_dial_contacts_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
PJSIP_DIAL_CONTACTS function read callback.
static const struct ast_datastore_info session_refresh_datastore
Datastore for attaching session refresh state information.
int pjsip_acf_parse_uri_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
PJSIP_PARSE_URI function read callback.
static int channel_read_rtcp(struct ast_channel *chan, const char *type, const char *field, char *buf, size_t buflen)
static int parse_uri_cb(void *data)
PJSIP dialplan functions header file.
Convenient Signal Processing routines.
void ast_dsp_free(struct ast_dsp *dsp)
#define DSP_FEATURE_DIGIT_DETECT
int ast_dsp_get_features(struct ast_dsp *dsp)
Get features.
void ast_dsp_set_features(struct ast_dsp *dsp, int features)
Select feature set.
struct ast_dsp * ast_dsp_new(void)
Allocates a new dsp, assumes 8khz for internal sample rate.
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
int ast_manager_hangup_helper(struct mansession *s, const struct message *m, manager_hangup_handler_t handler, manager_hangup_cause_validator_t cause_validator)
A manager helper function that hangs up a channel using a supplied channel type specific hangup funct...
int ast_sip_push_task_wait_serializer(struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
Push a task to the serializer and wait for it to complete.
Application convenience functions, designed to give consistent look and feel to Asterisk apps.
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
char * strsep(char **str, const char *delims)
#define ast_debug(level,...)
Log a DEBUG message.
Asterisk module definitions.
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Core PBX routines and definitions.
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
static char * func_args(char *function)
return a pointer to the arguments of the function, and terminates the function name with '\0'
struct ast_sip_aor * ast_sip_location_retrieve_aor(const char *aor_name)
Retrieve a named AOR.
pjsip_endpoint * ast_sip_get_pjsip_endpoint(void)
Get a pointer to the PJSIP endpoint.
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.
int ast_sip_str2rc(const char *name)
Convert name to SIP response code.
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
@ AST_SIP_CONTACT_FILTER_REACHABLE
Return only reachable or unknown contacts.
int ast_sip_str_to_dtmf(const char *dtmf_mode)
Convert the DTMF mode name into an enum.
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
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.
ast_sip_session_refresh_method
@ AST_SIP_SESSION_REFRESH_METHOD_UPDATE
@ AST_SIP_SESSION_REFRESH_METHOD_INVITE
int ast_sip_session_regenerate_answer(struct ast_sip_session *session, ast_sip_session_sdp_creation_cb on_sdp_creation)
Regenerate SDP Answer.
struct ast_datastore * ast_sip_session_get_datastore(struct ast_sip_session *session, const char *name)
Retrieve a session datastore.
struct ast_sip_session_media_state * ast_sip_session_media_state_alloc(void)
Allocate a session media state structure.
int ast_sip_session_add_datastore(struct ast_sip_session *session, struct ast_datastore *datastore)
Add a datastore to a SIP session.
void ast_sip_session_remove_datastore(struct ast_sip_session *session, const char *name)
Remove a session datastore from the session.
void ast_sip_session_media_state_free(struct ast_sip_session_media_state *media_state)
Free a session media state structure.
struct ast_datastore * ast_sip_session_alloc_datastore(const struct ast_datastore_info *info, const char *uid)
Alternative for ast_datastore_alloc()
int ast_sip_session_refresh(struct ast_sip_session *session, ast_sip_session_request_creation_cb on_request_creation, ast_sip_session_sdp_creation_cb on_sdp_creation, ast_sip_session_response_cb on_response, enum ast_sip_session_refresh_method method, int generate_new_sdp, struct ast_sip_session_media_state *media_state)
Send a reinvite or UPDATE on a session.
void ast_sip_session_send_response(struct ast_sip_session *session, pjsip_tx_data *tdata)
Send a SIP response.
enum ast_rtp_dtmf_mode ast_rtp_instance_dtmf_mode_get(struct ast_rtp_instance *instance)
Get the DTMF mode of an RTP instance.
@ AST_RTP_DTMF_MODE_RFC2833
@ AST_RTP_DTMF_MODE_INBAND
int ast_rtp_instance_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
Set the DTMF mode that should be used.
ast_rtp_instance_stat_field
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY_MES
@ AST_RTP_INSTANCE_STAT_ALL
#define ast_rtp_instance_get_remote_address(instance, address)
Get the address of the remote endpoint that we are sending RTP to.
char * ast_rtp_instance_get_quality(struct ast_rtp_instance *instance, enum ast_rtp_instance_stat_field field, char *buf, size_t size)
Retrieve quality statistics about an RTP instance.
void ast_rtp_instance_set_prop(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
Set the value of an RTP instance property.
void ast_rtp_instance_get_local_address(struct ast_rtp_instance *instance, struct ast_sockaddr *address)
Get the local address that we are expecting RTP on.
int ast_rtp_instance_get_stats(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
Retrieve statistics about an RTP instance.
#define AST_SRTP_CRYPTO_OFFER_OK
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
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_stream_set_metadata(struct ast_stream *stream, const char *m_key, const char *value)
Set a stream metadata value.
@ AST_STREAM_STATE_REMOVED
Set when the stream has been removed/declined.
struct ast_stream * ast_stream_topology_get_stream(const struct ast_stream_topology *topology, unsigned int position)
Get a specific stream from the topology.
int ast_stream_topology_get_count(const struct ast_stream_topology *topology)
Get the number of streams in a topology.
enum ast_stream_state ast_stream_get_state(const struct ast_stream *stream)
Get the current state of a stream.
enum ast_media_type ast_stream_get_type(const struct ast_stream *stream)
Get the media type of a stream.
void ast_stream_set_formats(struct ast_stream *stream, struct ast_format_cap *caps)
Set the current negotiated formats of a stream.
const struct ast_format_cap * ast_stream_get_formats(const struct ast_stream *stream)
Get the current negotiated formats of a stream.
struct ast_stream_topology * ast_stream_topology_clone(const struct ast_stream_topology *topology)
Create a deep clone of an existing stream topology.
struct ast_stream * ast_stream_topology_get_first_stream_by_type(const struct ast_stream_topology *topology, enum ast_media_type type)
Gets the first active stream of a specific type from the topology.
char * ast_str_truncate(struct ast_str *buf, ssize_t len)
Truncates the enclosed string to the given length.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
static force_inline int attribute_pure ast_strlen_zero(const char *s)
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
size_t ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
#define AST_YESNO(x)
return Yes or No depending on the argument.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Main Channel structure associated with a channel.
Structure for a data store type.
Structure for a data store object.
double remote_stdevrxploss
double local_normdevjitter
double local_normdevrxploss
double remote_normdevrxploss
double local_stdevrxploss
double remote_normdevjitter
double remote_stdevjitter
structure for secure RTP audio
A structure which contains a channel implementation and session.
struct ast_sip_session * session
Pointer to session.
An entity with which Asterisk communicates.
struct ast_sip_endpoint_media_configuration media
A structure describing a SIP session.
struct ast_sip_endpoint * endpoint
enum ast_sip_session_t38state t38state
struct ast_channel * channel
unsigned int moh_passthrough
struct ast_sip_session_media_state * active_media_state
struct ast_sip_session_media_state * pending_media_state
struct pjsip_inv_session * inv_session
enum ast_sip_dtmf_mode dtmf
struct ast_taskprocessor * serializer
Socket address structure.
Support for dynamic strings.
struct ast_sip_session * session
struct ast_channel * chan
In case you didn't read that giant block of text above the mansession_session struct,...
Struct used to push PJSIP_PARSE_URI function arguments to task processor.
Struct used to push function arguments to task processor.
struct ast_sip_session * session
struct ast_sip_session * session
enum ast_sip_session_refresh_method method
Session refresh state information.
struct ast_sip_session_media_state * media_state
Created proposed media state.
Transport information stored in transport_info datastore.
pj_sockaddr local_addr
Our address that received the request.
pj_sockaddr remote_addr
The address that sent the request.
#define ast_test_flag(p, flag)
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
char * ast_escape_quoted(const char *string, char *outbuf, int buflen)
Escape characters found in a quoted string.