int ast_msg_init(void); /*!< Provided by message.c */
void ast_msg_shutdown(void); /*!< Provided by message.c */
int aco_init(void); /*!< Provided by config_options.c */
+int dns_core_init(void); /*!< Provided by dns_core.c */
/*!
* \brief Initialize the bridging system.
check_init(ast_parking_stasis_init(), "Parking Core");
check_init(ast_device_state_engine_init(), "Device State Engine");
check_init(ast_presence_state_engine_init(), "Presence State Engine");
+ check_init(dns_core_init(), "DNS Resolver Core");
check_init(ast_dns_system_resolver_init(), "Default DNS resolver");
check_init(load_modules(1), "Module Preload");
check_init(ast_features_init(), "Call Features");
ao2_global_obj_replace_unref(cel_linkedids, container);
ao2_cleanup(container);
if (!container) {
- cel_engine_cleanup();
return -1;
}
ao2_global_obj_replace_unref(cel_dialstatus_store, container);
ao2_cleanup(container);
if (!container) {
- cel_engine_cleanup();
return -1;
}
if (STASIS_MESSAGE_TYPE_INIT(cel_generic_type)) {
- cel_engine_cleanup();
return -1;
}
if (ast_cli_register(&cli_status)) {
- cel_engine_cleanup();
return -1;
}
ao2_global_obj_replace_unref(cel_backends, container);
ao2_cleanup(container);
if (!container) {
- cel_engine_cleanup();
return -1;
}
if (aco_info_init(&cel_cfg_info)) {
- cel_engine_cleanup();
return -1;
}
struct cel_config *cel_cfg = cel_config_alloc();
if (!cel_cfg) {
- cel_engine_cleanup();
return -1;
}
}
if (create_subscriptions()) {
- cel_engine_cleanup();
return -1;
}
if (ast_cel_check_enabled() && create_routes()) {
- cel_engine_cleanup();
return -1;
}
int ast_local_init(void)
{
-
if (STASIS_MESSAGE_TYPE_INIT(ast_local_optimization_begin_type)) {
return -1;
}
locals = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, locals_cmp_cb);
if (!locals) {
- ao2_cleanup(local_tech.capabilities);
- local_tech.capabilities = NULL;
return -1;
}
/* Make sure we can register our channel type */
if (ast_channel_register(&local_tech)) {
ast_log(LOG_ERROR, "Unable to register channel class 'Local'\n");
- ao2_ref(locals, -1);
- ao2_cleanup(local_tech.capabilities);
- local_tech.capabilities = NULL;
+
return -1;
}
ast_cli_register_multiple(cli_local, ARRAY_LEN(cli_local));
}
device_state_topic_all = stasis_topic_create("ast_device_state_topic");
if (!device_state_topic_all) {
- devstate_cleanup();
return -1;
}
device_state_topic_pool = stasis_topic_pool_create(ast_device_state_topic_all());
if (!device_state_topic_pool) {
- devstate_cleanup();
return -1;
}
device_state_cache = stasis_cache_create_full(device_state_get_id,
device_state_aggregate_calc, device_state_aggregate_publish);
if (!device_state_cache) {
- devstate_cleanup();
return -1;
}
device_state_topic_cached = stasis_caching_topic_create(ast_device_state_topic_all(),
device_state_cache);
if (!device_state_topic_cached) {
- devstate_cleanup();
return -1;
}
devstate_change_cb, NULL);
if (!devstate_message_sub) {
ast_log(LOG_ERROR, "Failed to create subscription creating uncached device state aggregate events.\n");
- devstate_cleanup();
return -1;
}
#include "asterisk.h"
+#include "asterisk/_private.h"
#include "asterisk/linkedlists.h"
#include "asterisk/astobj2.h"
#include "asterisk/strings.h"
}
}
+int dns_core_init(void)
+{
+ sched = ast_sched_context_create();
+ if (!sched) {
+ return -1;
+ }
+
+ if (ast_sched_start_thread(sched)) {
+ return -1;
+ }
+
+ ast_register_cleanup(dns_shutdown);
+
+ return 0;
+}
+
int ast_dns_resolver_register(struct ast_dns_resolver *resolver)
{
struct ast_dns_resolver *iter;
AST_RWLIST_WRLOCK(&resolvers);
- /* On the first registration of a resolver start a scheduler for recurring queries */
- if (AST_LIST_EMPTY(&resolvers) && !sched) {
- sched = ast_sched_context_create();
- if (!sched) {
- ast_log(LOG_ERROR, "DNS resolver '%s' could not be registered: Failed to create scheduler for recurring DNS queries\n",
- resolver->name);
- AST_RWLIST_UNLOCK(&resolvers);
- return -1;
- }
-
- if (ast_sched_start_thread(sched)) {
- ast_log(LOG_ERROR, "DNS resolver '%s' could not be registered: Failed to start thread for recurring DNS queries\n",
- resolver->name);
- dns_shutdown();
- AST_RWLIST_UNLOCK(&resolvers);
- return -1;
- }
-
- ast_register_cleanup(dns_shutdown);
- }
-
AST_LIST_TRAVERSE(&resolvers, iter, next) {
if (!strcmp(iter->name, resolver->name)) {
ast_log(LOG_ERROR, "A DNS resolver with the name '%s' is already registered\n", resolver->name);
/* Return error if the task processor failed to instantiate */
if (!dns_system_resolver_tp) {
- dns_system_resolver_destroy();
return DNS_SYSTEM_RESOLVER_FAILURE;
}
int ast_dsp_init(void)
{
- int res = _dsp_init(0);
+ if (_dsp_init(0)) {
+ return -1;
+ }
#ifdef TEST_FRAMEWORK
- if (!res) {
- AST_TEST_REGISTER(test_dsp_fax_detect);
- AST_TEST_REGISTER(test_dsp_dtmf_detect);
+ AST_TEST_REGISTER(test_dsp_fax_detect);
+ AST_TEST_REGISTER(test_dsp_dtmf_detect);
- ast_register_cleanup(test_dsp_shutdown);
- }
+ ast_register_cleanup(test_dsp_shutdown);
#endif
- return res;
+
+ return 0;
}
int ast_dsp_reload(void)
int res;
res = ast_features_config_init();
- if (res) {
- return res;
- }
res |= ast_register_application2(app_bridge, bridge_exec, NULL, NULL, NULL);
res |= ast_manager_register_xml_core("Bridge", EVENT_FLAG_CALL, action_bridge);
- if (res) {
- features_shutdown();
- } else {
- ast_register_cleanup(features_shutdown);
- }
+ ast_register_cleanup(features_shutdown);
return res;
}
res |= __ast_custom_function_register(&featuremap_function, NULL);
res |= ast_cli_register_multiple(cli_features_config, ARRAY_LEN(cli_features_config));
- if (res) {
- ast_features_config_shutdown();
- }
-
return res;
}
/*! \brief Load indications module */
int ast_indications_init(void)
{
- if (!(ast_tone_zones = ao2_container_alloc(NUM_TONE_ZONE_BUCKETS,
- ast_tone_zone_hash, ast_tone_zone_cmp))) {
+ ast_tone_zones = ao2_container_alloc(NUM_TONE_ZONE_BUCKETS,
+ ast_tone_zone_hash, ast_tone_zone_cmp);
+ if (!ast_tone_zones) {
return -1;
}
if (load_indications(0)) {
- indications_shutdown();
return -1;
}
*/
static void media_cache_shutdown(void)
{
- ao2_ref(media_cache, -1);
+ ao2_cleanup(media_cache);
media_cache = NULL;
ast_cli_unregister_multiple(cli_media_cache, ARRAY_LEN(cli_media_cache));
int ast_media_cache_init(void)
{
- ast_register_atexit(media_cache_shutdown);
+ ast_register_cleanup(media_cache_shutdown);
media_cache = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_MUTEX, AO2_BUCKETS,
ast_sorcery_object_id_hash, ast_sorcery_object_id_compare);
}
if (ast_cli_register_multiple(cli_media_cache, ARRAY_LEN(cli_media_cache))) {
- ao2_ref(media_cache, -1);
return -1;
}
for (x = 0; x < ARRAY_LEN(builtins); x++) {
if (ast_register_application2(builtins[x].name, builtins[x].execute, NULL, NULL, NULL)) {
ast_log(LOG_ERROR, "Unable to register builtin application '%s'\n", builtins[x].name);
- unload_pbx_builtins();
return -1;
}
}
wizards = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, WIZARD_BUCKETS,
ast_sorcery_internal_wizard_hash_fn, NULL, ast_sorcery_internal_wizard_cmp_fn);
if (!wizards) {
- sorcery_cleanup();
return -1;
}
observers = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_RWLOCK, 0, NULL, NULL);
if (!observers) {
- sorcery_cleanup();
return -1;
}
instances = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_RWLOCK, 0, INSTANCE_BUCKETS,
sorcery_proxy_hash_fn, NULL, sorcery_proxy_cmp_fn);
if (!instances) {
- sorcery_cleanup();
return -1;
}