📄 config.c
字号:
ast_log(LOG_ERROR, "Connector no. %d for link '%s' not in range 1..%d.\n", host->spans[host->n_spans].connector, v->value, MAX_E1_CONNECTOR_NO); return -1; } ast_log(LOG_DEBUG, "linkname '%s', no %d \n", linkname_buf, host->spans[host->n_spans].connector); for (i = 0; i < host->n_spans; i++) { if (host->spans[i].connector == host->spans[host->n_spans].connector) { ast_log(LOG_ERROR, "Connector no. %d specified twice for host '%s.'\n", host->spans[host->n_spans].connector, host->name); return -1; } } host->spans[host->n_spans].link = lookup_link(linkname_buf); if (!host->spans[host->n_spans].link) { ast_log(LOG_ERROR, "Link '%s' not found while parsing host '%s'.\n", linkname_buf, host_name); return -1; } if (host->spans[host->n_spans].link->on_host) { ast_log(LOG_ERROR, "Link '%s' belongs to both host '%s' and '%s'.\n", linkname_buf, host_name, host->spans[host->n_spans].link->on_host->name); return -1; } host->spans[host->n_spans].link->on_host = host; host->n_spans++; ast_log(LOG_DEBUG, "host n_spans %d \n", host->n_spans); p = strsep(&spec, ","); } has_links = 1; } else if(0 == strncasecmp(v->name, "if-", 3)) { in_addr_t addr; if (host->n_ifs == MAX_IFS_PER_HOST) { ast_log(LOG_ERROR, "Too many interfaces defined for host '%s' (max %d).\n", host->name, MAX_IFS_PER_HOST); return -1; } if ((addr = inet_addr(v->value)) == INADDR_NONE) { ast_log(LOG_ERROR, "Invalid IP address '%s' for interface '%s' for host '%s'.\n", v->value, v->value, host_name); return -1; } memcpy(&host->ifs[host->n_ifs].addr, &addr, sizeof(addr)); host->ifs[host->n_ifs].name = strdup(&v->name[3]); host->n_ifs++; has_if = 1; } else if(0 == strcasecmp(v->name, "ssn")) { if(sscanf(v->value, "%i", &host->ssn) != 1) { ast_log(LOG_ERROR, "Invalid ssn value '%s' for host '%s'.\n", v->value, host_name); return -1; } } else if(0 == strcasecmp(v->name, "globaltitle")) { if(sscanf(v->value, "%hhi, %hhi, %hhi, %s", &host->global_title.translation_type, &host->global_title.nature_of_address, &host->global_title.numbering_plan, host->global_title.addr) != 4) { ast_log(LOG_ERROR, "Invalid globaltitle value '%s' for host '%s'.\n", v->value, host_name); return -1; } } else if(0 == strcasecmp(v->name, "route")) { char route_spec_buf[500] = {0,}; ast_copy_string(route_spec_buf, v->value, sizeof(route_spec_buf)); ast_log(LOG_DEBUG, "route '%s' \n", route_spec_buf); spec = &route_spec_buf[0]; p = strsep(&spec, ","); while(p && *p) { char dest_buf[100]; char linkset_buf[100]; struct linkset* linkset; if (host->n_routes == MAX_ROUTES_PER_HOST) { ast_log(LOG_ERROR, "Too many routes defined for host '%s' (max %d).\n", host->name, MAX_ROUTES_PER_HOST); return -1; } while ((*p == ' ') || (*p == '\t')) p++; if(sscanf(p, "%[0-9]:%s", dest_buf, linkset_buf) != 2) { if(sscanf(p, ":%s", linkset_buf) != 1) { ast_log(LOG_ERROR, "Invalid route specification '%s' for host '%s'.\n", p, host_name); return -1; } *dest_buf = '\0'; } linkset = lookup_linkset(linkset_buf); if (!linkset) { ast_log(LOG_ERROR, "Unknown linkset '%s' for route '%s' for host '%s'\n", linkset_buf, p, host_name); return -1; } host->routes[host->n_routes].destaddr = strdup(dest_buf); host->routes[host->n_routes].destlinkset = linkset; host->n_routes++; p = strsep(&spec, ","); } } else { ast_log(LOG_ERROR, "Unknown config option '%s', aborting.\n", v->name); return -1; } v = v->next; } if (!has_opc) { ast_log(LOG_ERROR, "Missing opc entry for host '%s'.\n", host_name); return -1; } if (!has_dpc) { ast_log(LOG_ERROR, "Missing dpc entry for host '%s'.\n", host_name); return -1; } if (!has_links) { ast_log(LOG_ERROR, "Missing links entry for host '%s'.\n", host_name); return -1; } if (!has_enabled) { ast_log(LOG_ERROR, "Missing enabled entry for host '%s'.\n", host_name); return -1; } if (!has_if) { ast_log(LOG_WARNING, "Missing interface entries for host '%s'.\n", host_name); } host->n_receivers = 0; host->state = STATE_UNKNOWN; host->has_signalling_receivers = 0; ast_log(LOG_DEBUG, "host %s, n_spans %d \n", host->name, host->n_spans); n_hosts++; return 0;}static int load_config_cluster(struct ast_config *cfg){ struct ast_variable *v; struct link* link; struct host* host; struct receiver* receiver; int i, j; char *p; char *spec; char dup_spec_buf[100] = {0,}; int has_port = 0; v = ast_variable_browse(cfg, "cluster"); while(v != NULL) { if (strcasecmp(v->name, "port") == 0) { if(sscanf(v->value, "%d", &clusterlistenport) != 1) { ast_log(LOG_ERROR, "The port entry '%s' in cluster section is not valid.\n", v->name); return -1; } has_port = 1; v = v->next; continue; } if ((link = lookup_link(v->name)) == NULL) { ast_log(LOG_ERROR, "The link '%s' is not defined while parsing cluster category.\n", v->name); return -1; } host = NULL; for (i = 0; i < n_hosts; i++) { for (j = 0; j < hosts[i].n_spans; j++) { if (hosts[i].spans[j].link == link) { host = &hosts[i]; break; } } } if (link->enabled) { if (host) { if (host->n_receivers == MAX_LINKS_PER_HOST) { ast_log(LOG_ERROR, "Too many receivers defined for host '%s' (max %d).\n", host->name, MAX_LINKS_PER_HOST); return -1; } ast_log(LOG_DEBUG, "found link '%s' on %s\n", v->name, host->name); receiver = &host->receivers[host->n_receivers]; receiver->receiverix = host->n_receivers++; receiver->n_targets = 0; link->receiver = receiver; ast_copy_string(dup_spec_buf, v->value, sizeof(dup_spec_buf)); spec = &dup_spec_buf[0]; p = strsep(&spec, ","); while(p) { char host_name_buf[100]; char if_name_buf[100]; struct host* target_host; struct ipinterface* target_if = NULL; char* if_name = &if_name_buf[3]; if(sscanf(p, "%[^#]#%s", host_name_buf, if_name_buf) != 2) { ast_log(LOG_ERROR, "Invalid host#if specification '%s'.\n", p); return -1; } if ((target_host = lookup_host(host_name_buf)) == NULL) { ast_log(LOG_ERROR, "Host '%s' not found in dup spec '%s'.\n", host_name_buf, p); return -1; } if (strncasecmp(if_name_buf, "if-", 3)) { ast_log(LOG_ERROR, "Invalid interface name: '%s' in dup spec '%s'.\n", host_name_buf, p); return -1; } for (i = 0; i < n_hosts; i++) { if (!strcmp(hosts[i].name, host_name_buf)) { for (j = 0; j < hosts[i].n_ifs; j++) { if (!strcmp(hosts[i].ifs[j].name, if_name)) { target_if = &hosts[i].ifs[j]; break; } } } } if (!target_if) { ast_log(LOG_ERROR, "Interface '%s' not found for host '%s'.\n", if_name_buf, host_name_buf); return -1; } if (receiver->n_targets == 2*MAX_HOSTS) { ast_log(LOG_ERROR, "Too many targets defined for link '%s' (max %d).\n", link->name, 2*MAX_HOSTS); return -1; } receiver->targets[receiver->n_targets].host = target_host; receiver->targets[receiver->n_targets].inf = target_if; receiver->n_targets++; ast_log(LOG_DEBUG, "Added target %s#%s for link %s on host %s \n", target_host->name, target_if->name, link->name, host->name); p = strsep(&spec, ","); } } else { ast_log(LOG_WARNING, "The link '%s' is not used by any host.\n", v->name); } } v = v->next; } if (!has_port) { ast_log(LOG_WARNING, "Missing port entry in cluster section"); return -1; } return 0;}int load_config(int reload){ struct ast_config *cfg; static const char conffile_name[] = "ss7.conf"; char* prevcat = NULL; int i, j, k; cfg = ast_config_load(conffile_name); if(cfg == NULL) { ast_log(LOG_ERROR, "Unable to load config '%s'.\n", conffile_name); return -1; } n_linksets = 0; n_links = 0; n_hosts = 0; while ((prevcat = ast_category_browse(cfg, prevcat)) != NULL) { if (strncasecmp(prevcat, "linkset-", 8) == 0) { if (load_config_linkset(cfg, prevcat)) goto fail; } else if (strncasecmp(prevcat, "link-", 5) == 0) { if (load_config_link(cfg, prevcat)) goto fail; } else if (strncasecmp(prevcat, "host-", 5) == 0) { if (load_config_host(cfg, prevcat)) goto fail; } else if (strcasecmp(prevcat, "cluster") == 0) { if (load_config_cluster(cfg)) goto fail; } else if (strcasecmp(prevcat, "jitter") == 0) { if (load_config_jitter(cfg)) goto fail; } else { ast_log(LOG_ERROR, "Error invalid config category '%s'.\n", prevcat); goto fail; } } if ((this_host = find_my_host()) == NULL) goto fail; for (i = 0; i < n_linksets; i++) { if (!linksets[i].enabled) continue; linksets[i].dpc = this_host->dpc[linksets[i].lsi]; ast_log(LOG_NOTICE, "Configuring DPC %d for linkset '%s'.\n", linksets[i].dpc, linksets[i].name); } for (i = 0; i < n_linksets; i++) { int any = 0; if (!linksets[i].enabled) continue; for (j = 0; j < linksets[i].n_links; j++) for (k = 0; k < this_host->n_spans; k++) if (this_host->spans[k].link == linksets[i].links[j]) { if (!linksets[i].dpc) { ast_log(LOG_ERROR, "No DPC specified for linkset '%s'.\n", linksets[i].name); goto fail; } any = any || linksets[i].links[j]->enabled; } linksets[i].enabled = any; ast_log(LOG_DEBUG, "Setting linkset %d '%s' enabled %d\n", i, linksets[i].name, any); } if (!this_host->enabled) { ast_log(LOG_ERROR, "Host '%s' not enabled, quitting!\n", this_host->name); goto fail; } if (this_host->default_linkset) { int haslinkset = 0; for (k = 0; k < this_host->n_spans; k++) { if (this_host->spans[k].link->enabled && this_host->spans[k].link->linkset->enabled && (this_host->spans[k].link->linkset == this_host->default_linkset)) haslinkset = 1; } if (!haslinkset) { ast_log(LOG_ERROR, "Default linkset '%s' for host '%s' is not configured for this host!\n", this_host->default_linkset->name, this_host->name); goto fail; } } else { struct linkset* linkset = NULL; for (k = 0; k < this_host->n_spans; k++) { if (this_host->spans[k].link->linkset->enabled) { if (linkset && (linkset != this_host->spans[k].link->linkset)) { ast_log(LOG_ERROR, "Host '%s' has multiple linksets, need to specify a default_linkset!\n", this_host->name); goto fail; } linkset = this_host->spans[k].link->linkset; } } this_host->default_linkset = linkset; } if (make_host_schannels()) goto fail; show_config(); ast_config_destroy(cfg); return 0; fail: ast_config_destroy(cfg); return -1;}static void destroy_linksets(void){ while (n_linksets-- > 0) { free(linksets[n_linksets].name); free(linksets[n_linksets].context); free(linksets[n_linksets].language); free(linksets[n_linksets].combined); }}static void destroy_links(void){ while (n_links-- > 0) { free(links[n_links].name); }}static void destroy_hosts(void){ while (n_hosts-- > 0) { free(hosts[n_hosts].name); }}void destroy_config(void){ destroy_linksets(); destroy_links(); destroy_hosts();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -