]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - usr.sbin/i4b/isdnd/rc_parse.y
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / usr.sbin / i4b / isdnd / rc_parse.y
1 /*
2  *   Copyright (c) 1997 Joerg Wunsch. All rights reserved.
3  *
4  *   Copyright (c) 1997, 2002 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  * $FreeBSD$
34  *
35  *      last edit-date: [Sun Aug 11 12:27:28 2002]
36  *
37  *---------------------------------------------------------------------------*/
38
39 %{
40
41 /* #define YYDEBUG 1 */
42
43 #include <stdio.h>
44 #include <stdlib.h>
45 #include <ctype.h>
46
47 #include "monitor.h"    /* monitor access rights bit definitions */
48 #include "isdnd.h"
49
50 #ifndef FALSE
51 # define FALSE 0
52 #endif
53
54 #ifndef TRUE
55 # define TRUE 1
56 #endif
57
58 extern void     cfg_setval(int keyword);
59 extern void     cfg_set_controller_default();
60 extern void     reset_scanner(FILE *infile);
61 extern void     yyerror(const char *msg);
62 extern int      yylex();
63
64 extern int      lineno;
65 extern char     *yytext;
66 extern int      nentries;
67
68 int             saw_system = 0;
69 int             entrycount = -1;
70 int             controllercount = -1;
71
72 %}
73
74 %token          ACCTALL
75 %token          ACCTFILE
76 %token          ADDPREFIX
77 %token          ALERT
78 %token          ALIASFNAME
79 %token          ALIASING
80 %token          ANSWERPROG
81 %token          B1PROTOCOL
82 %token          BEEPCONNECT
83 %token          BCAP
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          CLONE
98 %token          CONNECTPROG
99 %token          CONTROLLER
100 %token          DIALOUTTYPE
101 %token          DIALRANDINCR
102 %token          DIALRETRIES
103 %token          DIRECTION
104 %token          DISCONNECTPROG
105 %token          DOWNTIME
106 %token          DOWNTRIES
107 %token          EARLYHANGUP
108 %token          ENTRY
109 %token          EXTCALLATTR
110 %token          FIRMWARE
111 %token          FULLCMD
112 %token          HOLIDAYFILE
113 %token          IDLETIME_IN
114 %token          IDLETIME_OUT
115 %token          IDLE_ALG_OUT
116 %token          ISDNCHANNEL
117 %token          ISDNCONTROLLER
118 %token          ISDNTIME
119 %token          ISDNTXDELIN
120 %token          ISDNTXDELOUT
121 %token          LOCAL_PHONE_DIALOUT
122 %token          LOCAL_SUBADDR_DIALOUT
123 %token          LOCAL_PHONE_INCOMING
124 %token          LOCAL_SUBADDR_INCOMING
125 %token          LOGEVENTS
126 %token          MAILER
127 %token          MAILTO
128 %token          MAXCONNECTTIME
129 %token          MONITOR
130 %token          MONITORACCESS
131 %token          MONITORPORT
132 %token          MONITORSW
133 %token          NAME
134 %token          NO
135 %token          OFF
136 %token          ON
137 %token          PPP_AUTH_RECHALLENGE
138 %token          PPP_AUTH_PARANOID
139 %token          PPP_EXPECT_AUTH
140 %token          PPP_EXPECT_NAME
141 %token          PPP_EXPECT_PASSWORD
142 %token          PPP_SEND_AUTH
143 %token          PPP_SEND_NAME
144 %token          PPP_SEND_PASSWORD
145 %token          PREFIXNATIONAL
146 %token          PREFIXINTERNATIONAL
147 %token          PROTOCOL
148 %token          RATESFILE
149 %token          RATETYPE
150 %token          REACTION
151 %token          RECOVERYTIME
152 %token          REGEXPR
153 %token          REGPROG
154 %token          REMOTE_NUMBERS_HANDLING
155 %token          REMOTE_PHONE_DIALOUT
156 %token          REMOTE_SUBADDR_DIALOUT
157 %token          REMOTE_PHONE_INCOMING
158 %token          REMOTE_SUBADDR_INCOMING
159 %token          RESTRICTEDCMD
160 %token          ROTATESUFFIX
161 %token          RTPRIO
162 %token          SYSTEM
163 %token          TINAINITPROG
164 %token          UNITLENGTH
165 %token          UNITLENGTHSRC
166 %token          USEACCTFILE
167 %token          USESUBADDR
168 %token          USEDOWN
169 %token          USRDEVICENAME
170 %token          USRDEVICEUNIT
171 %token          VALID
172 %token          YES
173
174
175 %token  <str>   NUMBERSTR
176
177 %token  <str>   STRING
178
179 %type   <booln> boolean 
180
181 %type   <num>   sysfilekeyword sysnumkeyword sysstrkeyword sysboolkeyword
182 %type   <num>   filekeyword numkeyword strkeyword boolkeyword monrights monright
183 %type   <num>   cstrkeyword cfilekeyword
184 %type   <str>   filename
185
186 %union {
187         int     booln;
188         int     num;
189         char    *str;
190 }
191
192 %%
193
194 config:         sections
195                 ;
196
197 sections:       possible_nullentries
198                 syssect
199                 optcontrollersects
200                 entrysects
201                 ;
202
203 possible_nullentries:
204                 /* lambda */
205                 | possible_nullentries error '\n'
206                 | possible_nullentries nullentry
207                 ;
208
209 nullentry:      '\n'
210                 ;
211
212 entrysects:     entrysect
213                 | entrysects entrysect
214                 ;
215
216 optcontrollersects:
217                 controllersects
218                 |
219                         {
220                                 cfg_set_controller_default();
221                         }
222                 ;
223
224 controllersects:  controllersect
225                 | controllersects controllersect
226                 ;
227
228 /* ============== */
229 /* system section */
230 /* ============== */
231
232 syssect:        SYSTEM sysentries
233                 ;
234
235 sysentries:     sysentry
236                         { 
237                                 saw_system = 1; 
238                                 monitor_clear_rights();
239                         }
240                 | sysentries sysentry
241                 ;
242
243 sysentry:       sysfileentry
244                 | sysboolentry
245                 | sysnumentry
246                 | sysstrentry
247                 | sysmonitorstart
248                 | sysmonitorrights
249                 | nullentry
250                 | error '\n'
251                 ;
252
253   
254 sysmonitorstart:
255                 MONITOR '=' STRING '\n'
256                         {
257                             char *err = NULL;
258                             switch (monitor_start_rights($3)) {
259                                 case I4BMAR_OK:
260                                         break;
261                                 case I4BMAR_LENGTH:
262                                         err = "local socket name too long: %s";
263                                         break;
264                                 case I4BMAR_DUP:
265                                         err = "duplicate entry: %s";
266                                         break;
267                                 case I4BMAR_CIDR:
268                                         err = "invalid CIDR specification: %s";
269                                         break;
270                                 case I4BMAR_NOIP:
271                                         err = "could not resolve host or net specification: %s";
272                                         break;
273                             }
274                             if (err) {
275                                 char msg[1024];
276                                 snprintf(msg, sizeof msg, err, $3);
277                                 yyerror(msg);
278                             }
279                         }
280                 ;
281
282 sysmonitorrights:
283                 MONITORACCESS '=' monrights '\n'
284                         { monitor_add_rights($3); }     
285                 ;
286
287 monrights:      monrights ',' monright  { $$ = $1 | $3; }
288                 | monright              { $$ = $1; }
289                 ;
290
291 monright:       FULLCMD                 { $$ = I4B_CA_COMMAND_FULL; }
292                 | RESTRICTEDCMD         { $$ = I4B_CA_COMMAND_RESTRICTED; }
293                 | CHANNELSTATE          { $$ = I4B_CA_EVNT_CHANSTATE; }
294                 | CALLIN                { $$ = I4B_CA_EVNT_CALLIN; }
295                 | CALLOUT               { $$ = I4B_CA_EVNT_CALLOUT; }
296                 | LOGEVENTS             { $$ = I4B_CA_EVNT_I4B; }
297                 ;
298
299 sysfileentry:   sysfilekeyword '=' filename '\n'
300                         {
301                         cfg_setval($1);
302                         }
303                 ;
304
305 sysboolentry:   sysboolkeyword '=' boolean '\n'
306                         {
307                         yylval.booln = $3;
308                         cfg_setval($1);
309                         }
310                 ;
311
312 sysnumentry:    sysnumkeyword '=' NUMBERSTR '\n'
313                         { 
314                         yylval.num = atoi($3);
315                         cfg_setval($1);
316                         }
317                 ;
318
319 sysstrentry:      sysstrkeyword '=' STRING '\n'
320                         { 
321                         cfg_setval($1);
322                         }
323                 | sysstrkeyword '=' NUMBERSTR '\n'
324                         { 
325                         cfg_setval($1);
326                         }
327                 ;
328
329 filename:       STRING          {
330                                         if ($1[0] != '/') 
331                                         {
332                                                 yyerror("filename doesn't start with a slash");
333                                                 YYERROR;
334                                         }
335                                         $$ = $1;
336                                 }
337                 ;
338
339 boolean:          NO                    { $$ = FALSE; }
340                 | OFF                   { $$ = FALSE; }
341                 | ON                    { $$ = TRUE; }
342                 | YES                   { $$ = TRUE; }
343                 ;
344
345 sysfilekeyword:   RATESFILE             { $$ = RATESFILE; }
346                 | ACCTFILE              { $$ = ACCTFILE; }
347                 | ALIASFNAME            { $$ = ALIASFNAME; }
348                 | HOLIDAYFILE           { $$ = HOLIDAYFILE; }
349                 | TINAINITPROG          { $$ = TINAINITPROG; }
350                 ;
351
352 sysboolkeyword:   USEACCTFILE           { $$ = USEACCTFILE; }
353                 | ALIASING              { $$ = ALIASING; }
354                 | ACCTALL               { $$ = ACCTALL; }
355                 | ADDPREFIX             { $$ = ADDPREFIX; }
356                 | BEEPCONNECT           { $$ = BEEPCONNECT; }
357                 | EXTCALLATTR           { $$ = EXTCALLATTR; }
358                 | ISDNTIME              { $$ = ISDNTIME; }
359                 | MONITORSW             { $$ = MONITORSW; }
360                 ;
361
362 sysnumkeyword:    MONITORPORT           { $$ = MONITORPORT; }
363                 | RTPRIO                { $$ = RTPRIO; }
364                 ;
365
366 sysstrkeyword:    MAILER                { $$ = MAILER; }
367                 | MAILTO                { $$ = MAILTO; }
368                 | PREFIXNATIONAL        { $$ = PREFIXNATIONAL; }
369                 | PREFIXINTERNATIONAL   { $$ = PREFIXINTERNATIONAL; }
370                 | ROTATESUFFIX          { $$ = ROTATESUFFIX; }
371                 | REGEXPR               { $$ = REGEXPR; }
372                 | REGPROG               { $$ = REGPROG; }
373                 ;
374
375 /* ============= */
376 /* entry section */
377 /* ============= */
378
379 entrysect:      ENTRY
380                         { 
381                                 entrycount++;
382                                 nentries++;
383                         }
384                 entries
385                 ;
386
387 entries:        entry
388                 | entries entry
389                 ;
390
391 entry:          fileentry
392                 | strentry
393                 | numentry
394                 | boolentry
395                 | nullentry
396                 | error '\n'
397                 ;
398
399 fileentry:      filekeyword '=' filename '\n'
400                         {
401                         cfg_setval($1);
402                         }
403                 ;
404
405
406 strentry:       strkeyword '=' STRING '\n'
407                         { 
408                         cfg_setval($1);
409                         }
410                 | strkeyword '=' NUMBERSTR '\n'
411                         { 
412                         cfg_setval($1);
413                         }
414                 ;
415
416 boolentry:      boolkeyword '=' boolean '\n'
417                         {
418                         yylval.booln = $3;
419                         cfg_setval($1);
420                         }
421                 ;
422
423 numentry:       numkeyword '=' NUMBERSTR '\n'
424                         { 
425                         yylval.num = atoi($3);
426                         cfg_setval($1);
427                         }
428                 ;
429
430 filekeyword:      BUDGETCALLBACKSFILE   { $$ = BUDGETCALLBACKSFILE; }
431                 | BUDGETCALLOUTSFILE    { $$ = BUDGETCALLOUTSFILE; }
432                 ;
433
434 strkeyword:       ANSWERPROG            { $$ = ANSWERPROG; }
435                 | B1PROTOCOL            { $$ = B1PROTOCOL; }
436                 | BCAP                  { $$ = BCAP; }
437                 | CONNECTPROG           { $$ = CONNECTPROG; }
438                 | DIALOUTTYPE           { $$ = DIALOUTTYPE; }
439                 | DIRECTION             { $$ = DIRECTION; }
440                 | DISCONNECTPROG        { $$ = DISCONNECTPROG; }
441                 | IDLE_ALG_OUT          { $$ = IDLE_ALG_OUT; }
442                 | LOCAL_PHONE_INCOMING  { $$ = LOCAL_PHONE_INCOMING; }
443                 | LOCAL_SUBADDR_INCOMING        { $$ = LOCAL_SUBADDR_INCOMING; }
444                 | LOCAL_PHONE_DIALOUT   { $$ = LOCAL_PHONE_DIALOUT; }
445                 | LOCAL_SUBADDR_DIALOUT { $$ = LOCAL_SUBADDR_DIALOUT; }
446                 | NAME                  { $$ = NAME; }          
447                 | PPP_EXPECT_AUTH       { $$ = PPP_EXPECT_AUTH; }
448                 | PPP_EXPECT_NAME       { $$ = PPP_EXPECT_NAME; }
449                 | PPP_EXPECT_PASSWORD   { $$ = PPP_EXPECT_PASSWORD; }
450                 | PPP_SEND_AUTH         { $$ = PPP_SEND_AUTH; }
451                 | PPP_SEND_NAME         { $$ = PPP_SEND_NAME; }
452                 | PPP_SEND_PASSWORD     { $$ = PPP_SEND_PASSWORD; }
453                 | REACTION              { $$ = REACTION; }
454                 | REMOTE_NUMBERS_HANDLING { $$ = REMOTE_NUMBERS_HANDLING; }
455                 | REMOTE_PHONE_INCOMING { $$ = REMOTE_PHONE_INCOMING; }
456                 | REMOTE_SUBADDR_INCOMING       { $$ = REMOTE_SUBADDR_INCOMING; }
457                 | REMOTE_PHONE_DIALOUT  { $$ = REMOTE_PHONE_DIALOUT; }
458                 | REMOTE_SUBADDR_DIALOUT        { $$ = REMOTE_SUBADDR_DIALOUT; }
459                 | UNITLENGTHSRC         { $$ = UNITLENGTHSRC; }         
460                 | USRDEVICENAME         { $$ = USRDEVICENAME; }
461                 | VALID                 { $$ = VALID; }
462                 | CLONE                 { $$ = CLONE; }
463                 ;
464
465 numkeyword:       ALERT                 { $$ = ALERT; }
466                 | BUDGETCALLBACKPERIOD  { $$ = BUDGETCALLBACKPERIOD; }
467                 | BUDGETCALLBACKNCALLS  { $$ = BUDGETCALLBACKNCALLS; }
468                 | BUDGETCALLOUTPERIOD   { $$ = BUDGETCALLOUTPERIOD; }
469                 | BUDGETCALLOUTNCALLS   { $$ = BUDGETCALLOUTNCALLS; }
470                 | CALLBACKWAIT          { $$ = CALLBACKWAIT; }
471                 | CALLEDBACKWAIT        { $$ = CALLEDBACKWAIT; }
472                 | DIALRETRIES           { $$ = DIALRETRIES; }
473                 | EARLYHANGUP           { $$ = EARLYHANGUP; }
474                 | IDLETIME_IN           { $$ = IDLETIME_IN; }
475                 | IDLETIME_OUT          { $$ = IDLETIME_OUT; }
476                 | ISDNCONTROLLER        { $$ = ISDNCONTROLLER; }
477                 | ISDNCHANNEL           { $$ = ISDNCHANNEL; }
478                 | ISDNTXDELIN           { $$ = ISDNTXDELIN; }
479                 | ISDNTXDELOUT          { $$ = ISDNTXDELOUT; }
480                 | RATETYPE              { $$ = RATETYPE; }
481                 | RECOVERYTIME          { $$ = RECOVERYTIME; }
482                 | UNITLENGTH            { $$ = UNITLENGTH; }            
483                 | USRDEVICEUNIT         { $$ = USRDEVICEUNIT; }
484                 | DOWNTIME              { $$ = DOWNTIME; }
485                 | DOWNTRIES             { $$ = DOWNTRIES; }
486                 | MAXCONNECTTIME        { $$ = MAXCONNECTTIME; }
487                 ;
488
489 boolkeyword:      BUDGETCALLBACKSFILEROTATE { $$ = BUDGETCALLBACKSFILEROTATE; }
490                 | BUDGETCALLOUTSFILEROTATE  { $$ = BUDGETCALLOUTSFILEROTATE; }
491                 | DIALRANDINCR          { $$ = DIALRANDINCR; }
492                 | PPP_AUTH_RECHALLENGE  { $$ = PPP_AUTH_RECHALLENGE; }
493                 | PPP_AUTH_PARANOID     { $$ = PPP_AUTH_PARANOID; }
494                 | USEDOWN               { $$ = USEDOWN; }
495                 | USESUBADDR            { $$ = USESUBADDR; }
496                 ;
497
498 /* ================== */
499 /* controller section */
500 /* ================== */
501
502 controllersect: CONTROLLER
503                 { 
504                         controllercount++;
505                 }
506                 controllers
507                 ;
508
509 controllers:    controller
510                 | controllers controller
511                 ;
512
513 controller:     strcontroller
514                 | nullentry
515                 | error '\n'
516                 ;
517
518 strcontroller:  cstrkeyword '=' STRING '\n'
519                         { 
520                         cfg_setval($1);
521                         }
522                 | cstrkeyword '=' NUMBERSTR '\n'
523                         { 
524                         cfg_setval($1);
525                         }
526                 | cfilekeyword '=' filename '\n'
527                         { 
528                         cfg_setval($1);
529                         }
530                 ;
531
532 cstrkeyword:      PROTOCOL              { $$ = PROTOCOL; }
533                 ;
534
535 cfilekeyword:     FIRMWARE              { $$ = FIRMWARE; }
536                 ;
537
538
539 %%