static void loadconfigurationfile(void) { char *cat; struct ast_config *cfg; struct ast_variable *v; cfg = ast_load(CONF_FILE); if (!cfg) { /* Standard configuration */ enablecdr = 0; return; } cat = ast_category_browse(cfg, NULL); while (cat) { if (!strcasecmp(cat, "general")) { v = ast_variable_browse(cfg, cat); while (v) { if (!strcasecmp(v->name, "enabled")) { enablecdr = ast_true(v->value); } v = v->next; } } /* Next category */ cat = ast_category_browse(cfg, cat); } ast_destroy(cfg); }
static void adsi_load(void) { int x; struct ast_config *conf; struct ast_variable *v; char *name, *sname; init_state(); conf = ast_load("adsi.conf"); if (conf) { x=0; v = ast_variable_browse(conf, "intro"); while(v) { if (!strcasecmp(v->name, "alignment")) alignment = str2align(v->value); else if (!strcasecmp(v->name, "greeting")) { if (x < ADSI_MAX_INTRO) { aligns[x] = alignment; strncpy(intro[x], v->value, sizeof(intro[x]) - 1); intro[x][sizeof(intro[x]) - 1] = '\0'; x++; } } else if (!strcasecmp(v->name, "maxretries")) { if (atoi(v->value) > 0) maxretries = atoi(v->value); } v = v->next; } v = ast_variable_browse(conf, "speeddial"); if (x) total = x; x = 0; while(v) { char *stringp=NULL; stringp=v->value; name = strsep(&stringp, ","); sname = strsep(&stringp, ","); if (!sname) sname = name; if (x < ADSI_MAX_SPEED_DIAL) { /* Up to 20 digits */ strncpy(speeddial[x][0], v->name, sizeof(speeddial[x][0]) - 1); strncpy(speeddial[x][1], name, 18); strncpy(speeddial[x][2], sname, 7); x++; } v = v->next; } if (x) speeds = x; ast_destroy(conf); } }
void ast_decl_destroy(AST_Decl** node) { if ( node && *node) { /* destroy the stored default value ast node */ ast_destroy(&(*node)->value); /* release the allocated memory */ mem_free((*node)->name); mem_free(*node); *node = NULL; } } /* end of : void
void cons_exec(const char *line,bool isFile) { cons_initParsing(line,isFile); int res = yyparse(); if(res == 0) { bool finished = true; jmp_buf env; int ex = setjmp(env); if(ex == EX_NONE) { ex_push(&env); eval_get(execEnvs[curExecEnv].tree,0,&finished); } // if eval_get causes an exception, we get here and clean up ast_destroy(execEnvs[curExecEnv].tree); ex_pop(); } // free resources yylex_destroy(); cons_finishParsing(); }
/*--- conf_exec: The meetme() application */ static int conf_exec(struct ast_channel *chan, void *data) { int res=-1; struct localuser *u; char confno[AST_MAX_EXTENSION] = ""; int allowretry = 0; int retrycnt = 0; struct ast_conference *cnf; int confflags = 0; int dynamic = 0; int empty = 0, empty_no_pin = 0; char *notdata, *info, *inflags = NULL, *inpin = NULL, the_pin[AST_MAX_EXTENSION] = ""; if (!data || ast_strlen_zero(data)) { allowretry = 1; notdata = ""; } else { notdata = data; } LOCAL_USER_ADD(u); if (chan->_state != AST_STATE_UP) ast_answer(chan); info = ast_strdupa((char *)notdata); if (info) { char *tmp = strsep(&info, "|"); strncpy(confno, tmp, sizeof(confno) - 1); if (ast_strlen_zero(confno)) { allowretry = 1; } } if (info) inflags = strsep(&info, "|"); if (info) inpin = strsep(&info, "|"); if (inpin) strncpy(the_pin, inpin, sizeof(the_pin) - 1); if (inflags) { if (strchr(inflags, 'a')) confflags |= CONFFLAG_ADMIN; if (strchr(inflags, 'm')) confflags |= CONFFLAG_MONITOR; if (strchr(inflags, 'p')) confflags |= CONFFLAG_POUNDEXIT; if (strchr(inflags, 's')) confflags |= CONFFLAG_STARMENU; if (strchr(inflags, 't')) confflags |= CONFFLAG_TALKER; if (strchr(inflags, 'q')) confflags |= CONFFLAG_QUIET; if (strchr(inflags, 'M')) confflags |= CONFFLAG_MOH; if (strchr(inflags, 'x')) confflags |= CONFFLAG_MARKEDEXIT; if (strchr(inflags, 'X')) confflags |= CONFFLAG_EXIT_CONTEXT; if (strchr(inflags, 'A')) confflags |= CONFFLAG_MARKEDUSER; if (strchr(inflags, 'b')) confflags |= CONFFLAG_AGI; if (strchr(inflags, 'w')) confflags |= CONFFLAG_WAITMARKED; if (strchr(inflags, 'd')) dynamic = 1; if (strchr(inflags, 'D')) { dynamic = 1; if (! inpin) { strncpy(the_pin, "q", sizeof(the_pin) - 1); } } if (strchr(inflags, 'e')) empty = 1; if (strchr(inflags, 'E')) { empty = 1; empty_no_pin = 1; } } do { if (retrycnt > 3) allowretry = 0; if (empty) { int i, map[1024]; struct ast_config *cfg; struct ast_variable *var; int confno_int; memset(map, 0, sizeof(map)); ast_mutex_lock(&conflock); cnf = confs; while (cnf) { if (sscanf(cnf->confno, "%d", &confno_int) == 1) { /* Disqualify in use conference */ if (confno_int >= 0 && confno_int < 1024) map[confno_int]++; } cnf = cnf->next; } ast_mutex_unlock(&conflock); /* We only need to load the config file for static and empty_no_pin (otherwise we don't care) */ if ((empty_no_pin) || (!dynamic)) { cfg = ast_load("meetme.conf"); if (cfg) { var = ast_variable_browse(cfg, "rooms"); while(var) { if (!strcasecmp(var->name, "conf")) { char *stringp = ast_strdupa(var->value); if (stringp) { char *confno_tmp = strsep(&stringp, "|,"); int found = 0; if (sscanf(confno_tmp, "%d", &confno_int) == 1) { if ((confno_int >= 0) && (confno_int < 1024)) { if (stringp && empty_no_pin) { map[confno_int]++; } } } if (! dynamic) { /* For static: run through the list and see if this conference is empty */ ast_mutex_lock(&conflock); cnf = confs; while (cnf) { if (!strcmp(confno_tmp, cnf->confno)) { /* The conference exists, therefore it's not empty */ found = 1; break; } cnf = cnf->next; } ast_mutex_unlock(&conflock); if (!found) { /* At this point, we have a confno_tmp (static conference) that is empty */ if ((empty_no_pin && ((!stringp) || (stringp && (stringp[0] == '\0')))) || (!empty_no_pin)) { /* Case 1: empty_no_pin and pin is nonexistant (NULL) * Case 2: empty_no_pin and pin is blank (but not NULL) * Case 3: not empty_no_pin */ strncpy(confno, confno_tmp, sizeof(confno) - 1); break; /* XXX the map is not complete (but we do have a confno) */ } } } } else { ast_log(LOG_ERROR, "Out of memory\n"); } } var = var->next; } ast_destroy(cfg); } } /* Select first conference number not in use */ if (ast_strlen_zero(confno) && dynamic) { for (i=0;i<1024;i++) { if (!map[i]) { snprintf(confno, sizeof(confno), "%d", i); break; } } } /* Not found? */ if (ast_strlen_zero(confno)) { res = ast_streamfile(chan, "conf-noempty", chan->language); if (!res) ast_waitstream(chan, ""); } else { if (sscanf(confno, "%d", &confno_int) == 1) { res = ast_streamfile(chan, "conf-enteringno", chan->language); if (!res) { ast_waitstream(chan, ""); res = ast_say_digits(chan, confno_int, "", chan->language); } } else { ast_log(LOG_ERROR, "Could not scan confno '%s'\n", confno); } } } while (allowretry && (ast_strlen_zero(confno)) && (++retrycnt < 4)) { /* Prompt user for conference number */ res = ast_app_getdata(chan, "conf-getconfno", confno, sizeof(confno) - 1, 0); if (res < 0) { /* Don't try to validate when we catch an error */ confno[0] = '\0'; allowretry = 0; break; } } if (!ast_strlen_zero(confno)) { /* Check the validity of the conference */ cnf = find_conf(chan, confno, 1, dynamic, the_pin); if (!cnf) { res = ast_streamfile(chan, "conf-invalid", chan->language); if (!res) ast_waitstream(chan, ""); res = -1; if (allowretry) confno[0] = '\0'; } else { if (!ast_strlen_zero(cnf->pin)) { char pin[AST_MAX_EXTENSION]=""; int j; /* Allow the pin to be retried up to 3 times */ for (j=0; j<3; j++) { if (*the_pin) { strncpy(pin, the_pin, sizeof(pin) - 1); res = 0; } else { /* Prompt user for pin if pin is required */ res = ast_app_getdata(chan, "conf-getpin", pin + strlen(pin), sizeof(pin) - 1 - strlen(pin), 0); } if (res >= 0) { if (!strcasecmp(pin, cnf->pin)) { /* Pin correct */ allowretry = 0; /* Run the conference */ res = conf_run(chan, cnf, confflags); break; } else { /* Pin invalid */ res = ast_streamfile(chan, "conf-invalidpin", chan->language); if (!res) ast_waitstream(chan, AST_DIGIT_ANY); if (res < 0) break; pin[0] = res; pin[1] = '\0'; res = -1; if (allowretry) confno[0] = '\0'; } } else { res = -1; allowretry = 0; break; } /* Don't retry pin with a static pin */ if (*the_pin) { break; } } } else { /* No pin required */ allowretry = 0; /* Run the conference */ res = conf_run(chan, cnf, confflags); } } } } while (allowretry); /* Do the conference */ LOCAL_USER_REMOVE(u); return res; }
static struct ast_conference *find_conf(struct ast_channel *chan, char *confno, int make, int dynamic, char *dynamic_pin) { struct ast_config *cfg; struct ast_variable *var; struct ast_conference *cnf; /* Check first in the conference list */ ast_mutex_lock(&conflock); cnf = confs; while (cnf) { if (!strcmp(confno, cnf->confno)) break; cnf = cnf->next; } ast_mutex_unlock(&conflock); if (!cnf) { if (dynamic) { /* No need to parse meetme.conf */ ast_log(LOG_DEBUG, "Building dynamic conference '%s'\n", confno); if (dynamic_pin) { if (dynamic_pin[0] == 'q') { /* Query the user to enter a PIN */ ast_app_getdata(chan, "conf-getpin", dynamic_pin, AST_MAX_EXTENSION - 1, 0); } cnf = build_conf(confno, dynamic_pin, make, dynamic); } else { cnf = build_conf(confno, "", make, dynamic); } } else { /* Check the config */ cfg = ast_load("meetme.conf"); if (!cfg) { ast_log(LOG_WARNING, "No meetme.conf file :(\n"); return NULL; } var = ast_variable_browse(cfg, "rooms"); while(var) { if (!strcasecmp(var->name, "conf")) { /* Separate the PIN */ char *pin, *conf; if ((pin = ast_strdupa(var->value))) { conf = strsep(&pin, "|,"); if (!strcasecmp(conf, confno)) { /* Bingo it's a valid conference */ if (pin) cnf = build_conf(confno, pin, make, dynamic); else cnf = build_conf(confno, "", make, dynamic); break; } } } var = var->next; } if (!var) { ast_log(LOG_DEBUG, "%s isn't a valid conference\n", confno); } ast_destroy(cfg); } } else if (dynamic_pin) { /* Correct for the user selecting 'D' instead of 'd' to have someone join into a conference that has already been created with a pin. */ if (dynamic_pin[0] == 'q') dynamic_pin[0] = '\0'; } return cnf; }
int load_module() { struct ast_config *cfg; struct ast_variable *v; struct phone_pvt *tmp; int mode = MODE_IMMEDIATE; int txgain = DEFAULT_GAIN, rxgain = DEFAULT_GAIN; /* default gain 1.0 */ cfg = ast_load(config); /* We *must* have a config file otherwise stop immediately */ if (!cfg) { ast_log(LOG_ERROR, "Unable to load config %s\n", config); return -1; } if (ast_mutex_lock(&iflock)) { /* It's a little silly to lock it, but we mind as well just to be sure */ ast_log(LOG_ERROR, "Unable to lock interface list???\n"); return -1; } v = ast_variable_browse(cfg, "interfaces"); while(v) { /* Create the interface list */ if (!strcasecmp(v->name, "device")) { tmp = mkif(v->value, mode, txgain, rxgain); if (tmp) { tmp->next = iflist; iflist = tmp; } else { ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value); ast_destroy(cfg); ast_mutex_unlock(&iflock); __unload_module(); return -1; } } else if (!strcasecmp(v->name, "silencesupression")) { silencesupression = ast_true(v->value); } else if (!strcasecmp(v->name, "language")) { strncpy(language, v->value, sizeof(language)-1); } else if (!strcasecmp(v->name, "callerid")) { strncpy(callerid, v->value, sizeof(callerid)-1); } else if (!strcasecmp(v->name, "mode")) { if (!strncasecmp(v->value, "di", 2)) mode = MODE_DIALTONE; else if (!strncasecmp(v->value, "im", 2)) mode = MODE_IMMEDIATE; else if (!strncasecmp(v->value, "fx", 2)) mode = MODE_FXO; else ast_log(LOG_WARNING, "Unknown mode: %s\n", v->value); } else if (!strcasecmp(v->name, "context")) { strncpy(context, v->value, sizeof(context)-1); } else if (!strcasecmp(v->name, "format")) { if (!strcasecmp(v->value, "g723.1")) { prefformat = AST_FORMAT_G723_1; } else if (!strcasecmp(v->value, "slinear")) { prefformat = AST_FORMAT_SLINEAR; } else if (!strcasecmp(v->value, "ulaw")) { prefformat = AST_FORMAT_ULAW; } else ast_log(LOG_WARNING, "Unknown format '%s'\n", v->value); } else if (!strcasecmp(v->name, "echocancel")) { if (!strcasecmp(v->value, "off")) { echocancel = AEC_OFF; } else if (!strcasecmp(v->value, "low")) { echocancel = AEC_LOW; } else if (!strcasecmp(v->value, "medium")) { echocancel = AEC_MED; } else if (!strcasecmp(v->value, "high")) { echocancel = AEC_HIGH; } else ast_log(LOG_WARNING, "Unknown echo cancellation '%s'\n", v->value); } else if (!strcasecmp(v->name, "txgain")) { txgain = parse_gain_value(v->name, v->value); } else if (!strcasecmp(v->name, "rxgain")) { rxgain = parse_gain_value(v->name, v->value); } v = v->next; } ast_mutex_unlock(&iflock); /* Make sure we can register our Adtranphone channel type */ if (ast_channel_register(type, tdesc, AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, phone_request)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); ast_destroy(cfg); __unload_module(); return -1; } ast_destroy(cfg); /* And start the monitor for the first time */ restart_monitor(); return 0; }
/* * 'save dialplan' CLI command implementation functions ... */ static int handle_save_dialplan(int fd, int argc, char *argv[]) { char filename[256]; struct ast_context *c; struct ast_config *cfg; struct ast_variable *v; int context_header_written; int incomplete = 0; /* incomplete config write? */ FILE *output; if (! (static_config && !write_protect_config)) { ast_cli(fd, "I can't save dialplan now, see '%s' example file.\n", config); return RESULT_FAILURE; } if (argc != 2 && argc != 3) return RESULT_SHOWUSAGE; if (ast_mutex_lock(&save_dialplan_lock)) { ast_cli(fd, "Failed to lock dialplan saving (another proccess saving?)\n"); return RESULT_FAILURE; } /* have config path? */ if (argc == 3) { /* is there extension.conf too? */ if (!strstr(argv[2], ".conf")) { /* no, only directory path, check for last '/' occurence */ if (*(argv[2] + strlen(argv[2]) -1) == '/') snprintf(filename, sizeof(filename), "%s%s", argv[2], config); else /* without config extensions.conf, add it */ snprintf(filename, sizeof(filename), "%s/%s", argv[2], config); } else /* there is an .conf */ snprintf(filename, sizeof(filename), argv[2]); } else /* no config file, default one */ snprintf(filename, sizeof(filename), "%s/%s", (char *)ast_config_AST_CONFIG_DIR, config); cfg = ast_load("extensions.conf"); /* try to lock contexts list */ if (ast_lock_contexts()) { ast_cli(fd, "Failed to lock contexts list\n"); ast_mutex_unlock(&save_dialplan_lock); ast_destroy(cfg); return RESULT_FAILURE; } /* create new file ... */ if (!(output = fopen(filename, "wt"))) { ast_cli(fd, "Failed to create file '%s'\n", filename); ast_unlock_contexts(); ast_mutex_unlock(&save_dialplan_lock); ast_destroy(cfg); return RESULT_FAILURE; } /* fireout general info */ fprintf(output, "[general]\nstatic=%s\nwriteprotect=%s\n\n", static_config ? "yes" : "no", write_protect_config ? "yes" : "no"); if ((v = ast_variable_browse(cfg, "globals"))) { fprintf(output, "[globals]\n"); while(v) { fprintf(output, "%s => %s\n", v->name, v->value); v = v->next; } fprintf(output, "\n"); } ast_destroy(cfg); /* walk all contexts */ c = ast_walk_contexts(NULL); while (c) { context_header_written = 0; /* try to lock context and fireout all info */ if (!ast_lock_context(c)) { struct ast_exten *e, *last_written_e = NULL; struct ast_include *i; struct ast_ignorepat *ip; struct ast_sw *sw; /* registered by this module? */ if (!strcmp(ast_get_context_registrar(c), registrar)) { fprintf(output, "[%s]\n", ast_get_context_name(c)); context_header_written = 1; } /* walk extensions ... */ e = ast_walk_context_extensions(c, NULL); while (e) { struct ast_exten *p; /* fireout priorities */ p = ast_walk_extension_priorities(e, NULL); while (p) { if (!strcmp(ast_get_extension_registrar(p), registrar)) { /* make empty line between different extensions */ if (last_written_e != NULL && strcmp(ast_get_extension_name(last_written_e), ast_get_extension_name(p))) fprintf(output, "\n"); last_written_e = p; if (!context_header_written) { fprintf(output, "[%s]\n", ast_get_context_name(c)); context_header_written = 1; } if (ast_get_extension_priority(p)!=PRIORITY_HINT) { char *tempdata = NULL, *startdata; tempdata = strdup((char *)ast_get_extension_app_data(p)); if (tempdata) { startdata = tempdata; while (*tempdata) { if (*tempdata == '|') *tempdata = ','; tempdata++; } tempdata = startdata; } if (ast_get_extension_matchcid(p)) fprintf(output, "exten => %s/%s,%d,%s(%s)\n", ast_get_extension_name(p), ast_get_extension_cidmatch(p), ast_get_extension_priority(p), ast_get_extension_app(p), tempdata); else fprintf(output, "exten => %s,%d,%s(%s)\n", ast_get_extension_name(p), ast_get_extension_priority(p), ast_get_extension_app(p), tempdata); if (tempdata) free(tempdata); } else fprintf(output, "exten => %s,hint,%s\n", ast_get_extension_name(p), ast_get_extension_app(p)); } p = ast_walk_extension_priorities(e, p); } e = ast_walk_context_extensions(c, e); } /* written any extensions? ok, write space between exten & inc */ if (last_written_e) fprintf(output, "\n"); /* walk through includes */ i = ast_walk_context_includes(c, NULL); while (i) { if (!strcmp(ast_get_include_registrar(i), registrar)) { if (!context_header_written) { fprintf(output, "[%s]\n", ast_get_context_name(c)); context_header_written = 1; } fprintf(output, "include => %s\n", ast_get_include_name(i)); } i = ast_walk_context_includes(c, i); } if (ast_walk_context_includes(c, NULL)) fprintf(output, "\n"); /* walk through switches */ sw = ast_walk_context_switches(c, NULL); while (sw) { if (!strcmp(ast_get_switch_registrar(sw), registrar)) { if (!context_header_written) { fprintf(output, "[%s]\n", ast_get_context_name(c)); context_header_written = 1; } fprintf(output, "switch => %s/%s\n", ast_get_switch_name(sw), ast_get_switch_data(sw)); } sw = ast_walk_context_switches(c, sw); } if (ast_walk_context_switches(c, NULL)) fprintf(output, "\n"); /* fireout ignorepats ... */ ip = ast_walk_context_ignorepats(c, NULL); while (ip) { if (!strcmp(ast_get_ignorepat_registrar(ip), registrar)) { if (!context_header_written) { fprintf(output, "[%s]\n", ast_get_context_name(c)); context_header_written = 1; } fprintf(output, "ignorepat => %s\n", ast_get_ignorepat_name(ip)); } ip = ast_walk_context_ignorepats(c, ip); } ast_unlock_context(c); } else incomplete = 1; c = ast_walk_contexts(c); } ast_unlock_contexts(); ast_mutex_unlock(&save_dialplan_lock); fclose(output); if (incomplete) { ast_cli(fd, "Saved dialplan is incomplete\n"); return RESULT_FAILURE; } ast_cli(fd, "Dialplane successfully saved into '%s'\n", filename); return RESULT_SUCCESS; }
static int pbx_load_module(void) { struct ast_config *cfg; struct ast_variable *v; char *cxt, *ext, *pri, *appl, *data, *tc, *cidmatch; struct ast_context *con; char *start, *end; char realvalue[256]; cfg = ast_load(config); if (cfg) { /* Use existing config to populate the PBX table */ static_config = ast_true(ast_variable_retrieve(cfg, "general", "static")); write_protect_config = ast_true(ast_variable_retrieve(cfg, "general", "writeprotect")); v = ast_variable_browse(cfg, "globals"); while(v) { memset(realvalue, 0, sizeof(realvalue)); pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1); pbx_builtin_setvar_helper(NULL, v->name, realvalue); v = v->next; } cxt = ast_category_browse(cfg, NULL); while(cxt) { /* All categories but "general" or "globals" are considered contexts */ if (!strcasecmp(cxt, "general") || !strcasecmp(cxt, "globals")) { cxt = ast_category_browse(cfg, cxt); continue; } if ((con=ast_context_create(&local_contexts,cxt, registrar))) { v = ast_variable_browse(cfg, cxt); while(v) { if (!strcasecmp(v->name, "exten")) { char *stringp=NULL; int ipri = -2; char realext[256]=""; tc = strdup(v->value); if(tc!=NULL){ stringp=tc; ext = strsep(&stringp, ","); if (!ext) ext=""; pri = strsep(&stringp, ","); if (!pri) pri=""; if (!strcmp(pri,"hint")) ipri=PRIORITY_HINT; else { if (sscanf(pri, "%i", &ipri) != 1) { ast_log(LOG_WARNING, "Invalid priority '%s' at line %d\n", pri, v->lineno); ipri = 0; } } appl = stringp; if (!appl) appl=""; if (!(start = strchr(appl, '('))) { if (stringp) appl = strsep(&stringp, ","); else appl = ""; } if (start && (end = strrchr(appl, ')'))) { *start = *end = '\0'; data = start + 1; process_quotes_and_slashes(data, ',', '|'); } else if (stringp!=NULL && *stringp=='"') { stringp++; data = strsep(&stringp, "\""); stringp++; } else { if (stringp) data = strsep(&stringp, ","); else data = ""; } cidmatch = strchr(ext, '/'); if (cidmatch) { *cidmatch = '\0'; cidmatch++; } stringp=ext; strsep(&stringp, "/"); if (!data) data=""; while(*appl && (*appl < 33)) appl++; pbx_substitute_variables_helper(NULL, ext, realext, sizeof(realext) - 1); if (ipri) { if (ast_add_extension2(con, 0, realext, ipri, cidmatch, appl, strdup(data), FREE, registrar)) { ast_log(LOG_WARNING, "Unable to register extension at line %d\n", v->lineno); } } free(tc); } else fprintf(stderr,"Error strdup returned NULL in %s\n",__PRETTY_FUNCTION__); } else if(!strcasecmp(v->name, "include")) { memset(realvalue, 0, sizeof(realvalue)); pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1); if (ast_context_add_include2(con, realvalue, registrar)) ast_log(LOG_WARNING, "Unable to include context '%s' in context '%s'\n", v->value, cxt); } else if(!strcasecmp(v->name, "ignorepat")) { memset(realvalue, 0, sizeof(realvalue)); pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1); if (ast_context_add_ignorepat2(con, realvalue, registrar)) ast_log(LOG_WARNING, "Unable to include ignorepat '%s' in context '%s'\n", v->value, cxt); } else if (!strcasecmp(v->name, "switch")) { char *stringp=NULL; memset(realvalue, 0, sizeof(realvalue)); pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1); tc = realvalue; stringp=tc; appl = strsep(&stringp, "/"); data = strsep(&stringp, ""); if (!data) data = ""; if (ast_context_add_switch2(con, appl, data, registrar)) ast_log(LOG_WARNING, "Unable to include switch '%s' in context '%s'\n", v->value, cxt); } v = v->next; } } cxt = ast_category_browse(cfg, cxt); } ast_destroy(cfg); } ast_merge_contexts_and_delete(&local_contexts,registrar); for (con = ast_walk_contexts(NULL); con; con = ast_walk_contexts(con)) ast_context_verify_includes(con); return 0; }
/* * Load module stuff */ static int ind_load_module(void) { struct ast_config *cfg; struct ast_variable *v; char *cxt; char *c; struct tone_zone *tones; const char *country = NULL; /* that the following cast is needed, is yuk! */ /* yup, checked it out. It is NOT written to. */ cfg = ast_load((char *)config); if (!cfg) return 0; /* Use existing config to populate the Indication table */ cxt = ast_category_browse(cfg, NULL); while(cxt) { /* All categories but "general" are considered countries */ if (!strcasecmp(cxt, "general")) { cxt = ast_category_browse(cfg, cxt); continue; } tones = malloc(sizeof(struct tone_zone)); if (!tones) { ast_log(LOG_WARNING,"Out of memory\n"); ast_destroy(cfg); return -1; } memset(tones,0,sizeof(struct tone_zone)); strncpy(tones->country,cxt,sizeof(tones->country) - 1); v = ast_variable_browse(cfg, cxt); while(v) { if (!strcasecmp(v->name, "description")) { strncpy(tones->description, v->value, sizeof(tones->description)-1); } else if (!strcasecmp(v->name,"ringcadance")) { char *ring,*rings = ast_strdupa(v->value); c = rings; ring = strsep(&c,","); while (ring) { int *tmp, val; if (!isdigit(ring[0]) || (val=atoi(ring))==-1) { ast_log(LOG_WARNING,"Invalid ringcadance given '%s' at line %d.\n",ring,v->lineno); ring = strsep(&c,","); continue; } tmp = realloc(tones->ringcadance,(tones->nrringcadance+1)*sizeof(int)); if (!tmp) { ast_log(LOG_WARNING, "Out of memory\n"); ast_destroy(cfg); return -1; } tones->ringcadance = tmp; tmp[tones->nrringcadance] = val; tones->nrringcadance++; /* next item */ ring = strsep(&c,","); } } else if (!strcasecmp(v->name,"alias")) { char *countries = ast_strdupa(v->value); c = countries; country = strsep(&c,","); while (country) { struct tone_zone* azone = malloc(sizeof(struct tone_zone)); if (!azone) { ast_log(LOG_WARNING,"Out of memory\n"); ast_destroy(cfg); return -1; } memset(azone,0,sizeof(struct tone_zone)); strncpy(azone->country, country, sizeof(azone->country) - 1); strncpy(azone->alias, cxt, sizeof(azone->alias)-1); if (ast_register_indication_country(azone)) { ast_log(LOG_WARNING, "Unable to register indication alias at line %d.\n",v->lineno); free(tones); } /* next item */ country = strsep(&c,","); } } else { // add tone to country struct tone_zone_sound *ps,*ts; for (ps=NULL,ts=tones->tones; ts; ps=ts, ts=ts->next) { if (strcasecmp(v->name,ts->name)==0) { /* already there */ ast_log(LOG_NOTICE,"Duplicate entry '%s', skipped.\n",v->name); goto out; } } /* not there, add it to the back */ ts = malloc(sizeof(struct tone_zone_sound)); if (!ts) { ast_log(LOG_WARNING, "Out of memory\n"); ast_destroy(cfg); return -1; } ts->next = NULL; ts->name = strdup(v->name); ts->data = strdup(v->value); if (ps) ps->next = ts; else tones->tones = ts; } out: v = v->next; } if (tones->description[0] || tones->alias[0] || tones->tones) { if (ast_register_indication_country(tones)) { ast_log(LOG_WARNING, "Unable to register indication at line %d.\n",v->lineno); free(tones); } } else free(tones); cxt = ast_category_browse(cfg, cxt); } /* determine which country is the default */ country = ast_variable_retrieve(cfg,"general","country"); if (!country || !*country || ast_set_indication_country(country)) ast_log(LOG_WARNING,"Unable to set the default country (for indication tones)\n"); ast_destroy(cfg); return 0; }
/** * Main entry point to the Luci compiler/interpreter * * @param argc number of command-line arguments * @param argv C-string array of command-line arguments * @returns 1 on error, 0 on success */ int luci_main(int argc, char *argv[]) { #ifdef DEBUG yydebug = 1; #endif if (argc < 2) { /* interactive mode */ yyin = stdin; return luci_interactive(); } unsigned int mode = MODE_EXE; char *arg; char *infilename = NULL; unsigned int i; for (i = 1; i < argc; i++) { arg = argv[i]; if (strcmp(arg, "-h") == 0) { help(); return EXIT_SUCCESS; } else if (strcmp(arg, "-V") == 0) { fprintf(stdout, "%s\n", version_string); return EXIT_SUCCESS; } else if (strcmp(arg, "-g") == 0) { mode = MODE_GRAPH; } else if (strcmp(arg, "-p") == 0) { mode = MODE_PRINT; } else if (strcmp(arg, "-c") == 0) { mode = MODE_SERIAL; printf("%s\n", "This option is not yet supported"); return EXIT_SUCCESS; } else if (strcmp(arg, "-n") == 0) { mode = MODE_SYNTAX; } else if (i == (argc - 1)) { infilename = arg; } else { LUCI_DIE("Invalid option: %s\n", arg); } } if (infilename == NULL) { /* interactive mode */ yyin = stdin; return luci_interactive(); } else if (!(yyin = fopen(infilename, "r"))) { LUCI_DIE("Can't read from file %s\n", infilename); } LUCI_DEBUG("Reading from %s\n", infilename? infilename : "stdin"); /* initialize the scanner in non-interactive mode */ yy_luci_init(false); /* parse yyin and build and AST */ yyparse(); extern AstNode* g_root_node; /* parser.y */ if (!g_root_node) { /* empty program */ return EXIT_SUCCESS; } else if (mode == MODE_SYNTAX) { printf("%s\n", "Syntax valid"); return EXIT_SUCCESS; } else if (mode == MODE_GRAPH) { print_ast_graph(g_root_node); return EXIT_SUCCESS; } /* initialize systems */ gc_init(); compiler_init(); /* Compile the AST */ CompileState *cs = compile_ast(g_root_node); ast_destroy(g_root_node); LuciObject *gf = LuciFunction_new(); convert_to_function(cs, gf, 0); compile_state_delete(cs); if (setjmp(LUCI_EXCEPTION_BUF) == 0) { switch (mode) { case MODE_EXE: /* Execute the bytecode */ eval(gf); break; case MODE_PRINT: /* Print the bytecode */ print_instructions(gf); break; case MODE_SERIAL: /* Serialize program */ serialize_program(gf); break; default: LUCI_DIE("%s\n", "Invalid mode?!"); } } /* cleanup systems */ compiler_finalize(); gc_finalize(); return EXIT_SUCCESS; }
/** * Initiates Luci's interactive mode. * * Input is read from stdin, parsed, compiled, then executed. * The interpreter's state is maintained between successive * user inputs to stdin. * * returns EXIT_SUCCESS or EXIT_FAILURE */ int luci_interactive(void) { yy_luci_init(true); printf("\nWelcome to Interactive %s\n\n", version_string); /* initialize systems */ gc_init(); compiler_init(); CompileState *cs = NULL; LuciObject *gf = NULL; while (true) { /* set up interactive prompt in the lexer */ putc('$', stdout); putc(' ', stdout); /* parse yyin and build and AST */ yyparse(); extern AstNode *g_root_node; /* parser.y */ if (!g_root_node) { /* didn't parse anything... is it any empty line or EOF? */ if (feof(yyin)) { break; } else { continue; } } /* Compile the AST */ cs = compile_ast_incremental(cs, gf, g_root_node); /* clean up AST memory */ ast_destroy(g_root_node); g_root_node = NULL; gf = LuciFunction_new(); convert_to_function(cs, gf, 0); if (setjmp(LUCI_EXCEPTION_BUF) == 0) { /* Execute the bytecode */ eval(gf); } /* print one line of spacing */ fprintf(stdout, "%s", "\n"); /* remove the EOF flag */ clearerr(yyin); /* reset scanner */ yy_luci_reset(); } printf("Goodbye\n"); if (cs != NULL) { compile_state_delete(cs); } /* cleanup systems */ compiler_finalize(); gc_finalize(); return EXIT_SUCCESS; }
static int odbc_load_module(void) { int res = 0; struct ast_config *cfg; struct ast_variable *var; char *tmp; ast_mutex_lock(&odbc_lock); cfg = ast_load(config); if (!cfg) { ast_log(LOG_WARNING, "cdr_odbc: Unable to load config for ODBC CDR's: %s\n", config); goto out; } var = ast_variable_browse(cfg, "global"); if (!var) { /* nothing configured */ goto out; } tmp = ast_variable_retrieve(cfg,"global","dsn"); if (tmp) { dsn = malloc(strlen(tmp) + 1); if (dsn != NULL) { memset(dsn, 0, strlen(tmp) + 1); dsn_alloc = 1; strncpy(dsn, tmp, strlen(tmp)); } else { ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n"); res = -1; goto out; } } else { ast_log(LOG_WARNING,"cdr_odbc: dsn not specified. Assuming asteriskdb\n"); dsn = "asteriskdb"; } tmp = ast_variable_retrieve(cfg,"global","username"); if (tmp) { username = malloc(strlen(tmp) + 1); if (username != NULL) { memset(username, 0, strlen(tmp) + 1); username_alloc = 1; strncpy(username, tmp, strlen(tmp)); } else { ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n"); res = -1; goto out; } } else { ast_log(LOG_WARNING,"cdr_odbc: username not specified. Assuming root\n"); username = "******"; } tmp = ast_variable_retrieve(cfg,"global","password"); if (tmp) { password = malloc(strlen(tmp) + 1); if (password != NULL) { memset(password, 0, strlen(tmp) + 1); password_alloc = 1; strncpy(password, tmp, strlen(tmp)); } else { ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n"); res = -1; goto out; } } else { ast_log(LOG_WARNING,"cdr_odbc: database password not specified. Assuming blank\n"); password = ""; } tmp = ast_variable_retrieve(cfg,"global","loguniqueid"); if (tmp) { loguniqueid = ast_true(tmp); if (loguniqueid) { ast_log(LOG_NOTICE,"cdr_odbc: Logging uniqueid\n"); } else { ast_log(LOG_ERROR,"cdr_odbc: Not logging uniqueid\n"); } } else { ast_log(LOG_WARNING,"cdr_odbc: Not logging uniqueid\n"); loguniqueid = 0; } ast_destroy(cfg); if (option_verbose > 2) { ast_verbose( VERBOSE_PREFIX_3 "cdr_odbc: dsn is %s\n",dsn); ast_verbose( VERBOSE_PREFIX_3 "cdr_odbc: username is %s\n",username); ast_verbose( VERBOSE_PREFIX_3 "cdr_odbc: password is [secret]\n"); } res = odbc_init(); if (res < 0) { ast_log(LOG_ERROR, "cdr_odbc: Unable to connect to datasource: %s\n", dsn); if (option_verbose > 2) { ast_verbose( VERBOSE_PREFIX_3 "cdr_odbc: Unable to connect to datasource: %s\n", dsn); } } res = ast_cdr_register(name, desc, odbc_log); if (res) { ast_log(LOG_ERROR, "cdr_odbc: Unable to register ODBC CDR handling\n"); } out: ast_mutex_unlock(&odbc_lock); return res; }