Mon Oct 8 12:39:06 2012

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.
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)


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 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().

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   ) 

Provided by file.c

Definition at line 1493 of file file.c.

Referenced by main().

01494 {
01495    ast_cli_register_multiple(cli_file, ARRAY_LEN(cli_file));
01496    return 0;
01497 }

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().

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.

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 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.

Note:
This function will do nothing if the server has not completely started up. Once called, the reload queue is emptied, and further invocations will have no affect.

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   ) 

Load XML documentation. Provided by xmldoc.c.

Return values:
1 on error.
0 on success.

Referenced by main().

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   ) 

Provided by threadstorage.c

Definition at line 35 of file threadstorage.c.

Referenced by main().

00036 {
00037 }


Generated on Mon Oct 8 12:39:06 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7