Asterisk - The Open Source Telephony Project GIT-master-7e7a603
config_auth.c
Go to the documentation of this file.
1/*
2 * Asterisk -- An open source telephony toolkit.
3 *
4 * Copyright (C) 2013, Digium, Inc.
5 *
6 * Mark Michelson <mmichelson@digium.com>
7 *
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
13 *
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
17 */
18
19#include "asterisk.h"
20
21#include <pjsip.h>
22#include <pjlib.h>
23#include "asterisk/res_pjsip.h"
24#include "asterisk/logger.h"
25#include "asterisk/sorcery.h"
26#include "asterisk/cli.h"
29
30static void auth_destroy(void *obj)
31{
32 struct ast_sip_auth *auth = obj;
34}
35
36static void *auth_alloc(const char *name)
37{
38 struct ast_sip_auth *auth = ast_sorcery_generic_alloc(sizeof(*auth), auth_destroy);
39
40 if (!auth) {
41 return NULL;
42 }
43
44 if (ast_string_field_init(auth, 64)) {
45 ao2_cleanup(auth);
46 return NULL;
47 }
48
49 return auth;
50}
51
52static int auth_type_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
53{
54 struct ast_sip_auth *auth = obj;
55 if (!strcasecmp(var->value, "userpass")) {
57 } else if (!strcasecmp(var->value, "md5")) {
59 } else if (!strcasecmp(var->value, "google_oauth")) {
60#ifdef HAVE_PJSIP_OAUTH_AUTHENTICATION
62#else
63 ast_log(LOG_WARNING, "OAuth support is not available in the version of PJSIP in use\n");
64 return -1;
65#endif
66 } else {
67 ast_log(LOG_WARNING, "Unknown authentication storage type '%s' specified for %s\n",
68 var->value, var->name);
69 return -1;
70 }
71 return 0;
72}
73
74static const char *auth_types_map[] = {
75 [AST_SIP_AUTH_TYPE_USER_PASS] = "userpass",
76 [AST_SIP_AUTH_TYPE_MD5] = "md5",
77 [AST_SIP_AUTH_TYPE_GOOGLE_OAUTH] = "google_oauth"
78};
79
81{
83 auth_types_map[type] : "";
84}
85
86static int auth_type_to_str(const void *obj, const intptr_t *args, char **buf)
87{
88 const struct ast_sip_auth *auth = obj;
90 return 0;
91}
92
93static int auth_apply(const struct ast_sorcery *sorcery, void *obj)
94{
95 struct ast_sip_auth *auth = obj;
96 int res = 0;
97
98 if (ast_strlen_zero(auth->auth_user)) {
99 ast_log(LOG_ERROR, "No authentication username for auth '%s'\n",
101 return -1;
102 }
103
104 switch (auth->type) {
106 if (ast_strlen_zero(auth->md5_creds)) {
107 ast_log(LOG_ERROR, "'md5' authentication specified but no md5_cred "
108 "specified for auth '%s'\n", ast_sorcery_object_get_id(auth));
109 res = -1;
110 } else if (strlen(auth->md5_creds) != PJSIP_MD5STRLEN) {
111 ast_log(LOG_ERROR, "'md5' authentication requires digest of size '%d', but "
112 "digest is '%d' in size for auth '%s'\n", PJSIP_MD5STRLEN, (int)strlen(auth->md5_creds),
114 res = -1;
115 }
116 break;
120 || ast_strlen_zero(auth->oauth_secret)) {
121 ast_log(LOG_ERROR, "'google_oauth' authentication specified but refresh_token,"
122 " oauth_clientid, or oauth_secret not specified for auth '%s'\n",
124 res = -1;
125 }
126 break;
129 break;
130 }
131
132 return res;
133}
134
136 ao2_callback_fn on_auth, void *arg)
137{
138 int i;
139
140 if (!vector || !AST_VECTOR_SIZE(vector)) {
141 return 0;
142 }
143
144 for (i = 0; i < AST_VECTOR_SIZE(vector); ++i) {
145 /* AST_VECTOR_GET is safe to use since the vector is immutable */
148 AST_VECTOR_GET(vector,i)), ao2_cleanup);
149
150 if (!auth) {
151 continue;
152 }
153
154 if (on_auth(auth, arg, 0)) {
155 return -1;
156 }
157 }
158
159 return 0;
160}
161
162static int sip_auth_to_ami(const struct ast_sip_auth *auth,
163 struct ast_str **buf)
164{
166}
167
168static int format_ami_auth_handler(void *obj, void *arg, int flags)
169{
170 const struct ast_sip_auth *auth = obj;
171 struct ast_sip_ami *ami = arg;
172 const struct ast_sip_endpoint *endpoint = ami->arg;
173 RAII_VAR(struct ast_str *, buf,
174 ast_sip_create_ami_event("AuthDetail", ami), ast_free);
175
176 if (!buf) {
177 return -1;
178 }
179
180 if (sip_auth_to_ami(auth, &buf)) {
181 return -1;
182 }
183
184 if (endpoint) {
185 ast_str_append(&buf, 0, "EndpointName: %s\r\n",
186 ast_sorcery_object_get_id(endpoint));
187 }
188
189 astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
190 ami->count++;
191
192 return 0;
193}
194
196 struct ast_sip_ami *ami)
197{
199}
200
201static int format_ami_endpoint_auth(const struct ast_sip_endpoint *endpoint,
202 struct ast_sip_ami *ami)
203{
204 ami->arg = (void *)endpoint;
205 if (ast_sip_format_auths_ami(&endpoint->inbound_auths, ami)) {
206 return -1;
207 }
208
209 return ast_sip_format_auths_ami(&endpoint->outbound_auths, ami);
210}
211
214};
215
216static struct ao2_container *cli_get_auths(void)
217{
218 struct ao2_container *auths;
219
222
223 return auths;
224}
225
226static int format_ami_authlist_handler(void *obj, void *arg, int flags)
227{
228 struct ast_sip_auth *auth = obj;
229 struct ast_sip_ami *ami = arg;
230 struct ast_str *buf;
231
232 buf = ast_sip_create_ami_event("AuthList", ami);
233 if (!buf) {
234 return CMP_STOP;
235 }
236
237 sip_auth_to_ami(auth, &buf);
238
239 astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
240 ami->count++;
241
242 ast_free(buf);
243
244 return 0;
245}
246
247static int ami_show_auths(struct mansession *s, const struct message *m)
248{
249 struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
250 struct ao2_container *auths;
251
252 auths = cli_get_auths();
253 if (!auths) {
254 astman_send_error(s, m, "Could not get Auths\n");
255 return 0;
256 }
257
258 if (!ao2_container_count(auths)) {
259 astman_send_error(s, m, "No Auths found\n");
260 ao2_ref(auths, -1);
261 return 0;
262 }
263
264 astman_send_listack(s, m, "A listing of Auths follows, presented as AuthList events",
265 "start");
266
268
269 astman_send_list_complete_start(s, m, "AuthListComplete", ami.count);
271
272 ao2_ref(auths, -1);
273
274 return 0;
275}
276
277static struct ao2_container *cli_get_container(const char *regex)
278{
280 struct ao2_container *s_container;
281
283 if (!container) {
284 return NULL;
285 }
286
289 if (!s_container) {
290 return NULL;
291 }
292
293 if (ao2_container_dup(s_container, container, 0)) {
294 ao2_ref(s_container, -1);
295 return NULL;
296 }
297
298 return s_container;
299}
300
301static int cli_iterator(void *container, ao2_callback_fn callback, void *args)
302{
303 return ast_sip_for_each_auth(container, callback, args);
304}
305
306static void *cli_retrieve_by_id(const char *id)
307{
309}
310
311static int cli_print_header(void *obj, void *arg, int flags)
312{
313 struct ast_sip_cli_context *context = arg;
314 int indent = CLI_INDENT_TO_SPACES(context->indent_level);
315 int filler = CLI_MAX_WIDTH - indent - 20;
316
317 ast_assert(context->output_buffer != NULL);
318
319 ast_str_append(&context->output_buffer, 0,
320 "%*s: <AuthId/UserName%*.*s>\n", indent, "I/OAuth", filler, filler,
322
323 return 0;
324}
325
326static int cli_print_body(void *obj, void *arg, int flags)
327{
328 struct ast_sip_auth *auth = obj;
329 struct ast_sip_cli_context *context = arg;
330 char title[32];
331
332 ast_assert(context->output_buffer != NULL);
333
334 snprintf(title, sizeof(title), "%sAuth",
335 context->auth_direction ? context->auth_direction : "");
336
337 ast_str_append(&context->output_buffer, 0, "%*s: %s/%s\n",
338 CLI_INDENT_TO_SPACES(context->indent_level), title,
340
341 if (context->show_details
342 || (context->show_details_only_level_0 && context->indent_level == 0)) {
343 ast_str_append(&context->output_buffer, 0, "\n");
345 }
346
347 return 0;
348}
349
350static struct ast_cli_entry cli_commands[] = {
352 .command = "pjsip list auths",
353 .usage = "Usage: pjsip list auths [ like <pattern> ]\n"
354 " List the configured PJSIP Auths\n"
355 " Optional regular expression pattern is used to filter the list.\n"),
357 .command = "pjsip show auths",
358 .usage = "Usage: pjsip show auths [ like <pattern> ]\n"
359 " Show the configured PJSIP Auths\n"
360 " Optional regular expression pattern is used to filter the list.\n"),
362 .command = "pjsip show auth",
363 .usage = "Usage: pjsip show auth <id>\n"
364 " Show the configured PJSIP Auth\n"),
365};
366
368
369/*! \brief Initialize sorcery with auth support */
371{
373
374 ast_sorcery_apply_default(sorcery, SIP_SORCERY_AUTH_TYPE, "config", "pjsip.conf,criteria=type=auth");
375
377 return -1;
378 }
379
381 OPT_NOOP_T, 0, 0);
383 "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_auth, auth_user));
385 "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_auth, auth_pass));
387 "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_auth, refresh_token));
389 "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_auth, oauth_clientid));
391 "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_auth, oauth_secret));
393 "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_auth, md5_creds));
395 "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_auth, realm));
397 "32", OPT_UINT_T, 0, FLDSET(struct ast_sip_auth, nonce_lifetime));
399 "userpass", auth_type_handler, auth_type_to_str, NULL, 0, 0);
400
402
404 if (!cli_formatter) {
405 ast_log(LOG_ERROR, "Unable to allocate memory for cli formatter\n");
406 return -1;
407 }
415
418
420 return -1;
421 }
422
423 return 0;
424}
425
427{
431
432 ast_manager_unregister("PJSIPShowAuths");
433
434 return 0;
435}
#define var
Definition: ast_expr2f.c:605
Asterisk main include file. File version handling, generic pbx functions.
#define ast_free(a)
Definition: astmm.h:180
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ast_log
Definition: astobj2.c:42
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.
@ CMP_STOP
Definition: astobj2.h:1028
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#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.
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
int() ao2_callback_fn(void *obj, void *arg, int flags)
Type of a generic callback function.
Definition: astobj2.h:1226
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
@ OBJ_NODATA
Definition: astobj2.h:1044
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
Definition: astobj2.h:1327
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
static const char type[]
Definition: chan_ooh323.c:109
Standard Command Line Interface.
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
#define AST_CLI_DEFINE(fn, txt,...)
Definition: cli.h:197
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
static struct ast_cli_entry cli_commands[]
Definition: config_auth.c:350
static int cli_print_header(void *obj, void *arg, int flags)
Definition: config_auth.c:311
static int cli_iterator(void *container, ao2_callback_fn callback, void *args)
Definition: config_auth.c:301
int ast_sip_format_auths_ami(const struct ast_sip_auth_vector *auths, struct ast_sip_ami *ami)
Format auth details for AMI.
Definition: config_auth.c:195
static int sip_auth_to_ami(const struct ast_sip_auth *auth, struct ast_str **buf)
Definition: config_auth.c:162
static const char * auth_types_map[]
Definition: config_auth.c:74
static int format_ami_authlist_handler(void *obj, void *arg, int flags)
Definition: config_auth.c:226
static struct ast_sip_endpoint_formatter endpoint_auth_formatter
Definition: config_auth.c:212
static void * auth_alloc(const char *name)
Definition: config_auth.c:36
static struct ao2_container * cli_get_auths(void)
Definition: config_auth.c:216
static int format_ami_auth_handler(void *obj, void *arg, int flags)
Definition: config_auth.c:168
static void * cli_retrieve_by_id(const char *id)
Definition: config_auth.c:306
static int auth_type_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
Definition: config_auth.c:52
static int auth_apply(const struct ast_sorcery *sorcery, void *obj)
Definition: config_auth.c:93
static struct ao2_container * cli_get_container(const char *regex)
Definition: config_auth.c:277
static int format_ami_endpoint_auth(const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
Definition: config_auth.c:201
static int cli_print_body(void *obj, void *arg, int flags)
Definition: config_auth.c:326
static int ami_show_auths(struct mansession *s, const struct message *m)
Definition: config_auth.c:247
int ast_sip_for_each_auth(const struct ast_sip_auth_vector *vector, ao2_callback_fn on_auth, void *arg)
For every auth in the array call the given 'on_auth' handler.
Definition: config_auth.c:135
static int auth_type_to_str(const void *obj, const intptr_t *args, char **buf)
Definition: config_auth.c:86
int ast_sip_destroy_sorcery_auth(void)
Definition: config_auth.c:426
const char * ast_sip_auth_type_to_str(enum ast_sip_auth_type type)
Converts the given auth type to a string.
Definition: config_auth.c:80
static struct ast_sip_cli_formatter_entry * cli_formatter
Definition: config_auth.c:367
int ast_sip_initialize_sorcery_auth(void)
Initialize sorcery with auth support.
Definition: config_auth.c:370
static void auth_destroy(void *obj)
Definition: config_auth.c:30
#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.
@ OPT_UINT_T
Type for default option handler for unsigned integers.
@ OPT_NOOP_T
Type for a default handler that should do nothing.
@ OPT_STRINGFIELD_T
Type for default option handler for stringfields.
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static const char name[]
Definition: format_mp3.c:68
static int regex(struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
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:3423
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
Definition: manager.c:3381
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:3459
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
Definition: manager.c:3042
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
Definition: manager.c:3467
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:3302
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
Definition: manager.c:8041
Support for logging to various files, console and syslog Configuration in file logger....
#define LOG_ERROR
#define LOG_WARNING
#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
struct ao2_container * container
Definition: res_fax.c:501
void ast_sip_register_endpoint_formatter(struct ast_sip_endpoint_formatter *obj)
Register an endpoint formatter.
Definition: res_pjsip.c:481
void ast_sip_unregister_endpoint_formatter(struct ast_sip_endpoint_formatter *obj)
Unregister an endpoint formatter.
Definition: res_pjsip.c:487
int ast_sip_sorcery_object_to_ami(const void *obj, struct ast_str **buf)
Converts a sorcery object to a string of object properties.
ast_sip_auth_type
Methods of storing SIP digest authentication credentials.
Definition: res_pjsip.h:566
@ AST_SIP_AUTH_TYPE_GOOGLE_OAUTH
Definition: res_pjsip.h:572
@ AST_SIP_AUTH_TYPE_ARTIFICIAL
Definition: res_pjsip.h:574
@ AST_SIP_AUTH_TYPE_MD5
Definition: res_pjsip.h:570
@ AST_SIP_AUTH_TYPE_USER_PASS
Definition: res_pjsip.h:568
#define SIP_SORCERY_AUTH_TYPE
Definition: res_pjsip.h:577
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.
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
int ast_sip_unregister_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Unregisters a CLI formatter.
Definition: pjsip_cli.c:326
#define CLI_HEADER_FILLER
Definition: res_pjsip_cli.h:24
#define CLI_MAX_WIDTH
Definition: res_pjsip_cli.h:26
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
char * ast_sip_cli_traverse_objects(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition: pjsip_cli.c:109
#define CLI_INDENT_TO_SPACES(x)
Definition: res_pjsip_cli.h:29
int ast_sip_register_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Registers a CLI formatter.
Definition: pjsip_cli.c:310
static struct ast_sorcery * sorcery
#define NULL
Definition: resample.c:96
Sorcery Data Access Layer API.
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Definition: sorcery.c:2317
@ 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_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
Definition: sorcery.c:1853
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
Definition: sorcery.h:837
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:1954
#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
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
Definition: sorcery.c:1728
int ast_sorcery_object_id_compare(void *obj, void *arg, int flags)
ao2 object comparator based on sorcery id.
Definition: sorcery.c:2464
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
Definition: sorcery.h:955
int ast_sorcery_object_id_sort(const void *obj, const void *arg, int flags)
ao2 object sorter based on sorcery id.
Definition: sorcery.c:2440
#define ast_sorcery_apply_default(sorcery, type, name, data)
Definition: sorcery.h:476
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
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374
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:1139
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Generic container type.
descriptor for a cli entry.
Definition: cli.h:171
char * command
Definition: cli.h:186
AMI variable container.
Definition: res_pjsip.h:3047
struct mansession * s
Definition: res_pjsip.h:3049
void * arg
Definition: res_pjsip.h:3055
const struct message * m
Definition: res_pjsip.h:3051
const ast_string_field oauth_clientid
Definition: res_pjsip.h:597
const ast_string_field oauth_secret
Definition: res_pjsip.h:597
const ast_string_field md5_creds
Definition: res_pjsip.h:597
const ast_string_field auth_user
Definition: res_pjsip.h:597
const ast_string_field refresh_token
Definition: res_pjsip.h:597
enum ast_sip_auth_type type
Definition: res_pjsip.h:601
CLI Formatter Context passed to all formatters.
Definition: res_pjsip_cli.h:34
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
void *(* retrieve_by_id)(const char *id)
Definition: res_pjsip_cli.h:68
const char *(* get_id)(const void *obj)
Definition: res_pjsip_cli.h:70
const char * name
Definition: res_pjsip_cli.h:58
ao2_callback_fn * print_body
Definition: res_pjsip_cli.h:62
struct ao2_container *(* get_container)(const char *regex)
Definition: res_pjsip_cli.h:64
An entity responsible formatting endpoint information.
Definition: res_pjsip.h:3073
int(* format_ami)(const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
Callback used to format endpoint information over AMI.
Definition: res_pjsip.h:3077
An entity with which Asterisk communicates.
Definition: res_pjsip.h:963
struct ast_sip_auth_vector outbound_auths
Definition: res_pjsip.h:1010
struct ast_sip_auth_vector inbound_auths
Definition: res_pjsip.h:1008
Full structure for sorcery.
Definition: sorcery.c:230
Support for dynamic strings.
Definition: strings.h:623
Structure for variables, used for configurations and for channel variables.
In case you didn't read that giant block of text above the mansession_session struct,...
Definition: manager.c:1777
const char * args
char * usage
Definition: utils/frame.c:37
#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:941
#define ast_assert(a)
Definition: utils.h:739
#define ARRAY_IN_BOUNDS(v, a)
Checks to see if value is within the bounds of the given array.
Definition: utils.h:687
#define ARRAY_LEN(a)
Definition: utils.h:666
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680