File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / igmpproxy / src / confread.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:00:29 2012 UTC (12 years, 10 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

/*
**  igmpproxy - IGMP proxy based multicast router 
**  Copyright (C) 2005 Johnny Egeland <johnny@rlo.org>
**
**  This program is free software; you can redistribute it and/or modify
**  it under the terms of the GNU General Public License as published by
**  the Free Software Foundation; either version 2 of the License, or
**  (at your option) any later version.
**
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with this program; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
**
**----------------------------------------------------------------------------
**
**  This software is derived work from the following software. The original
**  source code has been modified from it's original state by the author
**  of igmpproxy.
**
**  smcroute 0.92 - Copyright (C) 2001 Carsten Schill <carsten@cschill.de>
**  - Licensed under the GNU General Public License, version 2
**  
**  mrouted 3.9-beta3 - COPYRIGHT 1989 by The Board of Trustees of 
**  Leland Stanford Junior University.
**  - Original license can be found in the Stanford.txt file.
**
*/
/**
*   confread.c
*
*   Generic config file reader. Used to open a config file,
*   and read the tokens from it. The parser is really simple,
*   and does no backlogging. This means that no form of
*   text escaping and qouting is currently supported.
*   '#' chars are read as comments, and the comment lasts until 
*   a newline or EOF
*
*/

#include "igmpproxy.h"

#define     READ_BUFFER_SIZE    512   // Inputbuffer size...
        
#ifndef MAX_TOKEN_LENGTH
  #define MAX_TOKEN_LENGTH  30     // Default max token length
#endif
                                     
FILE            *confFilePtr;       // File handle pointer
char            *iBuffer;           // Inputbuffer for reading...
unsigned int    bufPtr;             // Buffer position pointer.
unsigned int    readSize;           // Number of bytes in buffer after last read...
char    cToken[MAX_TOKEN_LENGTH];   // Token buffer...
short   validToken;

/**
*   Opens config file specified by filename.
*/    
int openConfigFile(char *filename) {

    // Set the buffer to null initially...
    iBuffer = NULL;

    // Open the file for reading...
    confFilePtr = fopen(filename, "r");
    
    // On error, return false
    if(confFilePtr == NULL) {
        return 0;
    }
    
    // Allocate memory for inputbuffer...
    iBuffer = (char*) malloc( sizeof(char) * READ_BUFFER_SIZE );
    
    if(iBuffer == NULL) {
        closeConfigFile();
        return 0;
    }
    
    // Reset bufferpointer and readsize
    bufPtr = 0;
    readSize = 0;

    return 1;
}

/**
*   Closes the currently open config file.
*/
void closeConfigFile() {
    // Close the file.
    if(confFilePtr!=NULL) {
        fclose(confFilePtr);
    }
    // Free input buffer memory...
    if(iBuffer != NULL) {
        free(iBuffer);
    }
}

/**
*   Returns the next token from the configfile. The function
*   return NULL if there are no more tokens in the file.    
*/
char *nextConfigToken() {

    validToken = 0;

    // If no file or buffer, return NULL
    if(confFilePtr == NULL || iBuffer == NULL) {
        return NULL;
    }

    {
        unsigned int tokenPtr       = 0;
        unsigned short finished     = 0;
        unsigned short commentFound = 0;

        // Outer buffer fill loop...
        while ( !finished ) {
            // If readpointer is at the end of the buffer, we should read next chunk...
            if(bufPtr == readSize) {
                // Fill up the buffer...
                readSize = fread (iBuffer, sizeof(char), READ_BUFFER_SIZE, confFilePtr);
                bufPtr = 0;

                // If the readsize is 0, we should just return...
                if(readSize == 0) {
                    return NULL;
                }
            }

            // Inner char loop...
            while ( bufPtr < readSize && !finished ) {

                //printf("Char %s", iBuffer[bufPtr]);

                // Break loop on \0
                if(iBuffer[bufPtr] == '\0') {
                    break;
                }

                if( commentFound ) {
                    if( iBuffer[bufPtr] == '\n' ) {
                        commentFound = 0;
                    }
                } else {

                    // Check current char...
                    switch(iBuffer[bufPtr]) {
                    case '#':
                        // Found a comment start...
                        commentFound = 1;
                        break;

                    case '\n':
                    case '\r':
                    case '\t':
                    case ' ':
                        // Newline, CR, Tab and space are end of token, or ignored.
                        if(tokenPtr > 0) {
                            cToken[tokenPtr] = '\0';    // EOL
                            finished = 1;
                        }
                        break;

                    default:
                        // Append char to token...
                        cToken[tokenPtr++] = iBuffer[bufPtr];
                        break;
                    }
                
                }

                // Check end of token buffer !!!
                if(tokenPtr == MAX_TOKEN_LENGTH - 1) {
                    // Prevent buffer overrun...
                    cToken[tokenPtr] = '\0';
                    finished = 1;
                }

                // Next char...
                bufPtr++;
            }
            // If the readsize is less than buffersize, we assume EOF.
            if(readSize < READ_BUFFER_SIZE && bufPtr == readSize) {
                if (tokenPtr > 0)
                    finished = 1;
                else
                    return NULL;
            }
        }
        if(tokenPtr>0) {
            validToken = 1;
            return cToken;
        }
    }
    return NULL;
}


/**
*   Returns the currently active token, or null
*   if no tokens are availible.
*/
char *getCurrentConfigToken() {
    return validToken ? cToken : NULL;
}


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>