Go to the source code of this file.
Functions | |
void | ast_autoservice_init (void) |
void | ast_builtins_init (void) |
initialize the _full_cmd string in * each of the builtins. | |
int | ast_cel_engine_init (void) |
int | ast_cel_engine_reload (void) |
void | ast_channels_init (void) |
int | ast_cli_perms_init (int reload) |
int | ast_data_init (void) |
int | ast_device_state_engine_init (void) |
Initialize the device state engine in separate thread. | |
int | ast_event_init (void) |
int | ast_features_init (void) |
int | ast_file_init (void) |
int | ast_http_init (void) |
int | ast_http_reload (void) |
int | ast_indications_init (void) |
Load indications module. | |
int | ast_indications_reload (void) |
Reload indications module. | |
int | ast_module_reload (const char *name) |
Reload asterisk modules. | |
int | ast_plc_reload (void) |
Reload genericplc configuration value from codecs.conf. | |
void | ast_process_pending_reloads (void) |
Process reload requests received during startup. | |
int | ast_ssl_init (void) |
void | ast_stun_init (void) |
Initialize the STUN system in Asterisk. | |
int | ast_term_init (void) |
int | ast_test_init (void) |
int | ast_timing_init (void) |
int | ast_tps_init (void) |
int | ast_xmldoc_load_documentation (void) |
Load XML documentation. Provided by xmldoc.c. | |
int | astdb_init (void) |
int | astobj2_init (void) |
void | close_logger (void) |
int | dnsmgr_init (void) |
int | dnsmgr_reload (void) |
void | dnsmgr_start_refresh (void) |
int | init_framer (void) |
int | init_logger (void) |
int | load_modules (unsigned int) |
int | load_pbx (void) |
void | threadstorage_init (void) |
Definition in file _private.h.
void ast_autoservice_init | ( | void | ) |
Provided by autoservice.c
Definition at line 323 of file autoservice.c.
References as_cond, and ast_cond_init.
Referenced by main().
00324 { 00325 ast_cond_init(&as_cond, NULL); 00326 }
void ast_builtins_init | ( | void | ) |
initialize the _full_cmd string in * each of the builtins.
Provided by cli.c
Definition at line 1875 of file cli.c.
References ARRAY_LEN, ast_cli_register_multiple(), and cli_cli.
Referenced by main().
01876 { 01877 ast_cli_register_multiple(cli_cli, ARRAY_LEN(cli_cli)); 01878 }
int ast_cel_engine_init | ( | void | ) |
Provided by cel.c
Definition at line 716 of file cel.c.
References ao2_container_alloc, ao2_ref, app_cmp(), app_hash(), appset, ast_cel_engine_term(), ast_cli_register(), ast_register_atexit(), cli_status, do_reload(), lid_cmp, lid_hash, linkedids, and NUM_APP_BUCKETS.
Referenced by main().
00717 { 00718 if (!(appset = ao2_container_alloc(NUM_APP_BUCKETS, app_hash, app_cmp))) { 00719 return -1; 00720 } 00721 if (!(linkedids = ao2_container_alloc(NUM_APP_BUCKETS, lid_hash, lid_cmp))) { 00722 ao2_ref(appset, -1); 00723 return -1; 00724 } 00725 00726 if (do_reload() || ast_cli_register(&cli_status)) { 00727 ao2_ref(appset, -1); 00728 appset = NULL; 00729 ao2_ref(linkedids, -1); 00730 linkedids = NULL; 00731 return -1; 00732 } 00733 00734 ast_register_atexit(ast_cel_engine_term); 00735 00736 return 0; 00737 }
int ast_cel_engine_reload | ( | void | ) |
Provided by cel.c
Definition at line 739 of file cel.c.
References do_reload().
00740 { 00741 return do_reload(); 00742 }
void ast_channels_init | ( | void | ) |
Provided by channel.c
Definition at line 8024 of file channel.c.
References ao2_container_alloc, ARRAY_LEN, ast_channel_cmp_cb(), ast_channel_hash_cb(), ast_cli_register_multiple(), ast_data_register_multiple_core, ast_plc_reload(), channel_providers, channels, cli_channel, and NUM_CHANNEL_BUCKETS.
Referenced by main().
08025 { 08026 channels = ao2_container_alloc(NUM_CHANNEL_BUCKETS, 08027 ast_channel_hash_cb, ast_channel_cmp_cb); 08028 08029 ast_cli_register_multiple(cli_channel, ARRAY_LEN(cli_channel)); 08030 08031 ast_data_register_multiple_core(channel_providers, ARRAY_LEN(channel_providers)); 08032 08033 ast_plc_reload(); 08034 }
int ast_cli_perms_init | ( | int | reload | ) |
Provided by cli.c
Definition at line 1752 of file cli.c.
References ast_calloc, ast_category_browse(), ast_config_load2(), ast_free, AST_LIST_TRAVERSE, ast_log(), ast_mutex_trylock, ast_mutex_unlock, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strdup, ast_strlen_zero(), ast_variable_browse(), CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEUNCHANGED, destroy_user_perms(), usergroup_cli_perm::gid, cli_perm::list, LOG_NOTICE, LOG_WARNING, ast_variable::name, ast_variable::next, perms_config, usergroup_cli_perm::uid, and ast_variable::value.
Referenced by handle_cli_reload_permissions(), and main().
01753 { 01754 struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 }; 01755 struct ast_config *cfg; 01756 char *cat = NULL; 01757 struct ast_variable *v; 01758 struct usergroup_cli_perm *user_group, *cp_entry; 01759 struct cli_perm *perm = NULL; 01760 struct passwd *pw; 01761 struct group *gr; 01762 01763 if (ast_mutex_trylock(&permsconfiglock)) { 01764 ast_log(LOG_NOTICE, "You must wait until last 'cli reload permissions' command finish\n"); 01765 return 1; 01766 } 01767 01768 cfg = ast_config_load2(perms_config, "" /* core, can't reload */, config_flags); 01769 if (!cfg) { 01770 ast_mutex_unlock(&permsconfiglock); 01771 return 1; 01772 } else if (cfg == CONFIG_STATUS_FILEUNCHANGED) { 01773 ast_mutex_unlock(&permsconfiglock); 01774 return 0; 01775 } 01776 01777 /* free current structures. */ 01778 destroy_user_perms(); 01779 01780 while ((cat = ast_category_browse(cfg, cat))) { 01781 if (!strcasecmp(cat, "general")) { 01782 /* General options */ 01783 for (v = ast_variable_browse(cfg, cat); v; v = v->next) { 01784 if (!strcasecmp(v->name, "default_perm")) { 01785 cli_default_perm = (!strcasecmp(v->value, "permit")) ? 1: 0; 01786 } 01787 } 01788 continue; 01789 } 01790 01791 /* users or groups */ 01792 gr = NULL, pw = NULL; 01793 if (cat[0] == '@') { 01794 /* This is a group */ 01795 gr = getgrnam(&cat[1]); 01796 if (!gr) { 01797 ast_log (LOG_WARNING, "Unknown group '%s'\n", &cat[1]); 01798 continue; 01799 } 01800 } else { 01801 /* This is a user */ 01802 pw = getpwnam(cat); 01803 if (!pw) { 01804 ast_log (LOG_WARNING, "Unknown user '%s'\n", cat); 01805 continue; 01806 } 01807 } 01808 user_group = NULL; 01809 /* Check for duplicates */ 01810 AST_RWLIST_WRLOCK(&cli_perms); 01811 AST_LIST_TRAVERSE(&cli_perms, cp_entry, list) { 01812 if ((pw && cp_entry->uid == pw->pw_uid) || (gr && cp_entry->gid == gr->gr_gid)) { 01813 /* if it is duplicated, just added this new settings, to 01814 the current list. */ 01815 user_group = cp_entry; 01816 break; 01817 } 01818 } 01819 AST_RWLIST_UNLOCK(&cli_perms); 01820 01821 if (!user_group) { 01822 /* alloc space for the new user config. */ 01823 user_group = ast_calloc(1, sizeof(*user_group)); 01824 if (!user_group) { 01825 continue; 01826 } 01827 user_group->uid = (pw ? pw->pw_uid : -1); 01828 user_group->gid = (gr ? gr->gr_gid : -1); 01829 user_group->perms = ast_calloc(1, sizeof(*user_group->perms)); 01830 if (!user_group->perms) { 01831 ast_free(user_group); 01832 continue; 01833 } 01834 } 01835 for (v = ast_variable_browse(cfg, cat); v; v = v->next) { 01836 if (ast_strlen_zero(v->value)) { 01837 /* we need to check this condition cause it could break security. */ 01838 ast_log(LOG_WARNING, "Empty permit/deny option in user '%s'\n", cat); 01839 continue; 01840 } 01841 if (!strcasecmp(v->name, "permit")) { 01842 perm = ast_calloc(1, sizeof(*perm)); 01843 if (perm) { 01844 perm->permit = 1; 01845 perm->command = ast_strdup(v->value); 01846 } 01847 } else if (!strcasecmp(v->name, "deny")) { 01848 perm = ast_calloc(1, sizeof(*perm)); 01849 if (perm) { 01850 perm->permit = 0; 01851 perm->command = ast_strdup(v->value); 01852 } 01853 } else { 01854 /* up to now, only 'permit' and 'deny' are possible values. */ 01855 ast_log(LOG_WARNING, "Unknown '%s' option\n", v->name); 01856 continue; 01857 } 01858 if (perm) { 01859 /* Added the permission to the user's list. */ 01860 AST_LIST_INSERT_TAIL(user_group->perms, perm, list); 01861 perm = NULL; 01862 } 01863 } 01864 AST_RWLIST_WRLOCK(&cli_perms); 01865 AST_RWLIST_INSERT_TAIL(&cli_perms, user_group, list); 01866 AST_RWLIST_UNLOCK(&cli_perms); 01867 } 01868 01869 ast_config_destroy(cfg); 01870 ast_mutex_unlock(&permsconfiglock); 01871 return 0; 01872 }
int ast_data_init | ( | void | ) |
Provided by data.c
Definition at line 3285 of file data.c.
References ao2_container_alloc, ARRAY_LEN, ast_cli_register_multiple(), ast_manager_register_xml, ast_rwlock_init, AST_TEST_REGISTER, cli_data, data_provider_cmp(), data_provider_hash(), manager_data_get(), NUM_DATA_NODE_BUCKETS, and root_data.
Referenced by main().
03286 { 03287 int res = 0; 03288 03289 ast_rwlock_init(&root_data.lock); 03290 03291 if (!(root_data.container = ao2_container_alloc(NUM_DATA_NODE_BUCKETS, 03292 data_provider_hash, data_provider_cmp))) { 03293 return -1; 03294 } 03295 03296 res |= ast_cli_register_multiple(cli_data, ARRAY_LEN(cli_data)); 03297 03298 res |= ast_manager_register_xml("DataGet", 0, manager_data_get); 03299 03300 #ifdef TEST_FRAMEWORK 03301 AST_TEST_REGISTER(test_data_get); 03302 #endif 03303 03304 return res; 03305 }
int ast_device_state_engine_init | ( | void | ) |
Initialize the device state engine in separate thread.
Provided by devicestate.c
Definition at line 723 of file devicestate.c.
References ast_cond_init, ast_log(), ast_pthread_create_background, change_thread, do_devstate_changes(), and LOG_ERROR.
Referenced by main().
00724 { 00725 ast_cond_init(&change_pending, NULL); 00726 if (ast_pthread_create_background(&change_thread, NULL, do_devstate_changes, NULL) < 0) { 00727 ast_log(LOG_ERROR, "Unable to start device state change thread.\n"); 00728 return -1; 00729 } 00730 00731 return 0; 00732 }
int ast_event_init | ( | void | ) |
Provided by event.c
Definition at line 1780 of file event.c.
References ao2_container_alloc, ARRAY_LEN, ast_cli_register_multiple(), ast_event_cache, ast_event_cmp(), ast_event_hash(), ast_event_subs, AST_RWDLLIST_HEAD_INIT, ast_taskprocessor_get(), container, event_cli, event_dispatcher, hash_fn, and NUM_CACHE_BUCKETS.
Referenced by main().
01781 { 01782 int i; 01783 01784 for (i = 0; i < AST_EVENT_TOTAL; i++) { 01785 AST_RWDLLIST_HEAD_INIT(&ast_event_subs[i]); 01786 } 01787 01788 for (i = 0; i < AST_EVENT_TOTAL; i++) { 01789 if (!ast_event_cache[i].hash_fn) { 01790 /* This event type is not cached. */ 01791 continue; 01792 } 01793 01794 if (!(ast_event_cache[i].container = ao2_container_alloc(NUM_CACHE_BUCKETS, 01795 ast_event_hash, ast_event_cmp))) { 01796 return -1; 01797 } 01798 } 01799 01800 if (!(event_dispatcher = ast_taskprocessor_get("core_event_dispatcher", 0))) { 01801 return -1; 01802 } 01803 01804 ast_cli_register_multiple(event_cli, ARRAY_LEN(event_cli)); 01805 01806 return 0; 01807 }
int ast_features_init | ( | void | ) |
Provided by features.c
Definition at line 8224 of file features.c.
References action_bridge(), ao2_container_alloc, ARRAY_LEN, ast_cli_register_multiple(), ast_devstate_prov_add(), ast_manager_register_xml, ast_pthread_create, ast_register_application2(), AST_TEST_REGISTER, bridge_exec(), cli_features, do_parking_thread(), EVENT_FLAG_CALL, load_config(), manager_park(), manager_parking_status(), metermaidstate(), park_call_exec(), parkcall, parked_call_exec(), parking_thread, parkinglot_cmp_cb(), parkinglot_hash_cb(), and parkinglots.
Referenced by main().
08225 { 08226 int res; 08227 08228 parkinglots = ao2_container_alloc(7, parkinglot_hash_cb, parkinglot_cmp_cb); 08229 if (!parkinglots) { 08230 return -1; 08231 } 08232 08233 res = load_config(0); 08234 if (res) { 08235 return res; 08236 } 08237 ast_cli_register_multiple(cli_features, ARRAY_LEN(cli_features)); 08238 if (ast_pthread_create(&parking_thread, NULL, do_parking_thread, NULL)) { 08239 return -1; 08240 } 08241 ast_register_application2(app_bridge, bridge_exec, NULL, NULL, NULL); 08242 res = ast_register_application2(parkedcall, parked_call_exec, NULL, NULL, NULL); 08243 if (!res) 08244 res = ast_register_application2(parkcall, park_call_exec, NULL, NULL, NULL); 08245 if (!res) { 08246 ast_manager_register_xml("ParkedCalls", 0, manager_parking_status); 08247 ast_manager_register_xml("Park", EVENT_FLAG_CALL, manager_park); 08248 ast_manager_register_xml("Bridge", EVENT_FLAG_CALL, action_bridge); 08249 } 08250 08251 res |= ast_devstate_prov_add("Park", metermaidstate); 08252 #if defined(TEST_FRAMEWORK) 08253 res |= AST_TEST_REGISTER(features_test); 08254 #endif /* defined(TEST_FRAMEWORK) */ 08255 08256 return res; 08257 }
int ast_file_init | ( | void | ) |
int ast_http_init | ( | void | ) |
Provided by http.c
Definition at line 1209 of file http.c.
References __ast_http_load(), ARRAY_LEN, ast_cli_register_multiple(), ast_http_uri_link(), cli_http, staticuri, and statusuri.
Referenced by main().
01210 { 01211 ast_http_uri_link(&statusuri); 01212 ast_http_uri_link(&staticuri); 01213 ast_cli_register_multiple(cli_http, ARRAY_LEN(cli_http)); 01214 01215 return __ast_http_load(0); 01216 }
int ast_http_reload | ( | void | ) |
Provided by http.c
Definition at line 1200 of file http.c.
References __ast_http_load().
01201 { 01202 return __ast_http_load(1); 01203 }
int ast_indications_init | ( | void | ) |
Load indications module.
Provided by indications.c
Definition at line 1153 of file indications.c.
References ao2_container_alloc, ARRAY_LEN, ast_cli_register_multiple(), ast_tone_zone_cmp(), ast_tone_zone_hash(), ast_tone_zones, cli_indications, load_indications(), and NUM_TONE_ZONE_BUCKETS.
Referenced by main().
01154 { 01155 if (!(ast_tone_zones = ao2_container_alloc(NUM_TONE_ZONE_BUCKETS, 01156 ast_tone_zone_hash, ast_tone_zone_cmp))) { 01157 return -1; 01158 } 01159 01160 if (load_indications(0)) { 01161 return -1; 01162 } 01163 01164 ast_cli_register_multiple(cli_indications, ARRAY_LEN(cli_indications)); 01165 01166 return 0; 01167 }
int ast_indications_reload | ( | void | ) |
Reload indications module.
Provided by indications.c
Definition at line 1170 of file indications.c.
References load_indications().
01171 { 01172 return load_indications(1); 01173 }
int ast_module_reload | ( | const char * | name | ) |
Reload asterisk modules.
name | the name of the module to reload |
1 | if the module was found but cannot be reloaded. | |
-1 | if a reload operation is already in progress. | |
2 | if the specfied module was found and reloaded. |
Definition at line 675 of file loader.c.
References ast_config_AST_CONFIG_DIR, ast_fully_booted, ast_lastreloadtime, AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_lock_path(), AST_LOCK_SUCCESS, AST_LOCK_TIMEOUT, ast_log(), ast_mutex_trylock, ast_mutex_unlock, ast_opt_lock_confdir, ast_tvnow(), ast_unlock_path(), ast_verb, ast_verbose, ast_module::declined, ast_module_info::description, ast_module_user::entry, ast_module::flags, ast_module::info, LOG_NOTICE, LOG_WARNING, queue_reload_request(), ast_module_info::reload, ast_module::resource, resource_name_match(), and ast_module::running.
Referenced by action_reload(), action_updateconfig(), ast_process_pending_reloads(), handle_core_reload(), handle_reload(), manager_moduleload(), and monitor_sig_flags().
00676 { 00677 struct ast_module *cur; 00678 int res = 0; /* return value. 0 = not found, others, see below */ 00679 int i; 00680 00681 /* If we aren't fully booted, we just pretend we reloaded but we queue this 00682 up to run once we are booted up. */ 00683 if (!ast_fully_booted) { 00684 queue_reload_request(name); 00685 return 0; 00686 } 00687 00688 if (ast_mutex_trylock(&reloadlock)) { 00689 ast_verbose("The previous reload command didn't finish yet\n"); 00690 return -1; /* reload already in progress */ 00691 } 00692 ast_lastreloadtime = ast_tvnow(); 00693 00694 if (ast_opt_lock_confdir) { 00695 int try; 00696 int res; 00697 for (try = 1, res = AST_LOCK_TIMEOUT; try < 6 && (res == AST_LOCK_TIMEOUT); try++) { 00698 res = ast_lock_path(ast_config_AST_CONFIG_DIR); 00699 if (res == AST_LOCK_TIMEOUT) { 00700 ast_log(LOG_WARNING, "Failed to grab lock on %s, try %d\n", ast_config_AST_CONFIG_DIR, try); 00701 } 00702 } 00703 if (res != AST_LOCK_SUCCESS) { 00704 ast_verbose("Cannot grab lock on %s\n", ast_config_AST_CONFIG_DIR); 00705 ast_mutex_unlock(&reloadlock); 00706 return -1; 00707 } 00708 } 00709 00710 /* Call "predefined" reload here first */ 00711 for (i = 0; reload_classes[i].name; i++) { 00712 if (!name || !strcasecmp(name, reload_classes[i].name)) { 00713 reload_classes[i].reload_fn(); /* XXX should check error ? */ 00714 res = 2; /* found and reloaded */ 00715 } 00716 } 00717 00718 if (name && res) { 00719 if (ast_opt_lock_confdir) { 00720 ast_unlock_path(ast_config_AST_CONFIG_DIR); 00721 } 00722 ast_mutex_unlock(&reloadlock); 00723 return res; 00724 } 00725 00726 AST_LIST_LOCK(&module_list); 00727 AST_LIST_TRAVERSE(&module_list, cur, entry) { 00728 const struct ast_module_info *info = cur->info; 00729 00730 if (name && resource_name_match(name, cur->resource)) 00731 continue; 00732 00733 if (!cur->flags.running || cur->flags.declined) { 00734 if (!name) 00735 continue; 00736 ast_log(LOG_NOTICE, "The module '%s' was not properly initialized. " 00737 "Before reloading the module, you must run \"module load %s\" " 00738 "and fix whatever is preventing the module from being initialized.\n", 00739 name, name); 00740 res = 2; /* Don't report that the module was not found */ 00741 break; 00742 } 00743 00744 if (!info->reload) { /* cannot be reloaded */ 00745 if (res < 1) /* store result if possible */ 00746 res = 1; /* 1 = no reload() method */ 00747 continue; 00748 } 00749 00750 res = 2; 00751 ast_verb(3, "Reloading module '%s' (%s)\n", cur->resource, info->description); 00752 info->reload(); 00753 } 00754 AST_LIST_UNLOCK(&module_list); 00755 00756 if (ast_opt_lock_confdir) { 00757 ast_unlock_path(ast_config_AST_CONFIG_DIR); 00758 } 00759 ast_mutex_unlock(&reloadlock); 00760 00761 return res; 00762 }
int ast_plc_reload | ( | void | ) |
Reload genericplc configuration value from codecs.conf.
Implementation is in main/channel.c
Definition at line 7889 of file channel.c.
References ast_config_load, AST_OPT_FLAG_GENERIC_PLC, ast_options, ast_set2_flag, ast_true(), ast_variable_browse(), CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEMISSING, CONFIG_STATUS_FILEUNCHANGED, and var.
Referenced by ast_channels_init().
07890 { 07891 struct ast_variable *var; 07892 struct ast_flags config_flags = { 0 }; 07893 struct ast_config *cfg = ast_config_load("codecs.conf", config_flags); 07894 if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) 07895 return 0; 07896 for (var = ast_variable_browse(cfg, "plc"); var; var = var->next) { 07897 if (!strcasecmp(var->name, "genericplc")) { 07898 ast_set2_flag(&ast_options, ast_true(var->value), AST_OPT_FLAG_GENERIC_PLC); 07899 } 07900 } 07901 ast_config_destroy(cfg); 07902 return 0; 07903 }
void ast_process_pending_reloads | ( | void | ) |
Process reload requests received during startup.
This function requests that the loader execute the pending reload requests that were queued during server startup.
Definition at line 610 of file loader.c.
References ast_free, ast_fully_booted, AST_LIST_LOCK, AST_LIST_REMOVE_HEAD, AST_LIST_UNLOCK, ast_log(), ast_module_reload(), do_full_reload, ast_module_user::entry, LOG_NOTICE, and reload_queue_item::module.
Referenced by main().
00611 { 00612 struct reload_queue_item *item; 00613 00614 if (!ast_fully_booted) { 00615 return; 00616 } 00617 00618 AST_LIST_LOCK(&reload_queue); 00619 00620 if (do_full_reload) { 00621 do_full_reload = 0; 00622 AST_LIST_UNLOCK(&reload_queue); 00623 ast_log(LOG_NOTICE, "Executing deferred reload request.\n"); 00624 ast_module_reload(NULL); 00625 return; 00626 } 00627 00628 while ((item = AST_LIST_REMOVE_HEAD(&reload_queue, entry))) { 00629 ast_log(LOG_NOTICE, "Executing deferred reload request for module '%s'.\n", item->module); 00630 ast_module_reload(item->module); 00631 ast_free(item); 00632 } 00633 00634 AST_LIST_UNLOCK(&reload_queue); 00635 }
int ast_ssl_init | ( | void | ) |
Provided by ssl.c
Definition at line 77 of file ssl.c.
References ast_calloc, ast_mutex_init, ssl_lock(), ssl_locks, and ssl_threadid().
Referenced by main().
00078 { 00079 #ifdef HAVE_OPENSSL 00080 unsigned int i; 00081 00082 SSL_library_init(); 00083 SSL_load_error_strings(); 00084 ERR_load_crypto_strings(); 00085 ERR_load_BIO_strings(); 00086 OpenSSL_add_all_algorithms(); 00087 00088 /* Make OpenSSL thread-safe. */ 00089 00090 CRYPTO_set_id_callback(ssl_threadid); 00091 00092 ssl_num_locks = CRYPTO_num_locks(); 00093 if (!(ssl_locks = ast_calloc(ssl_num_locks, sizeof(ssl_locks[0])))) { 00094 return -1; 00095 } 00096 for (i = 0; i < ssl_num_locks; i++) { 00097 ast_mutex_init(&ssl_locks[i]); 00098 } 00099 CRYPTO_set_locking_callback(ssl_lock); 00100 00101 #endif /* HAVE_OPENSSL */ 00102 return 0; 00103 }
void ast_stun_init | ( | void | ) |
Initialize the STUN system in Asterisk.
Provided by stun.c
Definition at line 503 of file stun.c.
References ast_cli_register_multiple(), and cli_stun.
Referenced by main().
00504 { 00505 ast_cli_register_multiple(cli_stun, sizeof(cli_stun) / sizeof(struct ast_cli_entry)); 00506 }
int ast_term_init | ( | void | ) |
Provided by term.c
Definition at line 87 of file term.c.
References ast_opt_console, ast_opt_force_black_background, ast_opt_light_background, ast_opt_no_color, ATTR_BRIGHT, ATTR_RESET, COLOR_BLACK, COLOR_BROWN, COLOR_WHITE, convshort(), and ESC.
Referenced by main().
00088 { 00089 char *term = getenv("TERM"); 00090 char termfile[256] = ""; 00091 char buffer[512] = ""; 00092 int termfd = -1, parseokay = 0, i; 00093 00094 if (ast_opt_no_color) { 00095 return 0; 00096 } 00097 00098 if (!ast_opt_console) { 00099 /* If any remote console is not compatible, we'll strip the color codes at that point */ 00100 vt100compat = 1; 00101 goto end; 00102 } 00103 00104 if (!term) { 00105 return 0; 00106 } 00107 00108 for (i = 0;; i++) { 00109 if (termpath[i] == NULL) { 00110 break; 00111 } 00112 snprintf(termfile, sizeof(termfile), "%s/%c/%s", termpath[i], *term, term); 00113 termfd = open(termfile, O_RDONLY); 00114 if (termfd > -1) { 00115 break; 00116 } 00117 } 00118 if (termfd > -1) { 00119 int actsize = read(termfd, buffer, sizeof(buffer) - 1); 00120 short sz_names = convshort(buffer + 2); 00121 short sz_bools = convshort(buffer + 4); 00122 short n_nums = convshort(buffer + 6); 00123 00124 /* if ((sz_names + sz_bools) & 1) 00125 sz_bools++; */ 00126 00127 if (sz_names + sz_bools + n_nums < actsize) { 00128 /* Offset 13 is defined in /usr/include/term.h, though we do not 00129 * include it here, as it conflicts with include/asterisk/term.h */ 00130 short max_colors = convshort(buffer + 12 + sz_names + sz_bools + 13 * 2); 00131 if (max_colors > 0) { 00132 vt100compat = 1; 00133 } 00134 parseokay = 1; 00135 } 00136 close(termfd); 00137 } 00138 00139 if (!parseokay) { 00140 /* These comparisons should not be substrings nor case-insensitive, as 00141 * terminal types are very particular about how they treat suffixes and 00142 * capitalization. For example, terminal type 'linux-m' does NOT 00143 * support color, while 'linux' does. Not even all vt100* terminals 00144 * support color, either (e.g. 'vt100+fnkeys'). */ 00145 if (!strcmp(term, "linux")) { 00146 vt100compat = 1; 00147 } else if (!strcmp(term, "xterm")) { 00148 vt100compat = 1; 00149 } else if (!strcmp(term, "xterm-color")) { 00150 vt100compat = 1; 00151 } else if (!strcmp(term, "xterm-256color")) { 00152 vt100compat = 1; 00153 } else if (!strncmp(term, "Eterm", 5)) { 00154 /* Both entries which start with Eterm support color */ 00155 vt100compat = 1; 00156 } else if (!strcmp(term, "vt100")) { 00157 vt100compat = 1; 00158 } else if (!strncmp(term, "crt", 3)) { 00159 /* Both crt terminals support color */ 00160 vt100compat = 1; 00161 } 00162 } 00163 00164 end: 00165 if (vt100compat) { 00166 /* Make commands show up in nice colors */ 00167 if (ast_opt_light_background) { 00168 snprintf(prepdata, sizeof(prepdata), "%c[%dm", ESC, COLOR_BROWN); 00169 snprintf(enddata, sizeof(enddata), "%c[%dm", ESC, COLOR_BLACK); 00170 snprintf(quitdata, sizeof(quitdata), "%c[0m", ESC); 00171 } else if (ast_opt_force_black_background) { 00172 snprintf(prepdata, sizeof(prepdata), "%c[%d;%d;%dm", ESC, ATTR_BRIGHT, COLOR_BROWN, COLOR_BLACK + 10); 00173 snprintf(enddata, sizeof(enddata), "%c[%d;%d;%dm", ESC, ATTR_RESET, COLOR_WHITE, COLOR_BLACK + 10); 00174 snprintf(quitdata, sizeof(quitdata), "%c[0m", ESC); 00175 } else { 00176 snprintf(prepdata, sizeof(prepdata), "%c[%d;%dm", ESC, ATTR_BRIGHT, COLOR_BROWN); 00177 snprintf(enddata, sizeof(enddata), "%c[%d;%dm", ESC, ATTR_RESET, COLOR_WHITE); 00178 snprintf(quitdata, sizeof(quitdata), "%c[0m", ESC); 00179 } 00180 } 00181 return 0; 00182 }
int ast_test_init | ( | void | ) |
Provided by test.c
Definition at line 936 of file test.c.
References ARRAY_LEN, and ast_cli_register_multiple().
Referenced by main().
00937 { 00938 #ifdef TEST_FRAMEWORK 00939 /* Register cli commands */ 00940 ast_cli_register_multiple(test_cli, ARRAY_LEN(test_cli)); 00941 #endif 00942 00943 return 0; 00944 }
int ast_timing_init | ( | void | ) |
Provided by timing.c
Definition at line 292 of file timing.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_heap_create(), cli_timing, timing_holder_cmp(), and timing_interfaces.
Referenced by main().
00293 { 00294 if (!(timing_interfaces = ast_heap_create(2, timing_holder_cmp, 0))) { 00295 return -1; 00296 } 00297 00298 return ast_cli_register_multiple(cli_timing, ARRAY_LEN(cli_timing)); 00299 }
int ast_tps_init | ( | void | ) |
Provided by taskprocessor.c
Definition at line 126 of file taskprocessor.c.
References ao2_container_alloc, ARRAY_LEN, ast_cli_register_multiple(), ast_cond_init, ast_log(), cli_ping_cond, LOG_ERROR, taskprocessor_clis, tps_cmp_cb(), tps_hash_cb(), TPS_MAX_BUCKETS, and tps_singletons.
Referenced by main().
00127 { 00128 if (!(tps_singletons = ao2_container_alloc(TPS_MAX_BUCKETS, tps_hash_cb, tps_cmp_cb))) { 00129 ast_log(LOG_ERROR, "taskprocessor container failed to initialize!\n"); 00130 return -1; 00131 } 00132 00133 ast_cond_init(&cli_ping_cond, NULL); 00134 00135 ast_cli_register_multiple(taskprocessor_clis, ARRAY_LEN(taskprocessor_clis)); 00136 return 0; 00137 }
int ast_xmldoc_load_documentation | ( | void | ) |
int astdb_init | ( | void | ) |
Provided by db.c
Definition at line 776 of file db.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_cond_init, ast_manager_register_xml, ast_pthread_create_background, cli_database, db_sync_thread(), dbinit(), EVENT_FLAG_REPORTING, EVENT_FLAG_SYSTEM, manager_dbdel(), manager_dbdeltree(), manager_dbget(), and manager_dbput().
Referenced by main().
00777 { 00778 pthread_t dont_care; 00779 00780 ast_cond_init(&dbcond, NULL); 00781 if (ast_pthread_create_background(&dont_care, NULL, db_sync_thread, NULL)) { 00782 return -1; 00783 } 00784 00785 /* Ignore check_return warning from Coverity for dbinit below */ 00786 dbinit(); 00787 00788 ast_cli_register_multiple(cli_database, ARRAY_LEN(cli_database)); 00789 ast_manager_register_xml("DBGet", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_dbget); 00790 ast_manager_register_xml("DBPut", EVENT_FLAG_SYSTEM, manager_dbput); 00791 ast_manager_register_xml("DBDel", EVENT_FLAG_SYSTEM, manager_dbdel); 00792 ast_manager_register_xml("DBDelTree", EVENT_FLAG_SYSTEM, manager_dbdeltree); 00793 return 0; 00794 }
int astobj2_init | ( | void | ) |
Provided by astobj2.c
Definition at line 1125 of file astobj2.c.
References ARRAY_LEN, and ast_cli_register_multiple().
Referenced by main().
01126 { 01127 #ifdef AO2_DEBUG 01128 ast_cli_register_multiple(cli_astobj2, ARRAY_LEN(cli_astobj2)); 01129 #endif 01130 01131 return 0; 01132 }
void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1155 of file logger.c.
References ast_cond_signal, AST_LIST_LOCK, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, close_logger_thread, f, logchannel::list, logcond, logthread, and qlog.
Referenced by really_quit().
01156 { 01157 struct logchannel *f = NULL; 01158 01159 logger_initialized = 0; 01160 01161 /* Stop logger thread */ 01162 AST_LIST_LOCK(&logmsgs); 01163 close_logger_thread = 1; 01164 ast_cond_signal(&logcond); 01165 AST_LIST_UNLOCK(&logmsgs); 01166 01167 if (logthread != AST_PTHREADT_NULL) 01168 pthread_join(logthread, NULL); 01169 01170 AST_RWLIST_WRLOCK(&logchannels); 01171 01172 if (qlog) { 01173 fclose(qlog); 01174 qlog = NULL; 01175 } 01176 01177 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 01178 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01179 fclose(f->fileptr); 01180 f->fileptr = NULL; 01181 } 01182 } 01183 01184 closelog(); /* syslog */ 01185 01186 AST_RWLIST_UNLOCK(&logchannels); 01187 }
int dnsmgr_init | ( | void | ) |
Provided by dnsmgr.c
Definition at line 397 of file dnsmgr.c.
References ast_cli_register(), ast_log(), cli_refresh, cli_reload, cli_status, do_reload(), LOG_ERROR, sched, and sched_context_create().
Referenced by main().
00398 { 00399 if (!(sched = sched_context_create())) { 00400 ast_log(LOG_ERROR, "Unable to create schedule context.\n"); 00401 return -1; 00402 } 00403 ast_cli_register(&cli_reload); 00404 ast_cli_register(&cli_status); 00405 ast_cli_register(&cli_refresh); 00406 return do_reload(1); 00407 }
int dnsmgr_reload | ( | void | ) |
Provided by dnsmgr.c
Definition at line 409 of file dnsmgr.c.
References do_reload().
00410 { 00411 return do_reload(0); 00412 }
void dnsmgr_start_refresh | ( | void | ) |
Provided by dnsmgr.c
Definition at line 291 of file dnsmgr.c.
References ast_sched_add_variable(), AST_SCHED_DEL, master_refresh_info, refresh_list(), and sched.
Referenced by main().
00292 { 00293 if (refresh_sched > -1) { 00294 AST_SCHED_DEL(sched, refresh_sched); 00295 refresh_sched = ast_sched_add_variable(sched, 100, refresh_list, &master_refresh_info, 1); 00296 } 00297 }
int init_framer | ( | void | ) |
Provided by frame.c
Definition at line 990 of file frame.c.
References ARRAY_LEN, ast_cli_register_multiple(), and my_clis.
Referenced by main().
00991 { 00992 ast_cli_register_multiple(my_clis, ARRAY_LEN(my_clis)); 00993 return 0; 00994 }
int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 1131 of file logger.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_cond_destroy, ast_cond_init, ast_config_AST_LOG_DIR, ast_mkdir(), ast_pthread_create, cli_logger, init_logger_chain(), logcond, logger_thread(), and logthread.
Referenced by main().
01132 { 01133 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01134 sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL); 01135 01136 /* start logger thread */ 01137 ast_cond_init(&logcond, NULL); 01138 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01139 ast_cond_destroy(&logcond); 01140 return -1; 01141 } 01142 01143 /* register the logger cli commands */ 01144 ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01145 01146 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01147 01148 /* create log channels */ 01149 init_logger_chain(0 /* locked */); 01150 logger_initialized = 1; 01151 01152 return 0; 01153 }
int load_modules | ( | unsigned | int | ) |
Provided by loader.c
Definition at line 1011 of file loader.c.
References add_to_load_order(), ast_config_load2(), ast_debug, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_LOCK, ast_log(), AST_MODULE_CONFIG, ast_variable_browse(), ast_verb, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEMISSING, embedded_module_list, embedding, module_list::first, module_list::last, LOG_WARNING, ast_variable::name, ast_variable::next, and ast_variable::value.
Referenced by main().
01012 { 01013 struct ast_config *cfg; 01014 struct ast_module *mod; 01015 struct load_order_entry *order; 01016 struct ast_variable *v; 01017 unsigned int load_count; 01018 struct load_order load_order; 01019 int res = 0; 01020 struct ast_flags config_flags = { 0 }; 01021 int modulecount = 0; 01022 01023 #ifdef LOADABLE_MODULES 01024 struct dirent *dirent; 01025 DIR *dir; 01026 #endif 01027 01028 /* all embedded modules have registered themselves by now */ 01029 embedding = 0; 01030 01031 ast_verb(1, "Asterisk Dynamic Loader Starting:\n"); 01032 01033 AST_LIST_HEAD_INIT_NOLOCK(&load_order); 01034 01035 AST_LIST_LOCK(&module_list); 01036 01037 if (embedded_module_list.first) { 01038 module_list.first = embedded_module_list.first; 01039 module_list.last = embedded_module_list.last; 01040 embedded_module_list.first = NULL; 01041 } 01042 01043 cfg = ast_config_load2(AST_MODULE_CONFIG, "" /* core, can't reload */, config_flags); 01044 if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) { 01045 ast_log(LOG_WARNING, "No '%s' found, no modules will be loaded.\n", AST_MODULE_CONFIG); 01046 goto done; 01047 } 01048 01049 /* first, find all the modules we have been explicitly requested to load */ 01050 for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) { 01051 if (!strcasecmp(v->name, preload_only ? "preload" : "load")) { 01052 add_to_load_order(v->value, &load_order, 0); 01053 } 01054 if (!strcasecmp(v->name, preload_only ? "preload-require" : "require")) { 01055 /* Add the module to the list and make sure it's required */ 01056 add_to_load_order(v->value, &load_order, 1); 01057 ast_debug(2, "Adding module to required list: %s (%s)\n", v->value, v->name); 01058 } 01059 01060 } 01061 01062 /* check if 'autoload' is on */ 01063 if (!preload_only && ast_true(ast_variable_retrieve(cfg, "modules", "autoload"))) { 01064 /* if so, first add all the embedded modules that are not already running to the load order */ 01065 AST_LIST_TRAVERSE(&module_list, mod, entry) { 01066 /* if it's not embedded, skip it */ 01067 if (mod->lib) 01068 continue; 01069 01070 if (mod->flags.running) 01071 continue; 01072 01073 add_to_load_order(mod->resource, &load_order, 0); 01074 } 01075 01076 #ifdef LOADABLE_MODULES 01077 /* if we are allowed to load dynamic modules, scan the directory for 01078 for all available modules and add them as well */ 01079 if ((dir = opendir(ast_config_AST_MODULE_DIR))) { 01080 while ((dirent = readdir(dir))) { 01081 int ld = strlen(dirent->d_name); 01082 01083 /* Must end in .so to load it. */ 01084 01085 if (ld < 4) 01086 continue; 01087 01088 if (strcasecmp(dirent->d_name + ld - 3, ".so")) 01089 continue; 01090 01091 /* if there is already a module by this name in the module_list, 01092 skip this file */ 01093 if (find_resource(dirent->d_name, 0)) 01094 continue; 01095 01096 add_to_load_order(dirent->d_name, &load_order, 0); 01097 } 01098 01099 closedir(dir); 01100 } else { 01101 if (!ast_opt_quiet) 01102 ast_log(LOG_WARNING, "Unable to open modules directory '%s'.\n", 01103 ast_config_AST_MODULE_DIR); 01104 } 01105 #endif 01106 } 01107 01108 /* now scan the config for any modules we are prohibited from loading and 01109 remove them from the load order */ 01110 for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) { 01111 if (strcasecmp(v->name, "noload")) 01112 continue; 01113 01114 AST_LIST_TRAVERSE_SAFE_BEGIN(&load_order, order, entry) { 01115 if (!resource_name_match(order->resource, v->value)) { 01116 AST_LIST_REMOVE_CURRENT(entry); 01117 ast_free(order->resource); 01118 ast_free(order); 01119 } 01120 } 01121 AST_LIST_TRAVERSE_SAFE_END; 01122 } 01123 01124 /* we are done with the config now, all the information we need is in the 01125 load_order list */ 01126 ast_config_destroy(cfg); 01127 01128 load_count = 0; 01129 AST_LIST_TRAVERSE(&load_order, order, entry) 01130 load_count++; 01131 01132 if (load_count) 01133 ast_log(LOG_NOTICE, "%d modules will be loaded.\n", load_count); 01134 01135 /* first, load only modules that provide global symbols */ 01136 if ((res = load_resource_list(&load_order, 1, &modulecount)) < 0) { 01137 goto done; 01138 } 01139 01140 /* now load everything else */ 01141 if ((res = load_resource_list(&load_order, 0, &modulecount)) < 0) { 01142 goto done; 01143 } 01144 01145 done: 01146 while ((order = AST_LIST_REMOVE_HEAD(&load_order, entry))) { 01147 ast_free(order->resource); 01148 ast_free(order); 01149 } 01150 01151 AST_LIST_UNLOCK(&module_list); 01152 01153 /* Tell manager clients that are aggressive at logging in that we're done 01154 loading modules. If there's a DNS problem in chan_sip, we might not 01155 even reach this */ 01156 manager_event(EVENT_FLAG_SYSTEM, "ModuleLoadReport", "ModuleLoadStatus: Done\r\nModuleSelection: %s\r\nModuleCount: %d\r\n", preload_only ? "Preload" : "All", modulecount); 01157 01158 return res; 01159 }
int load_pbx | ( | void | ) |
Provided by pbx.c
Definition at line 10307 of file pbx.c.
References __ast_custom_function_register(), ARRAY_LEN, ast_cli_register_multiple(), ast_data_register_multiple_core, AST_EVENT_DEVICE_STATE, AST_EVENT_IE_END, ast_event_subscribe(), ast_log(), ast_manager_register_xml, ast_register_application2(), ast_taskprocessor_get(), ast_verb, builtins, device_state_cb(), device_state_sub, device_state_tps, EVENT_FLAG_CONFIG, EVENT_FLAG_REPORTING, exception_function, LOG_ERROR, LOG_WARNING, manager_show_dialplan(), pbx_cli, pbx_data_providers, and testtime_function.
Referenced by main().
10308 { 10309 int x; 10310 10311 /* Initialize the PBX */ 10312 ast_verb(1, "Asterisk PBX Core Initializing\n"); 10313 if (!(device_state_tps = ast_taskprocessor_get("pbx-core", 0))) { 10314 ast_log(LOG_WARNING, "failed to create pbx-core taskprocessor\n"); 10315 } 10316 10317 ast_verb(1, "Registering builtin applications:\n"); 10318 ast_cli_register_multiple(pbx_cli, ARRAY_LEN(pbx_cli)); 10319 ast_data_register_multiple_core(pbx_data_providers, ARRAY_LEN(pbx_data_providers)); 10320 __ast_custom_function_register(&exception_function, NULL); 10321 __ast_custom_function_register(&testtime_function, NULL); 10322 10323 /* Register builtin applications */ 10324 for (x = 0; x < ARRAY_LEN(builtins); x++) { 10325 ast_verb(1, "[%s]\n", builtins[x].name); 10326 if (ast_register_application2(builtins[x].name, builtins[x].execute, NULL, NULL, NULL)) { 10327 ast_log(LOG_ERROR, "Unable to register builtin application '%s'\n", builtins[x].name); 10328 return -1; 10329 } 10330 } 10331 10332 /* Register manager application */ 10333 ast_manager_register_xml("ShowDialPlan", EVENT_FLAG_CONFIG | EVENT_FLAG_REPORTING, manager_show_dialplan); 10334 10335 if (!(device_state_sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE, device_state_cb, "pbx Device State Change", NULL, 10336 AST_EVENT_IE_END))) { 10337 return -1; 10338 } 10339 10340 return 0; 10341 }
void threadstorage_init | ( | void | ) |