static void loadconfigurationfile(void) { char *cat; struct cw_config *cfg; struct cw_variable *v; cfg = cw_config_load(CONF_FILE); if (!cfg) { /* Standard configuration */ enablecdr = 0; return; } cat = cw_category_browse(cfg, NULL); while (cat) { if (!strcasecmp(cat, "general")) { v = cw_variable_browse(cfg, cat); while (v) { if (!strcasecmp(v->name, "enabled")) { enablecdr = cw_true(v->value); } v = v->next; } } /* Next category */ cat = cw_category_browse(cfg, cat); } cw_config_destroy(cfg); }
static int load_config(void) { struct cw_variable *var; struct cw_config *cfg; char *cat; res_snmp_enabled = 0; res_snmp_agentx_subagent = 1; cfg = cw_config_load("res_snmp.conf"); if (!cfg) { cw_log(LOG_WARNING, "Could not load res_snmp.conf\n"); return 0; } cat = cw_category_browse(cfg, NULL); while (cat) { var = cw_variable_browse(cfg, cat); if (strcasecmp(cat, "general") == 0) { while (var) { if (strcasecmp(var->name, "subagent") == 0) { if (cw_true(var->value)) res_snmp_agentx_subagent = 1; else if (cw_false(var->value)) res_snmp_agentx_subagent = 0; else { cw_log(LOG_ERROR, "Value '%s' does not evaluate to true or false.\n", var->value); cw_config_destroy(cfg); return 1; } } else if (strcasecmp(var->name, "enabled") == 0) { res_snmp_enabled = cw_true(var->value); } else { cw_log(LOG_ERROR, "Unrecognized variable '%s' in category '%s'\n", var->name, cat); cw_config_destroy(cfg); return 1; } var = var->next; } } else { cw_log(LOG_ERROR, "Unrecognized category '%s'\n", cat); cw_config_destroy(cfg); return 1; } cat = cw_category_browse(cfg, cat); } cw_config_destroy(cfg); return 1; }
static void parse_config(void) { struct cw_config *cfg; struct cw_variable *var; if ((cfg = cw_config_load("codecs.conf"))) { if ((var = cw_variable_browse(cfg, "plc"))) { while (var) { if (!strcasecmp(var->name, "genericplc")) { useplc = cw_true(var->value) ? 1 : 0; if (option_verbose > 2) cw_verbose(VERBOSE_PREFIX_3 "codec_g722: %susing generic PLC\n", useplc ? "" : "not "); } var = var->next; } } cw_config_destroy(cfg); } }
static int load_config(int reload) { struct cw_config *cfg; struct cw_variable *var; int res = -1; strcpy(format, ""); strcpy(master, ""); if((cfg = cw_config_load("cdr_custom.conf"))) { var = cw_variable_browse(cfg, "mappings"); while(var) { cw_mutex_lock(&lock); if (!cw_strlen_zero(var->name) && !cw_strlen_zero(var->value)) { if (strlen(var->value) > (sizeof(format) - 2)) cw_log(LOG_WARNING, "Format string too long, will be truncated, at line %d\n", var->lineno); strncpy(format, var->value, sizeof(format) - 2); strcat(format,"\n"); snprintf(master, sizeof(master),"%s/%s/%s", cw_config_CW_LOG_DIR, name, var->name); cw_mutex_unlock(&lock); } else cw_log(LOG_NOTICE, "Mapping must have both filename and format at line %d\n", var->lineno); if (var->next) cw_log(LOG_NOTICE, "Sorry, only one mapping is supported at this time, mapping '%s' will be ignored at line %d.\n", var->next->name, var->next->lineno); var = var->next; } cw_config_destroy(cfg); res = 0; } else { if (reload) cw_log(LOG_WARNING, "Failed to reload configuration file.\n"); else cw_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n"); } return res; }
int misdn_cfg_init (int this_max_ports) { char config[] = "misdn.conf"; char *cat, *p; int i; struct cw_config *cfg; struct cw_variable *v; if (!(cfg = CW_LOAD_CFG(config))) { cw_log(LOG_WARNING, "missing file: misdn.conf\n"); return -1; } cw_mutex_init(&config_mutex); misdn_cfg_lock(); if (this_max_ports) { /* this is the first run */ max_ports = this_max_ports; map = (int *)calloc(MISDN_GEN_LAST + 1, sizeof(int)); if (_enum_array_map()) return -1; p = (char *)calloc(1, (max_ports + 1) * sizeof(union misdn_cfg_pt *) + (max_ports + 1) * NUM_PORT_ELEMENTS * sizeof(union misdn_cfg_pt)); port_cfg = (union misdn_cfg_pt **)p; p += (max_ports + 1) * sizeof(union misdn_cfg_pt *); for (i = 0; i <= max_ports; ++i) { port_cfg[i] = (union misdn_cfg_pt *)p; p += NUM_PORT_ELEMENTS * sizeof(union misdn_cfg_pt); } general_cfg = (union misdn_cfg_pt *)calloc(1, sizeof(union misdn_cfg_pt *) * NUM_GEN_ELEMENTS); ptp = (int *)calloc(max_ports + 1, sizeof(int)); } else { /* misdn reload */ _free_port_cfg(); _free_general_cfg(); memset(port_cfg[0], 0, NUM_PORT_ELEMENTS * sizeof(union misdn_cfg_pt) * (max_ports + 1)); memset(general_cfg, 0, sizeof(union misdn_cfg_pt *) * NUM_GEN_ELEMENTS); memset(ptp, 0, sizeof(int) * (max_ports + 1)); } cat = cw_category_browse(cfg, NULL); while(cat) { v = cw_variable_browse(cfg, cat); if (!strcasecmp(cat, "general")) { _build_general_config(v); } else { _build_port_config(v, cat); } cat = cw_category_browse(cfg, cat); } _fill_defaults(); misdn_cfg_unlock(); CW_DESTROY_CFG(cfg); return 0; }
static int do_directory(struct cw_channel *chan, struct cw_config *cfg, char *context, char *dialcontext, char digit, int last) { /* Read in the first three digits.. "digit" is the first digit, already read */ char ext[NUMDIGITS + 1]; char name[80] = ""; struct cw_variable *v; int res; int found=0; int lastuserchoice = 0; char *start, *pos, *conv,*stringp=NULL; if (cw_strlen_zero(context)) { cw_log(LOG_WARNING, "Directory must be called with an argument " "(context in which to interpret extensions)\n"); return -1; } if (digit == '0') { if (!cw_goto_if_exists(chan, chan->context, "o", 1) || (!cw_strlen_zero(chan->proc_context) && !cw_goto_if_exists(chan, chan->proc_context, "o", 1))) { return 0; } else { cw_log(LOG_WARNING, "Can't find extension 'o' in current context. " "Not Exiting the Directory!\n"); res = 0; } } if (digit == '*') { if (!cw_goto_if_exists(chan, chan->context, "a", 1) || (!cw_strlen_zero(chan->proc_context) && !cw_goto_if_exists(chan, chan->proc_context, "a", 1))) { return 0; } else { cw_log(LOG_WARNING, "Can't find extension 'a' in current context. " "Not Exiting the Directory!\n"); res = 0; } } memset(ext, 0, sizeof(ext)); ext[0] = digit; res = 0; if (cw_readstring(chan, ext + 1, NUMDIGITS - 1, 3000, 3000, "#") < 0) res = -1; if (!res) { /* Search for all names which start with those digits */ v = cw_variable_browse(cfg, context); while(v && !res) { /* Find all candidate extensions */ while(v) { /* Find a candidate extension */ start = strdup(v->value); if (start && !strcasestr(start, "hidefromdir=yes")) { stringp=start; strsep(&stringp, ","); pos = strsep(&stringp, ","); if (pos) { cw_copy_string(name, pos, sizeof(name)); /* Grab the last name */ if (last && strrchr(pos,' ')) pos = strrchr(pos, ' ') + 1; conv = convert(pos); if (conv) { if (!strcmp(conv, ext)) { /* Match! */ found++; free(conv); free(start); break; } free(conv); } } free(start); } v = v->next; } if (v) { /* We have a match -- play a greeting if they have it */ res = play_mailbox_owner(chan, context, dialcontext, v->name, name); switch (res) { case -1: /* user pressed '1' but extension does not exist, or * user hungup */ lastuserchoice = 0; break; case '1': /* user pressed '1' and extensions exists; play_mailbox_owner will already have done a goto() on the channel */ lastuserchoice = res; break; case '*': /* user pressed '*' to skip something found */ lastuserchoice = res; res = 0; break; default: break; } v = v->next; } } if (lastuserchoice != '1') { if (found) res = cw_streamfile(chan, "dir-nomore", chan->language); else res = cw_streamfile(chan, "dir-nomatch", chan->language); if (!res) res = 1; return res; } return 0; } return res; }
static int osp_build(struct cw_config *cfg, char *cat) { OSPTCERT TheAuthCert[MAX_CERTS]; unsigned char Reqbuf[4096],LocalBuf[4096],AuthBuf[MAX_CERTS][4096]; struct cw_variable *v; struct osp_provider *osp; int x,length,errorcode=0; int mallocd=0,i; char *cacerts[MAX_CERTS]; const char *servicepoints[MAX_SERVICEPOINTS]; OSPTPRIVATEKEY privatekey; OSPTCERT localcert; OSPTCERT *authCerts[MAX_CERTS]; cw_mutex_lock(&osplock); osp = providers; while(osp) { if (!strcasecmp(osp->name, cat)) break; osp = osp->next; } cw_mutex_unlock(&osplock); if (!osp) { mallocd = 1; osp = malloc(sizeof(struct osp_provider)); if (!osp) { cw_log(LOG_WARNING, "Out of memory!\n"); return -1; } memset(osp, 0, sizeof(struct osp_provider)); osp->handle = -1; } cw_copy_string(osp->name, cat, sizeof(osp->name)); snprintf(osp->localpvtkey, sizeof(osp->localpvtkey) ,"%s/%s-privatekey.pem", cw_config_CW_KEY_DIR, cat); snprintf(osp->localcert, sizeof(osp->localpvtkey), "%s/%s-localcert.pem", cw_config_CW_KEY_DIR, cat); osp->maxconnections=OSP_DEFAULT_MAX_CONNECTIONS; osp->retrydelay = OSP_DEFAULT_RETRY_DELAY; osp->retrylimit = OSP_DEFAULT_RETRY_LIMIT; osp->timeout = OSP_DEFAULT_TIMEOUT; osp->source[0] = '\0'; cw_log(LOG_DEBUG, "Building OSP Provider '%s'\n", cat); v = cw_variable_browse(cfg, cat); while(v) { if (!strcasecmp(v->name, "privatekey")) { if (v->value[0] == '/') cw_copy_string(osp->localpvtkey, v->value, sizeof(osp->localpvtkey)); else snprintf(osp->localpvtkey, sizeof(osp->localpvtkey), "%s/%s", cw_config_CW_KEY_DIR , v->value); } else if (!strcasecmp(v->name, "localcert")) { if (v->value[0] == '/') cw_copy_string(osp->localcert, v->value, sizeof(osp->localcert)); else snprintf(osp->localcert, sizeof(osp->localcert), "%s/%s", cw_config_CW_KEY_DIR, v->value); } else if (!strcasecmp(v->name, "cacert")) { if (osp->cacount < MAX_CERTS) { if (v->value[0] == '/') cw_copy_string(osp->cacerts[osp->cacount], v->value, sizeof(osp->cacerts[0])); else snprintf(osp->cacerts[osp->cacount], sizeof(osp->cacerts[0]), "%s/%s", cw_config_CW_KEY_DIR, v->value); osp->cacount++; } else cw_log(LOG_WARNING, "Too many CA Certificates at line %d\n", v->lineno); } else if (!strcasecmp(v->name, "servicepoint")) { if (osp->spcount < MAX_SERVICEPOINTS) { cw_copy_string(osp->servicepoints[osp->spcount], v->value, sizeof(osp->servicepoints[0])); osp->spcount++; } else cw_log(LOG_WARNING, "Too many Service points at line %d\n", v->lineno); } else if (!strcasecmp(v->name, "maxconnections")) { if ((sscanf(v->value, "%d", &x) == 1) && (x > 0) && (x <= 1000)) { osp->maxconnections = x; } else cw_log(LOG_WARNING, "maxconnections should be an integer from 1 to 1000, not '%s' at line %d\n", v->value, v->lineno); } else if (!strcasecmp(v->name, "retrydelay")) { if ((sscanf(v->value, "%d", &x) == 1) && (x >= 0) && (x <= 10)) { osp->retrydelay = x; } else cw_log(LOG_WARNING, "retrydelay should be an integer from 0 to 10, not '%s' at line %d\n", v->value, v->lineno); } else if (!strcasecmp(v->name, "retrylimit")) { if ((sscanf(v->value, "%d", &x) == 1) && (x >= 0) && (x <= 100)) { osp->retrylimit = x; } else cw_log(LOG_WARNING, "retrylimit should be an integer from 0 to 100, not '%s' at line %d\n", v->value, v->lineno); } else if (!strcasecmp(v->name, "timeout")) { if ((sscanf(v->value, "%d", &x) == 1) && (x >= 200) && (x <= 10000)) { osp->timeout = x; } else cw_log(LOG_WARNING, "timeout should be an integer from 200 to 10000, not '%s' at line %d\n", v->value, v->lineno); } else if (!strcasecmp(v->name, "source")) { cw_copy_string(osp->source, v->value, sizeof(osp->source)); } v = v->next; } if (osp->cacount < 1) { snprintf(osp->cacerts[osp->cacount], sizeof(osp->cacerts[0]), "%s/%s-cacert.pem", cw_config_CW_KEY_DIR, cat); osp->cacount++; } for (x=0;x<osp->cacount;x++) cacerts[x] = osp->cacerts[x]; for (x=0;x<osp->spcount;x++) servicepoints[x] = osp->servicepoints[x]; cw_mutex_lock(&osplock); osp->dead = 0; if (osp->handle > -1) { cw_log(LOG_DEBUG, "Deleting old handle for '%s'\n", osp->name); OSPPProviderDelete(osp->handle, 0); } length = 0; cw_log(LOG_DEBUG, "Loading private key for '%s' (%s)\n", osp->name, osp->localpvtkey); errorcode = loadPemPrivateKey(osp->localpvtkey,Reqbuf,&length); if (errorcode == 0) { privatekey.PrivateKeyData = Reqbuf; privatekey.PrivateKeyLength = length; } else { return -1; } length = 0; cw_log(LOG_DEBUG, "Loading local cert for '%s' (%s)\n", osp->name, osp->localcert); errorcode = loadPemCert(osp->localcert,LocalBuf,&length); if (errorcode == 0) { localcert.CertData = LocalBuf; localcert.CertDataLength = length; } else { return -1; } for (i=0;i<osp->cacount;i++) { length = 0; cw_log(LOG_DEBUG, "Loading CA cert %d for '%s' (%s)\n", i + 1, osp->name, osp->cacerts[i]); errorcode = loadPemCert(osp->cacerts[i],AuthBuf[i],&length); if (errorcode == 0) { TheAuthCert[i].CertData = AuthBuf[i]; TheAuthCert[i].CertDataLength = length; authCerts[i] = &(TheAuthCert[i]); } else { return -1; } } cw_log(LOG_DEBUG, "Creating provider handle for '%s'\n", osp->name); cw_log(LOG_DEBUG, "Service point '%s %d'\n", servicepoints[0], osp->spcount); if (OSPPProviderNew(osp->spcount, servicepoints, NULL, "localhost", &privatekey, &localcert, osp->cacount, (const OSPTCERT **)authCerts, 1, 300, osp->maxconnections, 1, osp->retrydelay, osp->retrylimit, osp->timeout, "", "", &osp->handle)) { cw_log(LOG_WARNING, "Unable to initialize provider '%s'\n", cat); osp->dead = 1; } if (mallocd) { osp->next = providers; providers = osp; } cw_mutex_unlock(&osplock); return 0; }