]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
modules: change module LOAD_FAILUREs to LOAD_DECLINES
authorGeorge Joseph <gjoseph@digium.com>
Tue, 11 Apr 2017 16:07:39 +0000 (10:07 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Wed, 12 Apr 2017 21:46:22 +0000 (16:46 -0500)
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

89 files changed:
addons/cdr_mysql.c
addons/chan_mobile.c
apps/app_adsiprog.c
apps/app_agent_pool.c
apps/app_alarmreceiver.c
apps/app_authenticate.c
apps/app_cdr.c
apps/app_confbridge.c
apps/app_dahdiras.c
apps/app_forkcdr.c
apps/app_queue.c
apps/app_voicemail.c
apps/app_zapateller.c
cdr/cdr_custom.c
cel/cel_custom.c
cel/cel_odbc.c
channels/chan_alsa.c
channels/chan_dahdi.c
channels/chan_iax2.c
channels/chan_mgcp.c
channels/chan_motif.c
channels/chan_nbs.c
channels/chan_oss.c
channels/chan_phone.c
channels/chan_pjsip.c
channels/chan_sip.c
channels/chan_skinny.c
channels/chan_unistim.c
codecs/codec_a_mu.c
codecs/codec_adpcm.c
codecs/codec_alaw.c
codecs/codec_g722.c
codecs/codec_g726.c
codecs/codec_gsm.c
codecs/codec_ilbc.c
codecs/codec_lpc10.c
codecs/codec_resample.c
codecs/codec_ulaw.c
formats/format_g723.c
formats/format_g726.c
formats/format_g729.c
formats/format_gsm.c
formats/format_h263.c
formats/format_h264.c
formats/format_ilbc.c
formats/format_jpeg.c
formats/format_ogg_vorbis.c
formats/format_pcm.c
formats/format_sln.c
formats/format_vox.c
formats/format_wav.c
formats/format_wav_gsm.c
funcs/func_cdr.c
funcs/func_holdintercept.c
funcs/func_talkdetect.c
include/asterisk/logger.h
main/asterisk.c
main/loader.c
main/logger.c
res/res_ari.c
res/res_ari_events.c
res/res_ari_model.c
res/res_calendar.c
res/res_chan_stats.c
res/res_config_sqlite.c
res/res_config_sqlite3.c
res/res_endpoint_stats.c
res/res_hep_rtcp.c
res/res_http_websocket.c
res/res_limit.c
res/res_pjsip/config_transport.c
res/res_pjsip_nat.c
res/res_pjsip_one_touch_record_info.c
res/res_pjsip_outbound_publish.c
res/res_pjsip_outbound_registration.c
res/res_pjsip_pubsub.c
res/res_pjsip_sdp_rtp.c
res/res_pjsip_send_to_voicemail.c
res/res_pjsip_t38.c
res/res_smdi.c
res/res_stasis.c
res/res_stasis_device_state.c
res/res_stasis_playback.c
res/res_stasis_recording.c
res/res_stasis_test.c
res/res_statsd.c
rest-api-templates/res_ari_resource.c.mustache
tests/test_bucket.c
tests/test_channel_feature_hooks.c

index 4621143fe1c6f648b13bb28e36ea27280eac24c5..70dab1ae4ad877795dfd6419c4fb90d0d973eebe 100644 (file)
@@ -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)
index 7077704b0c8a8344126a8340367e526536ecbfa7..f9fe9524b285ffc016157681a81e78430994cb46 100644 (file)
@@ -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",
index efe1aa36969d013785b88c6069cfb9d10f9131ed..640f553a4f56f0d9451b19450db34723ea41afc0 100644 (file)
@@ -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;
 }
 
index a8f2d2c1bd6f12e6f627c41a3fae92624d866462..dfaeb5594217248c70c10ef19235f870ec2f1b85 100644 (file)
@@ -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()) {
index aaf956ff2dea77168e02486884679a9fc6f954a3..ab28225e3e8b7064632523ea2b47859117138608 100644 (file)
@@ -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;
        }
index a8370588b8fbf9829e6fb91264f200e9fd817f7f..53d0e484cd8b687ffac25c2fd436484a8e624781 100644 (file)
@@ -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;
 }
 
index bf4961a5374ddec6b569fe9e48559c0320d7fef2..93510f8a1588459dcd1a7621a1b66993ab8e9202 100644 (file)
@@ -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;
 }
index f3b6976353488137eb0cc50c3c954da1e583b89b..fed44a616206480c7afbb9b8b5411d996f59cb65 100644 (file)
@@ -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;
index 701904beb28d7d174dda4b7c55befb2bb9d9037a..bd0a58fca57cea1f07fa0a3557dc2cc8d2ea4267 100644 (file)
@@ -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");
index bbd15881a5e0147d0ab7def527aec12b615ac70d..d3c92a0fc3c43503c2587ee3f9fb42762da71cf6 100644 (file)
@@ -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;
 }
