mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 03:20:57 +00:00
func_periodic_hook.c: Cleanup module resources on failure.
* Make load_module() cleanup if it failed to setup the module. * Make unload_module() always return 0. It is silly to fail unloading if the hook function we try to unregister was not even registered. Change-Id: I280fc6e8ba2a7ee2588ca01d870eebaf74b4ffe6
This commit is contained in:
@@ -450,7 +450,8 @@ static int unload_module(void)
|
|||||||
{
|
{
|
||||||
ast_context_destroy(NULL, AST_MODULE);
|
ast_context_destroy(NULL, AST_MODULE);
|
||||||
|
|
||||||
return ast_custom_function_unregister(&hook_function);
|
ast_custom_function_unregister(&hook_function);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int load_module(void)
|
static int load_module(void)
|
||||||
@@ -465,37 +466,40 @@ static int load_module(void)
|
|||||||
/*
|
/*
|
||||||
* Based on a handy recipe from the Asterisk Cookbook.
|
* Based on a handy recipe from the Asterisk Cookbook.
|
||||||
*/
|
*/
|
||||||
ast_add_extension(context_name, 1, exten_name, 1, "", "",
|
res = ast_add_extension(context_name, 1, exten_name, 1, "", "",
|
||||||
"Set", "EncodedChannel=${CUT(HOOK_CHANNEL,-,1-2)}",
|
"Set", "EncodedChannel=${CUT(HOOK_CHANNEL,-,1-2)}",
|
||||||
NULL, AST_MODULE);
|
NULL, AST_MODULE);
|
||||||
ast_add_extension(context_name, 1, exten_name, 2, "", "",
|
res |= ast_add_extension(context_name, 1, exten_name, 2, "", "",
|
||||||
"Set", "GROUP_NAME=${EncodedChannel}${HOOK_ID}",
|
"Set", "GROUP_NAME=${EncodedChannel}${HOOK_ID}",
|
||||||
NULL, AST_MODULE);
|
NULL, AST_MODULE);
|
||||||
ast_add_extension(context_name, 1, exten_name, 3, "", "",
|
res |= ast_add_extension(context_name, 1, exten_name, 3, "", "",
|
||||||
"Set", "GROUP(periodic-hook)=${GROUP_NAME}",
|
"Set", "GROUP(periodic-hook)=${GROUP_NAME}",
|
||||||
NULL, AST_MODULE);
|
NULL, AST_MODULE);
|
||||||
ast_add_extension(context_name, 1, exten_name, 4, "", "", "ExecIf",
|
res |= ast_add_extension(context_name, 1, exten_name, 4, "", "", "ExecIf",
|
||||||
"$[${GROUP_COUNT(${GROUP_NAME}@periodic-hook)} > 1]?Hangup()",
|
"$[${GROUP_COUNT(${GROUP_NAME}@periodic-hook)} > 1]?Hangup()",
|
||||||
NULL, AST_MODULE);
|
NULL, AST_MODULE);
|
||||||
ast_add_extension(context_name, 1, exten_name, 5, "", "",
|
res |= ast_add_extension(context_name, 1, exten_name, 5, "", "",
|
||||||
"Set", "ChannelToSpy=${URIDECODE(${EncodedChannel})}",
|
"Set", "ChannelToSpy=${URIDECODE(${EncodedChannel})}",
|
||||||
NULL, AST_MODULE);
|
NULL, AST_MODULE);
|
||||||
ast_add_extension(context_name, 1, exten_name, 6, "", "",
|
res |= ast_add_extension(context_name, 1, exten_name, 6, "", "",
|
||||||
"ChanSpy", "${ChannelToSpy},qEB", NULL, AST_MODULE);
|
"ChanSpy", "${ChannelToSpy},qEB", NULL, AST_MODULE);
|
||||||
|
|
||||||
res = ast_add_extension(context_name, 1, beep_exten, 1, "", "",
|
res |= ast_add_extension(context_name, 1, beep_exten, 1, "", "",
|
||||||
"Answer", "", NULL, AST_MODULE);
|
"Answer", "", NULL, AST_MODULE);
|
||||||
res |= ast_add_extension(context_name, 1, beep_exten, 2, "", "",
|
res |= ast_add_extension(context_name, 1, beep_exten, 2, "", "",
|
||||||
"Playback", "beep", NULL, AST_MODULE);
|
"Playback", "beep", NULL, AST_MODULE);
|
||||||
|
|
||||||
res = ast_custom_function_register_escalating(&hook_function, AST_CFE_BOTH);
|
res |= ast_custom_function_register_escalating(&hook_function, AST_CFE_BOTH);
|
||||||
|
|
||||||
if (!res) {
|
if (res) {
|
||||||
/* For Optional API. */
|
unload_module();
|
||||||
ast_module_shutdown_ref(ast_module_info->self);
|
return AST_MODULE_LOAD_DECLINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
|
/* For Optional API. */
|
||||||
|
ast_module_shutdown_ref(ast_module_info->self);
|
||||||
|
|
||||||
|
return AST_MODULE_LOAD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AST_OPTIONAL_API_NAME(ast_beep_start)(struct ast_channel *chan,
|
int AST_OPTIONAL_API_NAME(ast_beep_start)(struct ast_channel *chan,
|
||||||
|
Reference in New Issue
Block a user