Annotation of embedaddon/igmpproxy/src/confread.c, revision 1.1.1.1
1.1 misho 1: /*
2: ** igmpproxy - IGMP proxy based multicast router
3: ** Copyright (C) 2005 Johnny Egeland <johnny@rlo.org>
4: **
5: ** This program is free software; you can redistribute it and/or modify
6: ** it under the terms of the GNU General Public License as published by
7: ** the Free Software Foundation; either version 2 of the License, or
8: ** (at your option) any later version.
9: **
10: ** This program is distributed in the hope that it will be useful,
11: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: ** GNU General Public License for more details.
14: **
15: ** You should have received a copy of the GNU General Public License
16: ** along with this program; if not, write to the Free Software
17: ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18: **
19: **----------------------------------------------------------------------------
20: **
21: ** This software is derived work from the following software. The original
22: ** source code has been modified from it's original state by the author
23: ** of igmpproxy.
24: **
25: ** smcroute 0.92 - Copyright (C) 2001 Carsten Schill <carsten@cschill.de>
26: ** - Licensed under the GNU General Public License, version 2
27: **
28: ** mrouted 3.9-beta3 - COPYRIGHT 1989 by The Board of Trustees of
29: ** Leland Stanford Junior University.
30: ** - Original license can be found in the Stanford.txt file.
31: **
32: */
33: /**
34: * confread.c
35: *
36: * Generic config file reader. Used to open a config file,
37: * and read the tokens from it. The parser is really simple,
38: * and does no backlogging. This means that no form of
39: * text escaping and qouting is currently supported.
40: * '#' chars are read as comments, and the comment lasts until
41: * a newline or EOF
42: *
43: */
44:
45: #include "igmpproxy.h"
46:
47: #define READ_BUFFER_SIZE 512 // Inputbuffer size...
48:
49: #ifndef MAX_TOKEN_LENGTH
50: #define MAX_TOKEN_LENGTH 30 // Default max token length
51: #endif
52:
53: FILE *confFilePtr; // File handle pointer
54: char *iBuffer; // Inputbuffer for reading...
55: unsigned int bufPtr; // Buffer position pointer.
56: unsigned int readSize; // Number of bytes in buffer after last read...
57: char cToken[MAX_TOKEN_LENGTH]; // Token buffer...
58: short validToken;
59:
60: /**
61: * Opens config file specified by filename.
62: */
63: int openConfigFile(char *filename) {
64:
65: // Set the buffer to null initially...
66: iBuffer = NULL;
67:
68: // Open the file for reading...
69: confFilePtr = fopen(filename, "r");
70:
71: // On error, return false
72: if(confFilePtr == NULL) {
73: return 0;
74: }
75:
76: // Allocate memory for inputbuffer...
77: iBuffer = (char*) malloc( sizeof(char) * READ_BUFFER_SIZE );
78:
79: if(iBuffer == NULL) {
80: closeConfigFile();
81: return 0;
82: }
83:
84: // Reset bufferpointer and readsize
85: bufPtr = 0;
86: readSize = 0;
87:
88: return 1;
89: }
90:
91: /**
92: * Closes the currently open config file.
93: */
94: void closeConfigFile() {
95: // Close the file.
96: if(confFilePtr!=NULL) {
97: fclose(confFilePtr);
98: }
99: // Free input buffer memory...
100: if(iBuffer != NULL) {
101: free(iBuffer);
102: }
103: }
104:
105: /**
106: * Returns the next token from the configfile. The function
107: * return NULL if there are no more tokens in the file.
108: */
109: char *nextConfigToken() {
110:
111: validToken = 0;
112:
113: // If no file or buffer, return NULL
114: if(confFilePtr == NULL || iBuffer == NULL) {
115: return NULL;
116: }
117:
118: {
119: unsigned int tokenPtr = 0;
120: unsigned short finished = 0;
121: unsigned short commentFound = 0;
122:
123: // Outer buffer fill loop...
124: while ( !finished ) {
125: // If readpointer is at the end of the buffer, we should read next chunk...
126: if(bufPtr == readSize) {
127: // Fill up the buffer...
128: readSize = fread (iBuffer, sizeof(char), READ_BUFFER_SIZE, confFilePtr);
129: bufPtr = 0;
130:
131: // If the readsize is 0, we should just return...
132: if(readSize == 0) {
133: return NULL;
134: }
135: }
136:
137: // Inner char loop...
138: while ( bufPtr < readSize && !finished ) {
139:
140: //printf("Char %s", iBuffer[bufPtr]);
141:
142: // Break loop on \0
143: if(iBuffer[bufPtr] == '\0') {
144: break;
145: }
146:
147: if( commentFound ) {
148: if( iBuffer[bufPtr] == '\n' ) {
149: commentFound = 0;
150: }
151: } else {
152:
153: // Check current char...
154: switch(iBuffer[bufPtr]) {
155: case '#':
156: // Found a comment start...
157: commentFound = 1;
158: break;
159:
160: case '\n':
161: case '\r':
162: case '\t':
163: case ' ':
164: // Newline, CR, Tab and space are end of token, or ignored.
165: if(tokenPtr > 0) {
166: cToken[tokenPtr] = '\0'; // EOL
167: finished = 1;
168: }
169: break;
170:
171: default:
172: // Append char to token...
173: cToken[tokenPtr++] = iBuffer[bufPtr];
174: break;
175: }
176:
177: }
178:
179: // Check end of token buffer !!!
180: if(tokenPtr == MAX_TOKEN_LENGTH - 1) {
181: // Prevent buffer overrun...
182: cToken[tokenPtr] = '\0';
183: finished = 1;
184: }
185:
186: // Next char...
187: bufPtr++;
188: }
189: // If the readsize is less than buffersize, we assume EOF.
190: if(readSize < READ_BUFFER_SIZE && bufPtr == readSize) {
191: if (tokenPtr > 0)
192: finished = 1;
193: else
194: return NULL;
195: }
196: }
197: if(tokenPtr>0) {
198: validToken = 1;
199: return cToken;
200: }
201: }
202: return NULL;
203: }
204:
205:
206: /**
207: * Returns the currently active token, or null
208: * if no tokens are availible.
209: */
210: char *getCurrentConfigToken() {
211: return validToken ? cToken : NULL;
212: }
213:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>