MFC r1.6 r1.30 r1.28 (HEAD):
[dragonfly.git] / usr.sbin / i4b / isdnd / rc_parse.y
blob55143306502bfc3b2062eccd8a7b15eee6052e3b
1 /*
2 * Copyright (c) 1997 Joerg Wunsch. All rights reserved.
4 * Copyright (c) 1997, 2001 Hellmuth Michaelis. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
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.
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.
28 *---------------------------------------------------------------------------
30 * i4b daemon - runtime configuration parser
31 * -----------------------------------------
33 * $FreeBSD: src/usr.sbin/i4b/isdnd/rc_parse.y,v 1.6.2.2 2001/08/10 23:17:32 obrien Exp $
34 * $DragonFly: src/usr.sbin/i4b/isdnd/rc_parse.y,v 1.2 2003/06/17 04:29:54 dillon Exp $
36 * last edit-date: [Fri Jul 20 19:14:23 2001]
38 *---------------------------------------------------------------------------*/
42 /* #define YYDEBUG 1 */
44 #include <stdio.h>
45 #include <stdlib.h>
46 #include <ctype.h>
48 #include "monitor.h" /* monitor access rights bit definitions */
49 #include "isdnd.h"
51 #ifndef FALSE
52 # define FALSE 0
53 #endif
55 #ifndef TRUE
56 # define TRUE 1
57 #endif
59 extern void cfg_setval(int keyword);
60 extern void cfg_set_controller_default();
61 extern void reset_scanner(FILE *infile);
62 extern void yyerror(const char *msg);
63 extern int yylex();
65 extern int lineno;
66 extern char *yytext;
67 extern int nentries;
69 int saw_system = 0;
70 int entrycount = -1;
71 int controllercount = -1;
75 %token ACCTALL
76 %token ACCTFILE
77 %token ALERT
78 %token ALIASFNAME
79 %token ALIASING
80 %token ANSWERPROG
81 %token B1PROTOCOL
82 %token BEEPCONNECT
83 %token BUDGETCALLOUTPERIOD
84 %token BUDGETCALLOUTNCALLS
85 %token BUDGETCALLOUTSFILE
86 %token BUDGETCALLOUTSFILEROTATE
87 %token BUDGETCALLBACKPERIOD
88 %token BUDGETCALLBACKNCALLS
89 %token BUDGETCALLBACKSFILE
90 %token BUDGETCALLBACKSFILEROTATE
91 %token CALLBACKWAIT
92 %token CALLEDBACKWAIT
93 %token CALLIN
94 %token CALLOUT
95 %token CHANNELSTATE
96 %token CLONE
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 MAXCONNECTTIME
126 %token MONITOR
127 %token MONITORACCESS
128 %token MONITORPORT
129 %token MONITORSW
130 %token NAME
131 %token NO
132 %token OFF
133 %token ON
134 %token PPP_AUTH_RECHALLENGE
135 %token PPP_AUTH_PARANOID
136 %token PPP_EXPECT_AUTH
137 %token PPP_EXPECT_NAME
138 %token PPP_EXPECT_PASSWORD
139 %token PPP_SEND_AUTH
140 %token PPP_SEND_NAME
141 %token PPP_SEND_PASSWORD
142 %token PROTOCOL
143 %token RATESFILE
144 %token RATETYPE
145 %token REACTION
146 %token RECOVERYTIME
147 %token REGEXPR
148 %token REGPROG
149 %token REMOTE_NUMBERS_HANDLING
150 %token REMOTE_PHONE_DIALOUT
151 %token REMOTE_PHONE_INCOMING
152 %token RESTRICTEDCMD
153 %token ROTATESUFFIX
154 %token RTPRIO
155 %token SYSTEM
156 %token TINAINITPROG
157 %token UNITLENGTH
158 %token UNITLENGTHSRC
159 %token USEACCTFILE
160 %token USEDOWN
161 %token USRDEVICENAME
162 %token USRDEVICEUNIT
163 %token VALID
164 %token YES
167 %token <str> NUMBERSTR
169 %token <str> STRING
171 %type <booln> boolean
173 %type <num> sysfilekeyword sysnumkeyword sysstrkeyword sysboolkeyword
174 %type <num> filekeyword numkeyword strkeyword boolkeyword monrights monright
175 %type <num> cstrkeyword cfilekeyword
176 %type <str> filename
178 %union {
179 int booln;
180 int num;
181 char *str;
186 config: sections
189 sections: possible_nullentries
190 syssect
191 optcontrollersects
192 entrysects
195 possible_nullentries:
196 /* lambda */
197 | possible_nullentries error '\n'
198 | possible_nullentries nullentry
201 nullentry: '\n'
204 entrysects: entrysect
205 | entrysects entrysect
208 optcontrollersects:
209 controllersects
212 cfg_set_controller_default();
216 controllersects: controllersect
217 | controllersects controllersect
220 /* ============== */
221 /* system section */
222 /* ============== */
224 syssect: SYSTEM sysentries
227 sysentries: sysentry
229 saw_system = 1;
230 monitor_clear_rights();
232 | sysentries sysentry
235 sysentry: sysfileentry
236 | sysboolentry
237 | sysnumentry
238 | sysstrentry
239 | sysmonitorstart
240 | sysmonitorrights
241 | nullentry
242 | error '\n'
246 sysmonitorstart:
247 MONITOR '=' STRING '\n'
249 char *err = NULL;
250 switch (monitor_start_rights($3)) {
251 case I4BMAR_OK:
252 break;
253 case I4BMAR_LENGTH:
254 err = "local socket name too long: %s";
255 break;
256 case I4BMAR_DUP:
257 err = "duplicate entry: %s";
258 break;
259 case I4BMAR_CIDR:
260 err = "invalid CIDR specification: %s";
261 break;
262 case I4BMAR_NOIP:
263 err = "could not resolve host or net specification: %s";
264 break;
266 if (err) {
267 char msg[1024];
268 snprintf(msg, sizeof msg, err, $3);
269 yyerror(msg);
274 sysmonitorrights:
275 MONITORACCESS '=' monrights '\n'
276 { monitor_add_rights($3); }
279 monrights: monrights ',' monright { $$ = $1 | $3; }
280 | monright { $$ = $1; }
283 monright: FULLCMD { $$ = I4B_CA_COMMAND_FULL; }
284 | RESTRICTEDCMD { $$ = I4B_CA_COMMAND_RESTRICTED; }
285 | CHANNELSTATE { $$ = I4B_CA_EVNT_CHANSTATE; }
286 | CALLIN { $$ = I4B_CA_EVNT_CALLIN; }
287 | CALLOUT { $$ = I4B_CA_EVNT_CALLOUT; }
288 | LOGEVENTS { $$ = I4B_CA_EVNT_I4B; }
291 sysfileentry: sysfilekeyword '=' filename '\n'
293 cfg_setval($1);
297 sysboolentry: sysboolkeyword '=' boolean '\n'
299 yylval.booln = $3;
300 cfg_setval($1);
304 sysnumentry: sysnumkeyword '=' NUMBERSTR '\n'
306 yylval.num = atoi($3);
307 cfg_setval($1);
311 sysstrentry: sysstrkeyword '=' STRING '\n'
313 cfg_setval($1);
315 | sysstrkeyword '=' NUMBERSTR '\n'
317 cfg_setval($1);
321 filename: STRING {
322 if ($1[0] != '/')
324 yyerror("filename doesn't start with a slash");
325 YYERROR;
327 $$ = $1;
331 boolean: NO { $$ = FALSE; }
332 | OFF { $$ = FALSE; }
333 | ON { $$ = TRUE; }
334 | YES { $$ = TRUE; }
337 sysfilekeyword: RATESFILE { $$ = RATESFILE; }
338 | ACCTFILE { $$ = ACCTFILE; }
339 | ALIASFNAME { $$ = ALIASFNAME; }
340 | HOLIDAYFILE { $$ = HOLIDAYFILE; }
341 | TINAINITPROG { $$ = TINAINITPROG; }
344 sysboolkeyword: USEACCTFILE { $$ = USEACCTFILE; }
345 | ALIASING { $$ = ALIASING; }
346 | ACCTALL { $$ = ACCTALL; }
347 | BEEPCONNECT { $$ = BEEPCONNECT; }
348 | EXTCALLATTR { $$ = EXTCALLATTR; }
349 | ISDNTIME { $$ = ISDNTIME; }
350 | MONITORSW { $$ = MONITORSW; }
353 sysnumkeyword: MONITORPORT { $$ = MONITORPORT; }
354 | RTPRIO { $$ = RTPRIO; }
357 sysstrkeyword: MAILER { $$ = MAILER; }
358 | MAILTO { $$ = MAILTO; }
359 | ROTATESUFFIX { $$ = ROTATESUFFIX; }
360 | REGEXPR { $$ = REGEXPR; }
361 | REGPROG { $$ = REGPROG; }
364 /* ============= */
365 /* entry section */
366 /* ============= */
368 entrysect: ENTRY
370 entrycount++;
371 nentries++;
373 entries
376 entries: entry
377 | entries entry
380 entry: fileentry
381 | strentry
382 | numentry
383 | boolentry
384 | nullentry
385 | error '\n'
388 fileentry: filekeyword '=' filename '\n'
390 cfg_setval($1);
395 strentry: strkeyword '=' STRING '\n'
397 cfg_setval($1);
399 | strkeyword '=' NUMBERSTR '\n'
401 cfg_setval($1);
405 boolentry: boolkeyword '=' boolean '\n'
407 yylval.booln = $3;
408 cfg_setval($1);
412 numentry: numkeyword '=' NUMBERSTR '\n'
414 yylval.num = atoi($3);
415 cfg_setval($1);
419 filekeyword: BUDGETCALLBACKSFILE { $$ = BUDGETCALLBACKSFILE; }
420 | BUDGETCALLOUTSFILE { $$ = BUDGETCALLOUTSFILE; }
423 strkeyword: ANSWERPROG { $$ = ANSWERPROG; }
424 | B1PROTOCOL { $$ = B1PROTOCOL; }
425 | CONNECTPROG { $$ = CONNECTPROG; }
426 | DIALOUTTYPE { $$ = DIALOUTTYPE; }
427 | DIRECTION { $$ = DIRECTION; }
428 | DISCONNECTPROG { $$ = DISCONNECTPROG; }
429 | IDLE_ALG_OUT { $$ = IDLE_ALG_OUT; }
430 | LOCAL_PHONE_INCOMING { $$ = LOCAL_PHONE_INCOMING; }
431 | LOCAL_PHONE_DIALOUT { $$ = LOCAL_PHONE_DIALOUT; }
432 | NAME { $$ = NAME; }
433 | PPP_EXPECT_AUTH { $$ = PPP_EXPECT_AUTH; }
434 | PPP_EXPECT_NAME { $$ = PPP_EXPECT_NAME; }
435 | PPP_EXPECT_PASSWORD { $$ = PPP_EXPECT_PASSWORD; }
436 | PPP_SEND_AUTH { $$ = PPP_SEND_AUTH; }
437 | PPP_SEND_NAME { $$ = PPP_SEND_NAME; }
438 | PPP_SEND_PASSWORD { $$ = PPP_SEND_PASSWORD; }
439 | REACTION { $$ = REACTION; }
440 | REMOTE_NUMBERS_HANDLING { $$ = REMOTE_NUMBERS_HANDLING; }
441 | REMOTE_PHONE_INCOMING { $$ = REMOTE_PHONE_INCOMING; }
442 | REMOTE_PHONE_DIALOUT { $$ = REMOTE_PHONE_DIALOUT; }
443 | UNITLENGTHSRC { $$ = UNITLENGTHSRC; }
444 | USRDEVICENAME { $$ = USRDEVICENAME; }
445 | VALID { $$ = VALID; }
446 | CLONE { $$ = CLONE; }
449 numkeyword: ALERT { $$ = ALERT; }
450 | BUDGETCALLBACKPERIOD { $$ = BUDGETCALLBACKPERIOD; }
451 | BUDGETCALLBACKNCALLS { $$ = BUDGETCALLBACKNCALLS; }
452 | BUDGETCALLOUTPERIOD { $$ = BUDGETCALLOUTPERIOD; }
453 | BUDGETCALLOUTNCALLS { $$ = BUDGETCALLOUTNCALLS; }
454 | CALLBACKWAIT { $$ = CALLBACKWAIT; }
455 | CALLEDBACKWAIT { $$ = CALLEDBACKWAIT; }
456 | DIALRETRIES { $$ = DIALRETRIES; }
457 | EARLYHANGUP { $$ = EARLYHANGUP; }
458 | IDLETIME_IN { $$ = IDLETIME_IN; }
459 | IDLETIME_OUT { $$ = IDLETIME_OUT; }
460 | ISDNCONTROLLER { $$ = ISDNCONTROLLER; }
461 | ISDNCHANNEL { $$ = ISDNCHANNEL; }
462 | ISDNTXDELIN { $$ = ISDNTXDELIN; }
463 | ISDNTXDELOUT { $$ = ISDNTXDELOUT; }
464 | RATETYPE { $$ = RATETYPE; }
465 | RECOVERYTIME { $$ = RECOVERYTIME; }
466 | UNITLENGTH { $$ = UNITLENGTH; }
467 | USRDEVICEUNIT { $$ = USRDEVICEUNIT; }
468 | DOWNTIME { $$ = DOWNTIME; }
469 | DOWNTRIES { $$ = DOWNTRIES; }
470 | MAXCONNECTTIME { $$ = MAXCONNECTTIME; }
473 boolkeyword: BUDGETCALLBACKSFILEROTATE { $$ = BUDGETCALLBACKSFILEROTATE; }
474 | BUDGETCALLOUTSFILEROTATE { $$ = BUDGETCALLOUTSFILEROTATE; }
475 | DIALRANDINCR { $$ = DIALRANDINCR; }
476 | PPP_AUTH_RECHALLENGE { $$ = PPP_AUTH_RECHALLENGE; }
477 | PPP_AUTH_PARANOID { $$ = PPP_AUTH_PARANOID; }
478 | USEDOWN { $$ = USEDOWN; }
481 /* ================== */
482 /* controller section */
483 /* ================== */
485 controllersect: CONTROLLER
487 controllercount++;
489 controllers
492 controllers: controller
493 | controllers controller
496 controller: strcontroller
497 | nullentry
498 | error '\n'
501 strcontroller: cstrkeyword '=' STRING '\n'
503 cfg_setval($1);
505 | cstrkeyword '=' NUMBERSTR '\n'
507 cfg_setval($1);
509 | cfilekeyword '=' filename '\n'
511 cfg_setval($1);
515 cstrkeyword: PROTOCOL { $$ = PROTOCOL; }
518 cfilekeyword: FIRMWARE { $$ = FIRMWARE; }