index 9eca4ed730d9920d0857dfe8dfed600da955b420..7d36187a09369a24eed9b7a00f9de3b5d4a15974 100644 (file)
@@ -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);
index 6fad47c9e488730a3eacf795a36408ab8fea66df..b2375341a492a36eca0770c71fa7e85913dfb493 100644 (file)
@@ -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 */
index 8e966e954c679967a94b7a25e78cf4c78c645b8c..ccdeba2b745ac5cc1eebaa4b7c7b747b5e148783 100644 (file)
@@ -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");
index 6ef2cb094e3919d86d22a820c74e7e495be21f07..eb34ba06ad0a912005d5e0f836e50ddf54c31c5e 100644 (file)
@@ -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();
index 0b2ac764f75e65bfa3fbab8cc7eb47ebe853ac8c..9f480b8d794a6c9d3375f7b14f75f2bbbee59a2b 100644 (file)
@@ -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();
index 701883bceb128f1ae930ac13073b1d44a4e9d31d..188123167b77b26ddcd8497aa334d8ab3fd7e4e4 100644 (file)
@@ -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();
index 61ea2e7194b7a838724401db45775c7a3ef4fd16..0f61d7c032c5cc836d26b6a60d1a143f4a145e13 100644 (file)
@@ -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,
index 6d740d064b6c8fee1926189bd3750466248c7901..62a86f0d85caeca1a6b9ed016c7c1f805c79cae0 100644 (file)
@@ -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));
index e8c47ce9f756215deecfc1d97ded81e92145c221..67552ce4e6f78753b3bba4d3bcda7acbb05d296a 100644 (file)
@@ -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");
        }
index 16ba7ec308bb4412c533eb3866de05e6afbd159e..f3fe538a02fafc668b1b656be58c9db800a15522 100644 (file)
@@ -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);
index 640976f096bd9b85bee7ceed43da228db5328dec..4bb84c9a183a8f156e332a19775910d1d89d3c66 100644 (file)
@@ -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 */
index 2abde61e338977d426e450c3e5769265f86d881c..b1ce4c6e98a0002aab436ddf84445acbb4b0abda 100644 (file)
@@ -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;
index aa870dfc2299bd6fb2bc8fee7f50269d30fc8ad7..4e940f44d11064964ebc4cd20478750ca1263148 100644 (file)
@@ -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");
 
index 451d9f261ef8f82ddf21fc3c00b036257f9af1ee..b418b282b556acc231d79816295bea22c217d979 100644 (file)
@@ -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 */
index 8a1921c828aa7b6b0782831dd2b7d689ff8807ca..0ca84d014081f23e236568460959cb42227525ca 100644 (file)
@@ -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 */
index 96c3b8026f54406680e48a9c347d09c1fd079b68..2ba52ab7d31ba7fc3ebbe92c4af70ffe7739c577 100644 (file)
@@ -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
index 9c84eec30fd96ef89ae7590dbaca5fe8ae595aa7..2c40748a1f860232d1573ccc1bf9eb02c6b71175 100644 (file)
@@ -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;
index abcc4ed674947b8464704ee565decc5f75800a97..029ce91a389a326278bf4508d5b050e3bb15d9c1 100644 (file)
@@ -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)
index c21c706f50e757dc81176f3779ae2f3e29f846f4..ec8d2362200c1214f26633c9daf70e82ff7962e3 100644 (file)
@@ -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;
index 6b64f86935a3a8abf35b7960c172deded89991f3..924ec7650d27fbf6797a60e4a03582e1eb926b3a 100644 (file)
@@ -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;
index de9c4c4be208d22c8b2dd5dc98e817c338f86d95..0a4d4b8f6456efde2ecacb10f136643baf95f199 100644 (file)
@@ -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;
index e262ebd719f531c1cdeedb4dba91760284a899e7..feca8a0befae5d69bac7928de684785bf2668bc5 100644 (file)
@@ -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;
index 1954c5134de225e84f3681b1522b119fb06d9d14..8fb1fd10b2339bd23429a910942d514c7d9bbb88 100644 (file)
@@ -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;
index a18dc0abe77a15a5090e616cfab47abbf5664861..b3c21912c451193ac2a3a1cb52189a3f9c7de28b 100644 (file)
@@ -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;
index 2646f49bd191715fc8bf38c815c2cb4e8dc774f3..026fe9ad80f8a9f6922984998321dc989a0a17a9 100644 (file)
@@ -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;
index a62eed3a8f855e222d7814885da824dfc14d5de3..df59dd7569639b01fcee783caa6da8c7f95bfe31 100644 (file)
@@ -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;
index 9eda242cc9a19ad130c86eb1ad5c074cc26b80a7..03f068323b435f55191937f61d153ffd40989f0e 100644 (file)
@@ -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;
index 58c0a895e1e5625090a7e5aae1c14f8bf3c78335..2246c4b57c52529e05c2496539ae909fcdb22f1f 100644 (file)
@@ -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;
index 6d0b96337bd8cec4f76ee13e931b4c5fead77ad0..926c65b74f9799e79dc924401d76aa4dce2d14de 100644 (file)
@@ -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;
 }
 
