Asterisk - The Open Source Telephony Project GIT-master-754dea3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Data Structures | Functions | Variables
pbx_app.c File Reference

Custom function management routines. More...

#include "asterisk.h"
#include "asterisk/_private.h"
#include "asterisk/cli.h"
#include "asterisk/linkedlists.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/strings.h"
#include "asterisk/term.h"
#include "asterisk/utils.h"
#include "asterisk/xmldoc.h"
#include "pbx_private.h"
Include dependency graph for pbx_app.c:

Go to the source code of this file.

Data Structures

struct  apps
 Registered applications container. More...
 
struct  ast_app
 ast_app: A registered application More...
 

Functions

const char * app_name (struct ast_app *app)
 
char * ast_complete_applications (const char *line, const char *word, int state)
 Command completion for the list of installed applications. More...
 
int ast_pbx_exec_application (struct ast_channel *chan, const char *app_name, const char *app_args)
 Execute an application. More...
 
int ast_register_application2 (const char *app, int(*execute)(struct ast_channel *, const char *), const char *synopsis, const char *description, void *mod)
 Dynamically register a new dial plan application. More...
 
int ast_unregister_application (const char *app)
 Unregister an application. More...
 
static char * handle_show_application (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 'show application' CLI command implementation function... More...
 
static char * handle_show_applications (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
int load_pbx_app (void)
 
int pbx_exec (struct ast_channel *c, struct ast_app *app, const char *data)
 Execute an application. More...
 
struct ast_apppbx_findapp (const char *app)
 Look up an application. More...
 
static struct ast_apppbx_findapp_nolock (const char *name)
 
static void print_app_docs (struct ast_app *aa, int fd)
 
static void unload_pbx_app (void)
 

Variables

static struct ast_cli_entry app_cli []
 
static struct apps apps = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
 

Detailed Description

Custom function management routines.

Author
Corey Farrell git@c.nosp@m.fwar.nosp@m.e.com

Definition in file pbx_app.c.

Function Documentation

◆ app_name()

const char * app_name ( struct ast_app app)

◆ ast_complete_applications()

char * ast_complete_applications ( const char *  line,
const char *  word,
int  state 
)

Command completion for the list of installed applications.

This can be called from a CLI command completion function that wants to complete from the list of available applications.

Definition at line 429 of file pbx_app.c.

430{
431 struct ast_app *app;
432 int which = 0;
433 int cmp;
434 char *ret = NULL;
435 size_t wordlen = strlen(word);
436
438 AST_RWLIST_TRAVERSE(&apps, app, list) {
439 cmp = strncasecmp(word, app->name, wordlen);
440 if (cmp < 0) {
441 /* No more matches. */
442 break;
443 } else if (!cmp) {
444 /* Found match. */
445 if (state != -1) {
446 if (++which <= state) {
447 /* Not enough matches. */
448 continue;
449 }
450 ret = ast_strdup(app->name);
451 break;
452 }
454 break;
455 }
456 }
457 }
459
460 return ret;
461}
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition: main/cli.c:2768
short word
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:78
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:494
#define NULL
Definition: resample.c:96
Registered applications container.
Definition: pbx_app.c:68
ast_app: A registered application
Definition: pbx_app.c:45

References app, ast_cli_completion_add(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdup, and NULL.

Referenced by handle_orig(), and handle_show_application().

◆ ast_pbx_exec_application()

int ast_pbx_exec_application ( struct ast_channel chan,
const char *  app_name,
const char *  app_args 
)

Execute an application.

Parameters
chanchannel to execute on
app_namename of app to execute
app_argsthe data passed into the app

This application executes an application by name on a given channel. It is a wrapper around pbx_exec that will perform variable substitution and then execute the application if it exists. If the application is not found, a warning is logged.

Return values
0success
-1failure (including application not found)

Definition at line 501 of file pbx_app.c.

502{
503 int res = -1;
504 struct ast_app *app;
505
507 if (!app) {
508 ast_log(LOG_WARNING, "Could not find application (%s)\n", app_name);
509 } else {
510 struct ast_str *substituted_args = NULL;
511
512 if (!ast_strlen_zero(app_args) && (substituted_args = ast_str_create(16))) {
513 ast_str_substitute_variables(&substituted_args, 0, chan, app_args);
514 res = pbx_exec(chan, app, ast_str_buffer(substituted_args));
515 ast_free(substituted_args);
516 } else {
517 if (!ast_strlen_zero(app_args)) {
518 ast_log(LOG_WARNING, "Could not substitute application argument variables for %s\n", app_name);
519 }
520 res = pbx_exec(chan, app, app_args);
521 }
522 /* Manually make a snapshot now, since pbx_exec won't necessarily get called again immediately. */
524 }
525 return res;
526}
#define ast_free(a)
Definition: astmm.h:180
#define ast_log
Definition: astobj2.c:42
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.
#define LOG_WARNING
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
const char * app_name(struct ast_app *app)
Definition: pbx_app.c:463
int pbx_exec(struct ast_channel *c, struct ast_app *app, const char *data)
Execute an application.
Definition: pbx_app.c:471
struct ast_app * pbx_findapp(const char *app)
Look up an application.
Definition: pbx_app.c:92
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
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
Support for dynamic strings.
Definition: strings.h:623

References app, app_name(), ast_channel_publish_snapshot(), ast_free, ast_log, ast_str_buffer(), ast_str_create, ast_str_substitute_variables(), ast_strlen_zero(), LOG_WARNING, NULL, pbx_exec(), and pbx_findapp().

Referenced by answer_exec_run(), conf_kick_all(), conf_run(), disa_exec(), dundi_exec(), pbx_builtin_execiftime(), run_app_helper(), and snoop_stasis_thread().

◆ ast_register_application2()

int ast_register_application2 ( const char *  app,
int(*)(struct ast_channel *, const char *)  execute,
const char *  synopsis,
const char *  description,
void *  mod 
)

Dynamically register a new dial plan application.

Register an application.

Definition at line 104 of file pbx_app.c.

105{
106 struct ast_app *tmp;
107 struct ast_app *cur;
108 int length;
109#ifdef AST_XML_DOCS
110 char *tmpxml;
111#endif
112
114 cur = pbx_findapp_nolock(app);
115 if (cur) {
116 ast_log(LOG_WARNING, "Already have an application '%s'\n", app);
118 return -1;
119 }
120
121 length = sizeof(*tmp) + strlen(app) + 1;
122
123 if (!(tmp = ast_calloc(1, length))) {
125 return -1;
126 }
127
128 if (ast_string_field_init(tmp, 128)) {
130 ast_free(tmp);
131 return -1;
132 }
133
134 strcpy(tmp->name, app);
135 tmp->execute = execute;
136 tmp->module = mod;
137
138#ifdef AST_XML_DOCS
139 /* Try to lookup the docs in our XML documentation database */
141 /* load synopsis */
142 tmpxml = ast_xmldoc_build_synopsis("application", app, ast_module_name(tmp->module));
143 ast_string_field_set(tmp, synopsis, tmpxml);
144 ast_free(tmpxml);
145
146 /* load since */
147 tmpxml = ast_xmldoc_build_since("application", app, ast_module_name(tmp->module));
148 ast_string_field_set(tmp, since, tmpxml);
149 ast_free(tmpxml);
150
151 /* load description */
152 tmpxml = ast_xmldoc_build_description("application", app, ast_module_name(tmp->module));
153 ast_string_field_set(tmp, description, tmpxml);
154 ast_free(tmpxml);
155
156 /* load syntax */
157 tmpxml = ast_xmldoc_build_syntax("application", app, ast_module_name(tmp->module));
158 ast_string_field_set(tmp, syntax, tmpxml);
159 ast_free(tmpxml);
160
161 /* load arguments */
162 tmpxml = ast_xmldoc_build_arguments("application", app, ast_module_name(tmp->module));
163 ast_string_field_set(tmp, arguments, tmpxml);
164 ast_free(tmpxml);
165
166 /* load seealso */
167 tmpxml = ast_xmldoc_build_seealso("application", app, ast_module_name(tmp->module));
168 ast_string_field_set(tmp, seealso, tmpxml);
169 ast_free(tmpxml);
170 tmp->docsrc = AST_XML_DOC;
171 } else {
172#endif
175#ifdef AST_XML_DOCS
176 tmp->docsrc = AST_STATIC_DOC;
177 }
178#endif
179
180 /* Store in alphabetical order */
182 if (strcasecmp(tmp->name, cur->name) < 0) {
184 break;
185 }
186 }
188 if (!cur)
189 AST_RWLIST_INSERT_TAIL(&apps, tmp, list);
190
191 ast_verb(5, "Registered application '" COLORIZE_FMT "'\n", COLORIZE(COLOR_BRCYAN, 0, tmp->name));
192
194
195 return 0;
196}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
static char * synopsis
Definition: func_enum.c:166
static SQLHSTMT execute(struct odbc_obj *obj, void *data, int silent)
Common execution function for SQL queries.
Definition: func_odbc.c:485
#define ast_verb(level,...)
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:545
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:52
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:617
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:741
#define AST_RWLIST_INSERT_BEFORE_CURRENT
Definition: linkedlists.h:610
const char * ast_module_name(const struct ast_module *mod)
Get the name of a module.
Definition: loader.c:624
static struct ast_app * pbx_findapp_nolock(const char *name)
Definition: pbx_app.c:70
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
const ast_string_field since
Definition: pbx_app.c:54
const ast_string_field description
Definition: pbx_app.c:54
enum ast_doc_src docsrc
Definition: pbx_app.c:56
const ast_string_field seealso
Definition: pbx_app.c:54
const ast_string_field syntax
Definition: pbx_app.c:54
const ast_string_field arguments
Definition: pbx_app.c:54
int(* execute)(struct ast_channel *chan, const char *data)
Definition: pbx_app.c:46
#define COLOR_BRCYAN
Definition: term.h:63
#define COLORIZE(fg, bg, str)
Definition: term.h:72
#define COLORIZE_FMT
Shortcut macros for coloring a set of text.
Definition: term.h:71
char * ast_xmldoc_build_description(const char *type, const char *name, const char *module)
Generate description documentation from XML.
Definition: xmldoc.c:2356
char * ast_xmldoc_build_syntax(const char *type, const char *name, const char *module)
Get the syntax for a specified application or function.
Definition: xmldoc.c:1252
char * ast_xmldoc_build_arguments(const char *type, const char *name, const char *module)
Generate the [arguments] tag based on type of node ('application', 'function' or 'agi') and name.
Definition: xmldoc.c:2169
char * ast_xmldoc_build_synopsis(const char *type, const char *name, const char *module)
Generate synopsis documentation from XML.
Definition: xmldoc.c:2333
char * ast_xmldoc_build_since(const char *type, const char *name, const char *module)
Parse the <since> node content.
Definition: xmldoc.c:1787
@ AST_XML_DOC
Definition: xmldoc.h:31
@ AST_STATIC_DOC
Definition: xmldoc.h:32
char * ast_xmldoc_build_seealso(const char *type, const char *name, const char *module)
Parse the <see-also> node content.
Definition: xmldoc.c:1702

