func_periodic_hook.c: Cleanup module resources on failure.
[asterisk/asterisk.git] / funcs / func_periodic_hook.c
index 1f66747..31c534c 100644 (file)
@@ -446,7 +446,8 @@ static int unload_module(void)
 {
        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)
@@ -461,32 +462,36 @@ static int load_module(void)
        /*
         * 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)}",
                        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}",
                        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}",
                        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()",
                        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})}",
                        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);
 
-       res = ast_add_extension(context_name, 1, beep_exten, 1, "", "",
+       res |= ast_add_extension(context_name, 1, beep_exten, 1, "", "",
                        "Answer", "", NULL, AST_MODULE);
        res |= ast_add_extension(context_name, 1, beep_exten, 2, "", "",
                        "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);
 
-       return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
+       if (res) {
+               unload_module();
+               return AST_MODULE_LOAD_DECLINE;
+       }
+       return AST_MODULE_LOAD_SUCCESS;
 }
 
 int AST_OPTIONAL_API_NAME(ast_beep_start)(struct ast_channel *chan,