index 25daff9081b02e82435df666fdbef4518d0b76fa..cadb2d96a8bb267b35d3b1dd826652acf53afc68 100644 (file)
@@ -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",
index 2c677b2e9e74749ff7d550d3ad236d5c451dd9fe..4133546267d937d57a31704ee378d04df3791c22 100644 (file)
@@ -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;
 }
 
index 4a688e22abe294783577bb2eea50cf168adbeb0d..54c4b8ffa51f9c1b4b5dca2b57281ae31d6eb8e3 100644 (file)
@@ -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;
 }
 
index 731b746e0b628d7ee2b3a1713449129786143796..67f126927094f7b1bfaeb504d58939b74457e9d2 100644 (file)
@@ -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;
 }
 
index 7c3d2d4738cedb2768909f6e479089106b78d517..2ce7a593d8b698a426a0a402abf11d9821549c95 100644 (file)
@@ -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;
 }
 
index 6b811e69310e71c306475f32f7fc905d843e013a..0e2a92d14f9ac761ce30e967b365ee82598b2ab8 100644 (file)
@@ -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;
 }
 
index 5b2c72d0db699489699fed3e1c42520e5b8a9df6..04125d7bd50d280f45a6c8ca857ad741f98e0951 100644 (file)
@@ -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;
 }
 
index ed616c5e783a5f8ab0b19164a0aff26ef28be4f0..6428e275b06beb4de01c199f3f401d639d8960a1 100644 (file)
@@ -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;
 }
 
index beb00159127690f8b88ddc964865ff85f8015380..481299a58fcf93a9f4db053fc0c14dfd6e45bb36 100644 (file)
@@ -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,
index 143e4da2fdc854ce27d174005556267ae6075258..67e5cd5ed2a36af1654c8c946087b865c06a040d 100644 (file)
@@ -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,
index 6724c54d7603cf21c4cb708374d82b4870fe0460..6cef72dfa0e4264ca72d1b3f49c64880aa84f3d7 100644 (file)
@@ -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;
 }
 
index 90ef986ef0be2237c49e1f3c8ccf645b8e6048c0..42a27e41be186fb6422ee2e8220bd1449dd55e30 100644 (file)
@@ -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,
index 06597abb3f72e4879dc350e0cbe5692572977259..5b3853ef73abe1904f117ffd805bb67a96929c85 100644 (file)
@@ -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;
 }
 
index e67bca31884f51ac42ff75d9f36ec3c2e1682a4e..12e6f3bfccd221aa87c4004c617a7112dfeae096 100644 (file)
@@ -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;
 }
index 56d9a9e83a60e5bc757cffca1363585dc9b706ef..f4907d102a0c06c68b6bd9b1cde8ed824bfec352 100644 (file)
@@ -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");
index ccc74fd7f1fcc664810b8ec3a914e82b1bec06e4..9700a2451d689c527cb39a4cc48854d5ed1f7bd6 100644 (file)
@@ -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");
index d06aecf200f8f9ab3b603f1420f2cd94e04d77bc..af2fb91f60dc71f88387148620a593e78e24070d 100644 (file)
@@ -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
index 076ae6d224c20da0b61f7a4871f060fbcb9ab56d..e2562764aa86825d9eb4b2fae4fca6e6e50e0455 100644 (file)
@@ -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);
        }
index c135edc36bee13c1455ac5287d7f9addf942e4b7..7b031b647a6d32b9ff2c647d33abecfbefd344dd 100644 (file)
@@ -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:
index 9fda4b3428e9fd3b56b8601b4ebe747e6eb22ec1..48c939efeb453df43f7c4a587e1746999bcb9d6a 100644 (file)
@@ -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.
  *
index c6f81dcefa42011af6ea25d75ad97098018cc495..809b7f65a594bd7f2f14b487683876808d2c9cc2 100644 (file)
@@ -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();
index d102428bbeaacfde14d2ad966434a977e8944743..461b3140472d75b5ba1b7078a2283aad06f4a2f8 100644 (file)
@@ -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",
index 96cab809663eedcfe6098315af86996c4cfd139f..e372bcf9c78725393026db278fb71dd6e04c769f 100644 (file)
@@ -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;
 }
