Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[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  * $DragonFly: src/usr.sbin/i4b/isdnd/rc_parse.y,v 1.2 2003/06/17 04:29:54 dillon Exp $
35  *
36  *      last edit-date: [Fri Jul 20 19:14:23 2001]
37  *
38  *---------------------------------------------------------------------------*/
39
40 %{
41
42 /* #define YYDEBUG 1 */
43
44 #include <stdio.h>
45 #include <stdlib.h>
46 #include <ctype.h>
47
48 #include "monitor.h"    /* monitor access rights bit definitions */
49 #include "isdnd.h"
50
51 #ifndef FALSE
52 # define FALSE 0
53 #endif
54
55 #ifndef TRUE
56 # define TRUE 1
57 #endif
58
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();
64
65 extern int      lineno;
66 extern char     *yytext;
67 extern int      nentries;
68
69 int             saw_system = 0;
70 int             entrycount = -1;
71 int             controllercount = -1;
72
73 %}
74
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
165
166
167 %token  <str>   NUMBERSTR
168
169 %token  <str>   STRING
170
171 %type   <booln> boolean 
172
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
177
178 %union {
179         int     booln;
180         int     num;
181         char    *str;
182 }
183
184 %%
185
186 config:         sections
187                 ;
188
189 sections:       possible_nullentries
190                 syssect
191                 optcontrollersects
192                 entrysects
193                 ;
194
195 possible_nullentries:
196                 /* lambda */
197                 | possible_nullentries error '\n'
198                 | possible_nullentries nullentry
199                 ;
200
201 nullentry:      '\n'
202                 ;
203
204 entrysects:     entrysect
205                 | entrysects entrysect
206                 ;
207
208 optcontrollersects:
209                 controllersects
210                 |
211                         {
212                                 cfg_set_controller_default();
213                         }
214                 ;
215
216 controllersects:  controllersect
217                 | controllersects controllersect
218                 ;
219
220 /* ============== */
221 /* system section */
222 /* ============== */
223
224 syssect:        SYSTEM sysentries
225                 ;
226
227 sysentries:     sysentry
228                         { 
229                                 saw_system = 1; 
230                                 monitor_clear_rights();
231                         }
232                 | sysentries sysentry
233                 ;
234
235 sysentry:       sysfileentry
236                 | sysboolentry
237                 | sysnumentry
238                 | sysstrentry
239                 | sysmonitorstart
240                 | sysmonitorrights
241                 | nullentry
242                 | error '\n'
243                 ;
244
245   
246 sysmonitorstart:
247                 MONITOR '=' STRING '\n'
248                         {
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;
265                             }
266                             if (err) {
267                                 char msg[1024];
268                                 snprintf(msg, sizeof msg, err, $3);
269                                 yyerror(msg);
270                             }
271                         }
272                 ;
273
274 sysmonitorrights:
275                 MONITORACCESS '=' monrights '\n'
276                         { monitor_add_rights($3); }     
277                 ;
278
279 monrights:      monrights ',' monright  { $$ = $1 | $3; }
280                 | monright              { $$ = $1; }
281                 ;
282
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; }
289                 ;
290
291 sysfileentry:   sysfilekeyword '=' filename '\n'
292                         {
293                         cfg_setval($1);
294                         }
295                 ;
296
297 sysboolentry:   sysboolkeyword '=' boolean '\n'
298                         {
299                         yylval.booln = $3;
300                         cfg_setval($1);
301                         }
302                 ;
303
304 sysnumentry:    sysnumkeyword '=' NUMBERSTR '\n'
305                         { 
306                         yylval.num = atoi($3);
307                         cfg_setval($1);
308                         }
309                 ;
310
311 sysstrentry:      sysstrkeyword '=' STRING '\n'
312                         { 
313                         cfg_setval($1);
314                         }
315                 | sysstrkeyword '=' NUMBERSTR '\n'
316                         { 
317                         cfg_setval($1);
318                         }
319                 ;
320
321 filename:       STRING          {
322                                         if ($1[0] != '/') 
323                                         {
324                                                 yyerror("filename doesn't start with a slash");
325                                                 YYERROR;
326                                         }
327                                         $$ = $1;
328                                 }
329                 ;
330
331 boolean:          NO                    { $$ = FALSE; }
332                 | OFF                   { $$ = FALSE; }
333                 | ON                    { $$ = TRUE; }
334                 | YES                   { $$ = TRUE; }
335                 ;
336
337 sysfilekeyword:   RATESFILE             { $$ = RATESFILE; }
338                 | ACCTFILE              { $$ = ACCTFILE; }
339                 | ALIASFNAME            { $$ = ALIASFNAME; }
340                 | HOLIDAYFILE           { $$ = HOLIDAYFILE; }
341                 | TINAINITPROG          { $$ = TINAINITPROG; }
342                 ;
343
344 sysboolkeyword:   USEACCTFILE           { $$ = USEACCTFILE; }
345                 | ALIASING              { $$ = ALIASING; }
346                 | ACCTALL               { $$ = ACCTALL; }
347                 | BEEPCONNECT           { $$ = BEEPCONNECT; }
348                 | EXTCALLATTR           { $$ = EXTCALLATTR; }
349                 | ISDNTIME              { $$ = ISDNTIME; }
350                 | MONITORSW             { $$ = MONITORSW; }
351                 ;
352
353 sysnumkeyword:    MONITORPORT           { $$ = MONITORPORT; }
354                 | RTPRIO                { $$ = RTPRIO; }
355                 ;
356
357 sysstrkeyword:    MAILER                { $$ = MAILER; }
358                 | MAILTO                { $$ = MAILTO; }
359                 | ROTATESUFFIX          { $$ = ROTATESUFFIX; }
360                 | REGEXPR               { $$ = REGEXPR; }
361                 | REGPROG               { $$ = REGPROG; }
362                 ;
363
364 /* ============= */
365 /* entry section */
366 /* ============= */
367
368 entrysect:      ENTRY
369                         { 
370                                 entrycount++;
371                                 nentries++;
372                         }
373                 entries
374                 ;
375
376 entries:        entry
377                 | entries entry
378                 ;
379
380 entry:          fileentry
381                 | strentry
382                 | numentry
383                 | boolentry
384                 | nullentry
385                 | error '\n'
386                 ;
387
388 fileentry:      filekeyword '=' filename '\n'
389                         {
390                         cfg_setval($1);
391                         }
392                 ;
393
394
395 strentry:       strkeyword '=' STRING '\n'
396                         { 
397                         cfg_setval($1);
398                         }
399                 | strkeyword '=' NUMBERSTR '\n'
400                         { 
401                         cfg_setval($1);
402                         }
403                 ;
404
405 boolentry:      boolkeyword '=' boolean '\n'
406                         {
407                         yylval.booln = $3;
408                         cfg_setval($1);
409                         }
410                 ;
411
412 numentry:       numkeyword '=' NUMBERSTR '\n'
413                         { 
414                         yylval.num = atoi($3);
415                         cfg_setval($1);
416                         }
417                 ;
418
419 filekeyword:      BUDGETCALLBACKSFILE   { $$ = BUDGETCALLBACKSFILE; }
420                 | BUDGETCALLOUTSFILE    { $$ = BUDGETCALLOUTSFILE; }
421                 ;
422
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; }
447                 ;
448
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; }
471                 ;
472
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; }
479                 ;
480
481 /* ================== */
482 /* controller section */
483 /* ================== */
484
485 controllersect: CONTROLLER
486                 { 
487                         controllercount++;
488                 }
489                 controllers
490                 ;
491
492 controllers:    controller
493                 | controllers controller
494                 ;
495
496 controller:     strcontroller
497                 | nullentry
498                 | error '\n'
499                 ;
500
501 strcontroller:  cstrkeyword '=' STRING '\n'
502                         { 
503                         cfg_setval($1);
504                         }
505                 | cstrkeyword '=' NUMBERSTR '\n'
506                         { 
507                         cfg_setval($1);
508                         }
509                 | cfilekeyword '=' filename '\n'
510                         { 
511                         cfg_setval($1);
512                         }
513                 ;
514
515 cstrkeyword:      PROTOCOL              { $$ = PROTOCOL; }
516                 ;
517
518 cfilekeyword:     FIRMWARE              { $$ = FIRMWARE; }
519                 ;
520
521
522 %%