summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/cdr_mysql.c43
-rw-r--r--addons/chan_mobile.c11
-rw-r--r--apps/app_adsiprog.c2
-rw-r--r--apps/app_agent_pool.c5
-rw-r--r--apps/app_alarmreceiver.c2
-rw-r--r--apps/app_authenticate.c2
-rw-r--r--apps/app_cdr.c5
-rw-r--r--apps/app_confbridge.c6
-rw-r--r--apps/app_dahdiras.c2
-rw-r--r--apps/app_forkcdr.c6
-rw-r--r--apps/app_queue.c2
-rw-r--r--apps/app_voicemail.c2
-rw-r--r--apps/app_zapateller.c2
-rw-r--r--cdr/cdr_custom.c4
-rw-r--r--cel/cel_custom.c7
-rw-r--r--cel/cel_odbc.c7
-rw-r--r--channels/chan_alsa.c46
-rw-r--r--channels/chan_dahdi.c12
-rw-r--r--channels/chan_iax2.c33
-rw-r--r--channels/chan_mgcp.c10
-rw-r--r--channels/chan_motif.c2
-rw-r--r--channels/chan_nbs.c4
-rw-r--r--channels/chan_oss.c57
-rw-r--r--channels/chan_phone.c6
-rw-r--r--channels/chan_pjsip.c2
-rw-r--r--channels/chan_sip.c20
-rw-r--r--channels/chan_skinny.c6
-rw-r--r--channels/chan_unistim.c2
-rw-r--r--codecs/codec_a_mu.c2
-rw-r--r--codecs/codec_adpcm.c2
-rw-r--r--codecs/codec_alaw.c2
-rw-r--r--codecs/codec_g722.c2
-rw-r--r--codecs/codec_g726.c2
-rw-r--r--codecs/codec_gsm.c2
-rw-r--r--codecs/codec_ilbc.c2
-rw-r--r--codecs/codec_lpc10.c2
-rw-r--r--codecs/codec_resample.c4
-rw-r--r--codecs/codec_ulaw.c2
-rw-r--r--formats/format_g723.c2
-rw-r--r--formats/format_g726.c23
-rw-r--r--formats/format_g729.c2
-rw-r--r--formats/format_gsm.c2
-rw-r--r--formats/format_h263.c2
-rw-r--r--formats/format_h264.c2
-rw-r--r--formats/format_ilbc.c2
-rw-r--r--formats/format_jpeg.c2
-rw-r--r--formats/format_ogg_vorbis.c2
-rw-r--r--formats/format_pcm.c22
-rw-r--r--formats/format_sln.c29
-rw-r--r--formats/format_vox.c2
-rw-r--r--formats/format_wav.c18
-rw-r--r--formats/format_wav_gsm.c2
-rw-r--r--funcs/func_cdr.c5
-rw-r--r--funcs/func_holdintercept.c2
-rw-r--r--funcs/func_talkdetect.c2
-rw-r--r--include/asterisk/logger.h7
-rw-r--r--main/asterisk.c6
-rw-r--r--main/loader.c1
-rw-r--r--main/logger.c5
-rw-r--r--res/res_ari.c51
-rw-r--r--res/res_ari_events.c29
-rw-r--r--res/res_ari_model.c2
-rw-r--r--res/res_calendar.c6
-rw-r--r--res/res_chan_stats.c23
-rw-r--r--res/res_config_sqlite.c16
-rw-r--r--res/res_config_sqlite3.c6
-rw-r--r--res/res_endpoint_stats.c2
-rw-r--r--res/res_hep_rtcp.c2
-rw-r--r--res/res_http_websocket.c2
-rw-r--r--res/res_limit.c2
-rw-r--r--res/res_pjsip/config_transport.c2
-rw-r--r--res/res_pjsip_nat.c4
-rw-r--r--res/res_pjsip_one_touch_record_info.c2
-rw-r--r--res/res_pjsip_outbound_publish.c2
-rw-r--r--res/res_pjsip_outbound_registration.c8
-rw-r--r--res/res_pjsip_pubsub.c12
-rw-r--r--res/res_pjsip_sdp_rtp.c2
-rw-r--r--res/res_pjsip_send_to_voicemail.c2
-rw-r--r--res/res_pjsip_t38.c2
-rw-r--r--res/res_smdi.c4
-rw-r--r--res/res_stasis.c4
-rw-r--r--res/res_stasis_device_state.c5
-rw-r--r--res/res_stasis_playback.c5
-rw-r--r--res/res_stasis_recording.c5
-rw-r--r--res/res_stasis_test.c2
-rw-r--r--res/res_statsd.c3
-rw-r--r--rest-api-templates/res_ari_resource.c.mustache36
-rw-r--r--tests/test_bucket.c2
-rw-r--r--tests/test_channel_feature_hooks.c2
89 files changed, 403 insertions, 312 deletions
diff --git a/addons/cdr_mysql.c b/addons/cdr_mysql.c
index 0878950e1..f8f4192ac 100644
--- a/addons/cdr_mysql.c
+++ b/addons/cdr_mysql.c
@@ -351,9 +351,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));
@@ -364,12 +375,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);
@@ -505,13 +511,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 */
@@ -582,7 +591,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))) {
@@ -591,7 +602,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))) {
@@ -657,7 +670,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) {
@@ -671,7 +685,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 bd39bee64..8f04af753 100644
--- a/addons/chan_mobile.c
+++ b/addons/chan_mobile.c
@@ -4704,9 +4704,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;
}
@@ -4714,6 +4718,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;
}
@@ -4738,10 +4744,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 9d73702f6..6d485d6fb 100644
--- a/apps/app_adsiprog.c
+++ b/apps/app_adsiprog.c
@@ -1605,7 +1605,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 4563b58a0..2e0c8e880 100644
--- a/apps/app_agent_pool.c
+++ b/apps/app_agent_pool.c
@@ -2653,7 +2653,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. */
@@ -2677,8 +2677,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 2169617ac..07885d2bf 100644
--- a/apps/app_alarmreceiver.c
+++ b/apps/app_alarmreceiver.c
@@ -975,7 +975,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 f58ed3626..e0ad4a089 100644
--- a/apps/app_authenticate.c
+++ b/apps/app_authenticate.c
@@ -270,7 +270,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 17dea431d..1500c89f6 100644
--- a/apps/app_cdr.c
+++ b/apps/app_cdr.c
@@ -249,7 +249,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);
@@ -259,7 +259,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 5ec20ddb9..a9f917b9a 100644
--- a/apps/app_confbridge.c
+++ b/apps/app_confbridge.c
@@ -3955,7 +3955,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 */
@@ -3963,7 +3963,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 */
@@ -3988,7 +3988,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 6eaa1bd22..10c2962c6 100644
--- a/apps/app_dahdiras.c
+++ b/apps/app_dahdiras.c
@@ -223,7 +223,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 acd8982ef..5946c5009 100644
--- a/apps/app_forkcdr.c
+++ b/apps/app_forkcdr.c
@@ -199,7 +199,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);
@@ -208,7 +208,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 ae2d645e9..2389f0b13 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -8892,7 +8892,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 aebaafaf3..de826704a 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -14974,7 +14974,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 e876a70a8..f62f7bb50 100644
--- a/apps/app_zapateller.c
+++ b/apps/app_zapateller.c
@@ -132,7 +132,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 7d8b9d82e..fec20eaa8 100644
--- a/cdr/cdr_custom.c
+++ b/cdr/cdr_custom.c
@@ -203,7 +203,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();
@@ -216,7 +216,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 d1655413f..d05a1260c 100644
--- a/cel/cel_custom.c
+++ b/cel/cel_custom.c
@@ -191,14 +191,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;
}
@@ -207,7 +208,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 2ab511418..a0cc6e33a 100644
--- a/cel/cel_odbc.c
+++ b/cel/cel_odbc.c
@@ -801,13 +801,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;
}
@@ -816,7 +817,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 c50b5408e..c53c1a344 100644
--- a/channels/chan_alsa.c
+++ b/channels/chan_alsa.c
@@ -924,6 +924,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
*
@@ -994,12 +1014,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));
@@ -1007,26 +1031,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 97c80c83e..72fbe6e0c 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -19530,11 +19530,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);
@@ -19542,7 +19542,7 @@ static int load_module(void)
if (dahdi_native_load(&dahdi_tech)) {
ao2_ref(dahdi_tech.capabilities, -1);
- return AST_MODULE_LOAD_FAILURE;
+ return AST_MODULE_LOAD_DECLINE;
}
#ifdef HAVE_PRI
@@ -19560,7 +19560,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(
@@ -19571,7 +19571,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)
@@ -19594,7 +19594,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 38dc5c00e..d15b55d72 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -14886,7 +14886,7 @@ container_fail:
if (calltoken_ignores) {
ao2_ref(calltoken_ignores, -1);
}
- return AST_MODULE_LOAD_FAILURE;
+ return -1;
}
@@ -15091,12 +15091,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));
@@ -15107,28 +15109,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);
@@ -15137,8 +15147,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);
@@ -15157,6 +15169,7 @@ static int load_module(void)
ast_timer_close(timer);
timer = NULL;
}
+ __unload_module();
return AST_MODULE_LOAD_DECLINE;
}
@@ -15182,7 +15195,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)) {
@@ -15192,7 +15205,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 af79e218e..6cac4bc8a 100644
--- a/channels/chan_mgcp.c
+++ b/channels/chan_mgcp.c
@@ -4860,11 +4860,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);
@@ -4873,7 +4873,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())) {
@@ -4881,7 +4881,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)) {
@@ -4897,7 +4897,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 5828a1155..7d696e87d 100644
--- a/channels/chan_motif.c
+++ b/channels/chan_motif.c
@@ -2788,7 +2788,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 61e5398c3..a12470cee 100644
--- a/channels/chan_nbs.c
+++ b/channels/chan_nbs.c
@@ -257,12 +257,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 3e1e38d37..ec112de38 100644
--- a/channels/chan_oss.c
+++ b/channels/chan_oss.c
@@ -1435,6 +1435,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
*
@@ -1472,12 +1497,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);
@@ -1494,31 +1519,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 aa10a5620..76891ac98 100644
--- a/channels/chan_phone.c
+++ b/channels/chan_phone.c
@@ -1416,7 +1416,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) {
@@ -1432,7 +1432,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);
@@ -1508,7 +1508,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 46c74adf7..a92816431 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -2749,7 +2749,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 5419a1dd8..affe937e8 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -35287,17 +35287,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! */
@@ -35312,12 +35312,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);
@@ -35328,13 +35328,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;
@@ -35349,7 +35349,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);
@@ -35366,14 +35366,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 d1c2b927a..a0530007b 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -8698,7 +8698,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 */
@@ -8706,7 +8706,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);
@@ -8723,7 +8723,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 f82522111..b820cf51e 100644
--- a/channels/chan_unistim.c
+++ b/channels/chan_unistim.c
@@ -7126,7 +7126,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 ea8d01488..a2cce4ef7 100644
--- a/codecs/codec_a_mu.c
+++ b/codecs/codec_a_mu.c
@@ -141,7 +141,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 3076d264e..0b2f90f39 100644
--- a/codecs/codec_adpcm.c
+++ b/codecs/codec_adpcm.c
@@ -346,7 +346,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 ba16936b5..ebaca74c5 100644
--- a/codecs/codec_alaw.c
+++ b/codecs/codec_alaw.c
@@ -130,7 +130,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 9c868d3d9..48b5e4a27 100644
--- a/codecs/codec_g722.c
+++ b/codecs/codec_g722.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_g726.c b/codecs/codec_g726.c
index 4bf39b7ce..3b76628d5 100644
--- a/codecs/codec_g726.c
+++ b/codecs/codec_g726.c
@@ -890,7 +890,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 2ae42a6c0..296747ee3 100644
--- a/codecs/codec_gsm.c
+++ b/codecs/codec_gsm.c
@@ -239,7 +239,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 16466a9c9..d691f706f 100644
--- a/codecs/codec_ilbc.c
+++ b/codecs/codec_ilbc.c
@@ -267,7 +267,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 5f6ffff87..00e302267 100644
--- a/codecs/codec_lpc10.c
+++ b/codecs/codec_lpc10.c
@@ -272,7 +272,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 b54f5c921..e0d530d85 100644
--- a/codecs/codec_resample.c
+++ b/codecs/codec_resample.c
@@ -153,7 +153,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++) {
@@ -180,7 +180,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 cf4e358da..e0a4f6841 100644
--- a/codecs/codec_ulaw.c
+++ b/codecs/codec_ulaw.c
@@ -181,7 +181,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 750bacaf1..04e03b608 100644
--- a/formats/format_g723.c
+++ b/formats/format_g723.c
@@ -142,7 +142,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 f3b09f035..08e669e26 100644
--- a/formats/format_g726.c
+++ b/formats/format_g726.c
@@ -221,29 +221,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 6e0632c53..49e58025f 100644
--- a/formats/format_g729.c
+++ b/formats/format_g729.c
@@ -138,7 +138,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 777d49a63..a2b6d3656 100644
--- a/formats/format_gsm.c
+++ b/formats/format_gsm.c
@@ -183,7 +183,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 027f604f4..4cc3db542 100644
--- a/formats/format_h263.c
+++ b/formats/format_h263.c
@@ -170,7 +170,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 38f2734f3..60b090211 100644
--- a/formats/format_h264.c
+++ b/formats/format_h264.c
@@ -163,7 +163,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 b556d6cc8..eab465d88 100644
--- a/formats/format_ilbc.c
+++ b/formats/format_ilbc.c
@@ -135,7 +135,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 f69c547d3..798141d55 100644
--- a/formats/format_jpeg.c
+++ b/formats/format_jpeg.c
@@ -96,7 +96,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 4c42181fc..d4212a169 100644
--- a/formats/format_ogg_vorbis.c
+++ b/formats/format_ogg_vorbis.c
@@ -423,7 +423,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 0b1706e50..fedc0632f 100644
--- a/formats/format_pcm.c
+++ b/formats/format_pcm.c
@@ -500,6 +500,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;
@@ -517,19 +525,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 32972d09d..af3f691c8 100644
--- a/formats/format_sln.c
+++ b/formats/format_sln.c
@@ -235,6 +235,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;
@@ -251,26 +264,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 eb8ab0ead..5a70c34b1 100644
--- a/formats/format_vox.c
+++ b/formats/format_vox.c
@@ -137,7 +137,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 a415140f9..049ead40e 100644
--- a/formats/format_wav.c
+++ b/formats/format_wav.c
@@ -536,22 +536,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 21a850805..eef06cef5 100644
--- a/formats/format_wav_gsm.c
+++ b/formats/format_wav_gsm.c
@@ -568,7 +568,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 83942db4c..82ff488b0 100644
--- a/funcs/func_cdr.c
+++ b/funcs/func_cdr.c
@@ -649,7 +649,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);
@@ -665,7 +665,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 c2435463a..2a1cbb8c1 100644
--- a/funcs/func_holdintercept.c
+++ b/funcs/func_holdintercept.c
@@ -228,7 +228,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 02963f20e..5c7f41ab3 100644
--- a/funcs/func_talkdetect.c
+++ b/funcs/func_talkdetect.c
@@ -397,7 +397,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 9f9f671c0..2f629dfbe 100644
--- a/include/asterisk/logger.h
+++ b/include/asterisk/logger.h
@@ -500,6 +500,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 68859ab2f..16313ea68 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -4354,7 +4354,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 380fe1c92..d5500076b 100644
--- a/main/loader.c
+++ b/main/loader.c
@@ -1243,6 +1243,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 146d91985..8c8162d71 100644
--- a/main/logger.c
+++ b/main/logger.c
@@ -1653,6 +1653,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 549d78353..054d3bf3c 100644
--- a/res/res_ari.c
+++ b/res/res_ari.c
@@ -1106,6 +1106,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);
@@ -1115,7 +1136,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 */
@@ -1125,10 +1146,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;
}
@@ -1140,33 +1163,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 8ccb8870c..8d8a303d1 100644
--- a/res/res_ari_events.c
+++ b/res/res_ari_events.c
@@ -417,6 +417,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;
@@ -428,31 +437,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;
- ast_ari_websocket_events_event_websocket_dtor();
- 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 dd8e1af38..015b1e73f 100644
--- a/res/res_ari_model.c
+++ b/res/res_ari_model.c
@@ -190,7 +190,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 92b73c1ed..666b0e184 100644
--- a/res/res_calendar.c
+++ b/res/res_calendar.c
@@ -1888,7 +1888,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)) {
@@ -1902,7 +1902,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 9a26db78c..061d0867e 100644
--- a/res/res_chan_stats.c
+++ b/res/res_chan_stats.c
@@ -148,13 +148,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);
@@ -163,20 +172,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 96a10b43f..0f9113188 100644
--- a/res/res_config_sqlite.c
+++ b/res/res_config_sqlite.c
@@ -1680,7 +1680,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);
@@ -1700,7 +1700,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);
@@ -1719,7 +1719,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);
@@ -1729,7 +1729,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);
@@ -1744,7 +1744,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);
@@ -1754,7 +1754,7 @@ static int load_module(void)
if (error) {
unload_module();
- return 1;
+ return AST_MODULE_LOAD_DECLINE;
}
cdr_registered = 1;
@@ -1764,12 +1764,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 087843a68..0025548be 100644
--- a/res/res_config_sqlite3.c
+++ b/res/res_config_sqlite3.c
@@ -1359,18 +1359,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 249cbea9b..1e3f104c2 100644
--- a/res/res_endpoint_stats.c
+++ b/res/res_endpoint_stats.c
@@ -118,7 +118,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 25b90c7a2..7191f4661 100644
--- a/res/res_hep_rtcp.c
+++ b/res/res_hep_rtcp.c
@@ -155,7 +155,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 799eb848f..60332f591 100644
--- a/res/res_http_websocket.c
+++ b/res/res_http_websocket.c
@@ -1441,7 +1441,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 bff777d99..a308c4121 100644
--- a/res/res_limit.c
+++ b/res/res_limit.c
@@ -209,7 +209,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 d180296f4..62bc9d67d 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 a26180bc0..9205622d7 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 2d53fd48e..ec5f9be3e 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 a19a9bb24..c413cb0e1 100644
--- a/res/res_pjsip_outbound_publish.c
+++ b/res/res_pjsip_outbound_publish.c
@@ -1631,7 +1631,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 704239bd0..8a840ff05 100644
--- a/res/res_pjsip_outbound_registration.c
+++ b/res/res_pjsip_outbound_registration.c
@@ -2082,7 +2082,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. */
@@ -2091,7 +2091,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);
@@ -2135,7 +2135,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. */
@@ -2146,7 +2146,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 f0467627e..a1f3f2462 100644
--- a/res/res_pjsip_pubsub.c
+++ b/res/res_pjsip_pubsub.c
@@ -5225,13 +5225,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);
@@ -5239,7 +5239,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");
@@ -5249,7 +5249,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));
@@ -5277,7 +5277,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");
@@ -5286,7 +5286,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 7c861dac9..dfa6957c7 100644
--- a/res/res_pjsip_sdp_rtp.c
+++ b/res/res_pjsip_sdp_rtp.c
@@ -1650,7 +1650,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 bd70bcfd7..1cd28ceac 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 bae4ff1dc..4f082d714 100644
--- a/res/res_pjsip_t38.c
+++ b/res/res_pjsip_t38.c
@@ -938,7 +938,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 4c7a45164..e2e5b17ba 100644
--- a/res/res_smdi.c
+++ b/res/res_smdi.c
@@ -1126,7 +1126,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)) {
@@ -1369,7 +1369,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 196720984..9ea0d63fe 100644
--- a/res/res_stasis.c
+++ b/res/res_stasis.c
@@ -2111,12 +2111,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 e16bd8edd..344cb40c9 100644
--- a/res/res_stasis_device_state.c
+++ b/res/res_stasis_device_state.c
@@ -453,13 +453,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 4370f1712..c6f21365b 100644
--- a/res/res_stasis_playback.c
+++ b/res/res_stasis_playback.c
@@ -731,13 +731,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 630205c34..56984cb40 100644
--- a/res/res_stasis_recording.c
+++ b/res/res_stasis_recording.c
@@ -631,13 +631,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 8b5bad7ae..19d2a42c6 100644
--- a/res/res_stasis_test.c
+++ b/res/res_stasis_test.c
@@ -272,7 +272,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 22c4ba2e7..3d7dd1684 100644
--- a/res/res_statsd.c
+++ b/res/res_statsd.c
@@ -349,7 +349,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 c28a62cd9..ca4e2f192 100644
--- a/rest-api-templates/res_ari_resource.c.mustache
+++ b/rest-api-templates/res_ari_resource.c.mustache
@@ -256,6 +256,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;
@@ -270,14 +283,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;
@@ -289,21 +302,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;
- ast_ari_websocket_events_event_websocket_dtor();
-{{/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 2b6e059c3..2cf5267c1 100644
--- a/tests/test_bucket.c
+++ b/tests/test_bucket.c
@@ -1012,7 +1012,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 c9fdf0983..a32548458 100644
--- a/tests/test_channel_feature_hooks.c
+++ b/tests/test_channel_feature_hooks.c
@@ -345,7 +345,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);