Asterisk - The Open Source Telephony Project  GIT-master-a24979a
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"
28 #include "asterisk/res_pjsip_cli.h"
29 
30 static void auth_destroy(void *obj)
31 {
32  struct ast_sip_auth *auth = obj;
34 }
35 
36 static 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 
52 static 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 
74 static 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 
86 static 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 
93 static 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;
118  if (ast_strlen_zero(auth->refresh_token)
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 
162 static int sip_auth_to_ami(const struct ast_sip_auth *auth,
163  struct ast_str **buf)
164 {
165  return ast_sip_sorcery_object_to_ami(auth, buf);
166 }
167 
168 static 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 
201 static 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 
216 static struct ao2_container *cli_get_auths(void)
217 {
218  struct ao2_container *auths;
219 
222 
223  return auths;
224 }
225 
226 static 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 
247 static 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 
277 static 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 
301 static int cli_iterator(void *container, ao2_callback_fn callback, void *args)
302 {
303  return ast_sip_for_each_auth(container, callback, args);
304 }
305 
306 static void *cli_retrieve_by_id(const char *id)
307 {
309 }
310 
311 static 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 
326 static 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,
339  ast_sorcery_object_get_id(auth), auth->auth_user);
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 
350 static struct ast_cli_entry cli_commands[] = {
351  AST_CLI_DEFINE(ast_sip_cli_traverse_objects, "List PJSIP Auths",
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"),
356  AST_CLI_DEFINE(ast_sip_cli_traverse_objects, "Show PJSIP Auths",
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"),
361  AST_CLI_DEFINE(ast_sip_cli_traverse_objects, "Show PJSIP Auth",
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:614
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 char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:120
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 void * cli_retrieve_by_id(const char *id)
Definition: config_auth.c:306
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 struct ao2_container * cli_get_auths(void)
Definition: config_auth.c:216
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
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 void * auth_alloc(const char *name)
Definition: config_auth.c:36
static int format_ami_auth_handler(void *obj, void *arg, int flags)
Definition: config_auth.c:168
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 int format_ami_endpoint_auth(const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
Definition: config_auth.c:201
static struct ao2_container * cli_get_container(const char *regex)
Definition: config_auth.c:277
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
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:3208
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
Definition: manager.c:3166
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
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:3087
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
Definition: manager.c:2827
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
Definition: manager.c:7268
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
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
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.
void ast_sip_register_endpoint_formatter(struct ast_sip_endpoint_formatter *obj)
Register an endpoint formatter.
Definition: res_pjsip.c:474
void ast_sip_unregister_endpoint_formatter(struct ast_sip_endpoint_formatter *obj)
Unregister an endpoint formatter.
Definition: res_pjsip.c:480
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:450
@ AST_SIP_AUTH_TYPE_GOOGLE_OAUTH
Definition: res_pjsip.h:456
@ AST_SIP_AUTH_TYPE_ARTIFICIAL
Definition: res_pjsip.h:458
@ AST_SIP_AUTH_TYPE_MD5
Definition: res_pjsip.h:454
@ AST_SIP_AUTH_TYPE_USER_PASS
Definition: res_pjsip.h:452
#define SIP_SORCERY_AUTH_TYPE
Definition: res_pjsip.h:461
int ast_sip_unregister_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Unregisters a CLI formatter.
Definition: pjsip_cli.c:326
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_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
#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.
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
@ 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_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
Definition: sorcery.c:1728
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
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
Definition: sorcery.h:837
#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
int ast_sorcery_object_id_compare(void *obj, void *arg, int flags)
ao2 object comparator based on sorcery id.
Definition: sorcery.c:2459
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
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
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
#define ast_sorcery_apply_default(sorcery, type, name, data)
Definition: sorcery.h:476
#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:1117
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:739
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:2819
struct mansession * s
Definition: res_pjsip.h:2821
void * arg
Definition: res_pjsip.h:2827
const struct message * m
Definition: res_pjsip.h:2823
const ast_string_field oauth_clientid
Definition: res_pjsip.h:481
const ast_string_field oauth_secret
Definition: res_pjsip.h:481
const ast_string_field md5_creds
Definition: res_pjsip.h:481
const ast_string_field auth_user
Definition: res_pjsip.h:481
const ast_string_field refresh_token
Definition: res_pjsip.h:481
enum ast_sip_auth_type type
Definition: res_pjsip.h:485
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
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
An entity responsible formatting endpoint information.
Definition: res_pjsip.h:2845
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:2849
An entity with which Asterisk communicates.
Definition: res_pjsip.h:854
struct ast_sip_auth_vector outbound_auths
Definition: res_pjsip.h:901
struct ast_sip_auth_vector inbound_auths
Definition: res_pjsip.h:899
Full structure for sorcery.
Definition: sorcery.c:230
Support for dynamic strings.
Definition: strings.h:604
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:1632
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:936
#define ast_assert(a)
Definition: utils.h:734
#define ARRAY_IN_BOUNDS(v, a)
Checks to see if value is within the bounds of the given array.
Definition: utils.h:682
#define ARRAY_LEN(a)
Definition: utils.h:661
#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