diff options
author | murf <murf@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-03-26 20:06:12 +0000 |
---|---|---|
committer | murf <murf@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-03-26 20:06:12 +0000 |
commit | ec204f2139e54955fd45a332bc877ba352c85a00 (patch) | |
tree | e596769cf02e0a0ae8d65574c5e3e3665c03cf3c /main/config.c | |
parent | 60c4735aa8e681a659cbc5b0f6fd2d4e21774c7d (diff) |
Fix for 9257; by eliminating the globals in main/config.c, we make it thread-safe, which is a minimum requirement.
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@59225 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/config.c')
-rw-r--r-- | main/config.c | 129 |
1 files changed, 65 insertions, 64 deletions
diff --git a/main/config.c b/main/config.c index 0d95bfd8e..153478c08 100644 --- a/main/config.c +++ b/main/config.c @@ -62,14 +62,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") static char *extconfig_conf = "extconfig.conf"; -/*! Growable string buffer */ -static char *comment_buffer; /*!< this will be a comment collector.*/ -static int comment_buffer_size; /*!< the amount of storage so far alloc'd for the comment_buffer */ - -static char *lline_buffer; /*!< A buffer for stuff behind the ; */ -static int lline_buffer_size; - +/*! \brief Structure to keep comments for rewriting configuration files */ struct ast_comment { struct ast_comment *next; char cmt[0]; @@ -77,71 +71,70 @@ struct ast_comment { #define CB_INCR 250 -static void CB_INIT(void) +static void CB_INIT(char **comment_buffer, int *comment_buffer_size, char **lline_buffer, int *lline_buffer_size) { - if (!comment_buffer) { - comment_buffer = ast_malloc(CB_INCR); - if (!comment_buffer) + if (!(*comment_buffer)) { + *comment_buffer = ast_malloc(CB_INCR); + if (!(*comment_buffer)) return; - comment_buffer[0] = 0; - comment_buffer_size = CB_INCR; - lline_buffer = ast_malloc(CB_INCR); - if (!lline_buffer) + (*comment_buffer)[0] = 0; + *comment_buffer_size = CB_INCR; + *lline_buffer = ast_malloc(CB_INCR); + if (!(*lline_buffer)) return; - lline_buffer[0] = 0; - lline_buffer_size = CB_INCR; + (*lline_buffer)[0] = 0; + *lline_buffer_size = CB_INCR; } else { - comment_buffer[0] = 0; - lline_buffer[0] = 0; + (*comment_buffer)[0] = 0; + (*lline_buffer)[0] = 0; } } -static void CB_ADD(char *str) +static void CB_ADD(char **comment_buffer, int *comment_buffer_size, char *str) { - int rem = comment_buffer_size - strlen(comment_buffer) - 1; + int rem = *comment_buffer_size - strlen(*comment_buffer) - 1; int siz = strlen(str); if (rem < siz+1) { - comment_buffer = ast_realloc(comment_buffer, comment_buffer_size + CB_INCR + siz + 1); - if (!comment_buffer) + *comment_buffer = ast_realloc(*comment_buffer, *comment_buffer_size + CB_INCR + siz + 1); + if (!(*comment_buffer)) return; - comment_buffer_size += CB_INCR+siz+1; + *comment_buffer_size += CB_INCR+siz+1; } - strcat(comment_buffer,str); + strcat(*comment_buffer,str); } -static void CB_ADD_LEN(char *str, int len) +static void CB_ADD_LEN(char **comment_buffer, int *comment_buffer_size, char *str, int len) { - int cbl = strlen(comment_buffer) + 1; - int rem = comment_buffer_size - cbl; + int cbl = strlen(*comment_buffer) + 1; + int rem = *comment_buffer_size - cbl; if (rem < len+1) { - comment_buffer = ast_realloc(comment_buffer, comment_buffer_size + CB_INCR + len + 1); - if (!comment_buffer) + *comment_buffer = ast_realloc(*comment_buffer, *comment_buffer_size + CB_INCR + len + 1); + if (!(*comment_buffer)) return; - comment_buffer_size += CB_INCR+len+1; + *comment_buffer_size += CB_INCR+len+1; } - strncat(comment_buffer,str,len); - comment_buffer[cbl+len-1] = 0; + strncat(*comment_buffer,str,len); + (*comment_buffer)[cbl+len-1] = 0; } -static void LLB_ADD(char *str) +static void LLB_ADD(char **lline_buffer, int *lline_buffer_size, char *str) { - int rem = lline_buffer_size - strlen(lline_buffer) - 1; + int rem = *lline_buffer_size - strlen(*lline_buffer) - 1; int siz = strlen(str); if (rem < siz+1) { - lline_buffer = ast_realloc(lline_buffer, lline_buffer_size + CB_INCR + siz + 1); - if (!lline_buffer) + *lline_buffer = ast_realloc(*lline_buffer, *lline_buffer_size + CB_INCR + siz + 1); + if (!(*lline_buffer)) return; - lline_buffer_size += CB_INCR + siz + 1; + *lline_buffer_size += CB_INCR + siz + 1; } - strcat(lline_buffer,str); + strcat(*lline_buffer,str); } -static void CB_RESET(void ) +static void CB_RESET(char **comment_buffer, char **lline_buffer) { - comment_buffer[0] = 0; - lline_buffer[0] = 0; + (*comment_buffer)[0] = 0; + (*lline_buffer)[0] = 0; } - static struct ast_comment *ALLOC_COMMENT(const char *buffer) @@ -599,7 +592,8 @@ void ast_config_set_current_category(struct ast_config *cfg, const struct ast_ca cfg->current = (struct ast_category *) cat; } -static int process_text_line(struct ast_config *cfg, struct ast_category **cat, char *buf, int lineno, const char *configfile, int withcomments) +static int process_text_line(struct ast_config *cfg, struct ast_category **cat, char *buf, int lineno, const char *configfile, int withcomments, + char **comment_buffer, int *comment_buffer_size, char **lline_buffer, int *lline_buffer_size) { char *c; char *cur = buf; @@ -627,14 +621,14 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat, return -1; } /* add comments */ - if (withcomments && comment_buffer && comment_buffer[0] ) { - newcat->precomments = ALLOC_COMMENT(comment_buffer); + if (withcomments && *comment_buffer && (*comment_buffer)[0] ) { + newcat->precomments = ALLOC_COMMENT(*comment_buffer); } - if (withcomments && lline_buffer && lline_buffer[0] ) { - newcat->sameline = ALLOC_COMMENT(lline_buffer); + if (withcomments && *lline_buffer && (*lline_buffer)[0] ) { + newcat->sameline = ALLOC_COMMENT(*lline_buffer); } if( withcomments ) - CB_RESET(); + CB_RESET(comment_buffer, lline_buffer); /* If there are options or categories to inherit from, process them now */ if (c) { @@ -648,7 +642,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat, (*cat)->ignored = 1; } else if (!strcasecmp(cur, "+")) { *cat = category_get(cfg, catname, 1); - if (!*cat) { + if (!(*cat)) { ast_config_destroy(cfg); if (newcat) ast_category_destroy(newcat); @@ -683,7 +677,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat, *c = '\0'; /* Find real argument */ c = ast_skip_blanks(c + 1); - if (!*c) + if (!(*c)) c = NULL; } else c = NULL; @@ -737,7 +731,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat, ast_log(LOG_WARNING, "Unknown directive '%s' at line %d of %s\n", cur, lineno, configfile); } else { /* Just a line (variable = value) */ - if (!*cat) { + if (!(*cat)) { ast_log(LOG_WARNING, "parse error: No category context for line %d of %s\n", lineno, configfile); return -1; @@ -759,14 +753,14 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat, v->blanklines = 0; ast_variable_append(*cat, v); /* add comments */ - if (withcomments && comment_buffer && comment_buffer[0] ) { - v->precomments = ALLOC_COMMENT(comment_buffer); + if (withcomments && *comment_buffer && (*comment_buffer)[0] ) { + v->precomments = ALLOC_COMMENT(*comment_buffer); } - if (withcomments && lline_buffer && lline_buffer[0] ) { - v->sameline = ALLOC_COMMENT(lline_buffer); + if (withcomments && *lline_buffer && (*lline_buffer)[0] ) { + v->sameline = ALLOC_COMMENT(*lline_buffer); } if( withcomments ) - CB_RESET(); + CB_RESET(comment_buffer, lline_buffer); } else { return -1; @@ -789,6 +783,13 @@ static struct ast_config *config_text_file_load(const char *database, const char struct ast_category *cat = NULL; int count = 0; struct stat statbuf; + /*! Growable string buffer */ + char *comment_buffer=0; /*!< this will be a comment collector.*/ + int comment_buffer_size=0; /*!< the amount of storage so far alloc'd for the comment_buffer */ + + char *lline_buffer=0; /*!< A buffer for stuff behind the ; */ + int lline_buffer_size=0; + cat = ast_config_get_current_category(cfg); @@ -799,7 +800,7 @@ static struct ast_config *config_text_file_load(const char *database, const char } if (withcomments) { - CB_INIT(); + CB_INIT(&comment_buffer, &comment_buffer_size, &lline_buffer, &lline_buffer_size); if (!lline_buffer || !comment_buffer) { ast_log(LOG_ERROR, "Failed to initialize the comment buffer!\n"); return NULL; @@ -855,7 +856,7 @@ static struct ast_config *config_text_file_load(const char *database, const char lineno++; if (fgets(buf, sizeof(buf), f)) { if ( withcomments ) { - CB_ADD(lline_buffer); /* add the current lline buffer to the comment buffer */ + CB_ADD(&comment_buffer, &comment_buffer_size, lline_buffer); /* add the current lline buffer to the comment buffer */ lline_buffer[0] = 0; /* erase the lline buffer */ } @@ -893,8 +894,8 @@ static struct ast_config *config_text_file_load(const char *database, const char char *oldptr; oldptr = process_buf + strlen(process_buf); if ( withcomments ) { - CB_ADD(";"); - CB_ADD_LEN(oldptr+1,new_buf-oldptr-1); + CB_ADD(&comment_buffer, &comment_buffer_size, ";"); + CB_ADD_LEN(&comment_buffer, &comment_buffer_size, oldptr+1, new_buf-oldptr-1); } memmove(oldptr, new_buf, strlen(new_buf) + 1); @@ -907,7 +908,7 @@ static struct ast_config *config_text_file_load(const char *database, const char /* If ; is found, and we are not nested in a comment, we immediately stop all comment processing */ if ( withcomments ) { - LLB_ADD(comment_p); + LLB_ADD(&lline_buffer, &lline_buffer_size, comment_p); } *comment_p = '\0'; new_buf = comment_p; @@ -917,13 +918,13 @@ static struct ast_config *config_text_file_load(const char *database, const char } if( withcomments && comment && !process_buf ) { - CB_ADD(buf); /* the whole line is a comment, store it */ + CB_ADD(&comment_buffer, &comment_buffer_size, buf); /* the whole line is a comment, store it */ } if (process_buf) { char *buf = ast_strip(process_buf); if (!ast_strlen_zero(buf)) { - if (process_text_line(cfg, &cat, buf, lineno, fn, withcomments)) { + if (process_text_line(cfg, &cat, buf, lineno, fn, withcomments, &comment_buffer, &comment_buffer_size, &lline_buffer, &lline_buffer_size)) { cfg = NULL; break; } |