summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/param/params.c112
1 files changed, 51 insertions, 61 deletions
diff --git a/source3/param/params.c b/source3/param/params.c
index 24bef0a506..44b44d99b6 100644
--- a/source3/param/params.c
+++ b/source3/param/params.c
@@ -99,9 +99,6 @@ extern bool in_client;
* bSize - The size of the global buffer <bufr>.
*/
-static char *bufr = NULL;
-static int bSize = 0;
-
/* we can't use FILE* due to the 256 fd limit - use this cheap hack
instead */
typedef struct {
@@ -212,7 +209,7 @@ static int EatComment( myFILE *InFile )
*
*****************************************************************************/
-static int Continuation(char *line, int pos )
+static int Continuation(uint8_t *line, int pos )
{
pos--;
while( (pos >= 0) && isspace((int)line[pos]))
@@ -235,7 +232,7 @@ static int Continuation(char *line, int pos )
* ------------------------------------------------------------------------ **
*/
-static bool Section( myFILE *InFile, bool (*sfunc)(const char *) )
+static bool Section( DATA_BLOB *buf, myFILE *InFile, bool (*sfunc)(const char *) )
{
int c;
int i;
@@ -260,37 +257,37 @@ static bool Section( myFILE *InFile, bool (*sfunc)(const char *) )
while( (EOF != c) && (c > 0) ) {
/* Check that the buffer is big enough for the next character. */
- if( i > (bSize - 2) ) {
- char *tb = (char *)SMB_REALLOC_KEEP_OLD_ON_ERROR( bufr, bSize +BUFR_INC );
+ if( i > (buf->length - 2) ) {
+ uint8_t *tb = (uint8_t *)SMB_REALLOC_KEEP_OLD_ON_ERROR(buf->data, buf->length+BUFR_INC );
if(!tb) {
DEBUG(0, ("%s Memory re-allocation failure.", func) );
return False;
}
- bufr = tb;
- bSize += BUFR_INC;
+ buf->data = tb;
+ buf->length += BUFR_INC;
}
/* Handle a single character other than section end. */
switch( c ) {
case '\n': /* Got newline before closing ']'. */
- i = Continuation( bufr, i ); /* Check for line continuation. */
+ i = Continuation( buf->data, i ); /* Check for line continuation. */
if( i < 0 ) {
- bufr[end] = '\0';
- DEBUG(0, ("%s Badly formed line in configuration file: %s\n", func, bufr ));
+ buf->data[end] = '\0';
+ DEBUG(0, ("%s Badly formed line in configuration file: %s\n", func, buf->data ));
return False;
}
- end = ( (i > 0) && (' ' == bufr[i - 1]) ) ? (i - 1) : (i);
+ end = ( (i > 0) && (' ' == buf->data[i - 1]) ) ? (i - 1) : (i);
c = mygetc( InFile ); /* Continue with next line. */
break;
default: /* All else are a valid name chars. */
if(isspace( c )) {
/* One space per whitespace region. */
- bufr[end] = ' ';
+ buf->data[end] = ' ';
i = end + 1;
c = EatWhitespace( InFile );
} else {
- bufr[i++] = c;
+ buf->data[i++] = c;
end = i;
c = mygetc( InFile );
}
@@ -298,13 +295,13 @@ static bool Section( myFILE *InFile, bool (*sfunc)(const char *) )
if (AtSectionEnd(InFile)) {
/* Got to the closing bracket. */
- bufr[end] = '\0';
+ buf->data[end] = '\0';
if( 0 == end ) {
/* Don't allow an empty name. */
DEBUG(0, ("%s Empty section name in configuration file.\n", func ));
return False;
}
- if( !sfunc(bufr) ) /* Got a valid name. Deal with it. */
+ if( !sfunc((char *)buf->data) ) /* Got a valid name. Deal with it. */
return False;
EatComment( InFile ); /* Finish off the line. */
return True;
@@ -313,7 +310,7 @@ static bool Section( myFILE *InFile, bool (*sfunc)(const char *) )
}
/* We arrive here if we've met the EOF before the closing bracket. */
- DEBUG(0, ("%s Unexpected EOF in the configuration file: %s\n", func, bufr ));
+ DEBUG(0, ("%s Unexpected EOF in the configuration file: %s\n", func, buf->data ));
return False;
}
@@ -341,7 +338,7 @@ static bool Section( myFILE *InFile, bool (*sfunc)(const char *) )
* ------------------------------------------------------------------------ **
*/
-static bool Parameter( myFILE *InFile, bool (*pfunc)(const char *, const char *), int c )
+static bool Parameter( DATA_BLOB *buf, myFILE *InFile, bool (*pfunc)(const char *, const char *), int c )
{
int i = 0; /* Position within bufr. */
int end = 0; /* bufr[end] is current end-of-string. */
@@ -351,15 +348,15 @@ static bool Parameter( myFILE *InFile, bool (*pfunc)(const char *, const char *)
/* Read the parameter name. */
while( 0 == vstart ) {
/* Loop until we've found the start of the value. */
- if( i > (bSize - 2) ) {
+ if( i > (buf->length - 2) ) {
/* Ensure there's space for next char. */
- char *tb = (char *)SMB_REALLOC_KEEP_OLD_ON_ERROR( bufr, bSize + BUFR_INC );
+ uint8_t *tb = (uint8_t *)SMB_REALLOC_KEEP_OLD_ON_ERROR( buf->data, buf->length + BUFR_INC );
if (!tb) {
DEBUG(0, ("%s Memory re-allocation failure.", func) );
return False;
}
- bufr = tb;
- bSize += BUFR_INC;
+ buf->data = tb;
+ buf->length += BUFR_INC;
}
switch(c) {
@@ -369,37 +366,37 @@ static bool Parameter( myFILE *InFile, bool (*pfunc)(const char *, const char *)
DEBUG(0, ("%s Invalid parameter name in config. file.\n", func ));
return False;
}
- bufr[end++] = '\0'; /* Mark end of string & advance. */
+ buf->data[end++] = '\0'; /* Mark end of string & advance. */
i = end; /* New string starts here. */
vstart = end; /* New string is parameter value. */
- bufr[i] = '\0'; /* New string is nul, for now. */
+ buf->data[i] = '\0'; /* New string is nul, for now. */
break;
case '\n': /* Find continuation char, else error. */
- i = Continuation( bufr, i );
+ i = Continuation( buf->data, i );
if( i < 0 ) {
- bufr[end] = '\0';
- DEBUG(1,("%s Ignoring badly formed line in configuration file: %s\n", func, bufr ));
+ buf->data[end] = '\0';
+ DEBUG(1,("%s Ignoring badly formed line in configuration file: %s\n", func, buf->data ));
return True;
}
- end = ( (i > 0) && (' ' == bufr[i - 1]) ) ? (i - 1) : (i);
+ end = ( (i > 0) && (' ' == buf->data[i - 1]) ) ? (i - 1) : (i);
c = mygetc( InFile ); /* Read past eoln. */
break;
case '\0': /* Shouldn't have EOF within param name. */
case EOF:
- bufr[i] = '\0';
- DEBUG(1,("%s Unexpected end-of-file at: %s\n", func, bufr ));
+ buf->data[i] = '\0';
+ DEBUG(1,("%s Unexpected end-of-file at: %s\n", func, buf->data ));
return True;
default:
if(isspace( c )) {
/* One ' ' per whitespace region. */
- bufr[end] = ' ';
+ buf->data[end] = ' ';
i = end + 1;
c = EatWhitespace( InFile );
} else {
- bufr[i++] = c;
+ buf->data[i++] = c;
end = i;
c = mygetc( InFile );
}
@@ -409,15 +406,15 @@ static bool Parameter( myFILE *InFile, bool (*pfunc)(const char *, const char *)
/* Now parse the value. */
c = EatWhitespace( InFile ); /* Again, trim leading whitespace. */
while( (EOF !=c) && (c > 0) ) {
- if( i > (bSize - 2) ) {
+ if( i > (buf->length - 2) ) {
/* Make sure there's enough room. */
- char *tb = (char *)SMB_REALLOC_KEEP_OLD_ON_ERROR( bufr, bSize + BUFR_INC );
+ uint8_t *tb = (uint8_t *)SMB_REALLOC_KEEP_OLD_ON_ERROR( buf->data, buf->length + BUFR_INC );
if (!tb) {
DEBUG(0, ("%s Memory re-allocation failure.", func));
return False;
}
- bufr = tb;
- bSize += BUFR_INC;
+ buf->data = tb;
+ buf->length += BUFR_INC;
}
switch(c) {
@@ -426,27 +423,27 @@ static bool Parameter( myFILE *InFile, bool (*pfunc)(const char *, const char *)
break; /* removes them. */
case '\n': /* Marks end of value unless there's a '\'. */
- i = Continuation( bufr, i );
+ i = Continuation( buf->data, i );
if( i < 0 ) {
c = 0;
} else {
- for( end = i; (end >= 0) && isspace((int)bufr[end]); end-- )
+ for( end = i; (end >= 0) && isspace((int)buf->data[end]); end-- )
;
c = mygetc( InFile );
}
break;
default: /* All others verbatim. Note that spaces do not advance <end>. This allows trimming */
- bufr[i++] = c;
+ buf->data[i++] = c;
if( !isspace( c ) ) /* of whitespace at the end of the line. */
end = i;
c = mygetc( InFile );
break;
}
}
- bufr[end] = '\0'; /* End of value. */
+ buf->data[end] = '\0'; /* End of value. */
- return( pfunc( bufr, &bufr[vstart] ) ); /* Pass name & value to pfunc(). */
+ return( pfunc( (char *)buf->data, (char *)&buf->data[vstart] ) ); /* Pass name & value to pfunc(). */
}
/* ------------------------------------------------------------------------ **
@@ -471,7 +468,7 @@ static bool Parameter( myFILE *InFile, bool (*pfunc)(const char *, const char *)
* ------------------------------------------------------------------------ **
*/
-static bool Parse( myFILE *InFile,
+static bool Parse( DATA_BLOB *buf, myFILE *InFile,
bool (*sfunc)(const char *),
bool (*pfunc)(const char *, const char *) )
{
@@ -490,7 +487,7 @@ static bool Parse( myFILE *InFile,
break;
case '[': /* Section Header. */
- if( !Section( InFile, sfunc ) )
+ if( !Section( buf, InFile, sfunc ) )
return False;
c = EatWhitespace( InFile );
break;
@@ -500,7 +497,7 @@ static bool Parse( myFILE *InFile,
break;
default: /* Parameter line. */
- if( !Parameter( InFile, pfunc, c ) )
+ if( !Parameter( buf, InFile, pfunc, c ) )
return False;
c = EatWhitespace( InFile );
break;
@@ -563,6 +560,7 @@ bool pm_process( const char *FileName,
int result;
myFILE *InFile;
const char *func = "params.c:pm_process() -";
+ DATA_BLOB buf;
InFile = OpenConfFile( FileName ); /* Open the config file. */
if( NULL == InFile )
@@ -570,25 +568,17 @@ bool pm_process( const char *FileName,
DEBUG( 3, ("%s Processing configuration file \"%s\"\n", func, FileName) );
- if( NULL != bufr ) {
- /* If we already have a buffer */
- /* (recursive call), then just */
- /* use it. */
- result = Parse( InFile, sfunc, pfunc );
- } else {
- bSize = BUFR_INC;
- bufr = (char *)SMB_MALLOC( bSize );
- if( NULL == bufr ) {
- DEBUG(0,("%s memory allocation failure.\n", func));
- myfile_close(InFile);
- return False;
- }
+ buf = data_blob(NULL, 256);
- result = Parse( InFile, sfunc, pfunc );
- SAFE_FREE( bufr );
- bSize = 0;
+ if (buf.data == NULL) {
+ DEBUG(0,("%s memory allocation failure.\n", func));
+ myfile_close(InFile);
+ return False;
}
+ result = Parse( &buf, InFile, sfunc, pfunc );
+ data_blob_free(&buf);
+
myfile_close(InFile);
if( !result ) {