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 int action_setcdruserfield(struct mansession *s, struct message *m) { struct cw_channel *c = NULL; char *userfield = astman_get_header(m, "UserField"); char *channel = astman_get_header(m, "Channel"); char *append = astman_get_header(m, "Append"); if (cw_strlen_zero(channel)) { astman_send_error(s, m, "No Channel specified"); return 0; } if (cw_strlen_zero(userfield)) { astman_send_error(s, m, "No UserField specified"); return 0; } c = cw_get_channel_by_name_locked(channel); if (!c) { astman_send_error(s, m, "No such channel"); return 0; } if (cw_true(append)) cw_cdr_appenduserfield(c, userfield); else cw_cdr_setuserfield(c, userfield); cw_mutex_unlock(&c->lock); astman_send_ack(s, m, "CDR Userfield Set"); return 0; }
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 config_load(void) { struct cw_config *cfg; char *cat; struct osp_provider *osp, *prev = NULL, *next; cw_mutex_lock(&osplock); osp = providers; while(osp) { osp->dead = 1; osp = osp->next; } cw_mutex_unlock(&osplock); cfg = cw_config_load("osp.conf"); if (cfg) { if (!initialized) { cat = cw_variable_retrieve(cfg, "general", "accelerate"); if (cat && cw_true(cat)) if (OSPPInit(1)) { cw_log(LOG_WARNING, "Failed to enable hardware accelleration, falling back to software mode\n"); OSPPInit(0); } else hardware = 1; else OSPPInit(0); initialized = 1; } cat = cw_variable_retrieve(cfg, "general", "tokenformat"); if (cat) { if ((sscanf(cat, "%d", &tokenformat) != 1) || (tokenformat < TOKEN_ALGO_SIGNED) || (tokenformat > TOKEN_ALGO_BOTH)) { tokenformat = TOKEN_ALGO_SIGNED; cw_log(LOG_WARNING, "tokenformat should be an integer from 0 to 2, not '%s'\n", cat); } } cat = cw_category_browse(cfg, NULL); while(cat) { if (strcasecmp(cat, "general")) osp_build(cfg, cat); cat = cw_category_browse(cfg, cat); } cw_config_destroy(cfg); } else cw_log(LOG_NOTICE, "No OSP configuration found. OSP support disabled\n"); cw_mutex_lock(&osplock); osp = providers; while(osp) { next = osp->next; if (osp->dead) { if (prev) prev->next = next; else providers = next; /* XXX Cleanup OSP structure first XXX */ free(osp); } else prev = osp; osp = next; } cw_mutex_unlock(&osplock); return 0; }
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 execif_exec(struct cw_channel *chan, int argc, char **argv) { int res=0; struct localuser *u; struct cw_app *app = NULL; if (argc < 2 || !argv[0][0] || !argv[1][0]) { cw_log(LOG_ERROR, "Syntax: %s\n", execif_syntax); return -1; } LOCAL_USER_ADD(u); if (cw_true(argv[0])) { if ((app = pbx_findapp(argv[1]))) { res = pbx_exec_argv(chan, app, argc - 2, argv + 2); } else { cw_log(LOG_WARNING, "Count not find application! (%s)\n", argv[1]); res = -1; } } ALL_DONE(u,res); }
static char *builtin_function_if(struct cw_channel *chan, int argc, char **argv, char *buf, size_t len) { char *s, *q, **a; int i, n, l, first; static int deprecation_warning = 0; if (!deprecation_warning) { cw_log(LOG_WARNING, "IF(... ? ... : ...) is deprecated, please use $[ ... ? ... :: ... ] instead.\n"); deprecation_warning = 1; } /* First argument is "<condition ? ..." */ if (argc < 1 || !(s = strchr(argv[0], '?'))) { cw_log(LOG_ERROR, "Syntax: %s\n", if_func_syntax); return NULL; } /* Trim trailing space from the condition */ q = s; do { *(q--) = '\0'; } while (q >= argv[0] && isspace(*q)); do { *(s++) = '\0'; } while (isspace(*s)); n = 0; if (cw_true(argv[0])) { /* True: we want everything between '?' and ':' */ argv[0] = s; a = argv; for (i = 0; i < argc; i++) { if ((s = strchr(argv[i], ':'))) { do { *(s--) = '\0'; } while (s >= argv[i] && isspace(*s)); n = i + 1; break; } } } else { /* False: we want everything after ':' (if anything) */ argv[0] = s; for (i = 0; i < argc; i++) { if ((s = strchr(argv[i], ':'))) { do { *(s++) = '\0'; } while (isspace(*s)); argv[i] = s; a = argv + i; n = argc - i; break; } } /* No ": ..." so we just drop through */ } first = 1; len--; /* one for the terminating null */ q = buf; for (i = 0; len && i < n; i++) { if (!first) { *(q++) = ','; len--; } else first = 0; l = strlen(a[i]); if (l > len) l = len; memcpy(q, a[i], l); q += l; len -= l; } *q = '\0'; return buf; }
static int _while_exec(struct cw_channel *chan, int argc, char **argv, int end) { int res=0; struct localuser *u; char *while_pri = NULL; char *goto_str = NULL, *my_name = NULL; char *label = NULL; char varname[VAR_SIZE], end_varname[VAR_SIZE]; const char *prefix = "WHILE"; size_t size=0; int used_index_i = -1, x=0; char used_index[VAR_SIZE] = "0", new_index[VAR_SIZE] = "0"; if (!end && argc != 1) { cw_log(LOG_ERROR, "Syntax: %s\n", while_syntax); return -1; } if (!chan) { /* huh ? */ return -1; } LOCAL_USER_ADD(u); /* dont want run away loops if the chan isn't even up this is up for debate since it slows things down a tad ...... */ if (cw_waitfordigit(chan,1) < 0) ALL_DONE(u,-1); for (x=0;;x++) { if (get_index(chan, prefix, x)) { used_index_i = x; } else break; } snprintf(used_index, VAR_SIZE, "%d", used_index_i); snprintf(new_index, VAR_SIZE, "%d", used_index_i + 1); size = strlen(chan->context) + strlen(chan->exten) + 32; my_name = alloca(size); snprintf(my_name, size, "%s_%s_%d", chan->context, chan->exten, chan->priority); if (cw_strlen_zero(label)) { if (end) label = used_index; else if (!(label = pbx_builtin_getvar_helper(chan, my_name))) { label = new_index; pbx_builtin_setvar_helper(chan, my_name, label); } } snprintf(varname, VAR_SIZE, "%s_%s", prefix, label); while_pri = pbx_builtin_getvar_helper(chan, varname); if ((while_pri = pbx_builtin_getvar_helper(chan, varname)) && !end) { snprintf(end_varname, VAR_SIZE, "END_%s", varname); } if (!end && !cw_true(argv[0])) { /* Condition Met (clean up helper vars) */ pbx_builtin_setvar_helper(chan, varname, NULL); pbx_builtin_setvar_helper(chan, my_name, NULL); snprintf(end_varname, VAR_SIZE, "END_%s", varname); if ((goto_str=pbx_builtin_getvar_helper(chan, end_varname))) { pbx_builtin_setvar_helper(chan, end_varname, NULL); cw_parseable_goto(chan, goto_str); } else { int pri = find_matching_endwhile(chan); if (pri > 0) { if (option_verbose > 2) cw_verbose(VERBOSE_PREFIX_3 "Jumping to priority %d\n", pri); chan->priority = pri; } else { cw_log(LOG_WARNING, "Couldn't find matching EndWhile? (While at %s@%s priority %d)\n", chan->context, chan->exten, chan->priority); } } ALL_DONE(u,res); } if (!end && !while_pri) { size = strlen(chan->context) + strlen(chan->exten) + 32; goto_str = alloca(size); snprintf(goto_str, size, "%s,%s,%d", chan->context, chan->exten, chan->priority); pbx_builtin_setvar_helper(chan, varname, goto_str); } else if (end && while_pri) { /* END of loop */ snprintf(end_varname, VAR_SIZE, "END_%s", varname); if (! pbx_builtin_getvar_helper(chan, end_varname)) { size = strlen(chan->context) + strlen(chan->exten) + 32; goto_str = alloca(size); snprintf(goto_str, size, "%s,%s,%d", chan->context, chan->exten, chan->priority+1); pbx_builtin_setvar_helper(chan, end_varname, goto_str); } cw_parseable_goto(chan, while_pri); } ALL_DONE(u, res); }
static int _parse (union misdn_cfg_pt *dest, char *value, enum misdn_cfg_type type, int boolint_def) { int re = 0; int len, tmp; char *valtmp; switch (type) { case MISDN_CTYPE_STR: if ((len = strlen(value))) { dest->str = (char *)malloc((len + 1) * sizeof(char)); strncpy(dest->str, value, len); dest->str[len] = 0; } else { dest->str = (char *)malloc( sizeof(char)); dest->str[0] = 0; } break; case MISDN_CTYPE_INT: { char *pat; if (strchr(value,'x')) pat="%x"; else pat="%d"; if (sscanf(value, pat, &tmp)) { dest->num = (int *)malloc(sizeof(int)); memcpy(dest->num, &tmp, sizeof(int)); } else re = -1; } break; case MISDN_CTYPE_BOOL: dest->num = (int *)malloc(sizeof(int)); *(dest->num) = (cw_true(value) ? 1 : 0); break; case MISDN_CTYPE_BOOLINT: dest->num = (int *)malloc(sizeof(int)); if (sscanf(value, "%d", &tmp)) { memcpy(dest->num, &tmp, sizeof(int)); } else { *(dest->num) = (cw_true(value) ? boolint_def : 0); } break; case MISDN_CTYPE_MSNLIST: for (valtmp = strsep(&value, ","); valtmp; valtmp = strsep(&value, ",")) { if ((len = strlen(valtmp))) { struct msn_list *ml = (struct msn_list *)malloc(sizeof(struct msn_list)); ml->msn = (char *)calloc(len+1, sizeof(char)); strncpy(ml->msn, valtmp, len); ml->next = dest->ml; dest->ml = ml; } } break; case MISDN_CTYPE_ASTGROUP: dest->grp = (cw_group_t *)malloc(sizeof(cw_group_t)); *(dest->grp) = cw_get_group(value); break; } return re; }