From: George Joseph Date: Tue, 11 Apr 2017 16:07:39 +0000 (-0600) Subject: modules: change module LOAD_FAILUREs to LOAD_DECLINES X-Git-Tag: 13.16.0-rc1~46^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f882ca25722b6290dc6e8d786452b0b26adceed1;p=thirdparty%2Fasterisk.git modules: change module LOAD_FAILUREs to LOAD_DECLINES In all non-pbx modules, AST_MODULE_LOAD_FAILURE has been changed to AST_MODULE_LOAD_DECLINE. This prevents asterisk from exiting if a module can't be loaded. If the user wishes to retain the FAILURE behavior for a specific module, they can use the "require" or "preload-require" keyword in modules.conf. A new API was added to logger: ast_is_logger_initialized(). This allows asterisk.c/check_init() to print to the error log once the logger subsystem is ready instead of just to stdout. If something does fail before the logger is initialized, we now print to stderr instead of stdout. Change-Id: I5f4b50623d9b5a6cb7c5624a8c5c1274c13b2b25 --- diff --git a/addons/cdr_mysql.c b/addons/cdr_mysql.c index 4621143fe1..70dab1ae4a 100644 --- a/addons/cdr_mysql.c +++ b/addons/cdr_mysql.c @@ -358,9 +358,20 @@ db_reconnect: return 0; } +static void free_strings(void) +{ + struct unload_string *us; + + AST_LIST_LOCK(&unload_strings); + while ((us = AST_LIST_REMOVE_HEAD(&unload_strings, entry))) { + ast_free(us->str); + ast_free(us); + } + AST_LIST_UNLOCK(&unload_strings); +} + static int my_unload_module(int reload) { - struct unload_string *us; struct column *entry; ast_cli_unregister_multiple(cdr_mysql_status_cli, sizeof(cdr_mysql_status_cli) / sizeof(struct ast_cli_entry)); @@ -371,12 +382,7 @@ static int my_unload_module(int reload) records = 0; } - AST_LIST_LOCK(&unload_strings); - while ((us = AST_LIST_REMOVE_HEAD(&unload_strings, entry))) { - ast_free(us->str); - ast_free(us); - } - AST_LIST_UNLOCK(&unload_strings); + free_strings(); if (!reload) { AST_RWLIST_WRLOCK(&columns); @@ -512,13 +518,16 @@ static int my_load_module(int reload) } else { calldate_compat = 0; } + ast_free(compat); if (res < 0) { if (reload) { AST_RWLIST_UNLOCK(&columns); } ast_config_destroy(cfg); - return AST_MODULE_LOAD_FAILURE; + free_strings(); + + return AST_MODULE_LOAD_DECLINE; } /* Check for any aliases */ @@ -589,7 +598,9 @@ static int my_load_module(int reload) connected = 0; AST_RWLIST_UNLOCK(&columns); ast_config_destroy(cfg); - return AST_MODULE_LOAD_FAILURE; + free_strings(); + + return AST_MODULE_LOAD_DECLINE; } if (!(result = mysql_store_result(&mysql))) { @@ -598,7 +609,9 @@ static int my_load_module(int reload) connected = 0; AST_RWLIST_UNLOCK(&columns); ast_config_destroy(cfg); - return AST_MODULE_LOAD_FAILURE; + free_strings(); + + return AST_MODULE_LOAD_DECLINE; } while ((row = mysql_fetch_row(result))) { @@ -664,7 +677,8 @@ static int my_load_module(int reload) AST_RWLIST_UNLOCK(&columns); ast_config_destroy(cfg); if (res < 0) { - return AST_MODULE_LOAD_FAILURE; + my_unload_module(0); + return AST_MODULE_LOAD_DECLINE; } if (!reload) { @@ -678,7 +692,12 @@ static int my_load_module(int reload) res = ast_cli_register_multiple(cdr_mysql_status_cli, sizeof(cdr_mysql_status_cli) / sizeof(struct ast_cli_entry)); } - return res; + if (res) { + my_unload_module(0); + return AST_MODULE_LOAD_DECLINE; + } + + return AST_MODULE_LOAD_SUCCESS; } static int load_module(void) diff --git a/addons/chan_mobile.c b/addons/chan_mobile.c index 7077704b0c..f9fe9524b2 100644 --- a/addons/chan_mobile.c +++ b/addons/chan_mobile.c @@ -4706,9 +4706,13 @@ static int load_module(void) ast_format_cap_append(mbl_tech.capabilities, DEVICE_FRAME_FORMAT, 0); /* Check if we have Bluetooth, no point loading otherwise... */ dev_id = hci_get_route(NULL); + s = hci_open_dev(dev_id); if (dev_id < 0 || s < 0) { ast_log(LOG_ERROR, "No Bluetooth devices found. Not loading module.\n"); + ao2_ref(mbl_tech.capabilities, -1); + mbl_tech.capabilities = NULL; + hci_close_dev(s); return AST_MODULE_LOAD_DECLINE; } @@ -4716,6 +4720,8 @@ static int load_module(void) if (mbl_load_config()) { ast_log(LOG_ERROR, "Errors reading config file %s. Not loading module.\n", MBL_CONFIG); + ao2_ref(mbl_tech.capabilities, -1); + mbl_tech.capabilities = NULL; return AST_MODULE_LOAD_DECLINE; } @@ -4740,10 +4746,9 @@ static int load_module(void) return AST_MODULE_LOAD_SUCCESS; e_cleanup: - if (sdp_session) - sdp_close(sdp_session); + unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Bluetooth Mobile Device Channel Driver", diff --git a/apps/app_adsiprog.c b/apps/app_adsiprog.c index efe1aa3696..640f553a4f 100644 --- a/apps/app_adsiprog.c +++ b/apps/app_adsiprog.c @@ -1607,7 +1607,7 @@ static int unload_module(void) static int load_module(void) { if (ast_register_application_xml(app, adsi_exec)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/apps/app_agent_pool.c b/apps/app_agent_pool.c index a8f2d2c1bd..dfaeb55942 100644 --- a/apps/app_agent_pool.c +++ b/apps/app_agent_pool.c @@ -2655,7 +2655,7 @@ static int load_module(void) agents = ao2_container_alloc_rbtree(AO2_ALLOC_OPT_LOCK_MUTEX, AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE, agent_pvt_sort_cmp, agent_pvt_cmp); if (!agents) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* Init agent holding bridge v_table. */ @@ -2679,8 +2679,9 @@ static int load_module(void) res |= ast_register_application_xml(app_agent_request, agent_request_exec); if (res) { + ast_log(LOG_ERROR, "Unable to register application. Not loading module.\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (load_config()) { diff --git a/apps/app_alarmreceiver.c b/apps/app_alarmreceiver.c index aaf956ff2d..ab28225e3e 100644 --- a/apps/app_alarmreceiver.c +++ b/apps/app_alarmreceiver.c @@ -977,7 +977,7 @@ static int load_module(void) { if (load_config(0)) { if (ast_register_application_xml(app, alarmreceiver_exec)) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } diff --git a/apps/app_authenticate.c b/apps/app_authenticate.c index a8370588b8..53d0e484cd 100644 --- a/apps/app_authenticate.c +++ b/apps/app_authenticate.c @@ -272,7 +272,7 @@ static int unload_module(void) static int load_module(void) { if (ast_register_application_xml(app, auth_exec)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/apps/app_cdr.c b/apps/app_cdr.c index bf4961a537..93510f8a15 100644 --- a/apps/app_cdr.c +++ b/apps/app_cdr.c @@ -251,7 +251,7 @@ static int load_module(void) int res = 0; if (!router) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } res |= STASIS_MESSAGE_TYPE_INIT(appcdr_message_type); @@ -261,7 +261,8 @@ static int load_module(void) appcdr_callback, NULL); if (res) { - return AST_MODULE_LOAD_FAILURE; + unload_module(); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c index f3b6976353..fed44a6162 100644 --- a/apps/app_confbridge.c +++ b/apps/app_confbridge.c @@ -3932,7 +3932,7 @@ static int load_module(void) if (register_channel_tech(conf_record_get_tech()) || register_channel_tech(conf_announce_get_tech())) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* Create a container to hold the conference bridges */ @@ -3940,7 +3940,7 @@ static int load_module(void) conference_bridge_hash_cb, conference_bridge_cmp_cb); if (!conference_bridges) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* Setup manager stasis subscriptions */ @@ -3965,7 +3965,7 @@ static int load_module(void) res |= ast_manager_register_xml("ConfbridgeSetSingleVideoSrc", EVENT_FLAG_CALL, action_confbridgesetsinglevideosrc); if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/apps/app_dahdiras.c b/apps/app_dahdiras.c index 701904beb2..bd0a58fca5 100644 --- a/apps/app_dahdiras.c +++ b/apps/app_dahdiras.c @@ -230,7 +230,7 @@ static int unload_module(void) static int load_module(void) { - return ((ast_register_application_xml(app, dahdiras_exec)) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS); + return ((ast_register_application_xml(app, dahdiras_exec)) ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS); } AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "DAHDI ISDN Remote Access Server"); diff --git a/apps/app_forkcdr.c b/apps/app_forkcdr.c index bbd15881a5..d3c92a0fc3 100644 --- a/apps/app_forkcdr.c +++ b/apps/app_forkcdr.c @@ -201,7 +201,7 @@ static int load_module(void) int res = 0; if (!router) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } res |= STASIS_MESSAGE_TYPE_INIT(forkcdr_message_type); @@ -210,7 +210,9 @@ static int load_module(void) forkcdr_callback, NULL); if (res) { - return AST_MODULE_LOAD_FAILURE; + unload_module(); + + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } diff --git a/apps/app_queue.c b/apps/app_queue.c index 9eca4ed730..7d36187a09 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -8753,7 +8753,7 @@ static int reload_queue_rules(int reload) if (!(new_rl = ast_calloc(1, sizeof(*new_rl)))) { AST_LIST_UNLOCK(&rule_lists); ast_config_destroy(cfg); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } else { ast_copy_string(new_rl->name, rulecat, sizeof(new_rl->name)); AST_LIST_INSERT_TAIL(&rule_lists, new_rl, list); diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 6fad47c9e4..b2375341a4 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -14897,7 +14897,7 @@ static int load_module(void) umask(my_umask); if (!(inprocess_container = ao2_container_alloc(573, inprocess_hash_fn, inprocess_cmp_fn))) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* compute the location of the voicemail spool directory */ diff --git a/apps/app_zapateller.c b/apps/app_zapateller.c index 8e966e954c..ccdeba2b74 100644 --- a/apps/app_zapateller.c +++ b/apps/app_zapateller.c @@ -134,7 +134,7 @@ static int unload_module(void) static int load_module(void) { - return ((ast_register_application_xml(app, zapateller_exec)) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS); + return ((ast_register_application_xml(app, zapateller_exec)) ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS); } AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Block Telemarketers with Special Information Tone"); diff --git a/cdr/cdr_custom.c b/cdr/cdr_custom.c index 6ef2cb094e..eb34ba06ad 100644 --- a/cdr/cdr_custom.c +++ b/cdr/cdr_custom.c @@ -205,7 +205,7 @@ static enum ast_module_load_result load_module(void) { if (AST_RWLIST_WRLOCK(&sinks)) { ast_log(LOG_ERROR, "Unable to lock sink list. Load failed.\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } load_config(); @@ -218,7 +218,7 @@ static int reload(void) { if (AST_RWLIST_WRLOCK(&sinks)) { ast_log(LOG_ERROR, "Unable to lock sink list. Load failed.\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } free_config(); diff --git a/cel/cel_custom.c b/cel/cel_custom.c index 0b2ac764f7..9f480b8d79 100644 --- a/cel/cel_custom.c +++ b/cel/cel_custom.c @@ -193,14 +193,15 @@ static enum ast_module_load_result load_module(void) { if (AST_RWLIST_WRLOCK(&sinks)) { ast_log(LOG_ERROR, "Unable to lock sink list. Load failed.\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } load_config(); AST_RWLIST_UNLOCK(&sinks); if (ast_cel_backend_register(CUSTOM_BACKEND_NAME, custom_log)) { - return AST_MODULE_LOAD_FAILURE; + free_config(); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } @@ -209,7 +210,7 @@ static int reload(void) { if (AST_RWLIST_WRLOCK(&sinks)) { ast_log(LOG_ERROR, "Unable to lock sink list. Load failed.\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } free_config(); diff --git a/cel/cel_odbc.c b/cel/cel_odbc.c index 701883bceb..188123167b 100644 --- a/cel/cel_odbc.c +++ b/cel/cel_odbc.c @@ -810,13 +810,14 @@ static int load_module(void) if (AST_RWLIST_WRLOCK(&odbc_tables)) { ast_log(LOG_ERROR, "Unable to lock column list. Load failed.\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } load_config(); AST_RWLIST_UNLOCK(&odbc_tables); if (ast_cel_backend_register(ODBC_BACKEND_NAME, odbc_log)) { ast_log(LOG_ERROR, "Unable to subscribe to CEL events\n"); - return AST_MODULE_LOAD_FAILURE; + free_config(); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } @@ -825,7 +826,7 @@ static int reload(void) { if (AST_RWLIST_WRLOCK(&odbc_tables)) { ast_log(LOG_ERROR, "Unable to lock column list. Reload failed.\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } free_config(); diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c index 61ea2e7194..0f61d7c032 100644 --- a/channels/chan_alsa.c +++ b/channels/chan_alsa.c @@ -926,6 +926,26 @@ static struct ast_cli_entry cli_alsa[] = { AST_CLI_DEFINE(console_mute, "Disable/Enable mic input"), }; +static int unload_module(void) +{ + ast_channel_unregister(&alsa_tech); + ast_cli_unregister_multiple(cli_alsa, ARRAY_LEN(cli_alsa)); + + if (alsa.icard) + snd_pcm_close(alsa.icard); + if (alsa.ocard) + snd_pcm_close(alsa.ocard); + if (alsa.owner) + ast_softhangup(alsa.owner, AST_SOFTHANGUP_APPUNLOAD); + if (alsa.owner) + return -1; + + ao2_cleanup(alsa_tech.capabilities); + alsa_tech.capabilities = NULL; + + return 0; +} + /*! * \brief Load the module * @@ -996,12 +1016,16 @@ static int load_module(void) if (soundcard_init() < 0) { ast_verb(2, "No sound card detected -- console channel will be unavailable\n"); ast_verb(2, "Turn off ALSA support by adding 'noload=chan_alsa.so' in /etc/asterisk/modules.conf\n"); + unload_module(); + return AST_MODULE_LOAD_DECLINE; } if (ast_channel_register(&alsa_tech)) { ast_log(LOG_ERROR, "Unable to register channel class 'Console'\n"); - return AST_MODULE_LOAD_FAILURE; + unload_module(); + + return AST_MODULE_LOAD_DECLINE; } ast_cli_register_multiple(cli_alsa, ARRAY_LEN(cli_alsa)); @@ -1009,26 +1033,6 @@ static int load_module(void) return AST_MODULE_LOAD_SUCCESS; } -static int unload_module(void) -{ - ast_channel_unregister(&alsa_tech); - ast_cli_unregister_multiple(cli_alsa, ARRAY_LEN(cli_alsa)); - - if (alsa.icard) - snd_pcm_close(alsa.icard); - if (alsa.ocard) - snd_pcm_close(alsa.ocard); - if (alsa.owner) - ast_softhangup(alsa.owner, AST_SOFTHANGUP_APPUNLOAD); - if (alsa.owner) - return -1; - - ao2_cleanup(alsa_tech.capabilities); - alsa_tech.capabilities = NULL; - - return 0; -} - AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "ALSA Console Channel Driver", .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 6d740d064b..62a86f0d85 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -19609,11 +19609,11 @@ static int load_module(void) #endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */ if (STASIS_MESSAGE_TYPE_INIT(dahdichannel_type)) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(dahdi_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_format_cap_append(dahdi_tech.capabilities, ast_format_slin, 0); ast_format_cap_append(dahdi_tech.capabilities, ast_format_ulaw, 0); @@ -19621,7 +19621,7 @@ static int load_module(void) if (dahdi_native_load(ast_module_info->self, &dahdi_tech)) { ao2_ref(dahdi_tech.capabilities, -1); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } #ifdef HAVE_PRI @@ -19639,7 +19639,7 @@ static int load_module(void) if (ast_cc_agent_register(&dahdi_pri_cc_agent_callbacks) || ast_cc_monitor_register(&dahdi_pri_cc_monitor_callbacks)) { __unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } #endif /* defined(HAVE_PRI_CCSS) */ if (sig_pri_load( @@ -19650,7 +19650,7 @@ static int load_module(void) #endif /* defined(HAVE_PRI_CCSS) */ )) { __unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } #endif #if defined(HAVE_SS7) @@ -19673,7 +19673,7 @@ static int load_module(void) if (ast_channel_register(&dahdi_tech)) { ast_log(LOG_ERROR, "Unable to register channel class 'DAHDI'\n"); __unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } #ifdef HAVE_PRI ast_cli_register_multiple(dahdi_pri_cli, ARRAY_LEN(dahdi_pri_cli)); diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index e8c47ce9f7..67552ce4e6 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -14889,7 +14889,7 @@ container_fail: if (calltoken_ignores) { ao2_ref(calltoken_ignores, -1); } - return AST_MODULE_LOAD_FAILURE; + return -1; } @@ -15094,12 +15094,14 @@ static int load_module(void) struct iax2_registry *reg = NULL; if (!(iax2_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_format_cap_append_by_type(iax2_tech.capabilities, AST_MEDIA_TYPE_UNKNOWN); if (load_objects()) { - return AST_MODULE_LOAD_FAILURE; + ao2_ref(iax2_tech.capabilities, -1); + iax2_tech.capabilities = NULL; + return AST_MODULE_LOAD_DECLINE; } memset(iaxs, 0, sizeof(iaxs)); @@ -15110,28 +15112,36 @@ static int load_module(void) if (!(sched = ast_sched_context_create())) { ast_log(LOG_ERROR, "Failed to create scheduler thread\n"); - return AST_MODULE_LOAD_FAILURE; + ao2_ref(iax2_tech.capabilities, -1); + iax2_tech.capabilities = NULL; + return AST_MODULE_LOAD_DECLINE; } if (ast_sched_start_thread(sched)) { ast_sched_context_destroy(sched); + ao2_ref(iax2_tech.capabilities, -1); + iax2_tech.capabilities = NULL; sched = NULL; - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(io = io_context_create())) { ast_log(LOG_ERROR, "Failed to create I/O context\n"); ast_sched_context_destroy(sched); + ao2_ref(iax2_tech.capabilities, -1); + iax2_tech.capabilities = NULL; sched = NULL; - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(netsock = ast_netsock_list_alloc())) { ast_log(LOG_ERROR, "Failed to create netsock list\n"); io_context_destroy(io); ast_sched_context_destroy(sched); + ao2_ref(iax2_tech.capabilities, -1); + iax2_tech.capabilities = NULL; sched = NULL; - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_netsock_init(netsock); @@ -15140,8 +15150,10 @@ static int load_module(void) ast_log(LOG_ERROR, "Could not allocate outsock list.\n"); io_context_destroy(io); ast_sched_context_destroy(sched); + ao2_ref(iax2_tech.capabilities, -1); + iax2_tech.capabilities = NULL; sched = NULL; - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_netsock_init(outsock); @@ -15160,6 +15172,7 @@ static int load_module(void) ast_timer_close(timer); timer = NULL; } + __unload_module(); return AST_MODULE_LOAD_DECLINE; } @@ -15185,7 +15198,7 @@ static int load_module(void) if (ast_channel_register(&iax2_tech)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", "IAX2"); __unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (ast_register_switch(&iax2_switch)) { @@ -15195,7 +15208,7 @@ static int load_module(void) if (start_network_thread()) { ast_log(LOG_ERROR, "Unable to start network thread\n"); __unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } else { ast_verb(2, "IAX Ready and Listening\n"); } diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index 16ba7ec308..f3fe538a02 100644 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -4851,11 +4851,11 @@ static int reload_config(int reload) static int load_module(void) { if (!(global_capability = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(mgcp_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) { ao2_ref(global_capability, -1); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_format_cap_append(global_capability, ast_format_ulaw, 0); ast_format_cap_append(mgcp_tech.capabilities, ast_format_ulaw, 0); @@ -4864,7 +4864,7 @@ static int load_module(void) ast_log(LOG_WARNING, "Unable to create schedule context\n"); ao2_ref(global_capability, -1); ao2_ref(mgcp_tech.capabilities, -1); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(io = io_context_create())) { @@ -4872,7 +4872,7 @@ static int load_module(void) ast_sched_context_destroy(sched); ao2_ref(global_capability, -1); ao2_ref(mgcp_tech.capabilities, -1); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (reload_config(0)) { @@ -4888,7 +4888,7 @@ static int load_module(void) ast_sched_context_destroy(sched); ao2_ref(global_capability, -1); ao2_ref(mgcp_tech.capabilities, -1); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_rtp_glue_register(&mgcp_rtp_glue); diff --git a/channels/chan_motif.c b/channels/chan_motif.c index 640976f096..4bb84c9a18 100644 --- a/channels/chan_motif.c +++ b/channels/chan_motif.c @@ -2794,7 +2794,7 @@ end: ao2_cleanup(jingle_tech.capabilities); jingle_tech.capabilities = NULL; - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /*! \brief Reload module */ diff --git a/channels/chan_nbs.c b/channels/chan_nbs.c index 2abde61e33..b1ce4c6e98 100644 --- a/channels/chan_nbs.c +++ b/channels/chan_nbs.c @@ -259,12 +259,14 @@ static int unload_module(void) static int load_module(void) { if (!(nbs_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_format_cap_append(nbs_tech.capabilities, ast_format_slin, 0); /* Make sure we can register our channel type */ if (ast_channel_register(&nbs_tech)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); + ao2_ref(nbs_tech.capabilities, -1); + nbs_tech.capabilities = NULL; return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/channels/chan_oss.c b/channels/chan_oss.c index aa870dfc22..4e940f44d1 100644 --- a/channels/chan_oss.c +++ b/channels/chan_oss.c @@ -1437,6 +1437,31 @@ error: #endif } +static int unload_module(void) +{ + struct chan_oss_pvt *o, *next; + + ast_channel_unregister(&oss_tech); + ast_cli_unregister_multiple(cli_oss, ARRAY_LEN(cli_oss)); + + o = oss_default.next; + while (o) { + close(o->sounddev); + if (o->owner) + ast_softhangup(o->owner, AST_SOFTHANGUP_APPUNLOAD); + if (o->owner) + return -1; + next = o->next; + ast_free(o->name); + ast_free(o); + o = next; + } + ao2_cleanup(oss_tech.capabilities); + oss_tech.capabilities = NULL; + + return 0; +} + /*! * \brief Load the module * @@ -1474,12 +1499,12 @@ static int load_module(void) if (find_desc(oss_active) == NULL) { ast_log(LOG_NOTICE, "Device %s not found\n", oss_active); /* XXX we could default to 'dsp' perhaps ? */ - /* XXX should cleanup allocated memory etc. */ - return AST_MODULE_LOAD_FAILURE; + unload_module(); + return AST_MODULE_LOAD_DECLINE; } if (!(oss_tech.capabilities = ast_format_cap_alloc(0))) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_format_cap_append(oss_tech.capabilities, ast_format_slin, 0); @@ -1496,31 +1521,5 @@ static int load_module(void) return AST_MODULE_LOAD_SUCCESS; } - -static int unload_module(void) -{ - struct chan_oss_pvt *o, *next; - - ast_channel_unregister(&oss_tech); - ast_cli_unregister_multiple(cli_oss, ARRAY_LEN(cli_oss)); - - o = oss_default.next; - while (o) { - close(o->sounddev); - if (o->owner) - ast_softhangup(o->owner, AST_SOFTHANGUP_APPUNLOAD); - if (o->owner) - return -1; - next = o->next; - ast_free(o->name); - ast_free(o); - o = next; - } - ao2_cleanup(oss_tech.capabilities); - oss_tech.capabilities = NULL; - - return 0; -} - AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "OSS Console Channel Driver"); diff --git a/channels/chan_phone.c b/channels/chan_phone.c index 451d9f261e..b418b282b5 100644 --- a/channels/chan_phone.c +++ b/channels/chan_phone.c @@ -1418,7 +1418,7 @@ static int load_module(void) if (ast_mutex_lock(&iflock)) { /* It's a little silly to lock it, but we mind as well just to be sure */ ast_log(LOG_ERROR, "Unable to lock interface list???\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } v = ast_variable_browse(cfg, "interfaces"); while(v) { @@ -1434,7 +1434,7 @@ static int load_module(void) ast_config_destroy(cfg); ast_mutex_unlock(&iflock); __unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } } else if (!strcasecmp(v->name, "silencesupression")) { silencesupression = ast_true(v->value); @@ -1510,7 +1510,7 @@ static int load_module(void) ast_log(LOG_ERROR, "Unable to register channel class 'Phone'\n"); ast_config_destroy(cfg); __unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_config_destroy(cfg); /* And start the monitor for the first time */ diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 8a1921c828..0ca84d0140 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -2702,7 +2702,7 @@ end: ast_channel_unregister(&chan_pjsip_tech); ast_rtp_glue_unregister(&chan_pjsip_rtp_glue); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /*! \brief Unload the PJSIP channel from Asterisk */ diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 96c3b8026f..2ba52ab7d3 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -35197,17 +35197,17 @@ static int load_module(void) if (STASIS_MESSAGE_TYPE_INIT(session_timeout_type)) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(sip_tech.capabilities = ast_format_cap_alloc(0))) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (ast_sip_api_provider_register(&chan_sip_api_provider)) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* the fact that ao2_containers can't resize automatically is a major worry! */ @@ -35222,12 +35222,12 @@ static int load_module(void) || !threadt) { ast_log(LOG_ERROR, "Unable to create primary SIP container(s)\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(sip_cfg.caps = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_format_cap_append_by_type(sip_tech.capabilities, AST_MEDIA_TYPE_AUDIO); @@ -35238,13 +35238,13 @@ static int load_module(void) if (!(sched = ast_sched_context_create())) { ast_log(LOG_ERROR, "Unable to create scheduler context\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(io = io_context_create())) { ast_log(LOG_ERROR, "Unable to create I/O context\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } sip_reloadreason = CHANNEL_MODULE_LOAD; @@ -35259,7 +35259,7 @@ static int load_module(void) if (!(bogus_peer = temp_peer("(bogus_peer)"))) { ast_log(LOG_ERROR, "Unable to create bogus_peer for authentication\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* Make sure the auth will always fail. */ ast_string_field_set(bogus_peer, md5secret, BOGUS_PEER_MD5SECRET); @@ -35276,14 +35276,14 @@ static int load_module(void) if (ast_msg_tech_register(&sip_msg_tech)) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* Make sure we can register our sip channel type */ if (ast_channel_register(&sip_tech)) { ast_log(LOG_ERROR, "Unable to register channel type 'SIP'\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } #ifdef TEST_FRAMEWORK diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 9c84eec30f..2c40748a1f 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -8694,7 +8694,7 @@ static int load_module(void) ao2_ref(skinny_tech.capabilities, -1); ao2_ref(default_cap, -1); ast_log(LOG_WARNING, "Unable to create schedule context\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* Make sure we can register our skinny channel type */ @@ -8702,7 +8702,7 @@ static int load_module(void) ao2_ref(default_cap, -1); ao2_ref(skinny_tech.capabilities, -1); ast_log(LOG_ERROR, "Unable to register channel class 'Skinny'\n"); - return -1; + return AST_MODULE_LOAD_DECLINE; } ast_rtp_glue_register(&skinny_rtp_glue); @@ -8719,7 +8719,7 @@ static int load_module(void) ast_channel_unregister(&skinny_tech); ao2_ref(default_cap, -1); ao2_ref(skinny_tech.capabilities, -1); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/channels/chan_unistim.c b/channels/chan_unistim.c index abcc4ed674..029ce91a38 100644 --- a/channels/chan_unistim.c +++ b/channels/chan_unistim.c @@ -7119,7 +7119,7 @@ buff_failed: global_cap = NULL; ao2_cleanup(unistim_tech.capabilities); unistim_tech.capabilities = NULL; - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } static int unload_module(void) diff --git a/codecs/codec_a_mu.c b/codecs/codec_a_mu.c index c21c706f50..ec8d236220 100644 --- a/codecs/codec_a_mu.c +++ b/codecs/codec_a_mu.c @@ -143,7 +143,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_adpcm.c b/codecs/codec_adpcm.c index 6b64f86935..924ec7650d 100644 --- a/codecs/codec_adpcm.c +++ b/codecs/codec_adpcm.c @@ -348,7 +348,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_alaw.c b/codecs/codec_alaw.c index de9c4c4be2..0a4d4b8f64 100644 --- a/codecs/codec_alaw.c +++ b/codecs/codec_alaw.c @@ -132,7 +132,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_g722.c b/codecs/codec_g722.c index e262ebd719..feca8a0bef 100644 --- a/codecs/codec_g722.c +++ b/codecs/codec_g722.c @@ -243,7 +243,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_g726.c b/codecs/codec_g726.c index 1954c5134d..8fb1fd10b2 100644 --- a/codecs/codec_g726.c +++ b/codecs/codec_g726.c @@ -892,7 +892,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_gsm.c b/codecs/codec_gsm.c index a18dc0abe7..b3c21912c4 100644 --- a/codecs/codec_gsm.c +++ b/codecs/codec_gsm.c @@ -241,7 +241,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_ilbc.c b/codecs/codec_ilbc.c index 2646f49bd1..026fe9ad80 100644 --- a/codecs/codec_ilbc.c +++ b/codecs/codec_ilbc.c @@ -248,7 +248,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_lpc10.c b/codecs/codec_lpc10.c index a62eed3a8f..df59dd7569 100644 --- a/codecs/codec_lpc10.c +++ b/codecs/codec_lpc10.c @@ -274,7 +274,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_resample.c b/codecs/codec_resample.c index 9eda242cc9..03f068323b 100644 --- a/codecs/codec_resample.c +++ b/codecs/codec_resample.c @@ -155,7 +155,7 @@ static int load_module(void) trans_size = ARRAY_LEN(codec_list) * (ARRAY_LEN(codec_list) - 1); if (!(translators = ast_calloc(1, sizeof(struct ast_translator) * trans_size))) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } for (x = 0; x < ARRAY_LEN(codec_list); x++) { @@ -182,7 +182,7 @@ static int load_module(void) ast_unregister_translator won't fail.*/ if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/codecs/codec_ulaw.c b/codecs/codec_ulaw.c index 58c0a895e1..2246c4b57c 100644 --- a/codecs/codec_ulaw.c +++ b/codecs/codec_ulaw.c @@ -183,7 +183,7 @@ static int load_module(void) if (res) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/formats/format_g723.c b/formats/format_g723.c index 6d0b96337b..926c65b74f 100644 --- a/formats/format_g723.c +++ b/formats/format_g723.c @@ -144,7 +144,7 @@ static int load_module(void) g723_1_f.format = ast_format_g723; if (ast_format_def_register(&g723_1_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_g726.c b/formats/format_g726.c index 25daff9081..cadb2d96a8 100644 --- a/formats/format_g726.c +++ b/formats/format_g726.c @@ -223,29 +223,30 @@ static struct ast_format_def f[] = { { .desc_size = 0 } /* terminator */ }; -static int load_module(void) +static int unload_module(void) { int i; for (i = 0; f[i].desc_size ; i++) { - f[i].format = ast_format_g726; - if (ast_format_def_register(&f[i])) { /* errors are fatal */ - ast_log(LOG_WARNING, "Failed to register format %s.\n", f[i].name); - return AST_MODULE_LOAD_FAILURE; - } + if (ast_format_def_unregister(f[i].name)) + ast_log(LOG_WARNING, "Failed to unregister format %s.\n", f[i].name); } - return AST_MODULE_LOAD_SUCCESS; + return(0); } -static int unload_module(void) +static int load_module(void) { int i; for (i = 0; f[i].desc_size ; i++) { - if (ast_format_def_unregister(f[i].name)) - ast_log(LOG_WARNING, "Failed to unregister format %s.\n", f[i].name); + f[i].format = ast_format_g726; + if (ast_format_def_register(&f[i])) { /* errors are fatal */ + ast_log(LOG_WARNING, "Failed to register format %s.\n", f[i].name); + unload_module(); + return AST_MODULE_LOAD_DECLINE; + } } - return(0); + return AST_MODULE_LOAD_SUCCESS; } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Raw G.726 (16/24/32/40kbps) data", diff --git a/formats/format_g729.c b/formats/format_g729.c index 2c677b2e9e..4133546267 100644 --- a/formats/format_g729.c +++ b/formats/format_g729.c @@ -140,7 +140,7 @@ static int load_module(void) { g729_f.format = ast_format_g729; if (ast_format_def_register(&g729_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_gsm.c b/formats/format_gsm.c index 4a688e22ab..54c4b8ffa5 100644 --- a/formats/format_gsm.c +++ b/formats/format_gsm.c @@ -185,7 +185,7 @@ static int load_module(void) { gsm_f.format = ast_format_gsm; if (ast_format_def_register(&gsm_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_h263.c b/formats/format_h263.c index 731b746e0b..67f1269270 100644 --- a/formats/format_h263.c +++ b/formats/format_h263.c @@ -172,7 +172,7 @@ static int load_module(void) { h263_f.format = ast_format_h263; if (ast_format_def_register(&h263_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_h264.c b/formats/format_h264.c index 7c3d2d4738..2ce7a593d8 100644 --- a/formats/format_h264.c +++ b/formats/format_h264.c @@ -165,7 +165,7 @@ static int load_module(void) { h264_f.format = ast_format_h264; if (ast_format_def_register(&h264_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_ilbc.c b/formats/format_ilbc.c index 6b811e6931..0e2a92d14f 100644 --- a/formats/format_ilbc.c +++ b/formats/format_ilbc.c @@ -137,7 +137,7 @@ static int load_module(void) { ilbc_f.format = ast_format_ilbc; if (ast_format_def_register(&ilbc_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_jpeg.c b/formats/format_jpeg.c index 5b2c72d0db..04125d7bd5 100644 --- a/formats/format_jpeg.c +++ b/formats/format_jpeg.c @@ -98,7 +98,7 @@ static int load_module(void) { jpeg_format.format = ast_format_jpeg; if (ast_image_register(&jpeg_format)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_ogg_vorbis.c b/formats/format_ogg_vorbis.c index ed616c5e78..6428e275b0 100644 --- a/formats/format_ogg_vorbis.c +++ b/formats/format_ogg_vorbis.c @@ -425,7 +425,7 @@ static int load_module(void) { vorbis_f.format = ast_format_slin; if (ast_format_def_register(&vorbis_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_pcm.c b/formats/format_pcm.c index beb0015912..481299a58f 100644 --- a/formats/format_pcm.c +++ b/formats/format_pcm.c @@ -502,6 +502,14 @@ static struct ast_format_def au_f = { .buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET, /* this many shorts */ }; +static int unload_module(void) +{ + return ast_format_def_unregister(pcm_f.name) + || ast_format_def_unregister(alaw_f.name) + || ast_format_def_unregister(au_f.name) + || ast_format_def_unregister(g722_f.name); +} + static int load_module(void) { int i; @@ -519,19 +527,13 @@ static int load_module(void) if ( ast_format_def_register(&pcm_f) || ast_format_def_register(&alaw_f) || ast_format_def_register(&au_f) - || ast_format_def_register(&g722_f) ) - return AST_MODULE_LOAD_FAILURE; + || ast_format_def_register(&g722_f) ) { + unload_module(); + return AST_MODULE_LOAD_DECLINE; + } return AST_MODULE_LOAD_SUCCESS; } -static int unload_module(void) -{ - return ast_format_def_unregister(pcm_f.name) - || ast_format_def_unregister(alaw_f.name) - || ast_format_def_unregister(au_f.name) - || ast_format_def_unregister(g722_f.name); -} - AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Raw/Sun uLaw/ALaw 8KHz (PCM,PCMA,AU), G.722 16Khz", .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, diff --git a/formats/format_sln.c b/formats/format_sln.c index 143e4da2fd..67e5cd5ed2 100644 --- a/formats/format_sln.c +++ b/formats/format_sln.c @@ -237,6 +237,19 @@ static struct ast_format_def *slin_list[] = { &slin192_f, }; +static int unload_module(void) +{ + int res = 0; + int i = 0; + + for (i = 0; i < ARRAY_LEN(slin_list); i++) { + if (ast_format_def_unregister(slin_list[i]->name)) { + res = -1; + } + } + return res; +} + static int load_module(void) { int i; @@ -253,26 +266,14 @@ static int load_module(void) for (i = 0; i < ARRAY_LEN(slin_list); i++) { if (ast_format_def_register(slin_list[i])) { - return AST_MODULE_LOAD_FAILURE; + unload_module(); + return AST_MODULE_LOAD_DECLINE; } } return AST_MODULE_LOAD_SUCCESS; } -static int unload_module(void) -{ - int res = 0; - int i = 0; - - for (i = 0; i < ARRAY_LEN(slin_list); i++) { - if (ast_format_def_unregister(slin_list[i]->name)) { - res |= AST_MODULE_LOAD_FAILURE; - } - } - return res; -} - AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Raw Signed Linear Audio support (SLN) 8khz-192khz", .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, diff --git a/formats/format_vox.c b/formats/format_vox.c index 6724c54d76..6cef72dfa0 100644 --- a/formats/format_vox.c +++ b/formats/format_vox.c @@ -139,7 +139,7 @@ static int load_module(void) { vox_f.format = ast_format_adpcm; if (ast_format_def_register(&vox_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/formats/format_wav.c b/formats/format_wav.c index 90ef986ef0..42a27e41be 100644 --- a/formats/format_wav.c +++ b/formats/format_wav.c @@ -538,22 +538,24 @@ static struct ast_format_def wav_f = { .desc_size = sizeof(struct wav_desc), }; +static int unload_module(void) +{ + return ast_format_def_unregister(wav_f.name) + || ast_format_def_unregister(wav16_f.name); +} + static int load_module(void) { wav_f.format = ast_format_slin; wav16_f.format = ast_format_slin16; if (ast_format_def_register(&wav_f) - || ast_format_def_register(&wav16_f)) - return AST_MODULE_LOAD_FAILURE; + || ast_format_def_register(&wav16_f)) { + unload_module(); + return AST_MODULE_LOAD_DECLINE; + } return AST_MODULE_LOAD_SUCCESS; } -static int unload_module(void) -{ - return ast_format_def_unregister(wav_f.name) - || ast_format_def_unregister(wav16_f.name); -} - AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Microsoft WAV/WAV16 format (8kHz/16kHz Signed Linear)", .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, diff --git a/formats/format_wav_gsm.c b/formats/format_wav_gsm.c index 06597abb3f..5b3853ef73 100644 --- a/formats/format_wav_gsm.c +++ b/formats/format_wav_gsm.c @@ -570,7 +570,7 @@ static int load_module(void) { wav49_f.format = ast_format_gsm; if (ast_format_def_register(&wav49_f)) - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_SUCCESS; } diff --git a/funcs/func_cdr.c b/funcs/func_cdr.c index e67bca3188..12e6f3bfcc 100644 --- a/funcs/func_cdr.c +++ b/funcs/func_cdr.c @@ -651,7 +651,7 @@ static int load_module(void) int res = 0; if (!router) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } res |= STASIS_MESSAGE_TYPE_INIT(cdr_read_message_type); @@ -667,7 +667,8 @@ static int load_module(void) cdr_read_callback, NULL); if (res) { - return AST_MODULE_LOAD_FAILURE; + unload_module(); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } diff --git a/funcs/func_holdintercept.c b/funcs/func_holdintercept.c index 56d9a9e83a..f4907d102a 100644 --- a/funcs/func_holdintercept.c +++ b/funcs/func_holdintercept.c @@ -230,7 +230,7 @@ static int unload_module(void) /*! \internal \brief Load the module */ static int load_module(void) { - return ast_custom_function_register(&hold_intercept_function) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; + return ast_custom_function_register(&hold_intercept_function) ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; } AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Hold interception dialplan function"); diff --git a/funcs/func_talkdetect.c b/funcs/func_talkdetect.c index ccc74fd7f1..9700a2451d 100644 --- a/funcs/func_talkdetect.c +++ b/funcs/func_talkdetect.c @@ -399,7 +399,7 @@ static int load_module(void) res |= ast_custom_function_register(&talk_detect_function); - return res ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; + return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; } AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Talk detection dialplan function"); diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h index d06aecf200..af2fb91f60 100644 --- a/include/asterisk/logger.h +++ b/include/asterisk/logger.h @@ -518,6 +518,13 @@ int ast_verb_console_get(void); */ void ast_verb_console_set(int verb_level); +/*! + * \brief Test if logger is initialized + * + * \retval true if the logger is initialized + */ +int ast_is_logger_initialized(void); + #if defined(__cplusplus) || defined(c_plusplus) } #endif diff --git a/main/asterisk.c b/main/asterisk.c index 076ae6d224..e2562764aa 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -4448,7 +4448,11 @@ int main(int argc, char *argv[]) static inline void check_init(int init_result, const char *name) { if (init_result) { - printf("%s initialization failed.\n%s", name, term_quit()); + if (ast_is_logger_initialized()) { + ast_log(LOG_ERROR, "%s initialization failed. ASTERISK EXITING!\n%s", name, term_quit()); + } else { + fprintf(stderr, "%s initialization failed. ASTERISK EXITING!\n%s", name, term_quit()); + } ast_run_atexits(0); exit(init_result == -2 ? 2 : 1); } diff --git a/main/loader.c b/main/loader.c index c135edc36b..7b031b647a 100644 --- a/main/loader.c +++ b/main/loader.c @@ -1251,6 +1251,7 @@ static int load_resource_list(struct load_order *load_order, unsigned int global case AST_MODULE_LOAD_DECLINE: break; case AST_MODULE_LOAD_FAILURE: + ast_log(LOG_ERROR, "*** Failed to load module %s\n", mod->resource); res = -1; goto done; case AST_MODULE_LOAD_SKIP: diff --git a/main/logger.c b/main/logger.c index 9fda4b3428..48c939efeb 100644 --- a/main/logger.c +++ b/main/logger.c @@ -1554,6 +1554,11 @@ static void logger_queue_init(void) } } +int ast_is_logger_initialized(void) +{ + return logger_initialized; +} + /*! * \brief Start the ast_queue_log() logger. * diff --git a/res/res_ari.c b/res/res_ari.c index c6f81dcefa..809b7f65a5 100644 --- a/res/res_ari.c +++ b/res/res_ari.c @@ -1103,6 +1103,27 @@ static struct ast_http_uri http_uri = { .no_decode_uri = 1, }; +static int unload_module(void) +{ + ast_ari_cli_unregister(); + + if (is_enabled()) { + ast_debug(3, "Disabling ARI\n"); + ast_http_uri_unlink(&http_uri); + } + + ast_ari_config_destroy(); + + ao2_cleanup(root_handler); + root_handler = NULL; + ast_mutex_destroy(&root_handler_lock); + + ast_json_unref(oom_json); + oom_json = NULL; + + return 0; +} + static int load_module(void) { ast_mutex_init(&root_handler_lock); @@ -1112,7 +1133,7 @@ static int load_module(void) root_handler = root_handler_create(); } if (!root_handler) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* oom_json may have been built during a declined load */ @@ -1122,10 +1143,12 @@ static int load_module(void) } if (!oom_json) { /* Ironic */ - return AST_MODULE_LOAD_FAILURE; + unload_module(); + return AST_MODULE_LOAD_DECLINE; } if (ast_ari_config_init() != 0) { + unload_module(); return AST_MODULE_LOAD_DECLINE; } @@ -1137,33 +1160,13 @@ static int load_module(void) } if (ast_ari_cli_register() != 0) { - return AST_MODULE_LOAD_FAILURE; + unload_module(); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } -static int unload_module(void) -{ - ast_ari_cli_unregister(); - - if (is_enabled()) { - ast_debug(3, "Disabling ARI\n"); - ast_http_uri_unlink(&http_uri); - } - - ast_ari_config_destroy(); - - ao2_cleanup(root_handler); - root_handler = NULL; - ast_mutex_destroy(&root_handler_lock); - - ast_json_unref(oom_json); - oom_json = NULL; - - return 0; -} - static int reload_module(void) { char was_enabled = is_enabled(); diff --git a/res/res_ari_events.c b/res/res_ari_events.c index d102428bbe..461b314047 100644 --- a/res/res_ari_events.c +++ b/res/res_ari_events.c @@ -418,6 +418,15 @@ static struct stasis_rest_handlers events = { .children = { &events_user, } }; +static int unload_module(void) +{ + ast_ari_remove_handler(&events); + ao2_cleanup(events.ws_server); + events.ws_server = NULL; + stasis_app_unref(); + return 0; +} + static int load_module(void) { int res = 0; @@ -425,30 +434,27 @@ static int load_module(void) events.ws_server = ast_websocket_server_create(); if (!events.ws_server) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } protocol = ast_websocket_sub_protocol_alloc("ari"); if (!protocol) { ao2_ref(events.ws_server, -1); events.ws_server = NULL; - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } protocol->session_attempted = ast_ari_events_event_websocket_ws_attempted_cb; protocol->session_established = ast_ari_events_event_websocket_ws_established_cb; res |= ast_websocket_server_add_protocol2(events.ws_server, protocol); stasis_app_ref(); res |= ast_ari_add_handler(&events); - return res; -} -static int unload_module(void) -{ - ast_ari_remove_handler(&events); - ao2_cleanup(events.ws_server); - events.ws_server = NULL; - stasis_app_unref(); - return 0; + if (res) { + unload_module(); + return AST_MODULE_LOAD_DECLINE; + } + + return AST_MODULE_LOAD_SUCCESS; } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "RESTful API module - WebSocket resource", diff --git a/res/res_ari_model.c b/res/res_ari_model.c index 96cab80966..e372bcf9c7 100644 --- a/res/res_ari_model.c +++ b/res/res_ari_model.c @@ -192,7 +192,7 @@ static int load_module(void) REG_EXTENDED | REG_ICASE | REG_NOSUB); if (res != 0) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } diff --git a/res/res_calendar.c b/res/res_calendar.c index 2641654707..3725c94350 100644 --- a/res/res_calendar.c +++ b/res/res_calendar.c @@ -1882,7 +1882,7 @@ static int load_module(void) { if (!(calendars = ao2_container_alloc(CALENDAR_BUCKETS, calendar_hash_fn, calendar_cmp_fn))) { ast_log(LOG_ERROR, "Unable to allocate calendars container!\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (load_config(0)) { @@ -1896,7 +1896,9 @@ static int load_module(void) if (!(sched = ast_sched_context_create())) { ast_log(LOG_ERROR, "Unable to create sched context\n"); - return AST_MODULE_LOAD_FAILURE; + ast_config_destroy(calendar_config); + calendar_config = NULL; + return AST_MODULE_LOAD_DECLINE; } if (ast_pthread_create_background(&refresh_thread, NULL, do_refresh, NULL) < 0) { diff --git a/res/res_chan_stats.c b/res/res_chan_stats.c index 8d446b3b33..9104e0e049 100644 --- a/res/res_chan_stats.c +++ b/res/res_chan_stats.c @@ -150,13 +150,22 @@ static void default_route(void *data, struct stasis_subscription *sub, } } +static int unload_module(void) +{ + stasis_unsubscribe_and_join(sub); + sub = NULL; + stasis_message_router_unsubscribe_and_join(router); + router = NULL; + return 0; +} + static int load_module(void) { /* You can create a message router to route messages by type */ router = stasis_message_router_create( ast_channel_topic_all_cached()); if (!router) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } stasis_message_router_add(router, stasis_cache_update_type(), updates, NULL); @@ -165,20 +174,12 @@ static int load_module(void) /* Or a subscription to receive all of the messages from a topic */ sub = stasis_subscribe(ast_channel_topic_all(), statsmaker, NULL); if (!sub) { - return AST_MODULE_LOAD_FAILURE; + unload_module(); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } -static int unload_module(void) -{ - stasis_unsubscribe_and_join(sub); - sub = NULL; - stasis_message_router_unsubscribe_and_join(router); - router = NULL; - return 0; -} - AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Example of how to use Stasis", .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, diff --git a/res/res_config_sqlite.c b/res/res_config_sqlite.c index a5a831ea30..fa45fec351 100644 --- a/res/res_config_sqlite.c +++ b/res/res_config_sqlite.c @@ -1681,7 +1681,7 @@ static int load_module(void) ast_log(LOG_ERROR, "%s\n", S_OR(errormsg, sqlite_error_string(error))); sqlite_freemem(errormsg); unload_module(); - return 1; + return AST_MODULE_LOAD_DECLINE; } sqlite_freemem(errormsg); @@ -1701,7 +1701,7 @@ static int load_module(void) if (!query) { ast_log(LOG_ERROR, "Unable to allocate SQL query\n"); unload_module(); - return 1; + return AST_MODULE_LOAD_DECLINE; } ast_debug(1, "SQL query: %s\n", query); @@ -1720,7 +1720,7 @@ static int load_module(void) ast_log(LOG_ERROR, "%s\n", S_OR(errormsg, sqlite_error_string(error))); sqlite_freemem(errormsg); unload_module(); - return 1; + return AST_MODULE_LOAD_DECLINE; } sqlite_freemem(errormsg); @@ -1730,7 +1730,7 @@ static int load_module(void) if (!query) { ast_log(LOG_ERROR, "Unable to allocate SQL query\n"); unload_module(); - return 1; + return AST_MODULE_LOAD_DECLINE; } ast_debug(1, "SQL query: %s\n", query); @@ -1745,7 +1745,7 @@ static int load_module(void) ast_log(LOG_ERROR, "%s\n", S_OR(errormsg, sqlite_error_string(error))); sqlite_freemem(errormsg); unload_module(); - return 1; + return AST_MODULE_LOAD_DECLINE; } } sqlite_freemem(errormsg); @@ -1755,7 +1755,7 @@ static int load_module(void) if (error) { unload_module(); - return 1; + return AST_MODULE_LOAD_DECLINE; } cdr_registered = 1; @@ -1765,12 +1765,12 @@ static int load_module(void) if (error) { unload_module(); - return 1; + return AST_MODULE_LOAD_DECLINE; } cli_status_registered = 1; - return 0; + return AST_MODULE_LOAD_SUCCESS; } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Realtime SQLite configuration", diff --git a/res/res_config_sqlite3.c b/res/res_config_sqlite3.c index 5362e9ede1..56558624fe 100644 --- a/res/res_config_sqlite3.c +++ b/res/res_config_sqlite3.c @@ -1361,18 +1361,18 @@ static int load_module(void) discover_sqlite3_caps(); if (!((databases = ao2_container_alloc(DB_BUCKETS, db_hash_fn, db_cmp_fn)))) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (parse_config(0)) { ao2_ref(databases, -1); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(ast_config_engine_register(&sqlite3_config_engine))) { ast_log(LOG_ERROR, "The config API must have changed, this shouldn't happen.\n"); ao2_ref(databases, -1); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/res/res_endpoint_stats.c b/res/res_endpoint_stats.c index 6b84794338..e2b4ffa2e7 100644 --- a/res/res_endpoint_stats.c +++ b/res/res_endpoint_stats.c @@ -120,7 +120,7 @@ static int load_module(void) router = stasis_message_router_create(ast_endpoint_topic_all_cached()); if (!router) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } stasis_message_router_add(router, stasis_cache_update_type(), cache_update_cb, NULL); diff --git a/res/res_hep_rtcp.c b/res/res_hep_rtcp.c index d77b19c92f..f4f1dfe3bd 100644 --- a/res/res_hep_rtcp.c +++ b/res/res_hep_rtcp.c @@ -157,7 +157,7 @@ static int load_module(void) stasis_rtp_subscription = stasis_subscribe(ast_rtp_topic(), rtp_topic_handler, NULL); if (!stasis_rtp_subscription) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c index 71d838ad99..f49a3573e5 100644 --- a/res/res_http_websocket.c +++ b/res/res_http_websocket.c @@ -1434,7 +1434,7 @@ static int load_module(void) { websocketuri.data = websocket_server_internal_create(); if (!websocketuri.data) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_http_uri_link(&websocketuri); websocket_add_protocol_internal("echo", websocket_echo_callback); diff --git a/res/res_limit.c b/res/res_limit.c index e883ff3833..5f61f1b099 100644 --- a/res/res_limit.c +++ b/res/res_limit.c @@ -211,7 +211,7 @@ static int unload_module(void) static int load_module(void) { - return ast_cli_register(&cli_ulimit) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; + return ast_cli_register(&cli_ulimit) ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; } AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Resource limits"); diff --git a/res/res_pjsip/config_transport.c b/res/res_pjsip/config_transport.c index d180296f42..62bc9d67db 100644 --- a/res/res_pjsip/config_transport.c +++ b/res/res_pjsip/config_transport.c @@ -1348,7 +1348,7 @@ int ast_sip_initialize_sorcery_transport(void) transport_states = ao2_container_alloc(DEFAULT_STATE_BUCKETS, internal_state_hash, internal_state_cmp); if (!transport_states) { ast_log(LOG_ERROR, "Unable to allocate transport states container\n"); - return AST_MODULE_LOAD_FAILURE; + return -1; } ast_sorcery_apply_default(sorcery, "transport", "config", "pjsip.conf,criteria=type=transport"); diff --git a/res/res_pjsip_nat.c b/res/res_pjsip_nat.c index 5fcab63785..a0ce2a9d1e 100644 --- a/res/res_pjsip_nat.c +++ b/res/res_pjsip_nat.c @@ -361,13 +361,13 @@ static int load_module(void) if (ast_sip_register_service(&nat_module)) { ast_log(LOG_ERROR, "Could not register NAT module for incoming and outgoing requests\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (ast_sip_session_register_supplement(&nat_supplement)) { ast_log(LOG_ERROR, "Could not register NAT session supplement for incoming and outgoing INVITE requests\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/res/res_pjsip_one_touch_record_info.c b/res/res_pjsip_one_touch_record_info.c index e15b0d815c..3cac25a2d4 100644 --- a/res/res_pjsip_one_touch_record_info.c +++ b/res/res_pjsip_one_touch_record_info.c @@ -112,7 +112,7 @@ static int load_module(void) if (ast_sip_session_register_supplement(&info_supplement)) { ast_log(LOG_ERROR, "Unable to register One Touch Recording supplement\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/res/res_pjsip_outbound_publish.c b/res/res_pjsip_outbound_publish.c index 0273c6a68f..f84f118197 100644 --- a/res/res_pjsip_outbound_publish.c +++ b/res/res_pjsip_outbound_publish.c @@ -1269,7 +1269,7 @@ static int load_module(void) shutdown_group = ast_serializer_shutdown_group_alloc(); if (!shutdown_group) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_sorcery_apply_config(ast_sip_get_sorcery(), "res_pjsip_outbound_publish"); diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c index ee1894ffb5..0a65e6e1da 100644 --- a/res/res_pjsip_outbound_registration.c +++ b/res/res_pjsip_outbound_registration.c @@ -2083,7 +2083,7 @@ static int load_module(void) shutdown_group = ast_serializer_shutdown_group_alloc(); if (!shutdown_group) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* Create outbound registration states container. */ @@ -2092,7 +2092,7 @@ static int load_module(void) if (!new_states) { ast_log(LOG_ERROR, "Unable to allocate registration states container\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ao2_global_obj_replace_unref(current_states, new_states); ao2_ref(new_states, -1); @@ -2136,7 +2136,7 @@ static int load_module(void) ®istration_observer)) { ast_log(LOG_ERROR, "Unable to register observers.\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } /* Register how this module identifies endpoints. */ @@ -2147,7 +2147,7 @@ static int load_module(void) if (!cli_formatter) { ast_log(LOG_ERROR, "Unable to allocate memory for cli formatter\n"); unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } cli_formatter->name = "registration"; cli_formatter->print_header = cli_print_header; diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c index 79a4a8c3eb..fbb1ad4e88 100644 --- a/res/res_pjsip_pubsub.c +++ b/res/res_pjsip_pubsub.c @@ -5285,13 +5285,13 @@ static int load_module(void) if (!(sched = ast_sched_context_create())) { ast_log(LOG_ERROR, "Could not create scheduler for publication expiration\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (ast_sched_start_thread(sched)) { ast_log(LOG_ERROR, "Could not start scheduler thread for publication expiration\n"); ast_sched_context_destroy(sched); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } pjsip_endpt_add_capability(ast_sip_get_pjsip_endpoint(), NULL, PJSIP_H_ALLOW, NULL, 1, &str_PUBLISH); @@ -5299,7 +5299,7 @@ static int load_module(void) if (ast_sip_register_service(&pubsub_module)) { ast_log(LOG_ERROR, "Could not register pubsub service\n"); ast_sched_context_destroy(sched); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_sorcery_apply_config(sorcery, "res_pjsip_pubsub"); @@ -5309,7 +5309,7 @@ static int load_module(void) ast_log(LOG_ERROR, "Could not register subscription persistence object support\n"); ast_sip_unregister_service(&pubsub_module); ast_sched_context_destroy(sched); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_sorcery_object_field_register(sorcery, "subscription_persistence", "packet", "", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct subscription_persistence, packet)); @@ -5337,7 +5337,7 @@ static int load_module(void) if (apply_list_configuration(sorcery)) { ast_sip_unregister_service(&pubsub_module); ast_sched_context_destroy(sched); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_sorcery_apply_default(sorcery, "inbound-publication", "config", "pjsip.conf,criteria=type=inbound-publication"); @@ -5346,7 +5346,7 @@ static int load_module(void) ast_log(LOG_ERROR, "Could not register subscription persistence object support\n"); ast_sip_unregister_service(&pubsub_module); ast_sched_context_destroy(sched); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_sorcery_object_field_register(sorcery, "inbound-publication", "type", "", OPT_NOOP_T, 0, 0); ast_sorcery_object_field_register_custom(sorcery, "inbound-publication", "endpoint", "", diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index e1f0cee9d5..cafbd52ec8 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -1628,7 +1628,7 @@ static int load_module(void) end: unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PJSIP SDP RTP/AVP stream handler", diff --git a/res/res_pjsip_send_to_voicemail.c b/res/res_pjsip_send_to_voicemail.c index 12d6b74f68..6107a15121 100644 --- a/res/res_pjsip_send_to_voicemail.c +++ b/res/res_pjsip_send_to_voicemail.c @@ -219,7 +219,7 @@ static int load_module(void) if (ast_sip_session_register_supplement(&refer_supplement)) { ast_log(LOG_ERROR, "Unable to register Send to Voicemail supplement\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/res/res_pjsip_t38.c b/res/res_pjsip_t38.c index 16d50cd276..04774190ef 100644 --- a/res/res_pjsip_t38.c +++ b/res/res_pjsip_t38.c @@ -940,7 +940,7 @@ static int load_module(void) end: unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PJSIP T.38 UDPTL Support", diff --git a/res/res_smdi.c b/res/res_smdi.c index 7a63fe46aa..f4804c7cb2 100644 --- a/res/res_smdi.c +++ b/res/res_smdi.c @@ -1128,7 +1128,7 @@ static int smdi_load(int reload) if (!AST_LIST_EMPTY(&mwi_monitor.mailbox_mappings) && mwi_monitor.thread == AST_PTHREADT_NULL && ast_pthread_create_background(&mwi_monitor.thread, NULL, mwi_monitor_handler, NULL)) { ast_log(LOG_ERROR, "Failed to start MWI monitoring thread. This module will not operate.\n"); - return AST_MODULE_LOAD_FAILURE; + return -1; } if (ao2_container_count(new_ifaces)) { @@ -1371,7 +1371,7 @@ static int load_module(void) res = smdi_load(0); if (res < 0) { _unload_module(1); - return res; + return AST_MODULE_LOAD_DECLINE; } else if (res == 1) { _unload_module(1); ast_log(LOG_NOTICE, "No SMDI interfaces are available to listen on, not starting SMDI listener.\n"); diff --git a/res/res_stasis.c b/res/res_stasis.c index 55240bacc1..9d7bc4c243 100644 --- a/res/res_stasis.c +++ b/res/res_stasis.c @@ -2097,12 +2097,12 @@ static int load_module(void) 37, bridges_channel_hash_fn, bridges_channel_sort_fn, NULL); if (!apps_registry || !app_controls || !app_bridges || !app_bridges_moh || !app_bridges_playback) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (messaging_init()) { unload_module(); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } bridge_stasis_init(); diff --git a/res/res_stasis_device_state.c b/res/res_stasis_device_state.c index 2065c36b6b..29e75660cf 100644 --- a/res/res_stasis_device_state.c +++ b/res/res_stasis_device_state.c @@ -455,13 +455,14 @@ static int load_module(void) populate_cache(); if (ast_devstate_prov_add(DEVICE_STATE_PROVIDER_STASIS, stasis_device_state_cb)) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!(device_state_subscriptions = ao2_container_alloc( DEVICE_STATE_BUCKETS, device_state_subscriptions_hash, device_state_subscriptions_cmp))) { - return AST_MODULE_LOAD_FAILURE; + ast_devstate_prov_del(DEVICE_STATE_PROVIDER_STASIS); + return AST_MODULE_LOAD_DECLINE; } stasis_app_register_event_source(&device_state_event_source); diff --git a/res/res_stasis_playback.c b/res/res_stasis_playback.c index 7fdb5d4ad7..57d1fd2583 100644 --- a/res/res_stasis_playback.c +++ b/res/res_stasis_playback.c @@ -664,13 +664,14 @@ static int load_module(void) r = STASIS_MESSAGE_TYPE_INIT(stasis_app_playback_snapshot_type); if (r != 0) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } playbacks = ao2_container_alloc(PLAYBACK_BUCKETS, playback_hash, playback_cmp); if (!playbacks) { - return AST_MODULE_LOAD_FAILURE; + STASIS_MESSAGE_TYPE_CLEANUP(stasis_app_playback_snapshot_type); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } diff --git a/res/res_stasis_recording.c b/res/res_stasis_recording.c index 46bc6eb713..5508be8884 100644 --- a/res/res_stasis_recording.c +++ b/res/res_stasis_recording.c @@ -633,13 +633,14 @@ static int load_module(void) r = STASIS_MESSAGE_TYPE_INIT(stasis_app_recording_snapshot_type); if (r != 0) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } recordings = ao2_container_alloc(RECORDING_BUCKETS, recording_hash, recording_cmp); if (!recordings) { - return AST_MODULE_LOAD_FAILURE; + STASIS_MESSAGE_TYPE_CLEANUP(stasis_app_recording_snapshot_type); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; } diff --git a/res/res_stasis_test.c b/res/res_stasis_test.c index 9860b0ebd7..fe015ec73b 100644 --- a/res/res_stasis_test.c +++ b/res/res_stasis_test.c @@ -273,7 +273,7 @@ static int unload_module(void) static int load_module(void) { if (STASIS_MESSAGE_TYPE_INIT(stasis_test_message_type) != 0) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/res/res_statsd.c b/res/res_statsd.c index 4eb5260714..eb0dc67029 100644 --- a/res/res_statsd.c +++ b/res/res_statsd.c @@ -351,7 +351,8 @@ static int load_module(void) } if (statsd_init() != 0) { - return AST_MODULE_LOAD_FAILURE; + aco_info_destroy(&cfg_info); + return AST_MODULE_LOAD_DECLINE; } return AST_MODULE_LOAD_SUCCESS; diff --git a/rest-api-templates/res_ari_resource.c.mustache b/rest-api-templates/res_ari_resource.c.mustache index a59f63df5c..921b007be0 100644 --- a/rest-api-templates/res_ari_resource.c.mustache +++ b/rest-api-templates/res_ari_resource.c.mustache @@ -246,6 +246,19 @@ fin: __attribute__((unused)) {{> rest_handler}} {{/root_path}} +static int unload_module(void) +{ + ast_ari_remove_handler(&{{root_full_name}}); +{{#apis}} +{{#has_websocket}} + ao2_cleanup({{full_name}}.ws_server); + {{full_name}}.ws_server = NULL; +{{/has_websocket}} +{{/apis}} + stasis_app_unref(); + return 0; +} + static int load_module(void) { int res = 0; @@ -256,14 +269,14 @@ static int load_module(void) {{full_name}}.ws_server = ast_websocket_server_create(); if (!{{full_name}}.ws_server) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } protocol = ast_websocket_sub_protocol_alloc("{{websocket_protocol}}"); if (!protocol) { ao2_ref({{full_name}}.ws_server, -1); {{full_name}}.ws_server = NULL; - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } protocol->session_attempted = ast_ari_{{c_name}}_{{c_nickname}}_ws_attempted_cb; protocol->session_established = ast_ari_{{c_name}}_{{c_nickname}}_ws_established_cb; @@ -275,20 +288,12 @@ static int load_module(void) {{/apis}} stasis_app_ref(); res |= ast_ari_add_handler(&{{root_full_name}}); - return res; -} + if (res) { + unload_module(); + return AST_MODULE_LOAD_DECLINE; + } -static int unload_module(void) -{ - ast_ari_remove_handler(&{{root_full_name}}); -{{#apis}} -{{#has_websocket}} - ao2_cleanup({{full_name}}.ws_server); - {{full_name}}.ws_server = NULL; -{{/has_websocket}} -{{/apis}} - stasis_app_unref(); - return 0; + return AST_MODULE_LOAD_SUCCESS; } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "RESTful API module - {{{description}}}", diff --git a/tests/test_bucket.c b/tests/test_bucket.c index 13fd684cbd..4cc7b8e0ac 100644 --- a/tests/test_bucket.c +++ b/tests/test_bucket.c @@ -848,7 +848,7 @@ static int load_module(void) if (ast_bucket_scheme_register("test", &bucket_test_wizard, &bucket_file_test_wizard, ast_bucket_file_temporary_create, ast_bucket_file_temporary_destroy)) { ast_log(LOG_ERROR, "Failed to register Bucket test wizard scheme implementation\n"); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } AST_TEST_REGISTER(bucket_scheme_register); diff --git a/tests/test_channel_feature_hooks.c b/tests/test_channel_feature_hooks.c index c5d3b9b866..32a98cb7d5 100644 --- a/tests/test_channel_feature_hooks.c +++ b/tests/test_channel_feature_hooks.c @@ -347,7 +347,7 @@ static int load_module(void) { test_features_chan_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT); if (!test_features_chan_tech.capabilities) { - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } ast_format_cap_append(test_features_chan_tech.capabilities, TEST_CHANNEL_FORMAT, 0); ast_channel_register(&test_features_chan_tech);