index 2641654707fcd8ebac7a30c4e79e8e00474bcfed..3725c94350dc44419a9ddaa69bab24e23d92c1b1 100644 (file)
@@ -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) {
index 8d446b3b333c5b38f72dc49d6d2fb9a23b824f27..9104e0e0495eace04797d1e2b1b11ebdfe5829c1 100644 (file)
@@ -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,
index a5a831ea3054e32edfd1b93ef9a10052d3ea0fd8..fa45fec3518273ed7435bc8fc4da615c738e2999 100644 (file)
@@ -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",
index 5362e9ede1a3d47a07a8a59500d881e83431d2d8..56558624fe53c885b84adc27941de2e73d045693 100644 (file)
@@ -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;
index 6b84794338b89554ec96e18c7cbab271cef38173..e2b4ffa2e7d74b93a0bf07a25e7c5f5ece21f811 100644 (file)
@@ -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);
 
index d77b19c92f33355f93a06a884f6289f78ce87efd..f4f1dfe3bd970f0c1edd342059802e9088488275 100644 (file)
@@ -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;
index 71d838ad993d4b25a8165f61a428d8bbd47f374b..f49a3573e59c2d55a29c2e4a39a3202df95db652 100644 (file)
@@ -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);
index e883ff383362ecfb91fef9293a66c22e8f412bc9..5f61f1b099febcb494c6b83c71fd728580976c13 100644 (file)
@@ -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");
index d180296f420a91cfef07ef19da3a696a686d5a78..62bc9d67db258f7c36b5c47d021c4276ab838c22 100644 (file)
@@ -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");
index 5fcab637857941c9b8507f702f1d61367ee7f341..a0ce2a9d1e51b123283715b7f88fab65d5a73a85 100644 (file)
@@ -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;
index e15b0d815cea196336b34439e1368e77acbb9f26..3cac25a2d4f9e4fa6645399331505e28089dd83a 100644 (file)
@@ -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;
index 0273c6a68febef8a8f69015d45b95ae1248362c2..f84f11819799a05ba6dfd1d0fed7108969e4eacd 100644 (file)
@@ -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");
index ee1894ffb5dd8280dfdb9c13e8caa34a1d88811b..0a65e6e1da1d38cb1ab81d31eb2ac8b0b5e6a53f 100644 (file)
@@ -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)
                        &registration_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;
index 79a4a8c3eb275d94c52dc04d6758f52ffc2fba26..fbb1ad4e882b5b167c8aefa35db2c97db9d9637f 100644 (file)
@@ -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", "",
index e1f0cee9d5834b411b2de2a7e70a0afde7acca4c..cafbd52ec83e2e4fa381bf290343c9e9a5ba18a9 100644 (file)
@@ -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",
index 12d6b74f689efe0e3bfaf425a62aacf5c0ffeb9a..6107a151216974316ea427bfb8b3ee961b118471 100644 (file)
@@ -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;
index 16d50cd276e8c6f4982ba98d38557fb954e776a1..04774190ef4564f51613534fcecdd646109056c7 100644 (file)
@@ -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",
index 7a63fe46aa0bec33a9871ddced2db76bc4ec7cb6..f4804c7cb2f85abe2642f8fc68261c2ffd3b14b8 100644 (file)
@@ -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");
index 55240bacc10432aeaa5136364e6b546adcc41bd4..9d7bc4c2433550b3b591ed25e08490379cc045ca 100644 (file)
@@ -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();
index 2065c36b6bcd515c651588dd67e6769075250860..29e75660cf7bb013d2f98adf67bc596631b45db9 100644 (file)
@@ -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);
index 7fdb5d4ad7467ea0bf5acebdd00301ab74ed7ce2..57d1fd25838321e1c6103740edbb84628a912884 100644 (file)
@@ -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;
 }
index 46bc6eb713f0aa93aa715c92e803ea5fa1f256f3..5508be8884db62fae86768fccee0f809d3a255c1 100644 (file)
@@ -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;
 }
index 9860b0ebd7f39dc2319628cacb0ea4d653becc6c..fe015ec73bfe8ecc0c1f8e6dbdc72ff3eb4358f2 100644 (file)
@@ -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;
index 4eb5260714f1b3dad82401bbeb78fb6e9cb27f2a..eb0dc670296b1869f08628a0b8c2cf6f42c5a80f 100644 (file)
@@ -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;
index a59f63df5c7df958410ffab9e8077691cdd20335..921b007be0b8b56ab3e2721100ad08926fef5877 100644 (file)
@@ -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}}}",
index 13fd684cbd17d62b4af470aec5738252d4381e98..4cc7b8e0ac35b8d0565de7e61ccc2282e61ef845 100644 (file)
@@ -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);
index c5d3b9b866cb98f8dd29eb2699d1a4c58be6dd06..32a98cb7d523ed9581e436fb2c87eb8643f8fa00 100644 (file)
@@ -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);