[svn-commits] gtjoseph: trunk r425266 - in /trunk: ./ res/res_phoneprov.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat Oct 11 16:09:58 CDT 2014


Author: gtjoseph
Date: Sat Oct 11 16:09:53 2014
New Revision: 425266

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=425266
Log:
res_phoneprov: Cleanup module load error handling

Tested module load/reload interaction between res_phoneprov and
res_pjsip_phoneprov_provider in cases where res_phoneprov didn't
load correctly (usually misconfiguration or missing phoneprov.conf)

Tested-by: George Joseph

Review: https://reviewboard.asterisk.org/r/4069/
........

Merged revisions 425264 from http://svn.asterisk.org/svn/asterisk/branches/12
........

Merged revisions 425265 from http://svn.asterisk.org/svn/asterisk/branches/13

Modified:
    trunk/   (props changed)
    trunk/res/res_phoneprov.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: trunk/res/res_phoneprov.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_phoneprov.c?view=diff&rev=425266&r1=425265&r2=425266
==============================================================================
--- trunk/res/res_phoneprov.c (original)
+++ trunk/res/res_phoneprov.c Sat Oct 11 16:09:53 2014
@@ -1359,8 +1359,41 @@
 	}
 	ast_config_destroy(phoneprov_cfg);
 
+	if (!ao2_container_count(profiles)) {
+		ast_log(LOG_ERROR, "There are no provisioning profiles in phoneprov.conf.\n");
+		return -1;
+	}
+
 	return 0;
 }
+
+static int unload_module(void)
+{
+	ast_http_uri_unlink(&phoneprovuri);
+	ast_custom_function_unregister(&pp_each_user_function);
+	ast_custom_function_unregister(&pp_each_extension_function);
+	ast_cli_unregister_multiple(pp_cli, ARRAY_LEN(pp_cli));
+
+	/* This cleans up the sip.conf/users.conf provider (called specifically for clarity) */
+	ast_phoneprov_provider_unregister(SIPUSERS_PROVIDER_NAME);
+
+	/* This cleans up the framework which also cleans up the providers. */
+	delete_profiles();
+	ao2_cleanup(profiles);
+	profiles = NULL;
+	delete_routes();
+	ao2_cleanup(http_routes);
+	http_routes = NULL;
+	delete_users();
+	ao2_cleanup(users);
+	users = NULL;
+	delete_providers();
+	ao2_cleanup(providers);
+	providers = NULL;
+
+	return 0;
+}
+
 /*!
  * \brief Load the module
  *
@@ -1413,42 +1446,11 @@
 	ast_custom_function_register(&pp_each_extension_function);
 	ast_cli_register_multiple(pp_cli, ARRAY_LEN(pp_cli));
 
-	return 0;
+	return AST_MODULE_LOAD_SUCCESS;
 
 error:
-	delete_profiles();
-	ao2_cleanup(profiles);
-	delete_routes();
-	ao2_cleanup(http_routes);
-	delete_users();
-	ao2_cleanup(users);
-	delete_providers();
-	ao2_cleanup(providers);
+	unload_module();
 	return AST_MODULE_LOAD_DECLINE;
-
-}
-
-static int unload_module(void)
-{
-	ast_http_uri_unlink(&phoneprovuri);
-	ast_custom_function_unregister(&pp_each_user_function);
-	ast_custom_function_unregister(&pp_each_extension_function);
-	ast_cli_unregister_multiple(pp_cli, ARRAY_LEN(pp_cli));
-
-	/* This cleans up the sip.conf/users.conf provider (called specifically for clarity) */
-	ast_phoneprov_provider_unregister(SIPUSERS_PROVIDER_NAME);
-
-	/* This cleans up the framework which also cleans up the providers. */
-	delete_profiles();
-	ao2_cleanup(profiles);
-	delete_routes();
-	ao2_cleanup(http_routes);
-	delete_users();
-	ao2_cleanup(users);
-	delete_providers();
-	ao2_cleanup(providers);
-
-	return 0;
 }
 
 static int reload(void)
@@ -1464,7 +1466,8 @@
 	/* Reload the profiles */
 	if (load_common()) {
 		ast_log(LOG_ERROR, "Unable to reload provisioning profiles.\n");
-		return -1;
+		unload_module();
+		return AST_MODULE_LOAD_DECLINE;
 	}
 
 	/* For each provider, reload the users */
@@ -1480,7 +1483,7 @@
 	ao2_iterator_destroy(&i);
 	ao2_unlock(providers);
 
-	return 0;
+	return AST_MODULE_LOAD_SUCCESS;
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT | AST_MODFLAG_GLOBAL_SYMBOLS, "HTTP Phone Provisioning",
@@ -1577,6 +1580,10 @@
 
 void ast_phoneprov_provider_unregister(char *provider_name)
 {
+	if (!providers) {
+		return;
+	}
+
 	ast_phoneprov_delete_extensions(provider_name);
 	ao2_find(providers, provider_name, OBJ_SEARCH_KEY | OBJ_NODATA | OBJ_UNLINK);
 	ast_log(LOG_VERBOSE, "Unegistered phoneprov provider '%s'.\n", provider_name);




More information about the svn-commits mailing list