⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.c

📁 asterisk 的7号信令处理模块
💻 C
📖 第 1 页 / 共 3 页
字号:
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[100] = {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->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, "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[100] = {0,};      char linkset_name_buf[100];      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;	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) {	  ast_log(LOG_ERROR, "Unknown linkset '%s' for host '%s'", linkset_name_buf, host_name);	  return -1;	}	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) {	  ast_log(LOG_ERROR, "Too many links defined for host '%s' (max %d).\n", host->name, MAX_LINKS_PER_HOST);	  return -1;	}	if(sscanf(p, "%[^:]:%d", linkname_buf, &host->spans[host->n_spans].connector) != 2) {	  ast_log(LOG_DEBUG, "linkname '%s', no %d \n", linkname_buf, host->spans[host->n_spans].connector);	  ast_log(LOG_ERROR, "Invalid link specification '%s' for host '%s'.\n", p, host_name);	  return -1;	}	if ((host->spans[host->n_spans].connector < 1) || (host->spans[host->n_spans].connector > MAX_E1_CONNECTOR_NO)) {	  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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -