diff --git a/include/asterisk/ari.h b/include/asterisk/ari.h index 865b4b00cc5d794dd3c49edd42ad4f52230fca0f..f83d5963f322419200f33154dc0cc4bd6982fb19 100644 --- a/include/asterisk/ari.h +++ b/include/asterisk/ari.h @@ -268,4 +268,14 @@ void ast_ari_response_created(struct ast_ari_response *response, */ void ast_ari_response_alloc_failed(struct ast_ari_response *response); +/*! \brief Determines whether the res_ari module is loaded */ +#define CHECK_ARI_MODULE_LOADED() \ + do { \ + if (!ast_module_check("res_ari.so") \ + || !ast_ari_oom_json()) { \ + return AST_MODULE_LOAD_DECLINE; \ + } \ + } while(0) + + #endif /* _ASTERISK_ARI_H */ diff --git a/res/res_ari_applications.c b/res/res_ari_applications.c index 21d9f56eb0003865e267aa89134e6776286f1851..cf700c464e0cb4b0d21fc608fce8ff33333ef1ea 100644 --- a/res/res_ari_applications.c +++ b/res/res_ari_applications.c @@ -500,6 +500,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&applications); if (res) { diff --git a/res/res_ari_asterisk.c b/res/res_ari_asterisk.c index 89517ccae0c6d537c71ec04818fd21eb35b23f7a..eb0617b4c7081464219cd9e4d271317ede83dad7 100644 --- a/res/res_ari_asterisk.c +++ b/res/res_ari_asterisk.c @@ -1221,6 +1221,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&asterisk); if (res) { diff --git a/res/res_ari_bridges.c b/res/res_ari_bridges.c index 5402c2b995e13f8404fdb579904ab68b7af35dfb..65bf7ed3e73c8276cb9e238b6e658f1323f97bb0 100644 --- a/res/res_ari_bridges.c +++ b/res/res_ari_bridges.c @@ -1547,6 +1547,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&bridges); if (res) { diff --git a/res/res_ari_channels.c b/res/res_ari_channels.c index 9d218e2beefb360832e7e9a7d549e1cba14fb749..f6befcc90d4a036bdd643586684db4ceae6cd825 100644 --- a/res/res_ari_channels.c +++ b/res/res_ari_channels.c @@ -2851,6 +2851,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&channels); if (res) { diff --git a/res/res_ari_device_states.c b/res/res_ari_device_states.c index d6de5dff86919990c1fc4db6ea46960bb7121194..f393935626581035a6fc39268eeb840d92f2ab69 100644 --- a/res/res_ari_device_states.c +++ b/res/res_ari_device_states.c @@ -331,6 +331,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&deviceStates); if (res) { diff --git a/res/res_ari_endpoints.c b/res/res_ari_endpoints.c index d96de0877bf10751826eca60c2f5c5e02a4e7db5..d1242c0fbc0e05e0d68d2fe6bc4d6bdd88ecb15e 100644 --- a/res/res_ari_endpoints.c +++ b/res/res_ari_endpoints.c @@ -455,6 +455,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&endpoints); if (res) { diff --git a/res/res_ari_events.c b/res/res_ari_events.c index 3f5b89a440ee527e222a6f91ed4f44af1f7c97dc..f916d0e4eedba8c8c3bc4305ff9c473fa94869fb 100644 --- a/res/res_ari_events.c +++ b/res/res_ari_events.c @@ -430,28 +430,35 @@ static int unload_module(void) static int load_module(void) { int res = 0; - struct ast_websocket_protocol *protocol; - if (ast_ari_websocket_events_event_websocket_init() == -1) { - return AST_MODULE_LOAD_DECLINE; - } + CHECK_ARI_MODULE_LOADED(); - events.ws_server = ast_websocket_server_create(); - if (!events.ws_server) { - ast_ari_websocket_events_event_websocket_dtor(); - return AST_MODULE_LOAD_DECLINE; - } + /* This is scoped to not conflict with CHECK_ARI_MODULE_LOADED */ + { + struct ast_websocket_protocol *protocol; - protocol = ast_websocket_sub_protocol_alloc("ari"); - if (!protocol) { - ao2_ref(events.ws_server, -1); - events.ws_server = NULL; - ast_ari_websocket_events_event_websocket_dtor(); - return AST_MODULE_LOAD_DECLINE; + if (ast_ari_websocket_events_event_websocket_init() == -1) { + return AST_MODULE_LOAD_DECLINE; + } + + events.ws_server = ast_websocket_server_create(); + if (!events.ws_server) { + ast_ari_websocket_events_event_websocket_dtor(); + return AST_MODULE_LOAD_DECLINE; + } + + protocol = ast_websocket_sub_protocol_alloc("ari"); + if (!protocol) { + ao2_ref(events.ws_server, -1); + events.ws_server = NULL; + ast_ari_websocket_events_event_websocket_dtor(); + 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); } - 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); if (res) { diff --git a/res/res_ari_mailboxes.c b/res/res_ari_mailboxes.c index 12c33cd8847ba092f33755f1b9abed87e8011f99..1f6d2cc81b97a838ff62e43b4b7091cfb2741e69 100644 --- a/res/res_ari_mailboxes.c +++ b/res/res_ari_mailboxes.c @@ -337,6 +337,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&mailboxes); if (res) { diff --git a/res/res_ari_playbacks.c b/res/res_ari_playbacks.c index e2c432db031ddc393340c21a55594bd86a122299..40099cfb4882253aaff8f12635acb3ae837a35bd 100644 --- a/res/res_ari_playbacks.c +++ b/res/res_ari_playbacks.c @@ -289,6 +289,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&playbacks); if (res) { diff --git a/res/res_ari_recordings.c b/res/res_ari_recordings.c index 57d80f2e0fea78fc9d6dfecdd23c24a3836d7d6f..fe3d343ee2acac875ae87ff92bca2b6bdcf0c6c4 100644 --- a/res/res_ari_recordings.c +++ b/res/res_ari_recordings.c @@ -873,6 +873,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&recordings); if (res) { diff --git a/res/res_ari_sounds.c b/res/res_ari_sounds.c index fded7fbced53013a62022cf912ad29acde55d961..8d5928a504b6e4772bf98a9af3f83b2105f850da 100644 --- a/res/res_ari_sounds.c +++ b/res/res_ari_sounds.c @@ -219,6 +219,10 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + + stasis_app_ref(); res |= ast_ari_add_handler(&sounds); if (res) { diff --git a/rest-api-templates/res_ari_resource.c.mustache b/rest-api-templates/res_ari_resource.c.mustache index 3ccafcd082b8c3b39b8724a1c9b6f9682360d716..d4ccda9e8eadb96fa174dd05b5dfe8bae092f9a9 100644 --- a/rest-api-templates/res_ari_resource.c.mustache +++ b/rest-api-templates/res_ari_resource.c.mustache @@ -273,36 +273,43 @@ static int unload_module(void) static int load_module(void) { int res = 0; + + CHECK_ARI_MODULE_LOADED(); + {{#apis}} {{#operations}} {{#has_websocket}} - struct ast_websocket_protocol *protocol; + /* This is scoped to not conflict with CHECK_ARI_MODULE_LOADED */ + { + struct ast_websocket_protocol *protocol; - if (ast_ari_websocket_{{c_name}}_{{c_nickname}}_init() == -1) { - return AST_MODULE_LOAD_DECLINE; - } + if (ast_ari_websocket_{{c_name}}_{{c_nickname}}_init() == -1) { + return AST_MODULE_LOAD_DECLINE; + } - {{full_name}}.ws_server = ast_websocket_server_create(); - if (!{{full_name}}.ws_server) { - ast_ari_websocket_events_event_websocket_dtor(); - return AST_MODULE_LOAD_DECLINE; - } + {{full_name}}.ws_server = ast_websocket_server_create(); + if (!{{full_name}}.ws_server) { + ast_ari_websocket_events_event_websocket_dtor(); + 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; - ast_ari_websocket_events_event_websocket_dtor(); - 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; + protocol = ast_websocket_sub_protocol_alloc("{{websocket_protocol}}"); + if (!protocol) { + ao2_ref({{full_name}}.ws_server, -1); + {{full_name}}.ws_server = NULL; + ast_ari_websocket_events_event_websocket_dtor(); + 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; {{/has_websocket}} {{#is_websocket}} - res |= ast_websocket_server_add_protocol2({{full_name}}.ws_server, protocol); + res |= ast_websocket_server_add_protocol2({{full_name}}.ws_server, protocol); + } {{/is_websocket}} {{/operations}} {{/apis}} + stasis_app_ref(); res |= ast_ari_add_handler(&{{root_full_name}}); if (res) {