loader: Create ast_module_running_ref.

This function returns NULL if the module in question is not running.  I
did not change ast_module_ref as most callers do not check the result
and they always call ast_module_unref.

Make use of this function when running registered items from:
* app_stack API's
* bridge technologies
* CLI commands
* File formats
* Manager Actions
* RTP engines
* Sorcery Wizards
* Timing Interfaces
* Translators
* AGI Commands
* Fax Technologies

ASTERISK-20346 #close

Change-Id: Ia16fd28e188b2fc0b9d18b8a5d9cacc31df73fcc
This commit is contained in:
Corey Farrell
2017-12-29 19:24:02 -05:00
parent 7f4facc5e4
commit 55f1d69c43
13 changed files with 161 additions and 80 deletions

View File

@@ -2679,9 +2679,12 @@ static char *__ast_cli_generator(const char *text, const char *word, int state,
.n = state - matchnum,
.argv = argv,
.argc = x};
ast_module_ref(e->module);
ret = e->handler(e, CLI_GENERATE, &a);
ast_module_unref(e->module);
/* If the command is in a module it must be running. */
if (!e->module || ast_module_running_ref(e->module)) {
ret = e->handler(e, CLI_GENERATE, &a);
ast_module_unref(e->module);
}
}
if (ret)
break;
@@ -2760,9 +2763,11 @@ int ast_cli_command_full(int uid, int gid, int fd, const char *s)
*/
args[0] = (char *)e;
ast_module_ref(e->module);
retval = e->handler(e, CLI_HANDLER, &a);
ast_module_unref(e->module);
/* If the command is in a module it must be running. */
if (!e->module || ast_module_running_ref(e->module)) {
retval = e->handler(e, CLI_HANDLER, &a);
ast_module_unref(e->module);
}
if (retval == CLI_SHOWUSAGE) {
ast_cli(fd, "%s", S_OR(e->usage, "Invalid usage, but no usage information available.\n"));