mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-18 18:58:22 +00:00
repeal config prototype changes
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4878 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
410
config.c
410
config.c
@@ -41,7 +41,7 @@
|
|||||||
#define COMMENT_TAG '-'
|
#define COMMENT_TAG '-'
|
||||||
|
|
||||||
static int ast_cust_config=0;
|
static int ast_cust_config=0;
|
||||||
static config_static_func *global_load_func;
|
struct ast_config *(*global_load_func)(const char *dbname, const char *table, const char *, struct ast_config *,struct ast_category **,struct ast_variable **,int);
|
||||||
|
|
||||||
static struct ast_config_map {
|
static struct ast_config_map {
|
||||||
struct ast_config_map *next;
|
struct ast_config_map *next;
|
||||||
@@ -169,22 +169,19 @@ char *ast_variable_retrieve(const struct ast_config *config, const char *categor
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ast_category *ast_category_get(const struct ast_config *config, const char *category_name)
|
|
||||||
{
|
|
||||||
struct ast_category *category = config->root;
|
|
||||||
|
|
||||||
while(category) {
|
|
||||||
if (!strcasecmp(category->name, category_name))
|
|
||||||
return category;
|
|
||||||
category = category->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ast_category_exist(struct ast_config *config, char *category_name)
|
int ast_category_exist(struct ast_config *config, char *category_name)
|
||||||
{
|
{
|
||||||
return !!ast_category_get(config, category_name);
|
struct ast_category *category = NULL;
|
||||||
|
|
||||||
|
category = config->root;
|
||||||
|
|
||||||
|
while(category) {
|
||||||
|
if (!strcasecmp(category->name,category_name))
|
||||||
|
return 1;
|
||||||
|
category = category->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -232,137 +229,134 @@ static struct ast_config_reg *get_config_registrations(void)
|
|||||||
return ast_cust_config_list;
|
return ast_cust_config_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ast_category_append(struct ast_config *config, struct ast_category *category)
|
|
||||||
{
|
|
||||||
if (config->last)
|
|
||||||
config->last->next = category;
|
|
||||||
else
|
|
||||||
config->root = category;
|
|
||||||
config->last = category;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void variable_append(struct ast_category *category, struct ast_variable *variable)
|
|
||||||
{
|
|
||||||
if (category->last)
|
|
||||||
category->last->next = variable;
|
|
||||||
else
|
|
||||||
category->root = variable;
|
|
||||||
category->last = variable;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cfg_process(struct ast_config *tmp, struct ast_category **cat, char *buf, int lineno, const char *configfile, int includelevel)
|
|
||||||
|
static int cfg_process(struct ast_config *tmp, struct ast_category **_tmpc, struct ast_variable **_last, char *buf, int lineno, const char *configfile, int includelevel )
|
||||||
{
|
{
|
||||||
char *c;
|
char *c;
|
||||||
char *cur;
|
char *cur;
|
||||||
char *arg=NULL;
|
char *arg=NULL;
|
||||||
struct ast_variable *v;
|
struct ast_variable *v;
|
||||||
int object;
|
int object;
|
||||||
|
|
||||||
cur = ast_strip(buf);
|
cur = ast_strip(buf);
|
||||||
if (ast_strlen_zero(cur))
|
if (!ast_strlen_zero(cur)) {
|
||||||
return 0;
|
/* Actually parse the entry */
|
||||||
|
if (cur[0] == '[') {
|
||||||
/* Actually parse the entry */
|
/* A category header */
|
||||||
if (cur[0] == '[') {
|
c = strchr(cur, ']');
|
||||||
/* A category header */
|
|
||||||
c = strchr(cur, ']');
|
|
||||||
if (!c) {
|
|
||||||
ast_destroy(tmp);
|
|
||||||
ast_log(LOG_WARNING, "parse error: no closing ']', line %d of %s\n", lineno, configfile);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
*c = '\0';
|
|
||||||
cur++;
|
|
||||||
*cat = ast_new_category(cur);
|
|
||||||
if (!*cat) {
|
|
||||||
ast_destroy(tmp);
|
|
||||||
ast_log(LOG_WARNING, "Out of memory, line %d of %s\n", lineno, configfile);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ast_category_append(tmp, *cat);
|
|
||||||
} else if (cur[0] == '#') {
|
|
||||||
/* A directive */
|
|
||||||
cur++;
|
|
||||||
c = cur;
|
|
||||||
while(*c && (*c > 32)) c++;
|
|
||||||
if (*c) {
|
|
||||||
*c = '\0';
|
|
||||||
c++;
|
|
||||||
/* Find real argument */
|
|
||||||
while(*c && (*c < 33)) c++;
|
|
||||||
if (!*c)
|
|
||||||
c = NULL;
|
|
||||||
} else
|
|
||||||
c = NULL;
|
|
||||||
if (!strcasecmp(cur, "include")) {
|
|
||||||
/* A #include */
|
|
||||||
if (c) {
|
if (c) {
|
||||||
/* Strip off leading and trailing "'s and <>'s */
|
*c = 0;
|
||||||
while((*c == '<') || (*c == '>') || (*c == '\"')) c++;
|
*_tmpc = malloc(sizeof(struct ast_category));
|
||||||
/* Get rid of leading mess */
|
if (!*_tmpc) {
|
||||||
cur = c;
|
ast_destroy(tmp);
|
||||||
while (!ast_strlen_zero(cur)) {
|
ast_log(LOG_WARNING,
|
||||||
c = cur + strlen(cur) - 1;
|
"Out of memory, line %d\n", lineno);
|
||||||
if ((*c == '>') || (*c == '<') || (*c == '\"'))
|
return -1;
|
||||||
*c = '\0';
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
memset(*_tmpc, 0, sizeof(struct ast_category));
|
||||||
|
strncpy((*_tmpc)->name, cur+1, sizeof((*_tmpc)->name) - 1);
|
||||||
|
(*_tmpc)->root = NULL;
|
||||||
|
if (!tmp->prev)
|
||||||
|
tmp->root = *_tmpc;
|
||||||
|
else
|
||||||
|
tmp->prev->next = *_tmpc;
|
||||||
|
|
||||||
if((c = strchr(cur,':'))) {
|
tmp->prev = *_tmpc;
|
||||||
*c = '\0';
|
*_last = NULL;
|
||||||
c++;
|
|
||||||
arg = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (includelevel < MAX_INCLUDE_LEVEL) {
|
|
||||||
if(arg && cur) {
|
|
||||||
ast_log(LOG_WARNING, "Including files with explicit config engine no longer permitted. Please use extconfig.conf to specify all mappings\n");
|
|
||||||
} else {
|
|
||||||
if (!ast_internal_load(cur, tmp, cat, includelevel + 1))
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", includelevel);
|
|
||||||
} else
|
|
||||||
ast_log(LOG_WARNING, "Directive '#include' needs an argument (filename) at line %d of %s\n", lineno, configfile);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ast_log(LOG_WARNING, "Unknown directive '%s' at line %d of %s\n", cur, lineno, configfile);
|
|
||||||
} else {
|
|
||||||
/* Just a line (variable = value) */
|
|
||||||
if (!*cat) {
|
|
||||||
ast_log(LOG_WARNING,
|
|
||||||
"parse error: No category context for line %d of %s\n", lineno, configfile);
|
|
||||||
ast_destroy(tmp);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
c = strchr(cur, '=');
|
|
||||||
if (c) {
|
|
||||||
*c = 0;
|
|
||||||
c++;
|
|
||||||
/* Ignore > in => */
|
|
||||||
if (*c== '>') {
|
|
||||||
object = 1;
|
|
||||||
c++;
|
|
||||||
} else
|
|
||||||
object = 0;
|
|
||||||
v = ast_new_variable(ast_strip(cur), ast_strip(c));
|
|
||||||
if (v) {
|
|
||||||
v->lineno = lineno;
|
|
||||||
v->object = object;
|
|
||||||
/* Put and reset comments */
|
|
||||||
v->blanklines = 0;
|
|
||||||
variable_append(*cat, v);
|
|
||||||
} else {
|
} else {
|
||||||
|
ast_log(LOG_WARNING,
|
||||||
|
"parse error: no closing ']', line %d of %s\n", lineno, configfile);
|
||||||
|
}
|
||||||
|
} else if (cur[0] == '#') {
|
||||||
|
/* A directive */
|
||||||
|
cur++;
|
||||||
|
c = cur;
|
||||||
|
while(*c && (*c > 32)) c++;
|
||||||
|
if (*c) {
|
||||||
|
*c = '\0';
|
||||||
|
c++;
|
||||||
|
/* Find real argument */
|
||||||
|
while(*c && (*c < 33)) c++;
|
||||||
|
if (!*c)
|
||||||
|
c = NULL;
|
||||||
|
} else
|
||||||
|
c = NULL;
|
||||||
|
if (!strcasecmp(cur, "include")) {
|
||||||
|
/* A #include */
|
||||||
|
if (c) {
|
||||||
|
while((*c == '<') || (*c == '>') || (*c == '\"')) c++;
|
||||||
|
/* Get rid of leading mess */
|
||||||
|
cur = c;
|
||||||
|
while (!ast_strlen_zero(cur)) {
|
||||||
|
c = cur + strlen(cur) - 1;
|
||||||
|
if ((*c == '>') || (*c == '<') || (*c == '\"'))
|
||||||
|
*c = '\0';
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((c = strchr(cur,':'))) {
|
||||||
|
*c = '\0';
|
||||||
|
c++;
|
||||||
|
arg = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (includelevel < MAX_INCLUDE_LEVEL) {
|
||||||
|
if(arg && cur) {
|
||||||
|
ast_log(LOG_WARNING, "Including files with explicit config engine no longer permitted. Please use extconfig.conf to specify all mappings\n");
|
||||||
|
} else {
|
||||||
|
if (!ast_internal_load(cur, tmp, _tmpc, _last, includelevel + 1))
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", includelevel);
|
||||||
|
} else
|
||||||
|
ast_log(LOG_WARNING, "Directive '#include' needs an argument (filename) at line %d of %s\n", lineno, configfile);
|
||||||
|
/* Strip off leading and trailing "'s and <>'s */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ast_log(LOG_WARNING, "Unknown directive '%s' at line %d of %s\n", cur, lineno, configfile);
|
||||||
|
} else {
|
||||||
|
/* Just a line (variable = value) */
|
||||||
|
if (!*_tmpc) {
|
||||||
|
ast_log(LOG_WARNING,
|
||||||
|
"parse error: No category context for line %d of %s\n", lineno, configfile);
|
||||||
ast_destroy(tmp);
|
ast_destroy(tmp);
|
||||||
ast_log(LOG_WARNING, "Out of memory, line %d\n", lineno);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
c = strchr(cur, '=');
|
||||||
ast_log(LOG_WARNING, "No '=' (equal sign) in line %d of %s\n", lineno, configfile);
|
if (c) {
|
||||||
|
*c = 0;
|
||||||
|
c++;
|
||||||
|
/* Ignore > in => */
|
||||||
|
if (*c== '>') {
|
||||||
|
object = 1;
|
||||||
|
c++;
|
||||||
|
} else
|
||||||
|
object = 0;
|
||||||
|
v = ast_new_variable(ast_strip(cur), ast_strip(c));
|
||||||
|
if (v) {
|
||||||
|
v->next = NULL;
|
||||||
|
v->lineno = lineno;
|
||||||
|
v->object = object;
|
||||||
|
/* Put and reset comments */
|
||||||
|
v->blanklines = 0;
|
||||||
|
if (*_last)
|
||||||
|
(*_last)->next = v;
|
||||||
|
else
|
||||||
|
(*_tmpc)->root = v;
|
||||||
|
*_last = v;
|
||||||
|
} else {
|
||||||
|
ast_destroy(tmp);
|
||||||
|
ast_log(LOG_WARNING, "Out of memory, line %d\n", lineno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ast_log(LOG_WARNING, "No '=' (equal sign) in line %d of %s\n", lineno, configfile);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -429,6 +423,7 @@ int ast_save(char *configfile, struct ast_config *cfg, char *generator)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct ast_variable *ast_load_realtime(const char *family, ...)
|
struct ast_variable *ast_load_realtime(const char *family, ...)
|
||||||
{
|
{
|
||||||
struct ast_config_reg *reg;
|
struct ast_config_reg *reg;
|
||||||
@@ -474,7 +469,7 @@ int ast_update_realtime(const char *family, const char *keyfield, const char *lo
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ast_config *ast_internal_load(const char *configfile, struct ast_config *tmp, struct ast_category **cat, int includelevel)
|
struct ast_config *ast_internal_load(const char *configfile, struct ast_config *tmp, struct ast_category **_tmpc, struct ast_variable **_last, int includelevel)
|
||||||
{
|
{
|
||||||
char fn[256];
|
char fn[256];
|
||||||
char buf[8192];
|
char buf[8192];
|
||||||
@@ -482,10 +477,11 @@ struct ast_config *ast_internal_load(const char *configfile, struct ast_config *
|
|||||||
char table[256];
|
char table[256];
|
||||||
FILE *f;
|
FILE *f;
|
||||||
int lineno=0;
|
int lineno=0;
|
||||||
|
int master=0;
|
||||||
int comment = 0, nest[MAX_NESTED_COMMENTS];
|
int comment = 0, nest[MAX_NESTED_COMMENTS];
|
||||||
|
|
||||||
struct ast_config_reg *reg=NULL;
|
struct ast_config_reg *reg=NULL;
|
||||||
config_static_func *load_func;
|
struct ast_config *(*load_func)(const char *database, const char *table, const char *, struct ast_config *,struct ast_category **,struct ast_variable **,int);
|
||||||
char *comment_p, *process_buf, *new_buf=NULL;
|
char *comment_p, *process_buf, *new_buf=NULL;
|
||||||
|
|
||||||
load_func=NULL;
|
load_func=NULL;
|
||||||
@@ -505,7 +501,7 @@ struct ast_config *ast_internal_load(const char *configfile, struct ast_config *
|
|||||||
|
|
||||||
if (load_func) {
|
if (load_func) {
|
||||||
ast_log(LOG_NOTICE,"Loading Config %s via %s engine\n",configfile,reg && reg->name ? reg->name : "global");
|
ast_log(LOG_NOTICE,"Loading Config %s via %s engine\n",configfile,reg && reg->name ? reg->name : "global");
|
||||||
if((tmp = load_func(db, table, configfile, tmp, cat, includelevel)))
|
if((tmp = load_func(db, table, configfile,tmp, _tmpc, _last, includelevel)))
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -545,70 +541,73 @@ struct ast_config *ast_internal_load(const char *configfile, struct ast_config *
|
|||||||
if (option_debug)
|
if (option_debug)
|
||||||
ast_log(LOG_DEBUG, "Parsing %s\n", fn);
|
ast_log(LOG_DEBUG, "Parsing %s\n", fn);
|
||||||
else if (option_verbose > 2)
|
else if (option_verbose > 2)
|
||||||
ast_verbose("Found\n");
|
ast_verbose( "Found\n");
|
||||||
if (!tmp)
|
|
||||||
tmp = ast_new_config();
|
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
ast_log(LOG_WARNING, "Out of memory\n");
|
if((tmp = malloc(sizeof(struct ast_config)))) {
|
||||||
fclose(f);
|
memset(tmp, 0, sizeof(struct ast_config));
|
||||||
return tmp;
|
master = 1;
|
||||||
}
|
|
||||||
while(!feof(f)) {
|
|
||||||
lineno++;
|
|
||||||
if (fgets(buf, sizeof(buf), f)) {
|
|
||||||
new_buf = buf;
|
|
||||||
if (comment)
|
|
||||||
process_buf = NULL;
|
|
||||||
else
|
|
||||||
process_buf = buf;
|
|
||||||
while ((comment_p = strchr(new_buf, COMMENT_META))) {
|
|
||||||
if ((comment_p > new_buf) && (*(comment_p-1) == '\\')) {
|
|
||||||
/* Yuck, gotta memmove */
|
|
||||||
memmove(comment_p - 1, comment_p, strlen(comment_p) + 1);
|
|
||||||
new_buf = comment_p;
|
|
||||||
} else if(comment_p[1] == COMMENT_TAG && comment_p[2] == COMMENT_TAG && (comment_p[3] != '-')) {
|
|
||||||
/* Meta-Comment start detected ";--" */
|
|
||||||
if (comment < MAX_NESTED_COMMENTS) {
|
|
||||||
*comment_p = '\0';
|
|
||||||
new_buf = comment_p + 3;
|
|
||||||
comment++;
|
|
||||||
nest[comment-1] = lineno;
|
|
||||||
} else {
|
|
||||||
ast_log(LOG_ERROR, "Maximum nest limit of %d reached.\n", MAX_NESTED_COMMENTS);
|
|
||||||
}
|
|
||||||
} else if ((comment_p >= new_buf + 2) &&
|
|
||||||
(*(comment_p - 1) == COMMENT_TAG) &&
|
|
||||||
(*(comment_p - 2) == COMMENT_TAG)) {
|
|
||||||
/* Meta-Comment end detected */
|
|
||||||
comment--;
|
|
||||||
new_buf = comment_p + 1;
|
|
||||||
if (!comment) {
|
|
||||||
/* Back to non-comment now */
|
|
||||||
if (process_buf) {
|
|
||||||
/* Actually have to move what's left over the top, then continue */
|
|
||||||
char *oldptr;
|
|
||||||
oldptr = process_buf + strlen(process_buf);
|
|
||||||
memmove(oldptr, new_buf, strlen(new_buf) + 1);
|
|
||||||
new_buf = oldptr;
|
|
||||||
} else
|
|
||||||
process_buf = new_buf;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!comment) {
|
|
||||||
/* If ; is found, and we are not nested in a comment,
|
|
||||||
we immediately stop all comment processing */
|
|
||||||
*comment_p = '\0';
|
|
||||||
new_buf = comment_p;
|
|
||||||
} else
|
|
||||||
new_buf = comment_p + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (process_buf && cfg_process(tmp, cat, process_buf, lineno, configfile, includelevel)) {
|
|
||||||
tmp = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (tmp) {
|
||||||
|
while(!feof(f)) {
|
||||||
|
lineno++;
|
||||||
|
if (fgets(buf, sizeof(buf), f)) {
|
||||||
|
new_buf = buf;
|
||||||
|
if (comment)
|
||||||
|
process_buf = NULL;
|
||||||
|
else
|
||||||
|
process_buf = buf;
|
||||||
|
while ((comment_p = strchr(new_buf, COMMENT_META))) {
|
||||||
|
if ((comment_p > new_buf) && (*(comment_p-1) == '\\')) {
|
||||||
|
/* Yuck, gotta memmove */
|
||||||
|
memmove(comment_p - 1, comment_p, strlen(comment_p) + 1);
|
||||||
|
new_buf = comment_p;
|
||||||
|
} else if(comment_p[1] == COMMENT_TAG && comment_p[2] == COMMENT_TAG && (comment_p[3] != '-')) {
|
||||||
|
/* Meta-Comment start detected ";--" */
|
||||||
|
if (comment < MAX_NESTED_COMMENTS) {
|
||||||
|
*comment_p = '\0';
|
||||||
|
new_buf = comment_p + 3;
|
||||||
|
comment++;
|
||||||
|
nest[comment-1] = lineno;
|
||||||
|
} else {
|
||||||
|
ast_log(LOG_ERROR, "Maximum nest limit of %d reached.\n", MAX_NESTED_COMMENTS);
|
||||||
|
}
|
||||||
|
} else if ((comment_p >= new_buf + 2) &&
|
||||||
|
(*(comment_p - 1) == COMMENT_TAG) &&
|
||||||
|
(*(comment_p - 2) == COMMENT_TAG)) {
|
||||||
|
/* Meta-Comment end detected */
|
||||||
|
comment--;
|
||||||
|
new_buf = comment_p + 1;
|
||||||
|
if (!comment) {
|
||||||
|
/* Back to non-comment now */
|
||||||
|
if (process_buf) {
|
||||||
|
/* Actually have to move what's left over the top, then continue */
|
||||||
|
char *oldptr;
|
||||||
|
oldptr = process_buf + strlen(process_buf);
|
||||||
|
memmove(oldptr, new_buf, strlen(new_buf) + 1);
|
||||||
|
new_buf = oldptr;
|
||||||
|
} else
|
||||||
|
process_buf = new_buf;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!comment) {
|
||||||
|
/* If ; is found, and we are not nested in a comment,
|
||||||
|
we immediately stop all comment processing */
|
||||||
|
*comment_p = '\0';
|
||||||
|
new_buf = comment_p;
|
||||||
|
} else
|
||||||
|
new_buf = comment_p + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (process_buf && cfg_process(tmp, _tmpc, _last, process_buf, lineno, fn, includelevel)) {
|
||||||
|
tmp = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
ast_log(LOG_WARNING, "Out of memory\n");
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
} else { /* can't open file */
|
} else { /* can't open file */
|
||||||
if (option_debug)
|
if (option_debug)
|
||||||
@@ -674,9 +673,22 @@ int ast_cust_config_active(void) {
|
|||||||
|
|
||||||
struct ast_config *ast_load(char *configfile)
|
struct ast_config *ast_load(char *configfile)
|
||||||
{
|
{
|
||||||
struct ast_category *category = NULL;
|
struct ast_category *tmpc=NULL;
|
||||||
|
struct ast_variable *last = NULL;
|
||||||
|
|
||||||
return ast_internal_load(configfile, NULL, &category, 0);
|
return ast_internal_load(configfile, NULL, &tmpc, &last, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ast_category_append(struct ast_config *config, struct ast_category *cat)
|
||||||
|
{
|
||||||
|
struct ast_category *prev = NULL;
|
||||||
|
cat->next = NULL;
|
||||||
|
if (config->root) {
|
||||||
|
prev = config->root;
|
||||||
|
while(prev->next) prev = prev->next;
|
||||||
|
prev->next = cat;
|
||||||
|
} else
|
||||||
|
config->root = cat;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ast_category_browse(struct ast_config *config, char *prev)
|
char *ast_category_browse(struct ast_config *config, char *prev)
|
||||||
@@ -720,17 +732,20 @@ struct ast_config *ast_new_config(void)
|
|||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct ast_category *ast_new_category(char *name)
|
struct ast_category *ast_new_category(char *name)
|
||||||
{
|
{
|
||||||
struct ast_category *category;
|
struct ast_category *category;
|
||||||
category = malloc(sizeof(struct ast_category));
|
category = malloc(sizeof(struct ast_category));
|
||||||
if (category) {
|
if (category) {
|
||||||
memset(category, 0, sizeof(struct ast_category));
|
memset(category,0,sizeof(struct ast_category));
|
||||||
strncpy(category->name, name, sizeof(category->name) - 1);
|
strncpy(category->name,name,sizeof(category->name) - 1);
|
||||||
}
|
}
|
||||||
return category;
|
return category;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct ast_variable *ast_new_variable(char *name, char *value)
|
struct ast_variable *ast_new_variable(char *name, char *value)
|
||||||
{
|
{
|
||||||
struct ast_variable *variable;
|
struct ast_variable *variable;
|
||||||
@@ -740,6 +755,7 @@ struct ast_variable *ast_new_variable(char *name, char *value)
|
|||||||
memset(variable, 0, length);
|
memset(variable, 0, length);
|
||||||
variable->name = variable->stuff;
|
variable->name = variable->stuff;
|
||||||
variable->value = variable->stuff + strlen(name) + 1;
|
variable->value = variable->stuff + strlen(name) + 1;
|
||||||
|
variable->object=0;
|
||||||
strcpy(variable->name,name);
|
strcpy(variable->name,name);
|
||||||
strcpy(variable->value,value);
|
strcpy(variable->value,value);
|
||||||
}
|
}
|
||||||
|
@@ -96,13 +96,6 @@ int ast_true(const char *val);
|
|||||||
*/
|
*/
|
||||||
int ast_false(const char *val);
|
int ast_false(const char *val);
|
||||||
|
|
||||||
/*! Retrieve a category if it exists
|
|
||||||
* \param config which config to use
|
|
||||||
* \param category_name name of the category you're looking for
|
|
||||||
* This will search through the categories within a given config file and search for a match. The passed category_name can be a regular string.
|
|
||||||
* Returns pointer to category if found, NULL if not. */
|
|
||||||
struct ast_category *ast_category_get(const struct ast_config *config, const char *category_name);
|
|
||||||
|
|
||||||
/*! Check for category duplicates */
|
/*! Check for category duplicates */
|
||||||
/*!
|
/*!
|
||||||
* \param config which config to use
|
* \param config which config to use
|
||||||
|
@@ -14,49 +14,53 @@ extern "C" {
|
|||||||
struct ast_category {
|
struct ast_category {
|
||||||
char name[80];
|
char name[80];
|
||||||
struct ast_variable *root;
|
struct ast_variable *root;
|
||||||
struct ast_variable *last;
|
|
||||||
struct ast_category *next;
|
struct ast_category *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ast_config {
|
struct ast_config {
|
||||||
|
/* Maybe this structure isn't necessary but we'll keep it
|
||||||
|
for now */
|
||||||
struct ast_category *root;
|
struct ast_category *root;
|
||||||
struct ast_category *last;
|
struct ast_category *prev;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ast_config *config_static_func(const char *database, const char *table, const char *configfile, struct ast_config *config, struct ast_category **cat, int includelevel);
|
|
||||||
|
struct ast_category;
|
||||||
|
|
||||||
struct ast_config_reg {
|
struct ast_config_reg {
|
||||||
char name[CONFIG_KEYWORD_STRLEN];
|
char name[CONFIG_KEYWORD_STRLEN];
|
||||||
config_static_func *static_func;
|
struct ast_config *(*static_func)(const char *database, const char *table, const char *, struct ast_config *,struct ast_category **,struct ast_variable **,int);
|
||||||
struct ast_variable *(*realtime_func)(const char *database, const char *table, va_list ap);
|
struct ast_variable *(*realtime_func)(const char *database, const char *table, va_list ap);
|
||||||
struct ast_config *(*realtime_multi_func)(const char *database, const char *table, va_list ap);
|
struct ast_config *(*realtime_multi_func)(const char *database, const char *table, va_list ap);
|
||||||
int (*update_func)(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap);
|
int (*update_func)(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap);
|
||||||
struct ast_config_reg *next;
|
struct ast_config_reg *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int ast_config_register(struct ast_config_reg *new);
|
int ast_config_register(struct ast_config_reg *new);
|
||||||
int ast_config_deregister(struct ast_config_reg *del);
|
int ast_config_deregister(struct ast_config_reg *del);
|
||||||
void ast_cust_config_on(void);
|
void ast_cust_config_on(void);
|
||||||
void ast_cust_config_off(void);
|
void ast_cust_config_off(void);
|
||||||
int ast_cust_config_active(void);
|
int ast_cust_config_active(void);
|
||||||
void ast_config_destroy_all(void);
|
void ast_config_destroy_all(void);
|
||||||
|
|
||||||
|
|
||||||
|
int ast_category_delete(struct ast_config *cfg, char *category);
|
||||||
|
int ast_variable_delete(struct ast_config *cfg, char *category, char *variable, char *value);
|
||||||
|
int ast_save(char *filename, struct ast_config *cfg, char *generator);
|
||||||
|
|
||||||
|
struct ast_config *ast_new_config(void);
|
||||||
|
struct ast_category *ast_new_category(char *name);
|
||||||
|
struct ast_variable *ast_new_variable(char *name,char *value);
|
||||||
|
void ast_category_append(struct ast_config *config, struct ast_category *cat);
|
||||||
|
void ast_category_destroy(struct ast_category *cat);
|
||||||
int ast_cust_config_register(struct ast_config_reg *new);
|
int ast_cust_config_register(struct ast_config_reg *new);
|
||||||
int ast_cust_config_deregister(struct ast_config_reg *new);
|
int ast_cust_config_deregister(struct ast_config_reg *new);
|
||||||
int register_config_cli(void);
|
int register_config_cli(void);
|
||||||
int read_ast_cust_config(void);
|
int read_ast_cust_config(void);
|
||||||
|
struct ast_config *ast_internal_load(const char *configfile, struct ast_config *tmp, struct ast_category **_tmpc, struct ast_variable **_last, int includelevel);
|
||||||
|
|
||||||
struct ast_config *ast_new_config(void);
|
|
||||||
|
|
||||||
struct ast_category *ast_new_category(char *name);
|
|
||||||
void ast_category_append(struct ast_config *config, struct ast_category *cat);
|
|
||||||
int ast_category_delete(struct ast_config *cfg, char *category);
|
|
||||||
void ast_category_destroy(struct ast_category *cat);
|
|
||||||
|
|
||||||
struct ast_variable *ast_new_variable(char *name,char *value);
|
|
||||||
int ast_variable_delete(struct ast_config *cfg, char *category, char *variable, char *value);
|
|
||||||
int ast_save(char *filename, struct ast_config *cfg, char *generator);
|
|
||||||
|
|
||||||
struct ast_config *ast_internal_load(const char *configfile, struct ast_config *tmp, struct ast_category **cat, int includelevel);
|
|
||||||
|
|
||||||
#if defined(__cplusplus) || defined(c_plusplus)
|
#if defined(__cplusplus) || defined(c_plusplus)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user