config.c
来自「asterisk1.4.6版本下 7#信令驱动 源码」· C语言 代码 · 共 1,121 行 · 第 1/3 页
C
1,121 行
if (!has_subservice) {
ast_log(LOG_ERROR, "Missing subservice entry for linkset '%s'\n", linkset_name);
return -1;
}
linkset->context = strdup(context);
linkset->language = strdup(language);
if (!has_context)
ast_log(LOG_NOTICE, "Using default context '%s' for linkset '%s'\n", linkset->context, linkset_name);
if (!has_language)
ast_log(LOG_NOTICE, "Using default language '%s' for linkset '%s'\n", linkset->language, linkset_name);
linkset->name = strdup(linkset_name);
linkset->n_links = 0;
linkset->lsi = n_linksets;
linkset->init_grs_done = 0;
linkset->first_cic = MAX_CIC;
linkset->last_cic = 0;
linkset->init_grs_done = 0;
linkset->idle_list = NULL;
for (i = 0; i < MAX_CIC; i++)
linkset->cic_list[i] = NULL;
n_linksets++;
return 0;
}
static int load_config_link(struct ast_config *cfg, char* cat)
{
struct ast_variable *v;
char *p;
char *spec;
char *link_name = &cat[strlen("link-")];
char chan_spec_buf[1000] = {0,};
struct linkset* linkset = NULL;
struct link* link = &links[n_links];
int lastcic = 0;
int has_linkset = 0, has_enabled = 0, has_firstcic = 0, has_channels = 0, has_schannel = 0;
if (lookup_link(link_name)) {
ast_log(LOG_ERROR, "Links '%s' defined twice.\n", link_name);
return -1;
}
if (n_links == MAX_LINKS) {
ast_log(LOG_ERROR, "Too many links defined while parsing config for link '%s' (max %d).\n", link_name, MAX_LINKS);
return -1;
}
link->send_sltm = 1;
link->auto_block = 0;
/* Echo cancellation default values */
link->echocancel = EC_DISABLED;
link->echocan_taps = 128; /* echo cancellation taps, 128 default */
link->echocan_train = 300; /* echo cancellation training, 300ms default */
link->mtp = NULL;
link->initial_alignment = 1;
link->dpc = 0;
link->rxgain = 0.0;
link->txgain = 0.0;
*link->mtp3server_host = 0;
*link->mtp3server_port = 0;
link->mtp3fd = -1;
v = ast_variable_browse(cfg, cat);
while(v != NULL) {
if(0 == strcasecmp(v->name, "linkset")) {
linkset = lookup_linkset(v->value);
if (!linkset) {
ast_log(LOG_ERROR, "Linkset '%s' not found while parsing link '%s'.\n", v->value, link_name);
return -1;
}
has_linkset = 1;
} else if(0 == strcasecmp(v->name, "enabled")) {
if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) {
ast_log(LOG_ERROR, "Invalid value '%s' for enabled entry for link '%s'.\n", v->value, link_name);
return -1;
}
link->enabled = strcasecmp(v->value, "yes") == 0;
has_enabled = 1;
} else if(0 == strcasecmp(v->name, "sltm")) {
if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) {
ast_log(LOG_ERROR, "Invalid value '%s' for sltm entry for link '%s'.\n", v->value, link_name);
return -1;
}
link->send_sltm = strcasecmp(v->value, "yes") == 0;
} else if(0 == strcasecmp(v->name, "auto_block")) {
if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) {
ast_log(LOG_ERROR, "Invalid value '%s' for auto_block entry for link '%s'.\n", v->value, link_name);
return -1;
}
link->auto_block = strcasecmp(v->value, "yes") == 0;
} else if(0 == strcasecmp(v->name, "firstcic")) {
if(sscanf(v->value, "%d", &link->first_cic) != 1) {
ast_log(LOG_ERROR, "Invalid firstcic entry '%s' for link '%s'.\n", v->value, link_name);
return -1;
}
has_firstcic = 1;
} else if(0 == strcasecmp(v->name, "channels")) {
link->channelmask = 0;
ast_copy_string(chan_spec_buf, v->value, sizeof(chan_spec_buf));
spec = &chan_spec_buf[0];
p = strsep(&spec, ",");
while(p && *p) {
int i, first, last;
if(sscanf(p, "%d-%d", &first, &last) != 2 ||
first < 0 || first > last || last > 31) {
ast_log(LOG_DEBUG, "Channel range '%s' is %d %d \n", p, first,last);
ast_log(LOG_ERROR, "Illegal channel range '%s' for "
"channel specification for link '%s'.\n", p, link_name);
return -1;
}
for (i = first; i <= last; i++)
link->channelmask |= 1 << (i-1);
if (last > lastcic)
lastcic = last;
p = strsep(&spec, ",");
}
has_channels = 1;
} else if(0 == strcasecmp(v->name, "schannel")) {
link->schannel = -1;
link->remote = 0;
if (strcmp(v->value, "")) {
char host[128];
char port[128];
if(sscanf(v->value, "%d,%[^:]:%s", &link->schannel, host, port) == 3) {
if (!is_mtp3d)
link->remote = 1;
strcpy(link->mtp3server_host, host);
strcpy(link->mtp3server_port, port);
} else if(sscanf(v->value, "%d", &link->schannel) != 1) {
ast_log(LOG_ERROR, "Invalid schannel entry '%s' for link '%s'.\n", v->value, link_name);
return -1;
}
}
has_schannel = 1;
} else if(0 == strcasecmp(v->name, "echocancel")) {
if (strcasecmp(v->value, "no") == 0) {
link->echocancel = EC_DISABLED;
} else if (strcasecmp(v->value, "31speech") == 0) {
link->echocancel = EC_31SPEECH;
} else if (strcasecmp(v->value, "allways") == 0) {
link->echocancel = EC_ALLWAYS;
} else {
ast_log(LOG_ERROR, "Invalid value '%s' for echocancel entry for link '%s'.\n", v->value, link_name);
return -1;
}
} else if(0 == strcasecmp(v->name, "echocan_train")) {
if(sscanf(v->value, "%d", &link->echocan_train) != 1 ||
link->echocan_train < 10 || link->echocan_train > 1000)
{
ast_log(LOG_ERROR, "Invalid value '%s' for echocan_train entry for "
"link '%s'. should be between 10 and 1000\n",
v->value, link_name);
return -1;
}
} else if(0 == strcasecmp(v->name, "echocan_taps")) {
if(!(sscanf(v->value, "%d", &link->echocan_taps) == 1 &&
(link->echocan_taps == 32 || link->echocan_taps == 64 ||
link->echocan_taps == 128 || link->echocan_taps == 256)))
{
ast_log(LOG_ERROR, "Invalid value '%s' for echocan_taps entry for "
"link '%s'. should be 32, 64, 128 or 256\n",
v->value, link_name);
return -1;
}
} else if(0 == strcasecmp(v->name, "rxgain")) {
if (sscanf(v->value, "%f", &link->rxgain) != 1) {
ast_log(LOG_WARNING, "Invalid rxgain: %s\n", v->value);
link->rxgain = 0.0;
}
} else if(0 == strcasecmp(v->name, "txgain")) {
if (sscanf(v->value, "%f", &link->txgain) != 1) {
ast_log(LOG_WARNING, "Invalid txgain: %s\n", v->value);
link->txgain = 0.0;
}
} else if(0 == strcasecmp(v->name, "initial_alignment")) {
if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) {
ast_log(LOG_ERROR, "Invalid value '%s' for initial_alignment entry for link '%s'.\n", v->value, link_name);
return -1;
}
link->initial_alignment = strcasecmp(v->value, "yes") == 0;
} else {
ast_log(LOG_ERROR, "Unknown config option '%s', aborting.\n", v->name);
return -1;
}
v = v->next;
}
if (!has_linkset) {
ast_log(LOG_ERROR, "Missing linkset entry for link '%s'.\n", link_name);
return -1;
}
if (!has_enabled) {
ast_log(LOG_ERROR, "Missing enabled entry for link '%s'.\n", link_name);
return -1;
}
if (!has_firstcic) {
ast_log(LOG_ERROR, "Missing firstcic entry for link '%s'.\n", link_name);
return -1;
}
if (!has_channels) {
ast_log(LOG_ERROR, "Missing channels entry for link '%s'.\n", link_name);
return -1;
}
if (!has_schannel) {
ast_log(LOG_ERROR, "Missing schannel entry for link '%s'.\n", link_name);
return -1;
}
if (linkset->n_links == MAX_LINKS_PER_LINKSET) {
ast_log(LOG_ERROR, "Too many links defined for linkset '%s' for link '%s' (max %d).\n", linkset->name, link_name, MAX_LINKS_PER_LINKSET);
return -1;
}
link->name = strdup(link_name);
link->sls = linkset->n_schannels;
link->linkset = linkset;
link->on_host = NULL;
link->receiver = NULL;
link->first_zapid = -1;
if (link->enabled) {
if (linkset->enabled) {
linkset->links[linkset->n_links++] = link;
if (link->schannel != -1) {
linkset->schannels[linkset->n_schannels++] = link;
}
}
else {
ast_log(LOG_NOTICE, "Disabling link '%s' on disabled linkset '%s'\n", link->name, linkset->name);
link->enabled = 0;
}
}
ast_log(LOG_NOTICE, "%s link '%s' on linkset '%s', firstcic=%d\n", link->enabled ? "Configured" : "Ignoring disabled", link->name, linkset->name, link->first_cic);
if (linkset->first_cic > link->first_cic)
linkset->first_cic = link->first_cic;
lastcic = link->first_cic + lastcic -1;
if (linkset->last_cic < lastcic)
linkset->last_cic = lastcic;
link->linkix = n_links;
n_links++;
return 0;
}
static int load_config_host(struct ast_config *cfg, char* cat)
{
struct ast_variable *v;
char *p;
char *spec;
char *host_name = &cat[strlen("host-")];
struct host* host = &hosts[n_hosts];
char links_spec_buf[1000] = {0,};
int has_opc = 0, has_dpc = 0, has_links = 0, has_enabled = 0, has_if = 0;
if (n_hosts == MAX_HOSTS) {
ast_log(LOG_ERROR, "Too many hosts defined while parsing config for host '%s' (max %d).\n", host_name, MAX_HOSTS);
return -1;
}
memset(host->dpc, 0, sizeof(host->dpc));
memset(host->receivers, 0, sizeof(host->receivers));
host->name = strdup(host_name);
host->host_ix = n_hosts;
host->default_linkset = NULL;
host->n_schannels = 0;
host->n_peers = 0;
host->ssn = 0;
host->n_routes = 0;
memset(&host->global_title, 0, sizeof(host->global_title));
v = ast_variable_browse(cfg, cat);
while(v != NULL) {
if(0 == strcasecmp(v->name, "opc")) {
char *endptr;
host->opc = strtoul(v->value, &endptr, 0);
if(endptr == v->value || *endptr != '\0') {
ast_log(LOG_ERROR, "Error: Invalid number '%s' for "
"config option own_pc.\n", v->value);
return -1;
}
has_opc = 1;
} else if(0 == strcasecmp(v->name, "dpc")) {
char dpc_spec_buf[1000] = {0,};
char linkset_name_buf[1000];
char dpc_buf[20];
ast_copy_string(dpc_spec_buf, v->value, sizeof(dpc_spec_buf));
spec = &dpc_spec_buf[0];
p = strsep(&spec, ",");
while(p && *p) {
int dpc;
struct linkset* linkset;
struct link* link;
if(sscanf(p, "%[^:]:%s", linkset_name_buf, dpc_buf) != 2) {
ast_log(LOG_ERROR, "Invalid DPC specification '%s' for host '%s'", p, host_name);
return -1;
}
if (strncmp(v->value, "0x", 2) == 0)
dpc = strtol(dpc_buf+2, NULL, 16);
else
dpc = strtol(dpc_buf, NULL, 0);
if (!dpc) {
ast_log(LOG_ERROR, "Invalid DPC value '%s' for linkset '%s' for host '%s'", dpc_buf, linkset_name_buf, host_name);
return -1;
}
linkset = lookup_linkset(linkset_name_buf);
if (!linkset) {
link = lookup_link(linkset_name_buf);
if (!link) {
ast_log(LOG_ERROR, "Unknown link/linkset '%s' for host '%s'", linkset_name_buf, host_name);
return -1;
}
link->dpc = dpc;
}
else
host->dpc[linkset->lsi] = dpc;
p = strsep(&spec, ",");
}
has_dpc = 1;
} else if(0 == strcasecmp(v->name, "peers")) {
char peer_spec_buf[500] = {0,};
ast_copy_string(peer_spec_buf, v->value, sizeof(peer_spec_buf));
ast_log(LOG_DEBUG, "peers '%s' \n", peer_spec_buf);
spec = &peer_spec_buf[0];
p = strsep(&spec, ",");
while(p && *p) {
char link_buf[100];
char host_buf[100];
struct link* link;
if (host->n_peers == MAX_LINKS_PER_HOST) {
ast_log(LOG_ERROR, "Too many routes defined for host '%s' (max %d).\n", host->name, MAX_LINKS_PER_HOST);
return -1;
}
while ((*p == ' ') || (*p == '\t'))
p++;
if(sscanf(p, "%[^:]:%s", link_buf, host_buf) != 2) {
ast_log(LOG_ERROR, "Invalid peer specification '%s' for host '%s'.\n", p, host_name);
return -1;
}
link = lookup_link(link_buf);
if (!link) {
ast_log(LOG_ERROR, "Unknown link '%s' for peers '%s' for host '%s'", link_buf, p, host_name);
return -1;
}
host->peers[host->n_peers].link = link;
host->peers[host->n_peers].hostname = strdup(host_buf);
host->n_peers++;
p = strsep(&spec, ",");
}
} else if(0 == strcasecmp(v->name, "enabled")) {
if ((strcasecmp(v->value, "yes") != 0) && (strcasecmp(v->value, "no") != 0)) {
ast_log(LOG_ERROR, "Invalid value '%s' for enabled entry for host '%s'.\n", v->value, host_name);
return -1;
}
host->enabled = strcasecmp(v->value, "yes") == 0;
has_enabled = 1;
} else if(0 == strcasecmp(v->name, "default_linkset")) {
host->default_linkset = lookup_linkset(v->value);
if (!host->default_linkset) {
ast_log(LOG_ERROR, "Unknown default_linkset '%s' for host '%s'.\n", v->value, host_name);
return -1;
}
} else if(0 == strcasecmp(v->name, "links")) {
ast_copy_string(links_spec_buf, v->value, sizeof(links_spec_buf));
ast_log(LOG_DEBUG, "links '%s' \n", links_spec_buf);
spec = &links_spec_buf[0];
p = strsep(&spec, ",");
while(p && *p) {
char linkname_buf[100];
int i;
if (host->n_spans == MAX_SPANS_PER_HOST) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?