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. | |
void | ast_channels_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_module_reload (const char *name) |
Reload asterisk modules. | |
int | ast_term_init (void) |
int | ast_timing_init (void) |
int | ast_tps_init (void) |
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 310 of file autoservice.c.
References as_cond, and ast_cond_init().
Referenced by main().
00311 { 00312 ast_cond_init(&as_cond, NULL); 00313 }
void ast_builtins_init | ( | void | ) |
initialize the _full_cmd string in * each of the builtins.
Provided by cli.c
Definition at line 1251 of file cli.c.
References ast_cli_register_multiple(), and cli_cli.
Referenced by main().
01252 { 01253 ast_cli_register_multiple(cli_cli, sizeof(cli_cli) / sizeof(struct ast_cli_entry)); 01254 }
void ast_channels_init | ( | void | ) |
Provided by channel.c
Definition at line 5180 of file channel.c.
References ARRAY_LEN, ast_cli_register_multiple(), and cli_channel.
Referenced by main().
05181 { 05182 ast_cli_register_multiple(cli_channel, ARRAY_LEN(cli_channel)); 05183 }
int ast_device_state_engine_init | ( | void | ) |
Initialize the device state engine in separate thread.
Provided by devicestate.c
Definition at line 749 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().
00750 { 00751 ast_cond_init(&change_pending, NULL); 00752 if (ast_pthread_create_background(&change_thread, NULL, do_devstate_changes, NULL) < 0) { 00753 ast_log(LOG_ERROR, "Unable to start device state change thread.\n"); 00754 return -1; 00755 } 00756 00757 return 0; 00758 }
int ast_event_init | ( | void | ) |
Provided by event.c
Definition at line 1285 of file event.c.
References ao2_container_alloc, ast_event_cache, ast_event_cmp(), ast_event_hash(), ast_event_subs, AST_RWDLLIST_HEAD_INIT, ast_taskprocessor_get(), container, event_dispatcher, hash_fn, and NUM_CACHE_BUCKETS.
Referenced by main().
01286 { 01287 int i; 01288 01289 for (i = 0; i < AST_EVENT_TOTAL; i++) { 01290 AST_RWDLLIST_HEAD_INIT(&ast_event_subs[i]); 01291 } 01292 01293 for (i = 0; i < AST_EVENT_TOTAL; i++) { 01294 if (!ast_event_cache[i].hash_fn) { 01295 /* This event type is not cached. */ 01296 continue; 01297 } 01298 01299 if (!(ast_event_cache[i].container = ao2_container_alloc(NUM_CACHE_BUCKETS, 01300 ast_event_hash, ast_event_cmp))) { 01301 return -1; 01302 } 01303 } 01304 01305 if (!(event_dispatcher = ast_taskprocessor_get("core_event_dispatcher", 0))) { 01306 return -1; 01307 } 01308 01309 return 0; 01310 }
int ast_features_init | ( | void | ) |
Provided by features.c
Definition at line 4535 of file features.c.
References action_bridge(), ao2_container_alloc, ast_cli_register_multiple(), ast_devstate_prov_add(), ast_manager_register, ast_manager_register2(), ast_pthread_create, ast_register_application2(), bridge_exec(), cli_features, descrip, descrip2, do_parking_thread(), EVENT_FLAG_CALL, load_config(), manager_park(), manager_parking_status(), metermaidstate(), park_call_exec(), park_exec(), parkcall, parkedcall, parking_thread, parkinglot_cmp_cb(), parkinglot_hash_cb(), parkinglots, synopsis, and synopsis2.
Referenced by main().
04536 { 04537 int res; 04538 04539 ast_register_application2(app_bridge, bridge_exec, bridge_synopsis, bridge_descrip, NULL); 04540 04541 parkinglots = ao2_container_alloc(7, parkinglot_hash_cb, parkinglot_cmp_cb); 04542 04543 if ((res = load_config())) 04544 return res; 04545 ast_cli_register_multiple(cli_features, sizeof(cli_features) / sizeof(struct ast_cli_entry)); 04546 ast_pthread_create(&parking_thread, NULL, do_parking_thread, NULL); 04547 res = ast_register_application2(parkedcall, park_exec, synopsis, descrip, NULL); 04548 if (!res) 04549 res = ast_register_application2(parkcall, park_call_exec, synopsis2, descrip2, NULL); 04550 if (!res) { 04551 ast_manager_register("ParkedCalls", 0, manager_parking_status, "List parked calls"); 04552 ast_manager_register2("Park", EVENT_FLAG_CALL, manager_park, "Park a channel", mandescr_park); 04553 ast_manager_register2("Bridge", EVENT_FLAG_CALL, action_bridge, "Bridge two channels already in the PBX", mandescr_bridge); 04554 } 04555 04556 res |= ast_devstate_prov_add("Park", metermaidstate); 04557 04558 return res; 04559 }
int ast_file_init | ( | void | ) |
Provided by file.c
Definition at line 1369 of file file.c.
01370 { 01371 ast_cli_register_multiple(cli_file, sizeof(cli_file) / sizeof(struct ast_cli_entry)); 01372 return 0; 01373 }
int ast_http_init | ( | void | ) |
Provided by http.c
Definition at line 1022 of file http.c.
References __ast_http_load(), ast_cli_register_multiple(), ast_http_uri_link(), cli_http, staticuri, and statusuri.
Referenced by main().
01023 { 01024 ast_http_uri_link(&statusuri); 01025 ast_http_uri_link(&staticuri); 01026 ast_cli_register_multiple(cli_http, sizeof(cli_http) / sizeof(struct ast_cli_entry)); 01027 01028 return __ast_http_load(0); 01029 }
int ast_http_reload | ( | void | ) |
Provided by http.c
Definition at line 1013 of file http.c.
References __ast_http_load().
01014 { 01015 return __ast_http_load(1); 01016 }
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 548 of file loader.c.
References ast_lastreloadtime, AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log(), ast_mutex_trylock(), ast_mutex_unlock(), ast_tvnow(), ast_verb, ast_verbose, ast_module::declined, ast_module_info::description, ast_module_user::entry, ast_module::flags, ast_module::info, LOG_NOTICE, ast_module_info::reload, reloadlock, ast_module::resource, resource_name_match(), and ast_module::running.
Referenced by action_reload(), action_updateconfig(), handle_reload(), manager_moduleload(), and monitor_sig_flags().
00549 { 00550 struct ast_module *cur; 00551 int res = 0; /* return value. 0 = not found, others, see below */ 00552 int i; 00553 00554 if (ast_mutex_trylock(&reloadlock)) { 00555 ast_verbose("The previous reload command didn't finish yet\n"); 00556 return -1; /* reload already in progress */ 00557 } 00558 ast_lastreloadtime = ast_tvnow(); 00559 00560 /* Call "predefined" reload here first */ 00561 for (i = 0; reload_classes[i].name; i++) { 00562 if (!name || !strcasecmp(name, reload_classes[i].name)) { 00563 reload_classes[i].reload_fn(); /* XXX should check error ? */ 00564 res = 2; /* found and reloaded */ 00565 } 00566 } 00567 00568 if (name && res) { 00569 ast_mutex_unlock(&reloadlock); 00570 return res; 00571 } 00572 00573 AST_LIST_LOCK(&module_list); 00574 AST_LIST_TRAVERSE(&module_list, cur, entry) { 00575 const struct ast_module_info *info = cur->info; 00576 00577 if (name && resource_name_match(name, cur->resource)) 00578 continue; 00579 00580 if (!cur->flags.running || cur->flags.declined) { 00581 if (!name) 00582 continue; 00583 ast_log(LOG_NOTICE, "The module '%s' was not properly initialized. " 00584 "Before reloading the module, you must run \"module load %s\" " 00585 "and fix whatever is preventing the module from being initialized.\n", 00586 name, name); 00587 res = 2; /* Don't report that the module was not found */ 00588 break; 00589 } 00590 00591 if (!info->reload) { /* cannot be reloaded */ 00592 if (res < 1) /* store result if possible */ 00593 res = 1; /* 1 = no reload() method */ 00594 continue; 00595 } 00596 00597 res = 2; 00598 ast_verb(3, "Reloading module '%s' (%s)\n", cur->resource, info->description); 00599 info->reload(); 00600 } 00601 AST_LIST_UNLOCK(&module_list); 00602 00603 ast_mutex_unlock(&reloadlock); 00604 00605 return res; 00606 }
int ast_term_init | ( | void | ) |
Provided by term.c
Definition at line 69 of file term.c.
References ast_opt_console, ast_opt_no_color, ast_opt_no_fork, ATTR_BRIGHT, ATTR_RESET, COLOR_BLACK, COLOR_BROWN, COLOR_WHITE, convshort(), and ESC.
Referenced by main().
00070 { 00071 char *term = getenv("TERM"); 00072 char termfile[256] = ""; 00073 char buffer[512] = ""; 00074 int termfd = -1, parseokay = 0, i; 00075 00076 if (!term) 00077 return 0; 00078 if (!ast_opt_console || ast_opt_no_color || !ast_opt_no_fork) 00079 return 0; 00080 00081 for (i=0 ;; i++) { 00082 if (termpath[i] == NULL) { 00083 break; 00084 } 00085 snprintf(termfile, sizeof(termfile), "%s/%c/%s", termpath[i], *term, term); 00086 termfd = open(termfile, O_RDONLY); 00087 if (termfd > -1) { 00088 break; 00089 } 00090 } 00091 if (termfd > -1) { 00092 int actsize = read(termfd, buffer, sizeof(buffer) - 1); 00093 short sz_names = convshort(buffer + 2); 00094 short sz_bools = convshort(buffer + 4); 00095 short n_nums = convshort(buffer + 6); 00096 00097 /* if ((sz_names + sz_bools) & 1) 00098 sz_bools++; */ 00099 00100 if (sz_names + sz_bools + n_nums < actsize) { 00101 /* Offset 13 is defined in /usr/include/term.h, though we do not 00102 * include it here, as it conflicts with include/asterisk/term.h */ 00103 short max_colors = convshort(buffer + 12 + sz_names + sz_bools + 13 * 2); 00104 if (max_colors > 0) { 00105 vt100compat = 1; 00106 } 00107 parseokay = 1; 00108 } 00109 close(termfd); 00110 } 00111 00112 if (!parseokay) { 00113 /* These comparisons should not be substrings nor case-insensitive, as 00114 * terminal types are very particular about how they treat suffixes and 00115 * capitalization. For example, terminal type 'linux-m' does NOT 00116 * support color, while 'linux' does. Not even all vt100* terminals 00117 * support color, either (e.g. 'vt100+fnkeys'). */ 00118 if (!strcmp(term, "linux")) { 00119 vt100compat = 1; 00120 } else if (!strcmp(term, "xterm")) { 00121 vt100compat = 1; 00122 } else if (!strcmp(term, "xterm-color")) { 00123 vt100compat = 1; 00124 } else if (!strncmp(term, "Eterm", 5)) { 00125 /* Both entries which start with Eterm support color */ 00126 vt100compat = 1; 00127 } else if (!strcmp(term, "vt100")) { 00128 vt100compat = 1; 00129 } else if (!strncmp(term, "crt", 3)) { 00130 /* Both crt terminals support color */ 00131 vt100compat = 1; 00132 } 00133 } 00134 00135 if (vt100compat) { 00136 /* Make commands show up in nice colors */ 00137 snprintf(prepdata, sizeof(prepdata), "%c[%d;%d;%dm", ESC, ATTR_BRIGHT, COLOR_BROWN, COLOR_BLACK + 10); 00138 snprintf(enddata, sizeof(enddata), "%c[%d;%d;%dm", ESC, ATTR_RESET, COLOR_WHITE, COLOR_BLACK + 10); 00139 snprintf(quitdata, sizeof(quitdata), "%c[0m", ESC); 00140 } 00141 return 0; 00142 }
int ast_timing_init | ( | void | ) |
Provided by timing.c
Definition at line 283 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().
00284 { 00285 if (!(timing_interfaces = ast_heap_create(2, timing_holder_cmp, 0))) { 00286 return -1; 00287 } 00288 00289 return ast_cli_register_multiple(cli_timing, ARRAY_LEN(cli_timing)); 00290 }
int ast_tps_init | ( | void | ) |
Provided by taskprocessor.c
Definition at line 122 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().
00123 { 00124 if (!(tps_singletons = ao2_container_alloc(TPS_MAX_BUCKETS, tps_hash_cb, tps_cmp_cb))) { 00125 ast_log(LOG_ERROR, "taskprocessor container failed to initialize!\n"); 00126 return -1; 00127 } 00128 00129 ast_cond_init(&cli_ping_cond, NULL); 00130 00131 ast_cli_register_multiple(taskprocessor_clis, ARRAY_LEN(taskprocessor_clis)); 00132 return 0; 00133 }
int astdb_init | ( | void | ) |
Provided by db.c
Definition at line 665 of file db.c.
References ast_cli_register_multiple(), ast_manager_register, cli_database, dbinit(), EVENT_FLAG_REPORTING, EVENT_FLAG_SYSTEM, manager_dbdel(), manager_dbdeltree(), manager_dbget(), and manager_dbput().
Referenced by main().
00666 { 00667 dbinit(); 00668 ast_cli_register_multiple(cli_database, sizeof(cli_database) / sizeof(struct ast_cli_entry)); 00669 ast_manager_register("DBGet", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, manager_dbget, "Get DB Entry"); 00670 ast_manager_register("DBPut", EVENT_FLAG_SYSTEM, manager_dbput, "Put DB Entry"); 00671 ast_manager_register("DBDel", EVENT_FLAG_SYSTEM, manager_dbdel, "Delete DB Entry"); 00672 ast_manager_register("DBDelTree", EVENT_FLAG_SYSTEM, manager_dbdeltree, "Delete DB Tree"); 00673 return 0; 00674 }
int astobj2_init | ( | void | ) |
Provided by astobj2.c
Definition at line 1003 of file astobj2.c.
References ARRAY_LEN, and ast_cli_register_multiple().
Referenced by main().
01004 { 01005 #ifdef AO2_DEBUG 01006 ast_cli_register_multiple(cli_astobj2, ARRAY_LEN(cli_astobj2)); 01007 #endif 01008 01009 return 0; 01010 }
void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1049 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, eventlog, f, logchannel::list, logcond, logthread, and qlog.
Referenced by quit_handler().
01051 { 01052 struct logchannel *f = NULL; 01053 01054 /* Stop logger thread */ 01055 AST_LIST_LOCK(&logmsgs); 01056 close_logger_thread = 1; 01057 ast_cond_signal(&logcond); 01058 AST_LIST_UNLOCK(&logmsgs); 01059 01060 if (logthread != AST_PTHREADT_NULL) 01061 pthread_join(logthread, NULL); 01062 01063 AST_RWLIST_WRLOCK(&logchannels); 01064 01065 if (eventlog) { 01066 fclose(eventlog); 01067 eventlog = NULL; 01068 } 01069 01070 if (qlog) { 01071 fclose(qlog); 01072 qlog = NULL; 01073 } 01074 01075 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 01076 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01077 fclose(f->fileptr); 01078 f->fileptr = NULL; 01079 } 01080 } 01081 01082 closelog(); /* syslog */ 01083 01084 AST_RWLIST_UNLOCK(&logchannels); 01085 01086 return;
int dnsmgr_init | ( | void | ) |
Provided by dnsmgr.c
Definition at line 350 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().
00351 { 00352 if (!(sched = sched_context_create())) { 00353 ast_log(LOG_ERROR, "Unable to create schedule context.\n"); 00354 return -1; 00355 } 00356 ast_cli_register(&cli_reload); 00357 ast_cli_register(&cli_status); 00358 ast_cli_register(&cli_refresh); 00359 return do_reload(1); 00360 }
int dnsmgr_reload | ( | void | ) |
Provided by dnsmgr.c
Definition at line 362 of file dnsmgr.c.
References do_reload().
00363 { 00364 return do_reload(0); 00365 }
void dnsmgr_start_refresh | ( | void | ) |
Provided by dnsmgr.c
Definition at line 244 of file dnsmgr.c.
References ast_sched_add_variable(), AST_SCHED_DEL, master_refresh_info, refresh_list(), and sched.
Referenced by main().
00245 { 00246 if (refresh_sched > -1) { 00247 AST_SCHED_DEL(sched, refresh_sched); 00248 refresh_sched = ast_sched_add_variable(sched, 100, refresh_list, &master_refresh_info, 1); 00249 } 00250 }
int init_framer | ( | void | ) |
Provided by frame.c
Definition at line 978 of file frame.c.
References ast_cli_register_multiple(), and my_clis.
Referenced by main().
00979 { 00980 ast_cli_register_multiple(my_clis, sizeof(my_clis) / sizeof(struct ast_cli_entry)); 00981 return 0; 00982 }
int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 1005 of file logger.c.
References ast_cli_register_multiple(), ast_cond_destroy(), ast_cond_init(), ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_pthread_create, ast_queue_log(), ast_verb, cli_logger, errno, eventlog, EVENTLOG, handle_SIGXFSZ(), init_logger_chain(), LOG_ERROR, LOG_EVENT, logcond, logfiles, logger_thread(), logthread, and qlog.
Referenced by main().
01007 { 01008 char tmp[256]; 01009 int res = 0; 01010 01011 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01012 (void) signal(SIGXFSZ, (void *) handle_SIGXFSZ); 01013 01014 /* start logger thread */ 01015 ast_cond_init(&logcond, NULL); 01016 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01017 ast_cond_destroy(&logcond); 01018 return -1; 01019 } 01020 01021 /* register the logger cli commands */ 01022 ast_cli_register_multiple(cli_logger, sizeof(cli_logger) / sizeof(struct ast_cli_entry)); 01023 01024 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01025 01026 /* create log channels */ 01027 init_logger_chain(0 /* locked */); 01028 01029 /* create the eventlog */ 01030 if (logfiles.event_log) { 01031 snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG); 01032 eventlog = fopen(tmp, "a"); 01033 if (eventlog) { 01034 ast_log(LOG_EVENT, "Started Asterisk Event Logger\n"); 01035 ast_verb(1, "Asterisk Event Logger Started %s\n", tmp); 01036 } else { 01037 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); 01038 res = -1; 01039 } 01040 } 01041 01042 if (logfiles.queue_log) { 01043 snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 01044 qlog = fopen(tmp, "a"); 01045 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); 01046 } 01047 return res;
int load_modules | ( | unsigned | int | ) |
Provided by loader.c
Definition at line 745 of file loader.c.
References add_to_load_order(), ast_config_load2(), AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_LOCK, ast_log(), AST_MODULE_CONFIG, ast_variable_browse(), ast_verb, config_flags, dir, embedding, LOG_WARNING, ast_variable::name, ast_variable::next, and ast_variable::value.
Referenced by main().
00746 { 00747 struct ast_config *cfg; 00748 struct ast_module *mod; 00749 struct load_order_entry *order; 00750 struct ast_variable *v; 00751 unsigned int load_count; 00752 struct load_order load_order; 00753 int res = 0; 00754 struct ast_flags config_flags = { 0 }; 00755 int modulecount = 0; 00756 00757 #ifdef LOADABLE_MODULES 00758 struct dirent *dirent; 00759 DIR *dir; 00760 #endif 00761 00762 /* all embedded modules have registered themselves by now */ 00763 embedding = 0; 00764 00765 ast_verb(1, "Asterisk Dynamic Loader Starting:\n"); 00766 00767 AST_LIST_HEAD_INIT_NOLOCK(&load_order); 00768 00769 AST_LIST_LOCK(&module_list); 00770 00771 if (embedded_module_list.first) { 00772 module_list.first = embedded_module_list.first; 00773 module_list.last = embedded_module_list.last; 00774 embedded_module_list.first = NULL; 00775 } 00776 00777 if (!(cfg = ast_config_load2(AST_MODULE_CONFIG, "" /* core, can't reload */, config_flags))) { 00778 ast_log(LOG_WARNING, "No '%s' found, no modules will be loaded.\n", AST_MODULE_CONFIG); 00779 goto done; 00780 } 00781 00782 /* first, find all the modules we have been explicitly requested to load */ 00783 for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) { 00784 if (!strcasecmp(v->name, preload_only ? "preload" : "load")) { 00785 add_to_load_order(v->value, &load_order); 00786 } 00787 } 00788 00789 /* check if 'autoload' is on */ 00790 if (!preload_only && ast_true(ast_variable_retrieve(cfg, "modules", "autoload"))) { 00791 /* if so, first add all the embedded modules that are not already running to the load order */ 00792 AST_LIST_TRAVERSE(&module_list, mod, entry) { 00793 /* if it's not embedded, skip it */ 00794 if (mod->lib) 00795 continue; 00796 00797 if (mod->flags.running) 00798 continue; 00799 00800 order = add_to_load_order(mod->resource, &load_order); 00801 } 00802 00803 #ifdef LOADABLE_MODULES 00804 /* if we are allowed to load dynamic modules, scan the directory for 00805 for all available modules and add them as well */ 00806 if ((dir = opendir(ast_config_AST_MODULE_DIR))) { 00807 while ((dirent = readdir(dir))) { 00808 int ld = strlen(dirent->d_name); 00809 00810 /* Must end in .so to load it. */ 00811 00812 if (ld < 4) 00813 continue; 00814 00815 if (strcasecmp(dirent->d_name + ld - 3, ".so")) 00816 continue; 00817 00818 /* if there is already a module by this name in the module_list, 00819 skip this file */ 00820 if (find_resource(dirent->d_name, 0)) 00821 continue; 00822 00823 add_to_load_order(dirent->d_name, &load_order); 00824 } 00825 00826 closedir(dir); 00827 } else { 00828 if (!ast_opt_quiet) 00829 ast_log(LOG_WARNING, "Unable to open modules directory '%s'.\n", 00830 ast_config_AST_MODULE_DIR); 00831 } 00832 #endif 00833 } 00834 00835 /* now scan the config for any modules we are prohibited from loading and 00836 remove them from the load order */ 00837 for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) { 00838 if (strcasecmp(v->name, "noload")) 00839 continue; 00840 00841 AST_LIST_TRAVERSE_SAFE_BEGIN(&load_order, order, entry) { 00842 if (!resource_name_match(order->resource, v->value)) { 00843 AST_LIST_REMOVE_CURRENT(entry); 00844 ast_free(order->resource); 00845 ast_free(order); 00846 } 00847 } 00848 AST_LIST_TRAVERSE_SAFE_END; 00849 } 00850 00851 /* we are done with the config now, all the information we need is in the 00852 load_order list */ 00853 ast_config_destroy(cfg); 00854 00855 load_count = 0; 00856 AST_LIST_TRAVERSE(&load_order, order, entry) 00857 load_count++; 00858 00859 if (load_count) 00860 ast_log(LOG_NOTICE, "%d modules will be loaded.\n", load_count); 00861 00862 /* first, load only modules that provide global symbols */ 00863 AST_LIST_TRAVERSE_SAFE_BEGIN(&load_order, order, entry) { 00864 switch (load_resource(order->resource, 1)) { 00865 case AST_MODULE_LOAD_SUCCESS: 00866 modulecount++; 00867 case AST_MODULE_LOAD_DECLINE: 00868 AST_LIST_REMOVE_CURRENT(entry); 00869 ast_free(order->resource); 00870 ast_free(order); 00871 break; 00872 case AST_MODULE_LOAD_FAILURE: 00873 res = -1; 00874 goto done; 00875 case AST_MODULE_LOAD_SKIP: 00876 /* try again later */ 00877 break; 00878 } 00879 } 00880 AST_LIST_TRAVERSE_SAFE_END; 00881 00882 /* now load everything else */ 00883 AST_LIST_TRAVERSE_SAFE_BEGIN(&load_order, order, entry) { 00884 switch (load_resource(order->resource, 0)) { 00885 case AST_MODULE_LOAD_SUCCESS: 00886 modulecount++; 00887 case AST_MODULE_LOAD_DECLINE: 00888 AST_LIST_REMOVE_CURRENT(entry); 00889 ast_free(order->resource); 00890 ast_free(order); 00891 break; 00892 case AST_MODULE_LOAD_FAILURE: 00893 res = -1; 00894 goto done; 00895 case AST_MODULE_LOAD_SKIP: 00896 /* should not happen */ 00897 break; 00898 } 00899 } 00900 AST_LIST_TRAVERSE_SAFE_END; 00901 00902 done: 00903 while ((order = AST_LIST_REMOVE_HEAD(&load_order, entry))) { 00904 ast_free(order->resource); 00905 ast_free(order); 00906 } 00907 00908 AST_LIST_UNLOCK(&module_list); 00909 00910 /* Tell manager clients that are aggressive at logging in that we're done 00911 loading modules. If there's a DNS problem in chan_sip, we might not 00912 even reach this */ 00913 manager_event(EVENT_FLAG_SYSTEM, "ModuleLoadReport", "ModuleLoadStatus: Done\r\nModuleSelection: %s\r\nModuleCount: %d\r\n", preload_only ? "Preload" : "All", modulecount); 00914 00915 return res; 00916 }
int load_pbx | ( | void | ) |
Provided by pbx.c
Definition at line 8630 of file pbx.c.
References __ast_custom_function_register(), ast_cli_register_multiple(), AST_EVENT_DEVICE_STATE, AST_EVENT_IE_END, ast_event_subscribe(), ast_log(), ast_manager_register2(), 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(), and pbx_cli.
Referenced by main().
08631 { 08632 int x; 08633 08634 /* Initialize the PBX */ 08635 ast_verb(1, "Asterisk PBX Core Initializing\n"); 08636 if (!(device_state_tps = ast_taskprocessor_get("pbx-core", 0))) { 08637 ast_log(LOG_WARNING, "failed to create pbx-core taskprocessor\n"); 08638 } 08639 08640 ast_verb(1, "Registering builtin applications:\n"); 08641 ast_cli_register_multiple(pbx_cli, sizeof(pbx_cli) / sizeof(struct ast_cli_entry)); 08642 __ast_custom_function_register(&exception_function, NULL); 08643 08644 /* Register builtin applications */ 08645 for (x = 0; x < sizeof(builtins) / sizeof(struct pbx_builtin); x++) { 08646 ast_verb(1, "[%s]\n", builtins[x].name); 08647 if (ast_register_application2(builtins[x].name, builtins[x].execute, builtins[x].synopsis, builtins[x].description, NULL)) { 08648 ast_log(LOG_ERROR, "Unable to register builtin application '%s'\n", builtins[x].name); 08649 return -1; 08650 } 08651 } 08652 08653 /* Register manager application */ 08654 ast_manager_register2("ShowDialPlan", EVENT_FLAG_CONFIG | EVENT_FLAG_REPORTING, manager_show_dialplan, "List dialplan", mandescr_show_dialplan); 08655 08656 if (!(device_state_sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE, device_state_cb, NULL, 08657 AST_EVENT_IE_END))) { 08658 return -1; 08659 } 08660 08661 return 0; 08662 }
void threadstorage_init | ( | void | ) |