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