Unregister SIP provider API if module load is declined
authorMatthew Jordan <mjordan@digium.com>
Wed, 30 Jan 2013 15:57:41 +0000 (15:57 +0000)
committerMatthew Jordan <mjordan@digium.com>
Wed, 30 Jan 2013 15:57:41 +0000 (15:57 +0000)
A user in #asterisk ran into a problem where a configuration error prevented
the chan_sip module from being loaded. Upon fixing their configuratione error,
they could no longer load the chan_sip module. This was because the
configuration checking happened after the SIP provider was registered with the
Asterisk core, and subsequent attempts to load the SIP module failed as the
provider was already registered.

Since we want to detect any failure in registering chan_sip as early as
possible (as that could be emblematic of a deeper mismatch between module
and Asterisk core), this patch does not change the registration location, but
does ensure that if a module load is declined, we unregister the module as
the SIP api provider.
........

Merged revisions 380480 from http://svn.asterisk.org/svn/asterisk/branches/11

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@380500 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index b547edb..1d9c2d9 100644 (file)
@@ -34331,7 +34331,6 @@ static int load_module(void)
 
        if (!(io = io_context_create())) {
                ast_log(LOG_ERROR, "Unable to create I/O context\n");
-               ast_sched_context_destroy(sched);
                return AST_MODULE_LOAD_FAILURE;
        }
 
@@ -34339,6 +34338,7 @@ static int load_module(void)
 
        can_parse_xml = sip_is_xml_parsable();
        if (reload_config(sip_reloadreason)) {  /* Load the configuration from sip.conf */
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }
 
@@ -34409,11 +34409,13 @@ static int load_module(void)
        initialize_escs();
 
        if (sip_epa_register(&cc_epa_static_data)) {
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }
 
        if (sip_reqresp_parser_init() == -1) {
                ast_log(LOG_ERROR, "Unable to initialize the SIP request and response parser\n");
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }
 
@@ -34422,13 +34424,16 @@ static int load_module(void)
                 * in incoming PUBLISH requests
                 */
                if (ast_cc_agent_register(&sip_cc_agent_callbacks)) {
+                       ast_sip_api_provider_unregister();
                        return AST_MODULE_LOAD_DECLINE;
                }
        }
        if (ast_cc_monitor_register(&sip_cc_monitor_callbacks)) {
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }
        if (!(sip_monitor_instances = ao2_container_alloc(37, sip_monitor_instance_hash_fn, sip_monitor_instance_cmp_fn))) {
+               ast_sip_api_provider_unregister();
                return AST_MODULE_LOAD_DECLINE;
        }