Initial import from FreeBSD RELENG_4:
[dragonfly.git] / usr.sbin / i4b / isdnd / rc_parse.y
1 /*
2  *   Copyright (c) 1997 Joerg Wunsch. All rights reserved.
3  *
4  *   Copyright (c) 1997, 2001 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: src/usr.sbin/i4b/isdnd/rc_parse.y,v 1.6.2.2 2001/08/10 23:17:32 obrien Exp $
34  *
35  *      last edit-date: [Fri Jul 20 19:14:23 2001]
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          ALERT
77 %token          ALIASFNAME
78 %token          ALIASING
79 %token          ANSWERPROG
80 %token          B1PROTOCOL
81 %token          BEEPCONNECT
82 %token          BUDGETCALLOUTPERIOD
83 %token          BUDGETCALLOUTNCALLS
84 %token          BUDGETCALLOUTSFILE
85 %token          BUDGETCALLOUTSFILEROTATE
86 %token          BUDGETCALLBACKPERIOD
87 %token          BUDGETCALLBACKNCALLS
88 %token          BUDGETCALLBACKSFILE
89 %token          BUDGETCALLBACKSFILEROTATE
90 %token          CALLBACKWAIT
91 %token          CALLEDBACKWAIT
92 %token          CALLIN
93 %token          CALLOUT
94 %token          CHANNELSTATE
95 %token          CLONE
96 %token          CONNECTPROG
97 %token          CONTROLLER
98 %token          DIALOUTTYPE
99 %token          DIALRANDINCR
100 %token          DIALRETRIES
101 %token          DIRECTION
102 %token          DISCONNECTPROG
103 %token          DOWNTIME
104 %token          DOWNTRIES
105 %token          EARLYHANGUP
106 %token          ENTRY
107 %token          EXTCALLATTR
108 %token          FIRMWARE
109 %token          FULLCMD
110 %token          HOLIDAYFILE
111 %token          IDLETIME_IN
112 %token          IDLETIME_OUT
113 %token          IDLE_ALG_OUT
114 %token          ISDNCHANNEL
115 %token          ISDNCONTROLLER
116 %token          ISDNTIME
117 %token          ISDNTXDELIN
118 %token          ISDNTXDELOUT
119 %token          LOCAL_PHONE_DIALOUT
120 %token          LOCAL_PHONE_INCOMING
121 %token          LOGEVENTS
122 %token          MAILER
123 %token          MAILTO
124 %token          MAXCONNECTTIME
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
188 sections:       possible_nullentries
189                 syssect
190                 optcontrollersects
191                 entrysects
192                 ;
193
194 possible_nullentries:
195                 /* lambda */
196                 | possible_nullentries error '\n'
197                 | possible_nullentries nullentry
198                 ;
199
200 nullentry:      '\n'
201                 ;
202
203 entrysects:     entrysect
204                 | entrysects entrysect
205                 ;
206
207 optcontrollersects:
208                 controllersects
209                 |
210                         {
211                                 cfg_set_controller_default();
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                                 entrycount++;
370                                 nentries++;
371                         }
372                 entries
373                 ;
374
375 entries:        entry
376                 | entries entry
377                 ;
378
379 entry:          fileentry
380                 | strentry
381                 | numentry
382                 | boolentry
383                 | nullentry
384                 | error '\n'
385                 ;
386
387 fileentry:      filekeyword '=' filename '\n'
388                         {
389                         cfg_setval($1);
390                         }
391                 ;
392
393
394 strentry:       strkeyword '=' STRING '\n'
395                         { 
396                         cfg_setval($1);
397                         }
398                 | strkeyword '=' NUMBERSTR '\n'
399                         { 
400                         cfg_setval($1);
401                         }
402                 ;
403
404 boolentry:      boolkeyword '=' boolean '\n'
405                         {
406                         yylval.booln = $3;
407                         cfg_setval($1);
408                         }
409                 ;
410
411 numentry:       numkeyword '=' NUMBERSTR '\n'
412                         { 
413                         yylval.num = atoi($3);
414                         cfg_setval($1);
415                         }
416                 ;
417
418 filekeyword:      BUDGETCALLBACKSFILE   { $$ = BUDGETCALLBACKSFILE; }
419                 | BUDGETCALLOUTSFILE    { $$ = BUDGETCALLOUTSFILE; }
420                 ;
421
422 strkeyword:       ANSWERPROG            { $$ = ANSWERPROG; }
423                 | B1PROTOCOL            { $$ = B1PROTOCOL; }
424                 | CONNECTPROG           { $$ = CONNECTPROG; }
425                 | DIALOUTTYPE           { $$ = DIALOUTTYPE; }
426                 | DIRECTION             { $$ = DIRECTION; }
427                 | DISCONNECTPROG        { $$ = DISCONNECTPROG; }
428                 | IDLE_ALG_OUT          { $$ = IDLE_ALG_OUT; }
429                 | LOCAL_PHONE_INCOMING  { $$ = LOCAL_PHONE_INCOMING; }
430                 | LOCAL_PHONE_DIALOUT   { $$ = LOCAL_PHONE_DIALOUT; }
431                 | NAME                  { $$ = NAME; }          
432                 | PPP_EXPECT_AUTH       { $$ = PPP_EXPECT_AUTH; }
433                 | PPP_EXPECT_NAME       { $$ = PPP_EXPECT_NAME; }
434                 | PPP_EXPECT_PASSWORD   { $$ = PPP_EXPECT_PASSWORD; }
435                 | PPP_SEND_AUTH         { $$ = PPP_SEND_AUTH; }
436                 | PPP_SEND_NAME         { $$ = PPP_SEND_NAME; }
437                 | PPP_SEND_PASSWORD     { $$ = PPP_SEND_PASSWORD; }
438                 | REACTION              { $$ = REACTION; }
439                 | REMOTE_NUMBERS_HANDLING { $$ = REMOTE_NUMBERS_HANDLING; }
440                 | REMOTE_PHONE_INCOMING { $$ = REMOTE_PHONE_INCOMING; }
441                 | REMOTE_PHONE_DIALOUT  { $$ = REMOTE_PHONE_DIALOUT; }
442                 | UNITLENGTHSRC         { $$ = UNITLENGTHSRC; }         
443                 | USRDEVICENAME         { $$ = USRDEVICENAME; }
444                 | VALID                 { $$ = VALID; }
445                 | CLONE                 { $$ = CLONE; }
446                 ;
447
448 numkeyword:       ALERT                 { $$ = ALERT; }
449                 | BUDGETCALLBACKPERIOD  { $$ = BUDGETCALLBACKPERIOD; }
450                 | BUDGETCALLBACKNCALLS  { $$ = BUDGETCALLBACKNCALLS; }
451                 | BUDGETCALLOUTPERIOD   { $$ = BUDGETCALLOUTPERIOD; }
452                 | BUDGETCALLOUTNCALLS   { $$ = BUDGETCALLOUTNCALLS; }
453                 | CALLBACKWAIT          { $$ = CALLBACKWAIT; }
454                 | CALLEDBACKWAIT        { $$ = CALLEDBACKWAIT; }
455                 | DIALRETRIES           { $$ = DIALRETRIES; }
456                 | EARLYHANGUP           { $$ = EARLYHANGUP; }
457                 | IDLETIME_IN           { $$ = IDLETIME_IN; }
458                 | IDLETIME_OUT          { $$ = IDLETIME_OUT; }
459                 | ISDNCONTROLLER        { $$ = ISDNCONTROLLER; }
460                 | ISDNCHANNEL           { $$ = ISDNCHANNEL; }
461                 | ISDNTXDELIN           { $$ = ISDNTXDELIN; }
462                 | ISDNTXDELOUT          { $$ = ISDNTXDELOUT; }
463                 | RATETYPE              { $$ = RATETYPE; }
464                 | RECOVERYTIME          { $$ = RECOVERYTIME; }
465                 | UNITLENGTH            { $$ = UNITLENGTH; }            
466                 | USRDEVICEUNIT         { $$ = USRDEVICEUNIT; }
467                 | DOWNTIME              { $$ = DOWNTIME; }
468                 | DOWNTRIES             { $$ = DOWNTRIES; }
469                 | MAXCONNECTTIME        { $$ = MAXCONNECTTIME; }
470                 ;
471
472 boolkeyword:      BUDGETCALLBACKSFILEROTATE { $$ = BUDGETCALLBACKSFILEROTATE; }
473                 | BUDGETCALLOUTSFILEROTATE  { $$ = BUDGETCALLOUTSFILEROTATE; }
474                 | DIALRANDINCR          { $$ = DIALRANDINCR; }
475                 | PPP_AUTH_RECHALLENGE  { $$ = PPP_AUTH_RECHALLENGE; }
476                 | PPP_AUTH_PARANOID     { $$ = PPP_AUTH_PARANOID; }
477                 | USEDOWN               { $$ = USEDOWN; }
478                 ;
479
480 /* ================== */
481 /* controller section */
482 /* ================== */
483
484 controllersect: CONTROLLER
485                 { 
486                         controllercount++;
487                 }
488                 controllers
489                 ;
490
491 controllers:    controller
492                 | controllers controller
493                 ;
494
495 controller:     strcontroller
496                 | nullentry
497                 | error '\n'
498                 ;
499
500 strcontroller:  cstrkeyword '=' STRING '\n'
501                         { 
502                         cfg_setval($1);
503                         }
504                 | cstrkeyword '=' NUMBERSTR '\n'
505                         { 
506                         cfg_setval($1);
507                         }
508                 | cfilekeyword '=' filename '\n'
509                         { 
510                         cfg_setval($1);
511                         }
512                 ;
513
514 cstrkeyword:      PROTOCOL              { $$ = PROTOCOL; }
515                 ;
516
517 cfilekeyword:     FIRMWARE              { $$ = FIRMWARE; }
518                 ;
519
520
521 %%