References app, ast_app::arguments, ast_calloc, ast_free, ast_log, ast_module_name(), AST_RWLIST_INSERT_BEFORE_CURRENT, AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, AST_STATIC_DOC, ast_string_field_init, ast_string_field_set, ast_strlen_zero(), ast_verb, AST_XML_DOC, ast_xmldoc_build_arguments(), ast_xmldoc_build_description(), ast_xmldoc_build_seealso(), ast_xmldoc_build_since(), ast_xmldoc_build_synopsis(), ast_xmldoc_build_syntax(), COLOR_BRCYAN, COLORIZE, COLORIZE_FMT, ast_app::description, ast_app::docsrc, execute(), ast_app::execute, LOG_WARNING, pbx_findapp_nolock(), ast_app::seealso, ast_app::since, synopsis, and ast_app::syntax.

Referenced by ast_msg_init(), load_module(), load_pbx_builtins(), and load_pbx_variables().

◆ ast_unregister_application()

int ast_unregister_application ( const char *  app)

Unregister an application.

Parameters
appname of the application (does not have to be the same string as the one that was registered)

This unregisters an application from Asterisk's internal application list.

Return values
0success
-1failure

Definition at line 392 of file pbx_app.c.

393{
394 struct ast_app *cur;
395 int cmp;
396
397 /* Anticipate need for conlock in unreference_cached_app(), in order to avoid
398 * possible deadlock with pbx_extension_helper()/pbx_findapp()
399 */
401
404 cmp = strcasecmp(app, cur->name);
405 if (cmp > 0) {
406 continue;
407 }
408 if (!cmp) {
409 /* Found it. */
412 ast_verb(5, "Unregistered application '%s'\n", cur->name);
414 ast_free(cur);
415 break;
416 }
417 /* Not in container. */
418 cur = NULL;
419 break;
420 }
423
425
426 return cur ? 0 : -1;
427}
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:570
void unreference_cached_app(struct ast_app *app)
Definition: pbx.c:6145
int ast_rdlock_contexts(void)
Read locks the context list.
Definition: pbx.c:8483
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8488
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374

