Fri Jun 19 12:09:54 2009

Asterisk developer's documentation


_private.h File Reference

Prototypes for public functions only of internal interest,. More...

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)


Detailed Description

Prototypes for public functions only of internal interest,.

Definition in file _private.h.


Function Documentation

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.

Parameters:
name the name of the module to reload
This function reloads the specified module, or if no modules are specified, it will reload all loaded modules.

Note:
Modules are reloaded using their reload() functions, not unloading them and loading them again.
Returns:
0 if the specified module was not found.
Return values:
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   ) 

Provided by threadstorage.c

Definition at line 31 of file threadstorage.c.

Referenced by main().

00032 {
00033 }


Generated on Fri Jun 19 12:09:54 2009 for Asterisk - the Open Source PBX by  doxygen 1.4.7