Fixed crashes due to use of nested functions.
I have therefore added shared/fileio.c/h to encapsule buffered file operations, thus making it possible to re-read the configuration file unlike with the patch I committed to stable-0-4-4. See also: http://lists.omnipotent.net/pipermail/lcdproc/2003-December/008413.html
This commit is contained in:
+19
-25
@@ -25,6 +25,7 @@
|
|||||||
#endif /* WITH_LDAP_SUPPORT */
|
#endif /* WITH_LDAP_SUPPORT */
|
||||||
|
|
||||||
#include "shared/report.h"
|
#include "shared/report.h"
|
||||||
|
#include "shared/fileio.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct key {
|
typedef struct key {
|
||||||
@@ -48,7 +49,8 @@ section * find_section( char * sectionname );
|
|||||||
section * add_section( char * sectionname );
|
section * add_section( char * sectionname );
|
||||||
key * find_key( section * s, char * keyname, int skip );
|
key * find_key( section * s, char * keyname, int skip );
|
||||||
key * add_key( section * s, char * keyname, char * value );
|
key * add_key( section * s, char * keyname, char * value );
|
||||||
int process_config( section ** current_section, char (*get_next_char)(), char modify_section_allowed, char * source_descr );
|
char get_next_char_f(buffile * f);
|
||||||
|
int process_config( section ** current_section, char (*get_next_char)(), char modify_section_allowed, char * source_descr, buffile * f );
|
||||||
|
|
||||||
#ifdef WITH_LDAP_SUPPORT
|
#ifdef WITH_LDAP_SUPPORT
|
||||||
int connect_to_ldap(void);
|
int connect_to_ldap(void);
|
||||||
@@ -67,14 +69,9 @@ int ldap_port;
|
|||||||
|
|
||||||
/**** EXTERNAL FUNCTIONS ****/
|
/**** EXTERNAL FUNCTIONS ****/
|
||||||
|
|
||||||
#define FILECHUNKSIZE 10
|
|
||||||
|
|
||||||
int config_read_file( char *filename )
|
int config_read_file( char *filename )
|
||||||
{
|
{
|
||||||
FILE * f;
|
buffile * f;
|
||||||
char buf[FILECHUNKSIZE];
|
|
||||||
int bytesread=0;
|
|
||||||
int pos=0;
|
|
||||||
section * curr_section = NULL;
|
section * curr_section = NULL;
|
||||||
|
|
||||||
#ifdef WITH_LDAP_SUPPORT
|
#ifdef WITH_LDAP_SUPPORT
|
||||||
@@ -112,26 +109,14 @@ int config_read_file( char *filename )
|
|||||||
}
|
}
|
||||||
#endif /* WITH_LDAP_SUPPORT */
|
#endif /* WITH_LDAP_SUPPORT */
|
||||||
|
|
||||||
/* We use a nested fuction to transfer the characters from buffer to parser*/
|
f = buffile_open( filename, "r" );
|
||||||
char get_next_char() {
|
|
||||||
if( pos>=bytesread ) {
|
|
||||||
if( !( bytesread = fread( buf, 1, FILECHUNKSIZE, f ))) {
|
|
||||||
/* We're at the end*/
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pos = 0;
|
|
||||||
}
|
|
||||||
return buf[pos++];
|
|
||||||
}
|
|
||||||
|
|
||||||
f = fopen( filename, "r" );
|
|
||||||
if( f==NULL ) {
|
if( f==NULL ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
process_config( &curr_section, get_next_char, 1, filename );
|
process_config( &curr_section, get_next_char_f, 1, filename, f );
|
||||||
|
|
||||||
fclose( f );
|
buffile_close( f );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -152,7 +137,7 @@ int config_read_string( char *sectionname, char *str )
|
|||||||
s=add_section( sectionname );
|
s=add_section( sectionname );
|
||||||
}
|
}
|
||||||
|
|
||||||
process_config( &s, get_next_char, 0, "command line" );
|
process_config( &s, get_next_char, 0, "command line", NULL );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -565,6 +550,10 @@ key * add_key( section * s, char * keyname, char * value )
|
|||||||
return (*place);
|
return (*place);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char get_next_char_f(buffile * f) {
|
||||||
|
return ((char) buffile_read(f, 1)[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Parser states*/
|
/* Parser states*/
|
||||||
#define ST_INITIAL 0
|
#define ST_INITIAL 0
|
||||||
@@ -587,7 +576,7 @@ key * add_key( section * s, char * keyname, char * value )
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int process_config( section ** current_section, char (*get_next_char)(), char modify_section_allowed, char * source_descr )
|
int process_config( section ** current_section, char (*get_next_char)(), char modify_section_allowed, char * source_descr, buffile * f)
|
||||||
{
|
{
|
||||||
char state = ST_INITIAL;
|
char state = ST_INITIAL;
|
||||||
char ch;
|
char ch;
|
||||||
@@ -603,7 +592,12 @@ int process_config( section ** current_section, char (*get_next_char)(), char mo
|
|||||||
|
|
||||||
while( state != ST_END ) {
|
while( state != ST_END ) {
|
||||||
|
|
||||||
ch = get_next_char();
|
if (NULL != f) {
|
||||||
|
ch = get_next_char(f);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ch = get_next_char();
|
||||||
|
}
|
||||||
|
|
||||||
/* Secretly keep count of the line numbers*/
|
/* Secretly keep count of the line numbers*/
|
||||||
if( ch == '\n' ) {
|
if( ch == '\n' ) {
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* fileio.c
|
||||||
|
* This file is part of LCDd, the lcdproc server.
|
||||||
|
*
|
||||||
|
* This file is released under the GNU General Public License. Refer to the
|
||||||
|
* COPYING file distributed with this package.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Rene Wagner
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Defines routines to read from buffered files.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "fileio.h"
|
||||||
|
|
||||||
|
#define FILECHUNKSIZE 10
|
||||||
|
|
||||||
|
buffile *buffile_open( const char *path, const char *mode ) {
|
||||||
|
buffile * file = NULL;
|
||||||
|
|
||||||
|
file = malloc(sizeof(*file));
|
||||||
|
if ( NULL == file )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
file->pos=0;
|
||||||
|
file->bytesread=0;
|
||||||
|
|
||||||
|
file->f = fopen( path, mode );
|
||||||
|
if( NULL == file->f ) {
|
||||||
|
free(file);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
int buffile_close ( buffile * file ) {
|
||||||
|
int retval=0;
|
||||||
|
|
||||||
|
if (NULL == file)
|
||||||
|
return -1;
|
||||||
|
if ( NULL != file->f )
|
||||||
|
retval = fclose( file->f );
|
||||||
|
if ( NULL != file->buf )
|
||||||
|
free ( file->buf );
|
||||||
|
free (file);
|
||||||
|
file = NULL;
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * buffile_read ( buffile * file, size_t n ) {
|
||||||
|
char * returnbuf=NULL;
|
||||||
|
|
||||||
|
if( NULL == file )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
returnbuf = malloc(n);
|
||||||
|
if( NULL == returnbuf)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if( NULL == file->buf ) {
|
||||||
|
file->buf = malloc(FILECHUNKSIZE);
|
||||||
|
if( NULL == file->buf )
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( file->pos >= file->bytesread ) {
|
||||||
|
if( !( file->bytesread = fread( file->buf, 1, FILECHUNKSIZE, file->f ))) {
|
||||||
|
/* We're at the end*/
|
||||||
|
returnbuf[0]=0;
|
||||||
|
return returnbuf;
|
||||||
|
}
|
||||||
|
file->pos = 0;
|
||||||
|
}
|
||||||
|
strncpy(returnbuf, file->buf + (file->pos++), sizeof(returnbuf));
|
||||||
|
return returnbuf;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* fileio.h
|
||||||
|
* This file is part of LCDd, the lcdproc server.
|
||||||
|
*
|
||||||
|
* This file is released under the GNU General Public License. Refer to the
|
||||||
|
* COPYING file distributed with this package.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Rene Wagner
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Defines routines to read from buffered files.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FILEIO_H
|
||||||
|
#define FILEIO_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef struct buffile {
|
||||||
|
FILE * f;
|
||||||
|
char * buf;
|
||||||
|
int bytesread, pos;
|
||||||
|
} buffile;
|
||||||
|
|
||||||
|
buffile *buffile_open( const char *path, const char *mode );
|
||||||
|
/* Opens the given file and returns a pointer to the corresponding
|
||||||
|
* buffile object.
|
||||||
|
*/
|
||||||
|
int buffile_close ( buffile * file );
|
||||||
|
/* Tries to close the file corresponding to the given buffile
|
||||||
|
* object and to free the memory used by the buffile object itself.
|
||||||
|
* Returns 0 on success, return value of fclose(3) in case of errors
|
||||||
|
* with fclose.
|
||||||
|
*/
|
||||||
|
char * buffile_read ( buffile * file, size_t n );
|
||||||
|
/* Reads n bytes from the given buffile object.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user