References app, ast_free, ast_rdlock_contexts(), AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_string_field_free_memory, ast_unlock_contexts(), ast_verb, NULL, and unreference_cached_app().

Referenced by __unload_module(), load_module(), message_shutdown(), unload_module(), unload_parking_applications(), unload_pbx_builtins(), and unload_pbx_variables().

◆ handle_show_application()

static char * handle_show_application ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

'show application' CLI command implementation function...

Definition at line 260 of file pbx_app.c.

261{
262 struct ast_app *aa;
263 int app, no_registered_app = 1;
264
265 switch (cmd) {
266 case CLI_INIT:
267 e->command = "core show application";
268 e->usage =
269 "Usage: core show application <application> [<application> [<application> [...]]]\n"
270 " Describes a particular application.\n";
271 return NULL;
272 case CLI_GENERATE:
273 /*
274 * There is a possibility to show information about more than one
275 * application at one time. You can type 'show application Dial Echo' and
276 * you will see information about these two applications ...
277 */
278 return ast_complete_applications(a->line, a->word, -1);
279 }
280
281 if (a->argc < 4) {
282 return CLI_SHOWUSAGE;
283 }
284
286 AST_RWLIST_TRAVERSE(&apps, aa, list) {
287 /* Check for each app that was supplied as an argument */
288 for (app = 3; app < a->argc; app++) {
289 if (strcasecmp(aa->name, a->argv[app])) {
290 continue;
291 }
292
293 /* We found it! */
294 no_registered_app = 0;
295
296 print_app_docs(aa, a->fd);
297 }
298 }
300
301 /* we found at least one app? no? */
302 if (no_registered_app) {
303 ast_cli(a->fd, "Your application(s) is (are) not registered\n");
304 return CLI_FAILURE;
305 }
306
307 return CLI_SUCCESS;
308}
#define CLI_SHOWUSAGE
Definition: cli.h:45
#define CLI_SUCCESS
Definition: cli.h:44
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
@ CLI_INIT
Definition: cli.h:152
@ CLI_GENERATE
Definition: cli.h:153
#define CLI_FAILURE
Definition: cli.h:46
char * ast_complete_applications(const char *line, const char *word, int state)
Command completion for the list of installed applications.
Definition: pbx_app.c:429
static void print_app_docs(struct ast_app *aa, int fd)
Definition: pbx_app.c:198
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
static struct test_val a

