diff --git a/config.c b/config.c index 386bab480721312cb2e9604a434b1830a8040919..c63b2fded626f6d1b274f8a2a2ab8e6f46750f19 100755 --- a/config.c +++ b/config.c @@ -89,6 +89,12 @@ struct ast_variable *ast_variable_browse(struct ast_config *config, char *catego { struct ast_category *cat; cat = config->root; + while(cat) { + if (cat->name == category) + return cat->root; + cat = cat->next; + } + cat = config->root; while(cat) { if (!strcasecmp(cat->name, category)) return cat->root; @@ -101,6 +107,12 @@ char *ast_variable_retrieve(struct ast_config *config, char *category, char *val { struct ast_variable *v; if (category) { + v = ast_variable_browse(config, category); + while (v) { + if (value == v->name) + return v->value; + v=v->next; + } v = ast_variable_browse(config, category); while (v) { if (!strcasecmp(value, v->name)) @@ -186,6 +198,7 @@ struct ast_config *ast_load(char *configfile) c = strchr(cur, ']'); if (c) { *c = 0; +#if 0 /* * Check category duplicity before structure * allocation @@ -199,7 +212,7 @@ struct ast_config *ast_load(char *configfile) fclose(f); return NULL; } - +#endif tmpc = malloc(sizeof(struct ast_category)); if (!tmpc) { ast_destroy(tmp); @@ -216,18 +229,12 @@ struct ast_config *ast_load(char *configfile) } else { ast_log(LOG_WARNING, "parse error: no closing ']', line %d\n", lineno); - ast_destroy(tmp); - fclose(f); - return NULL; } } else { /* Just a line (variable = value) */ if (!tmpc) { ast_log(LOG_WARNING, "parse error: No category context for line %d\n", lineno); - ast_destroy(tmp); - fclose(f); - return NULL; } c = strchr(cur, '='); if (c) { @@ -248,14 +255,13 @@ struct ast_config *ast_load(char *configfile) tmpc->root = v; last = v; } else { + ast_destroy(tmp); ast_log(LOG_WARNING, "Out of memory, line %d\n", lineno); fclose(f); - ast_destroy(tmp); + return NULL; } } else { - ast_log(LOG_WARNING, "No = in line %d\n", lineno); - fclose(f); - ast_destroy(tmp); + ast_log(LOG_WARNING, "No '=' (equal sign) in line %d\n", lineno); } } @@ -282,6 +288,16 @@ char *ast_category_browse(struct ast_config *config, char *prev) return NULL; } cat = config->root; + while(cat) { + if (cat->name == prev) { + if (cat->next) + return cat->next->name; + else + return NULL; + } + cat = cat->next; + } + cat = config->root; while(cat) { if (!strcasecmp(cat->name, prev)) { if (cat->next)