1 /*
2  *   Copyright (c) 1997 Joerg Wunsch. All rights reserved.
3  *
4  *   Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
5  *
6  *   Redistribution and use in source and binary forms, with or without
7  *   modification, are permitted provided that the following conditions
8  *   are met:
9  *
10  *   1. Redistributions of source code must retain the above copyright
11  *      notice, this list of conditions and the following disclaimer.
12  *   2. Redistributions in binary form must reproduce the above copyright
13  *      notice, this list of conditions and the following disclaimer in the
14  *      documentation and/or other materials provided with the distribution.
15  *
16  *   THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  *   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  *   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  *   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  *   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  *   SUCH DAMAGE.
27  *
28  *---------------------------------------------------------------------------
29  *
30  *	i4b daemon - runtime configuration parser
31  *	-----------------------------------------
32  *
33  *	$Id: rc_parse.y,v 1.4 2003/09/05 13:31:04 pooka Exp $
34  *
35  * $FreeBSD$
36  *
37  *      last edit-date: [Mon Oct  2 22:51:23 2000]
38  *
39  *---------------------------------------------------------------------------*/
40 
41 %{
42 
43 /* #define YYDEBUG 1 */
44 
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <ctype.h>
48 
49 #include "monitor.h"	/* monitor access rights bit definitions */
50 #include "isdnd.h"
51 
52 #ifndef FALSE
53 # define FALSE 0
54 #endif
55 
56 #ifndef TRUE
57 # define TRUE 1
58 #endif
59 
60 extern void 	cfg_setval(int keyword);
61 extern void 	init_currrent_cfg_state(void);
62 extern void	reset_scanner(FILE *infile);
63 extern void 	yyerror(const char *msg);
64 extern int	yylex(void);
65 extern void	flush_config(void);
66 
67 extern int	lineno;
68 extern char	*yytext;
69 
70 extern struct isdn_ctrl_state * cur_ctrl;
71 
72 int		saw_system = 0;
73 %}
74 
75 %token		ACCTALL
76 %token		ACCTFILE
77 %token		ALERT
78 %token		ALIASFNAME
79 %token		ALIASING
80 %token		ANSWERPROG
81 %token		AUTOUPDOWN
82 %token		B1PROTOCOL
83 %token		BEEPCONNECT
84 %token		BUDGETCALLOUTPERIOD
85 %token		BUDGETCALLOUTNCALLS
86 %token		BUDGETCALLOUTSFILE
87 %token		BUDGETCALLOUTSFILEROTATE
88 %token		BUDGETCALLBACKPERIOD
89 %token		BUDGETCALLBACKNCALLS
90 %token		BUDGETCALLBACKSFILE
91 %token		BUDGETCALLBACKSFILEROTATE
92 %token		CALLBACKWAIT
93 %token		CALLEDBACKWAIT
94 %token		CALLIN
95 %token		CALLOUT
96 %token		CHANNELSTATE
97 %token		CONNECTPROG
98 %token		CONTROLLER
99 %token		DIALOUTTYPE
100 %token		DIALRANDINCR
101 %token		DIALRETRIES
102 %token		DIRECTION
103 %token		DISCONNECTPROG
104 %token		DOWNTIME
105 %token		DOWNTRIES
106 %token		EARLYHANGUP
107 %token		ENTRY
108 %token		EXTCALLATTR
109 %token		FIRMWARE
110 %token		FULLCMD
111 %token		HOLIDAYFILE
112 %token		IDLETIME_IN
113 %token		IDLETIME_OUT
114 %token		IDLE_ALG_OUT
115 %token		ISDNCHANNEL
116 %token		ISDNCONTROLLER
117 %token		ISDNTIME
118 %token		ISDNTXDELIN
119 %token		ISDNTXDELOUT
120 %token		LOCAL_PHONE_DIALOUT
121 %token		LOCAL_PHONE_INCOMING
122 %token		LOGEVENTS
123 %token		MAILER
124 %token		MAILTO
125 %token		MONITOR
126 %token		MONITORACCESS
127 %token		MONITORPORT
128 %token		MONITORSW
129 %token		NAME
130 %token		NO
131 %token		OFF
132 %token		ON
133 %token		PPP_AUTH_RECHALLENGE
134 %token		PPP_AUTH_PARANOID
135 %token		PPP_EXPECT_AUTH
136 %token		PPP_EXPECT_NAME
137 %token		PPP_EXPECT_PASSWORD
138 %token		PPP_SEND_AUTH
139 %token		PPP_SEND_NAME
140 %token		PPP_SEND_PASSWORD
141 %token		PROTOCOL
142 %token		RATESFILE
143 %token		RATETYPE
144 %token		REACTION
145 %token		RECOVERYTIME
146 %token		REGEXPR
147 %token		REGPROG
148 %token		REMOTE_NUMBERS_HANDLING
149 %token		REMOTE_PHONE_DIALOUT
150 %token		REMOTE_PHONE_INCOMING
151 %token		RESTRICTEDCMD
152 %token		ROTATESUFFIX
153 %token		RTPRIO
154 %token		SYSTEM
155 %token		TINAINITPROG
156 %token		UNITLENGTH
157 %token		UNITLENGTHSRC
158 %token		USEACCTFILE
159 %token		USEDOWN
160 %token		USRDEVICENAME
161 %token		USRDEVICEUNIT
162 %token		VALID
163 %token		YES
164 
165 
166 %token	<str>	NUMBERSTR
167 
168 %token	<str>	STRING
169 
170 %type	<booln>	boolean
171 
172 %type	<num>	sysfilekeyword sysnumkeyword sysstrkeyword sysboolkeyword
173 %type	<num>	filekeyword numkeyword strkeyword boolkeyword monrights monright
174 %type	<num>	cstrkeyword cfilekeyword
175 %type	<str>	filename
176 
177 %union {
178 	int 	booln;
179 	int	num;
180 	char 	*str;
181 }
182 
183 %%
184 
185 config:		sections
186 			{
187 				flush_config();
188 			}
189 		;
190 
191 sections:	possible_nullentries
192 		syssect
193 		optcontrollersects
194 		entrysects
195 		;
196 
197 possible_nullentries:
198 		/* lambda */
199 		| possible_nullentries error '\n'
200 		| possible_nullentries nullentry
201 		;
202 
203 nullentry:	'\n'
204 		;
205 
206 entrysects:	entrysect
207 		| entrysects entrysect
208 		;
209 
210 optcontrollersects:
211 		controllersects
212 		|
213 		;
214 
215 controllersects:  controllersect
216 		| controllersects controllersect
217 		;
218 
219 /* ============== */
220 /* system section */
221 /* ============== */
222 
223 syssect:	SYSTEM sysentries
224 		;
225 
226 sysentries:	sysentry
227 			{
228 				saw_system = 1;
229 				monitor_clear_rights();
230 			}
231 		| sysentries sysentry
232 		;
233 
234 sysentry:	sysfileentry
235 		| sysboolentry
236 		| sysnumentry
237 		| sysstrentry
238 		| sysmonitorstart
239 		| sysmonitorrights
240 		| nullentry
241 		| error '\n'
242 		;
243 
244 
245 sysmonitorstart:
246 		MONITOR '=' STRING '\n'
247 			{
248 			    char *err = NULL;
249 			    switch (monitor_start_rights($3)) {
250 			    	case I4BMAR_OK:
251 			    		break;
252 			    	case I4BMAR_LENGTH:
253 			    		err = "local socket name too long: %s";
254 			    		break;
255 			    	case I4BMAR_DUP:
256 			    		err = "duplicate entry: %s";
257 			    		break;
258 			    	case I4BMAR_CIDR:
259 			    		err = "invalid CIDR specification: %s";
260 			    		break;
261 			    	case I4BMAR_NOIP:
262 			    		err = "could not resolve host or net specification: %s";
263 			    		break;
264 			    }
265 			    if (err) {
266 			    	char msg[1024];
267 		    		snprintf(msg, sizeof msg, err, $3);
268 		    		yyerror(msg);
269 		    	    }
270 			}
271 		;
272 
273 sysmonitorrights:
274 		MONITORACCESS '=' monrights '\n'
275 			{ monitor_add_rights($3); }
276 		;
277 
278 monrights:	monrights ',' monright	{ $$ = $1 | $3; }
279 		| monright		{ $$ = $1; }
280 		;
281 
282 monright:	FULLCMD			{ $$ = I4B_CA_COMMAND_FULL; }
283 		| RESTRICTEDCMD		{ $$ = I4B_CA_COMMAND_RESTRICTED; }
284 		| CHANNELSTATE		{ $$ = I4B_CA_EVNT_CHANSTATE; }
285 		| CALLIN		{ $$ = I4B_CA_EVNT_CALLIN; }
286 		| CALLOUT		{ $$ = I4B_CA_EVNT_CALLOUT; }
287 		| LOGEVENTS		{ $$ = I4B_CA_EVNT_I4B; }
288 		;
289 
290 sysfileentry:	sysfilekeyword '=' filename '\n'
291 			{
292 			cfg_setval($1);
293 			}
294 		;
295 
296 sysboolentry:	sysboolkeyword '=' boolean '\n'
297 			{
298 			yylval.booln = $3;
299 			cfg_setval($1);
300 			}
301 		;
302 
303 sysnumentry:	sysnumkeyword '=' NUMBERSTR '\n'
304 			{
305 			yylval.num = atoi($3);
306 			cfg_setval($1);
307 			}
308 		;
309 
310 sysstrentry:	  sysstrkeyword '=' STRING '\n'
311 			{
312 			cfg_setval($1);
313 			}
314 		| sysstrkeyword '=' NUMBERSTR '\n'
315 			{
316 			cfg_setval($1);
317 			}
318 		;
319 
320 filename:	STRING		{
321 					if ($1[0] != '/')
322 					{
323 						yyerror("filename doesn't start with a slash");
324 						YYERROR;
325 					}
326 					$$ = $1;
327 				}
328 		;
329 
330 boolean:	  NO			{ $$ = FALSE; }
331 		| OFF			{ $$ = FALSE; }
332 		| ON			{ $$ = TRUE; }
333 		| YES			{ $$ = TRUE; }
334 		;
335 
336 sysfilekeyword:	  RATESFILE		{ $$ = RATESFILE; }
337 		| ACCTFILE		{ $$ = ACCTFILE; }
338 		| ALIASFNAME		{ $$ = ALIASFNAME; }
339 		| HOLIDAYFILE		{ $$ = HOLIDAYFILE; }
340 		| TINAINITPROG		{ $$ = TINAINITPROG; }
341 		;
342 
343 sysboolkeyword:	  USEACCTFILE		{ $$ = USEACCTFILE; }
344 		| ALIASING		{ $$ = ALIASING; }
345 		| ACCTALL		{ $$ = ACCTALL; }
346 		| BEEPCONNECT		{ $$ = BEEPCONNECT; }
347 		| EXTCALLATTR		{ $$ = EXTCALLATTR; }
348 		| ISDNTIME		{ $$ = ISDNTIME; }
349 		| MONITORSW		{ $$ = MONITORSW; }
350 		;
351 
352 sysnumkeyword:	  MONITORPORT		{ $$ = MONITORPORT; }
353 		| RTPRIO		{ $$ = RTPRIO; }
354 		;
355 
356 sysstrkeyword:	  MAILER		{ $$ = MAILER; }
357 		| MAILTO		{ $$ = MAILTO; }
358 		| ROTATESUFFIX		{ $$ = ROTATESUFFIX; }
359 		| REGEXPR		{ $$ = REGEXPR; }
360 		| REGPROG		{ $$ = REGPROG; }
361 		;
362 
363 /* ============= */
364 /* entry section */
365 /* ============= */
366 
367 entrysect:	ENTRY
368 			{
369 				init_currrent_cfg_state();
370 			}
371 		entries
372 		;
373 
374 entries:	entry
375 		| entries entry
376 		;
377 
378 entry:		fileentry
379 		| strentry
380 		| numentry
381 		| boolentry
382 		| nullentry
383 		| error '\n'
384 		;
385 
386 fileentry:	filekeyword '=' filename '\n'
387 			{
388 			cfg_setval($1);
389 			}
390 		;
391 
392 
393 strentry:	strkeyword '=' STRING '\n'
394 			{
395 			cfg_setval($1);
396 			}
397 		| strkeyword '=' NUMBERSTR '\n'
398 			{
399 			cfg_setval($1);
400 			}
401 		;
402 
403 boolentry:	boolkeyword '=' boolean '\n'
404 			{
405 			yylval.booln = $3;
406 			cfg_setval($1);
407 			}
408 		;
409 
410 numentry:	numkeyword '=' NUMBERSTR '\n'
411 			{
412 			yylval.num = atoi($3);
413 			cfg_setval($1);
414 			}
415 		;
416 
417 filekeyword:	  BUDGETCALLBACKSFILE	{ $$ = BUDGETCALLBACKSFILE; }
418 		| BUDGETCALLOUTSFILE	{ $$ = BUDGETCALLOUTSFILE; }
419 		;
420 
421 strkeyword:	  ANSWERPROG		{ $$ = ANSWERPROG; }
422 		| B1PROTOCOL		{ $$ = B1PROTOCOL; }
423 		| CONNECTPROG		{ $$ = CONNECTPROG; }
424 		| DIALOUTTYPE		{ $$ = DIALOUTTYPE; }
425 		| DIRECTION		{ $$ = DIRECTION; }
426 		| DISCONNECTPROG	{ $$ = DISCONNECTPROG; }
427 		| IDLE_ALG_OUT		{ $$ = IDLE_ALG_OUT; }
428 		| LOCAL_PHONE_INCOMING	{ $$ = LOCAL_PHONE_INCOMING; }
429 		| LOCAL_PHONE_DIALOUT	{ $$ = LOCAL_PHONE_DIALOUT; }
430 		| NAME			{ $$ = NAME; }
431 		| PPP_EXPECT_AUTH	{ $$ = PPP_EXPECT_AUTH; }
432 		| PPP_EXPECT_NAME	{ $$ = PPP_EXPECT_NAME; }
433 		| PPP_EXPECT_PASSWORD	{ $$ = PPP_EXPECT_PASSWORD; }
434 		| PPP_SEND_AUTH		{ $$ = PPP_SEND_AUTH; }
435 		| PPP_SEND_NAME		{ $$ = PPP_SEND_NAME; }
436 		| PPP_SEND_PASSWORD	{ $$ = PPP_SEND_PASSWORD; }
437 		| REACTION		{ $$ = REACTION; }
438 		| REMOTE_NUMBERS_HANDLING { $$ = REMOTE_NUMBERS_HANDLING; }
439 		| REMOTE_PHONE_INCOMING	{ $$ = REMOTE_PHONE_INCOMING; }
440 		| REMOTE_PHONE_DIALOUT	{ $$ = REMOTE_PHONE_DIALOUT; }
441 		| UNITLENGTHSRC		{ $$ = UNITLENGTHSRC; }
442 		| USRDEVICENAME		{ $$ = USRDEVICENAME; }
443 		| VALID			{ $$ = VALID; }
444 		;
445 
446 numkeyword:	  ALERT			{ $$ = ALERT; }
447 		| BUDGETCALLBACKPERIOD	{ $$ = BUDGETCALLBACKPERIOD; }
448 		| BUDGETCALLBACKNCALLS	{ $$ = BUDGETCALLBACKNCALLS; }
449 		| BUDGETCALLOUTPERIOD	{ $$ = BUDGETCALLOUTPERIOD; }
450 		| BUDGETCALLOUTNCALLS	{ $$ = BUDGETCALLOUTNCALLS; }
451 		| CALLBACKWAIT		{ $$ = CALLBACKWAIT; }
452 		| CALLEDBACKWAIT	{ $$ = CALLEDBACKWAIT; }
453 		| DIALRETRIES		{ $$ = DIALRETRIES; }
454 		| EARLYHANGUP		{ $$ = EARLYHANGUP; }
455 		| IDLETIME_IN		{ $$ = IDLETIME_IN; }
456 		| IDLETIME_OUT		{ $$ = IDLETIME_OUT; }
457 		| ISDNCONTROLLER	{ $$ = ISDNCONTROLLER; }
458 		| ISDNCHANNEL		{ $$ = ISDNCHANNEL; }
459 		| ISDNTXDELIN		{ $$ = ISDNTXDELIN; }
460 		| ISDNTXDELOUT		{ $$ = ISDNTXDELOUT; }
461 		| RATETYPE		{ $$ = RATETYPE; }
462 		| RECOVERYTIME		{ $$ = RECOVERYTIME; }
463 		| UNITLENGTH		{ $$ = UNITLENGTH; }
464 		| USRDEVICEUNIT		{ $$ = USRDEVICEUNIT; }
465 		| DOWNTIME		{ $$ = DOWNTIME; }
466 		| DOWNTRIES		{ $$ = DOWNTRIES; }
467 		;
468 
469 boolkeyword:	  AUTOUPDOWN		{ $$ = AUTOUPDOWN; }
470                 | BUDGETCALLBACKSFILEROTATE { $$ = BUDGETCALLBACKSFILEROTATE; }
471 		| BUDGETCALLOUTSFILEROTATE  { $$ = BUDGETCALLOUTSFILEROTATE; }
472 		| DIALRANDINCR		{ $$ = DIALRANDINCR; }
473 		| PPP_AUTH_RECHALLENGE	{ $$ = PPP_AUTH_RECHALLENGE; }
474 		| PPP_AUTH_PARANOID	{ $$ = PPP_AUTH_PARANOID; }
475 		| USEDOWN		{ $$ = USEDOWN; }
476 		;
477 
478 /* ================== */
479 /* controller section */
480 /* ================== */
481 
482 controllersect:	CONTROLLER
483 		{
484 			cur_ctrl = NULL;
485 		}
486 		controllers
487 		;
488 
489 controllers:	controller {
490 			if (cur_ctrl)
491 				cur_ctrl = NEXT_CTRL(cur_ctrl);
492 			else
493 				cur_ctrl = get_first_ctrl_state();
494 		}
495 		| controllers controller
496 		;
497 
498 controller:	strcontroller
499 		| nullentry
500 		| error '\n'
501 		;
502 
503 strcontroller:	cstrkeyword '=' STRING '\n'
504 			{
505 			cfg_setval($1);
506 			}
507 		| cstrkeyword '=' NUMBERSTR '\n'
508 			{
509 			cfg_setval($1);
510 			}
511 		| cfilekeyword '=' filename '\n'
512 			{
513 			cfg_setval($1);
514 			}
515 		;
516 
517 cstrkeyword:	  PROTOCOL		{ $$ = PROTOCOL; }
518 		;
519 
520 cfilekeyword:	  FIRMWARE		{ $$ = FIRMWARE; }
521 		;
522 
523 
524 %%
525