References a, app, ast_cli(), ast_complete_applications(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, print_app_docs(), and ast_cli_entry::usage.

◆ handle_show_applications()

static char * handle_show_applications ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 310 of file pbx_app.c.

311{
312 struct ast_app *aa;
313 int like = 0, describing = 0;
314 int total_match = 0; /* Number of matches in like clause */
315 int total_apps = 0; /* Number of apps registered */
316
317 switch (cmd) {
318 case CLI_INIT:
319 e->command = "core show applications [like|describing]";
320 e->usage =
321 "Usage: core show applications [{like|describing} <text>]\n"
322 " List applications which are currently available.\n"
323 " If 'like', <text> will be a substring of the app name\n"
324 " If 'describing', <text> will be a substring of the description\n";
325 return NULL;
326 case CLI_GENERATE:
327 return NULL;
328 }
329
331
332 if (AST_RWLIST_EMPTY(&apps)) {
333 ast_cli(a->fd, "There are no registered applications\n");
335 return CLI_SUCCESS;
336 }
337
338 /* core list applications like <keyword> */
339 if ((a->argc == 5) && (!strcmp(a->argv[3], "like"))) {
340 like = 1;
341 } else if ((a->argc > 4) && (!strcmp(a->argv[3], "describing"))) {
342 describing = 1;
343 }
344
345 /* core list applications describing <keyword1> [<keyword2>] [...] */
346 if ((!like) && (!describing)) {
347 ast_cli(a->fd, " -= Registered Asterisk Applications =-\n");
348 } else {
349 ast_cli(a->fd, " -= Matching Asterisk Applications =-\n");
350 }
351
352 AST_RWLIST_TRAVERSE(&apps, aa, list) {
353 int printapp = 0;
354 total_apps++;
355 if (like) {
356 if (strcasestr(aa->name, a->argv[4])) {
357 printapp = 1;
358 total_match++;
359 }
360 } else if (describing) {
361 if (aa->description) {
362 /* Match all words on command line */
363 int i;
364 printapp = 1;
365 for (i = 4; i < a->argc; i++) {
366 if (!strcasestr(aa->description, a->argv[i])) {
367 printapp = 0;
368 } else {
369 total_match++;
370 }
371 }
372 }
373 } else {
374 printapp = 1;
375 }
376
377 if (printapp) {
378 ast_cli(a->fd," %20s: %s\n", aa->name, aa->synopsis ? aa->synopsis : "<Synopsis not available>");
379 }
380 }
381 if ((!like) && (!describing)) {
382 ast_cli(a->fd, " -= %d Applications Registered =-\n",total_apps);
383 } else {
384 ast_cli(a->fd, " -= %d Applications Matching =-\n",total_match);
385 }
386
388
389 return CLI_SUCCESS;
390}
char * strcasestr(const char *, const char *)
#define AST_RWLIST_EMPTY
Definition: linkedlists.h:452
const ast_string_field synopsis
Definition: pbx_app.c:54

References a, ast_cli(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_app::description, NULL, strcasestr(), ast_app::synopsis, and ast_cli_entry::usage.

◆ load_pbx_app()

int load_pbx_app ( void  )

Provided by pbx_app.c

Definition at line 538 of file pbx_app.c.

539{
542
543 return 0;
544}
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
static struct ast_cli_entry app_cli[]
Definition: pbx_app.c:528
static void unload_pbx_app(void)
Definition: pbx_app.c:533
#define ARRAY_LEN(a)
Definition: utils.h:666

References app_cli, ARRAY_LEN, ast_cli_register_multiple, ast_register_cleanup(), and unload_pbx_app().

Referenced by asterisk_daemon().

◆ pbx_exec()

int pbx_exec ( struct ast_channel c,
struct ast_app app,
const char *  data 
)

Execute an application.

Note
This function is special. It saves the stack so that no matter how many times it is called, it returns to the same place
Parameters
cChannel
appApplication
dataData for execution

Definition at line 471 of file pbx_app.c.

474{
475 int res;
476 struct ast_module_user *u = NULL;
477 const char *saved_c_appl;
478 const char *saved_c_data;
479
480 /* save channel values */
481 saved_c_appl= ast_channel_appl(c);
482 saved_c_data= ast_channel_data(c);
483
485 ast_channel_appl_set(c, app->name);
486 ast_channel_data_set(c, data);
489
490 if (app->module)
491 u = __ast_module_user_add(app->module, c);
492 res = app->execute(c, S_OR(data, ""));
493 if (app->module && u)
494 __ast_module_user_remove(app->module, u);
495 /* restore channel values */
496 ast_channel_appl_set(c, saved_c_appl);
497 ast_channel_data_set(c, saved_c_data);
498 return res;
499}
void ast_channel_appl_set(struct ast_channel *chan, const char *value)
const char * ast_channel_data(const struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2970
void ast_channel_data_set(struct ast_channel *chan, const char *value)
const char * ast_channel_appl(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2971
struct ast_module_user * __ast_module_user_add(struct ast_module *, struct ast_channel *)
Definition: loader.c:809
void __ast_module_user_remove(struct ast_module *, struct ast_module_user *)
Definition: loader.c:835
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
static struct test_val c

References __ast_module_user_add(), __ast_module_user_remove(), app, ast_channel_appl(), ast_channel_appl_set(), ast_channel_data(), ast_channel_data_set(), ast_channel_lock, ast_channel_publish_snapshot(), ast_channel_unlock, c, NULL, and S_OR.

Referenced by aelsub_exec(), ari_channel_thread(), ari_originate_dial(), ast_pbx_exec_application(), AST_TEST_DEFINE(), bridge_stasis_run_cb(), conf_run(), conf_start_record(), exec_exec(), execif_exec(), forward_message(), handle_exec(), iax2_exec(), lua_pbx_exec(), page_exec(), pbx_extension_helper(), pbx_outgoing_exec(), realtime_exec(), try_calling(), and tryexec_exec().

◆ pbx_findapp()

struct ast_app * pbx_findapp ( const char *  app)

Look up an application.

Parameters
appname of the app

This function searches for the ast_app structure within the apps that are registered for the one with the name you passed in.

Returns
the ast_app structure that matches on success, or NULL on failure

Definition at line 92 of file pbx_app.c.

93{
94 struct ast_app *ret;
95
99
100 return ret;
101}

References app, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, and pbx_findapp_nolock().

Referenced by ast_pbx_exec_application().

◆ pbx_findapp_nolock()

static struct ast_app * pbx_findapp_nolock ( const char *  name)
static

Definition at line 70 of file pbx_app.c.

71{
72 struct ast_app *cur;
73 int cmp;
74
75 AST_RWLIST_TRAVERSE(&apps, cur, list) {
76 cmp = strcasecmp(name, cur->name);
77 if (cmp > 0) {
78 continue;
79 }
80 if (!cmp) {
81 /* Found it. */
82 break;
83 }
84 /* Not in container. */
85 cur = NULL;
86 break;
87 }
88
89 return cur;
90}
static const char name[]
Definition: format_mp3.c:68

References AST_RWLIST_TRAVERSE, name, and NULL.

Referenced by ast_register_application2(), and pbx_findapp().

◆ print_app_docs()

static void print_app_docs ( struct ast_app aa,
int  fd 
)
static

Definition at line 198 of file pbx_app.c.

199{
200 char *synopsis = NULL, *since = NULL, *description = NULL, *syntax = NULL, *arguments = NULL, *seealso = NULL;
201
202#ifdef AST_XML_DOCS
203 if (aa->docsrc == AST_XML_DOC) {
204 synopsis = ast_xmldoc_printable(S_OR(aa->synopsis, "Not available"), 1);
205 since = ast_xmldoc_printable(S_OR(aa->since, "Not available"), 1);
206 description = ast_xmldoc_printable(S_OR(aa->description, "Not available"), 1);
207 syntax = ast_xmldoc_printable(S_OR(aa->syntax, "Not available"), 1);
208 arguments = ast_xmldoc_printable(S_OR(aa->arguments, "Not available"), 1);
209 seealso = ast_xmldoc_printable(S_OR(aa->seealso, "Not available"), 1);
210 } else
211#endif
212 {
213 synopsis = ast_strdup(S_OR(aa->synopsis, "Not Available"));
214 since = ast_strdup(S_OR(aa->since, "Not Available"));
215 description = ast_strdup(S_OR(aa->description, "Not Available"));
216 syntax = ast_strdup(S_OR(aa->syntax, "Not Available"));
217 arguments = ast_strdup(S_OR(aa->arguments, "Not Available"));
218 seealso = ast_strdup(S_OR(aa->seealso, "Not Available"));
219 }
220 /* check allocated memory. */
221 if (!synopsis || !since || !description || !syntax || !arguments || !seealso) {
222 goto free_docs;
223 }
224
225 ast_cli(fd, "\n"
226 "%s -= Info about Application '%s' =- %s\n\n"
227 COLORIZE_FMT "\n"
228 "%s\n\n"
229 COLORIZE_FMT "\n"
230 "%s\n\n"
231 COLORIZE_FMT "\n"
232 "%s\n\n"
233 COLORIZE_FMT "\n"
234 "%s\n\n"
235 COLORIZE_FMT "\n"
236 "%s\n\n"
237 COLORIZE_FMT "\n"
238 "%s\n\n",
240 COLORIZE(COLOR_MAGENTA, 0, "[Synopsis]"), synopsis,
241 COLORIZE(COLOR_MAGENTA, 0, "[Since]"), since,
242 COLORIZE(COLOR_MAGENTA, 0, "[Description]"), description,
243 COLORIZE(COLOR_MAGENTA, 0, "[Syntax]"), syntax,
244 COLORIZE(COLOR_MAGENTA, 0, "[Arguments]"), arguments,
245 COLORIZE(COLOR_MAGENTA, 0, "[See Also]"), seealso
246 );
247
248free_docs:
250 ast_free(since);
251 ast_free(description);
252 ast_free(syntax);
253 ast_free(arguments);
254 ast_free(seealso);
255}
const char * ast_term_reset(void)
Returns the terminal reset code.
Definition: term.c:357
#define COLOR_MAGENTA
Definition: term.h:60
const char * ast_term_color(int fgcolor, int bgcolor)
Return a color sequence string.
Definition: term.c:341
char * ast_xmldoc_printable(const char *bwinput, int withcolors)
Colorize and put delimiters (instead of tags) to the xmldoc output.
Definition: xmldoc.c:241

References ast_app::arguments, ast_cli(), ast_free, ast_strdup, ast_term_color(), ast_term_reset(), AST_XML_DOC, ast_xmldoc_printable(), COLOR_MAGENTA, COLORIZE, COLORIZE_FMT, ast_app::description, ast_app::docsrc, NULL, S_OR, ast_app::seealso, ast_app::since, synopsis, ast_app::synopsis, and ast_app::syntax.

Referenced by handle_show_application().

◆ unload_pbx_app()

static void unload_pbx_app ( void  )
static

Definition at line 533 of file pbx_app.c.

534{
536}
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30

References app_cli, ARRAY_LEN, and ast_cli_unregister_multiple().

Referenced by load_pbx_app().

Variable Documentation

◆ app_cli

struct ast_cli_entry app_cli[]
static
Initial value:
= {
{ .handler = handle_show_applications , .summary = "Shows registered dialplan applications" ,},
{ .handler = handle_show_application , .summary = "Describe a specific dialplan application" ,},
}
static char * handle_show_application(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
'show application' CLI command implementation function...
Definition: pbx_app.c:260
static char * handle_show_applications(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition: pbx_app.c:310

Definition at line 528 of file pbx_app.c.

Referenced by load_pbx_app(), and unload_pbx_app().

◆ apps

struct apps apps = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
static