Annotation of embedaddon/ntp/ntpd/ntp_parser.y, revision 1.1
1.1 ! misho 1: /* ntp_parser.y
! 2: *
! 3: * The parser for the NTP configuration file.
! 4: *
! 5: * Written By: Sachin Kamboj
! 6: * University of Delaware
! 7: * Newark, DE 19711
! 8: * Copyright (c) 2006
! 9: */
! 10:
! 11: %{
! 12: #ifdef HAVE_CONFIG_H
! 13: # include <config.h>
! 14: #endif
! 15:
! 16: #include "ntp.h"
! 17: #include "ntpd.h"
! 18: #include "ntp_machine.h"
! 19: #include "ntp_stdlib.h"
! 20: #include "ntp_filegen.h"
! 21: #include "ntp_data_structures.h"
! 22: #include "ntp_scanner.h"
! 23: #include "ntp_config.h"
! 24: #include "ntp_crypto.h"
! 25:
! 26: #include "ntpsim.h" /* HMS: Do we really want this all the time? */
! 27: /* SK: It might be a good idea to always
! 28: include the simulator code. That way
! 29: someone can use the same configuration file
! 30: for both the simulator and the daemon
! 31: */
! 32:
! 33:
! 34: struct FILE_INFO *ip_file; /* Pointer to the configuration file stream */
! 35:
! 36: #define YYMALLOC emalloc
! 37: #define YYFREE free
! 38: #define YYERROR_VERBOSE
! 39: #define YYMAXDEPTH 1000 /* stop the madness sooner */
! 40: void yyerror(const char *msg);
! 41: extern int input_from_file; /* 0=input from ntpq :config */
! 42: %}
! 43:
! 44: /*
! 45: * Enable generation of token names array even without YYDEBUG.
! 46: * We access via token_name() defined below.
! 47: */
! 48: %token-table
! 49:
! 50: %union {
! 51: char *String;
! 52: double Double;
! 53: int Integer;
! 54: void *VoidPtr;
! 55: queue *Queue;
! 56: struct attr_val *Attr_val;
! 57: struct address_node *Address_node;
! 58: struct setvar_node *Set_var;
! 59:
! 60: /* Simulation types */
! 61: server_info *Sim_server;
! 62: script_info *Sim_script;
! 63: }
! 64:
! 65: /* TERMINALS (do not appear left of colon) */
! 66: %token <Integer> T_Age
! 67: %token <Integer> T_All
! 68: %token <Integer> T_Allan
! 69: %token <Integer> T_Auth
! 70: %token <Integer> T_Autokey
! 71: %token <Integer> T_Automax
! 72: %token <Integer> T_Average
! 73: %token <Integer> T_Bclient
! 74: %token <Integer> T_Beacon
! 75: %token <Integer> T_Bias
! 76: %token <Integer> T_Broadcast
! 77: %token <Integer> T_Broadcastclient
! 78: %token <Integer> T_Broadcastdelay
! 79: %token <Integer> T_Burst
! 80: %token <Integer> T_Calibrate
! 81: %token <Integer> T_Calldelay
! 82: %token <Integer> T_Ceiling
! 83: %token <Integer> T_Clockstats
! 84: %token <Integer> T_Cohort
! 85: %token <Integer> T_ControlKey
! 86: %token <Integer> T_Crypto
! 87: %token <Integer> T_Cryptostats
! 88: %token <Integer> T_Day
! 89: %token <Integer> T_Default
! 90: %token <Integer> T_Digest
! 91: %token <Integer> T_Disable
! 92: %token <Integer> T_Discard
! 93: %token <Integer> T_Dispersion
! 94: %token <Double> T_Double
! 95: %token <Integer> T_Driftfile
! 96: %token <Integer> T_Drop
! 97: %token <Integer> T_Ellipsis /* "..." not "ellipsis" */
! 98: %token <Integer> T_Enable
! 99: %token <Integer> T_End
! 100: %token <Integer> T_False
! 101: %token <Integer> T_File
! 102: %token <Integer> T_Filegen
! 103: %token <Integer> T_Flag1
! 104: %token <Integer> T_Flag2
! 105: %token <Integer> T_Flag3
! 106: %token <Integer> T_Flag4
! 107: %token <Integer> T_Flake
! 108: %token <Integer> T_Floor
! 109: %token <Integer> T_Freq
! 110: %token <Integer> T_Fudge
! 111: %token <Integer> T_Host
! 112: %token <Integer> T_Huffpuff
! 113: %token <Integer> T_Iburst
! 114: %token <Integer> T_Ident
! 115: %token <Integer> T_Ignore
! 116: %token <Integer> T_Includefile
! 117: %token <Integer> T_Integer
! 118: %token <Integer> T_Interface
! 119: %token <Integer> T_Ipv4
! 120: %token <Integer> T_Ipv4_flag
! 121: %token <Integer> T_Ipv6
! 122: %token <Integer> T_Ipv6_flag
! 123: %token <Integer> T_Kernel
! 124: %token <Integer> T_Key
! 125: %token <Integer> T_Keys
! 126: %token <Integer> T_Keysdir
! 127: %token <Integer> T_Kod
! 128: %token <Integer> T_Mssntp
! 129: %token <Integer> T_Leapfile
! 130: %token <Integer> T_Limited
! 131: %token <Integer> T_Link
! 132: %token <Integer> T_Listen
! 133: %token <Integer> T_Logconfig
! 134: %token <Integer> T_Logfile
! 135: %token <Integer> T_Loopstats
! 136: %token <Integer> T_Lowpriotrap
! 137: %token <Integer> T_Manycastclient
! 138: %token <Integer> T_Manycastserver
! 139: %token <Integer> T_Mask
! 140: %token <Integer> T_Maxclock
! 141: %token <Integer> T_Maxdist
! 142: %token <Integer> T_Maxpoll
! 143: %token <Integer> T_Minclock
! 144: %token <Integer> T_Mindist
! 145: %token <Integer> T_Minimum
! 146: %token <Integer> T_Minpoll
! 147: %token <Integer> T_Minsane
! 148: %token <Integer> T_Mode
! 149: %token <Integer> T_Monitor
! 150: %token <Integer> T_Month
! 151: %token <Integer> T_Multicastclient
! 152: %token <Integer> T_Nic
! 153: %token <Integer> T_Nolink
! 154: %token <Integer> T_Nomodify
! 155: %token <Integer> T_None
! 156: %token <Integer> T_Nopeer
! 157: %token <Integer> T_Noquery
! 158: %token <Integer> T_Noselect
! 159: %token <Integer> T_Noserve
! 160: %token <Integer> T_Notrap
! 161: %token <Integer> T_Notrust
! 162: %token <Integer> T_Ntp
! 163: %token <Integer> T_Ntpport
! 164: %token <Integer> T_NtpSignDsocket
! 165: %token <Integer> T_Orphan
! 166: %token <Integer> T_Panic
! 167: %token <Integer> T_Peer
! 168: %token <Integer> T_Peerstats
! 169: %token <Integer> T_Phone
! 170: %token <Integer> T_Pid
! 171: %token <Integer> T_Pidfile
! 172: %token <Integer> T_Pool
! 173: %token <Integer> T_Port
! 174: %token <Integer> T_Preempt
! 175: %token <Integer> T_Prefer
! 176: %token <Integer> T_Protostats
! 177: %token <Integer> T_Pw
! 178: %token <Integer> T_Qos
! 179: %token <Integer> T_Randfile
! 180: %token <Integer> T_Rawstats
! 181: %token <Integer> T_Refid
! 182: %token <Integer> T_Requestkey
! 183: %token <Integer> T_Restrict
! 184: %token <Integer> T_Revoke
! 185: %token <Integer> T_Saveconfigdir
! 186: %token <Integer> T_Server
! 187: %token <Integer> T_Setvar
! 188: %token <Integer> T_Sign
! 189: %token <Integer> T_Statistics
! 190: %token <Integer> T_Stats
! 191: %token <Integer> T_Statsdir
! 192: %token <Integer> T_Step
! 193: %token <Integer> T_Stepout
! 194: %token <Integer> T_Stratum
! 195: %token <String> T_String
! 196: %token <Integer> T_Sysstats
! 197: %token <Integer> T_Tick
! 198: %token <Integer> T_Time1
! 199: %token <Integer> T_Time2
! 200: %token <Integer> T_Timingstats
! 201: %token <Integer> T_Tinker
! 202: %token <Integer> T_Tos
! 203: %token <Integer> T_Trap
! 204: %token <Integer> T_True
! 205: %token <Integer> T_Trustedkey
! 206: %token <Integer> T_Ttl
! 207: %token <Integer> T_Type
! 208: %token <Integer> T_Unconfig
! 209: %token <Integer> T_Unpeer
! 210: %token <Integer> T_Version
! 211: %token <Integer> T_WanderThreshold /* Not a token */
! 212: %token <Integer> T_Week
! 213: %token <Integer> T_Wildcard
! 214: %token <Integer> T_Xleave
! 215: %token <Integer> T_Year
! 216: %token <Integer> T_Flag /* Not an actual token */
! 217: %token <Integer> T_Void /* Not an actual token */
! 218: %token <Integer> T_EOC
! 219:
! 220:
! 221: /* NTP Simulator Tokens */
! 222: %token <Integer> T_Simulate
! 223: %token <Integer> T_Beep_Delay
! 224: %token <Integer> T_Sim_Duration
! 225: %token <Integer> T_Server_Offset
! 226: %token <Integer> T_Duration
! 227: %token <Integer> T_Freq_Offset
! 228: %token <Integer> T_Wander
! 229: %token <Integer> T_Jitter
! 230: %token <Integer> T_Prop_Delay
! 231: %token <Integer> T_Proc_Delay
! 232:
! 233:
! 234:
! 235: /*** NON-TERMINALS ***/
! 236: %type <Integer> access_control_flag
! 237: %type <Queue> ac_flag_list
! 238: %type <Address_node> address
! 239: %type <Integer> address_fam
! 240: %type <Queue> address_list
! 241: %type <Integer> boolean
! 242: %type <Integer> client_type
! 243: %type <Attr_val> crypto_command
! 244: %type <Queue> crypto_command_list
! 245: %type <Integer> crypto_str_keyword
! 246: %type <Attr_val> discard_option
! 247: %type <Integer> discard_option_keyword
! 248: %type <Queue> discard_option_list
! 249: %type <Integer> enable_disable
! 250: %type <Attr_val> filegen_option
! 251: %type <Queue> filegen_option_list
! 252: %type <Integer> filegen_type
! 253: %type <Attr_val> fudge_factor
! 254: %type <Integer> fudge_factor_bool_keyword
! 255: %type <Integer> fudge_factor_dbl_keyword
! 256: %type <Queue> fudge_factor_list
! 257: %type <Queue> integer_list
! 258: %type <Queue> integer_list_range
! 259: %type <Attr_val> integer_list_range_elt
! 260: %type <Attr_val> integer_range
! 261: %type <Integer> nic_rule_action
! 262: %type <Integer> interface_command
! 263: %type <Integer> interface_nic
! 264: %type <Address_node> ip_address
! 265: %type <Integer> link_nolink
! 266: %type <Attr_val> log_config_command
! 267: %type <Queue> log_config_list
! 268: %type <Integer> misc_cmd_dbl_keyword
! 269: %type <Integer> misc_cmd_str_keyword
! 270: %type <Integer> misc_cmd_str_lcl_keyword
! 271: %type <Integer> nic_rule_class
! 272: %type <Double> number
! 273: %type <Attr_val> option
! 274: %type <Attr_val> option_flag
! 275: %type <Integer> option_flag_keyword
! 276: %type <Queue> option_list
! 277: %type <Attr_val> option_int
! 278: %type <Integer> option_int_keyword
! 279: %type <Integer> stat
! 280: %type <Queue> stats_list
! 281: %type <Queue> string_list
! 282: %type <Attr_val> system_option
! 283: %type <Integer> system_option_flag_keyword
! 284: %type <Queue> system_option_list
! 285: %type <Integer> t_default_or_zero
! 286: %type <Integer> tinker_option_keyword
! 287: %type <Attr_val> tinker_option
! 288: %type <Queue> tinker_option_list
! 289: %type <Attr_val> tos_option
! 290: %type <Integer> tos_option_dbl_keyword
! 291: %type <Integer> tos_option_int_keyword
! 292: %type <Queue> tos_option_list
! 293: %type <Attr_val> trap_option
! 294: %type <Queue> trap_option_list
! 295: %type <Integer> unpeer_keyword
! 296: %type <Set_var> variable_assign
! 297:
! 298: /* NTP Simulator non-terminals */
! 299: %type <Queue> sim_init_statement_list
! 300: %type <Attr_val> sim_init_statement
! 301: %type <Queue> sim_server_list
! 302: %type <Sim_server> sim_server
! 303: %type <Double> sim_server_offset
! 304: %type <Address_node> sim_server_name
! 305: %type <Queue> sim_act_list
! 306: %type <Sim_script> sim_act
! 307: %type <Queue> sim_act_stmt_list
! 308: %type <Attr_val> sim_act_stmt
! 309:
! 310: %%
! 311:
! 312: /* ntp.conf
! 313: * Configuration File Grammar
! 314: * --------------------------
! 315: */
! 316:
! 317: configuration
! 318: : command_list
! 319: ;
! 320:
! 321: command_list
! 322: : command_list command T_EOC
! 323: | command T_EOC
! 324: | error T_EOC
! 325: {
! 326: /* I will need to incorporate much more fine grained
! 327: * error messages. The following should suffice for
! 328: * the time being.
! 329: */
! 330: msyslog(LOG_ERR,
! 331: "syntax error in %s line %d, column %d",
! 332: ip_file->fname,
! 333: ip_file->err_line_no,
! 334: ip_file->err_col_no);
! 335: }
! 336: ;
! 337:
! 338: command : /* NULL STATEMENT */
! 339: | server_command
! 340: | unpeer_command
! 341: | other_mode_command
! 342: | authentication_command
! 343: | monitoring_command
! 344: | access_control_command
! 345: | orphan_mode_command
! 346: | fudge_command
! 347: | system_option_command
! 348: | tinker_command
! 349: | miscellaneous_command
! 350: | simulate_command
! 351: ;
! 352:
! 353: /* Server Commands
! 354: * ---------------
! 355: */
! 356:
! 357: server_command
! 358: : client_type address option_list
! 359: {
! 360: struct peer_node *my_node = create_peer_node($1, $2, $3);
! 361: if (my_node)
! 362: enqueue(cfgt.peers, my_node);
! 363: }
! 364: | client_type address
! 365: {
! 366: struct peer_node *my_node = create_peer_node($1, $2, NULL);
! 367: if (my_node)
! 368: enqueue(cfgt.peers, my_node);
! 369: }
! 370: ;
! 371:
! 372: client_type
! 373: : T_Server
! 374: | T_Pool
! 375: | T_Peer
! 376: | T_Broadcast
! 377: | T_Manycastclient
! 378: ;
! 379:
! 380: address
! 381: : ip_address
! 382: | address_fam T_String
! 383: { $$ = create_address_node($2, $1); }
! 384: ;
! 385:
! 386: ip_address
! 387: : T_String
! 388: { $$ = create_address_node($1, 0); }
! 389: ;
! 390:
! 391: address_fam
! 392: : T_Ipv4_flag
! 393: { $$ = AF_INET; }
! 394: | T_Ipv6_flag
! 395: { $$ = AF_INET6; }
! 396: ;
! 397:
! 398: option_list
! 399: : option_list option { $$ = enqueue($1, $2); }
! 400: | option { $$ = enqueue_in_new_queue($1); }
! 401: ;
! 402:
! 403: option
! 404: : option_flag
! 405: | option_int
! 406: | T_Bias number
! 407: { $$ = create_attr_dval($1, $2); }
! 408: ;
! 409:
! 410: option_flag
! 411: : option_flag_keyword
! 412: { $$ = create_attr_ival(T_Flag, $1); }
! 413: ;
! 414:
! 415: option_flag_keyword
! 416: : T_Autokey
! 417: | T_Burst
! 418: | T_Iburst
! 419: | T_Noselect
! 420: | T_Preempt
! 421: | T_Prefer
! 422: | T_True
! 423: | T_Xleave
! 424: ;
! 425:
! 426: option_int
! 427: : option_int_keyword T_Integer
! 428: { $$ = create_attr_ival($1, $2); }
! 429: ;
! 430:
! 431: option_int_keyword
! 432: : T_Key
! 433: | T_Minpoll
! 434: | T_Maxpoll
! 435: | T_Ttl
! 436: | T_Mode
! 437: | T_Version
! 438: ;
! 439:
! 440:
! 441:
! 442: /* unpeer commands
! 443: * ---------------
! 444: */
! 445:
! 446: unpeer_command
! 447: : unpeer_keyword address
! 448: {
! 449: struct unpeer_node *my_node = create_unpeer_node($2);
! 450: if (my_node)
! 451: enqueue(cfgt.unpeers, my_node);
! 452: }
! 453: ;
! 454: unpeer_keyword
! 455: : T_Unconfig
! 456: | T_Unpeer
! 457: ;
! 458:
! 459:
! 460: /* Other Modes
! 461: * (broadcastclient manycastserver multicastclient)
! 462: * ------------------------------------------------
! 463: */
! 464:
! 465: other_mode_command
! 466: : T_Broadcastclient
! 467: { cfgt.broadcastclient = 1; }
! 468: | T_Manycastserver address_list
! 469: { append_queue(cfgt.manycastserver, $2); }
! 470: | T_Multicastclient address_list
! 471: { append_queue(cfgt.multicastclient, $2); }
! 472: ;
! 473:
! 474:
! 475:
! 476: /* Authentication Commands
! 477: * -----------------------
! 478: */
! 479:
! 480: authentication_command
! 481: : T_Automax T_Integer
! 482: { enqueue(cfgt.vars, create_attr_ival($1, $2)); }
! 483: | T_ControlKey T_Integer
! 484: { cfgt.auth.control_key = $2; }
! 485: | T_Crypto crypto_command_list
! 486: {
! 487: cfgt.auth.cryptosw++;
! 488: append_queue(cfgt.auth.crypto_cmd_list, $2);
! 489: }
! 490: | T_Keys T_String
! 491: { cfgt.auth.keys = $2; }
! 492: | T_Keysdir T_String
! 493: { cfgt.auth.keysdir = $2; }
! 494: | T_Requestkey T_Integer
! 495: { cfgt.auth.request_key = $2; }
! 496: | T_Revoke T_Integer
! 497: { cfgt.auth.revoke = $2; }
! 498: | T_Trustedkey integer_list_range
! 499: { cfgt.auth.trusted_key_list = $2; }
! 500: | T_NtpSignDsocket T_String
! 501: { cfgt.auth.ntp_signd_socket = $2; }
! 502: ;
! 503:
! 504: crypto_command_list
! 505: : /* empty list */
! 506: { $$ = create_queue(); }
! 507: | crypto_command_list crypto_command
! 508: {
! 509: if ($2 != NULL)
! 510: $$ = enqueue($1, $2);
! 511: else
! 512: $$ = $1;
! 513: }
! 514: ;
! 515:
! 516: crypto_command
! 517: : crypto_str_keyword T_String
! 518: { $$ = create_attr_sval($1, $2); }
! 519: | T_Revoke T_Integer
! 520: {
! 521: $$ = NULL;
! 522: cfgt.auth.revoke = $2;
! 523: msyslog(LOG_WARNING,
! 524: "'crypto revoke %d' is deprecated, "
! 525: "please use 'revoke %d' instead.",
! 526: cfgt.auth.revoke, cfgt.auth.revoke);
! 527: }
! 528: ;
! 529:
! 530: crypto_str_keyword
! 531: : T_Host
! 532: | T_Ident
! 533: | T_Pw
! 534: | T_Randfile
! 535: | T_Sign
! 536: | T_Digest
! 537: ;
! 538:
! 539:
! 540: /* Orphan Mode Commands
! 541: * --------------------
! 542: */
! 543:
! 544: orphan_mode_command
! 545: : T_Tos tos_option_list
! 546: { append_queue(cfgt.orphan_cmds,$2); }
! 547: ;
! 548:
! 549: tos_option_list
! 550: : tos_option_list tos_option { $$ = enqueue($1, $2); }
! 551: | tos_option { $$ = enqueue_in_new_queue($1); }
! 552: ;
! 553:
! 554: tos_option
! 555: : tos_option_int_keyword T_Integer
! 556: { $$ = create_attr_dval($1, (double)$2); }
! 557: | tos_option_dbl_keyword number
! 558: { $$ = create_attr_dval($1, $2); }
! 559: | T_Cohort boolean
! 560: { $$ = create_attr_dval($1, (double)$2); }
! 561: ;
! 562:
! 563: tos_option_int_keyword
! 564: : T_Ceiling
! 565: | T_Floor
! 566: | T_Orphan
! 567: | T_Minsane
! 568: | T_Beacon
! 569: ;
! 570:
! 571: tos_option_dbl_keyword
! 572: : T_Mindist
! 573: | T_Maxdist
! 574: | T_Minclock
! 575: | T_Maxclock
! 576: ;
! 577:
! 578:
! 579: /* Monitoring Commands
! 580: * -------------------
! 581: */
! 582:
! 583: monitoring_command
! 584: : T_Statistics stats_list
! 585: { append_queue(cfgt.stats_list, $2); }
! 586: | T_Statsdir T_String
! 587: {
! 588: if (input_from_file) {
! 589: cfgt.stats_dir = $2;
! 590: } else {
! 591: YYFREE($2);
! 592: yyerror("statsdir remote configuration ignored");
! 593: }
! 594: }
! 595: | T_Filegen stat filegen_option_list
! 596: {
! 597: enqueue(cfgt.filegen_opts,
! 598: create_filegen_node($2, $3));
! 599: }
! 600: ;
! 601:
! 602: stats_list
! 603: : stats_list stat { $$ = enqueue($1, create_ival($2)); }
! 604: | stat { $$ = enqueue_in_new_queue(create_ival($1)); }
! 605: ;
! 606:
! 607: stat
! 608: : T_Clockstats
! 609: | T_Cryptostats
! 610: | T_Loopstats
! 611: | T_Peerstats
! 612: | T_Rawstats
! 613: | T_Sysstats
! 614: | T_Timingstats
! 615: | T_Protostats
! 616: ;
! 617:
! 618: filegen_option_list
! 619: : /* empty list */
! 620: { $$ = create_queue(); }
! 621: | filegen_option_list filegen_option
! 622: {
! 623: if ($2 != NULL)
! 624: $$ = enqueue($1, $2);
! 625: else
! 626: $$ = $1;
! 627: }
! 628: ;
! 629:
! 630: filegen_option
! 631: : T_File T_String
! 632: {
! 633: if (input_from_file) {
! 634: $$ = create_attr_sval($1, $2);
! 635: } else {
! 636: $$ = NULL;
! 637: YYFREE($2);
! 638: yyerror("filegen file remote config ignored");
! 639: }
! 640: }
! 641: | T_Type filegen_type
! 642: {
! 643: if (input_from_file) {
! 644: $$ = create_attr_ival($1, $2);
! 645: } else {
! 646: $$ = NULL;
! 647: yyerror("filegen type remote config ignored");
! 648: }
! 649: }
! 650: | link_nolink
! 651: {
! 652: const char *err;
! 653:
! 654: if (input_from_file) {
! 655: $$ = create_attr_ival(T_Flag, $1);
! 656: } else {
! 657: $$ = NULL;
! 658: if (T_Link == $1)
! 659: err = "filegen link remote config ignored";
! 660: else
! 661: err = "filegen nolink remote config ignored";
! 662: yyerror(err);
! 663: }
! 664: }
! 665: | enable_disable
! 666: { $$ = create_attr_ival(T_Flag, $1); }
! 667: ;
! 668:
! 669: link_nolink
! 670: : T_Link
! 671: | T_Nolink
! 672: ;
! 673:
! 674: enable_disable
! 675: : T_Enable
! 676: | T_Disable
! 677: ;
! 678:
! 679: filegen_type
! 680: : T_None
! 681: | T_Pid
! 682: | T_Day
! 683: | T_Week
! 684: | T_Month
! 685: | T_Year
! 686: | T_Age
! 687: ;
! 688:
! 689:
! 690: /* Access Control Commands
! 691: * -----------------------
! 692: */
! 693:
! 694: access_control_command
! 695: : T_Discard discard_option_list
! 696: {
! 697: append_queue(cfgt.discard_opts, $2);
! 698: }
! 699: | T_Restrict address ac_flag_list
! 700: {
! 701: enqueue(cfgt.restrict_opts,
! 702: create_restrict_node($2, NULL, $3, ip_file->line_no));
! 703: }
! 704: | T_Restrict T_Default ac_flag_list
! 705: {
! 706: enqueue(cfgt.restrict_opts,
! 707: create_restrict_node(NULL, NULL, $3, ip_file->line_no));
! 708: }
! 709: | T_Restrict T_Ipv4_flag T_Default ac_flag_list
! 710: {
! 711: enqueue(cfgt.restrict_opts,
! 712: create_restrict_node(
! 713: create_address_node(
! 714: estrdup("0.0.0.0"),
! 715: AF_INET),
! 716: create_address_node(
! 717: estrdup("0.0.0.0"),
! 718: AF_INET),
! 719: $4,
! 720: ip_file->line_no));
! 721: }
! 722: | T_Restrict T_Ipv6_flag T_Default ac_flag_list
! 723: {
! 724: enqueue(cfgt.restrict_opts,
! 725: create_restrict_node(
! 726: create_address_node(
! 727: estrdup("::"),
! 728: AF_INET6),
! 729: create_address_node(
! 730: estrdup("::"),
! 731: AF_INET6),
! 732: $4,
! 733: ip_file->line_no));
! 734: }
! 735: | T_Restrict ip_address T_Mask ip_address ac_flag_list
! 736: {
! 737: enqueue(cfgt.restrict_opts,
! 738: create_restrict_node($2, $4, $5, ip_file->line_no));
! 739: }
! 740: ;
! 741:
! 742: ac_flag_list
! 743: : /* empty list is allowed */
! 744: { $$ = create_queue(); }
! 745: | ac_flag_list access_control_flag
! 746: { $$ = enqueue($1, create_ival($2)); }
! 747: ;
! 748:
! 749: access_control_flag
! 750: : T_Flake
! 751: | T_Ignore
! 752: | T_Kod
! 753: | T_Mssntp
! 754: | T_Limited
! 755: | T_Lowpriotrap
! 756: | T_Nomodify
! 757: | T_Nopeer
! 758: | T_Noquery
! 759: | T_Noserve
! 760: | T_Notrap
! 761: | T_Notrust
! 762: | T_Ntpport
! 763: | T_Version
! 764: ;
! 765:
! 766: discard_option_list
! 767: : discard_option_list discard_option
! 768: { $$ = enqueue($1, $2); }
! 769: | discard_option
! 770: { $$ = enqueue_in_new_queue($1); }
! 771: ;
! 772:
! 773: discard_option
! 774: : discard_option_keyword T_Integer
! 775: { $$ = create_attr_ival($1, $2); }
! 776: ;
! 777:
! 778: discard_option_keyword
! 779: : T_Average
! 780: | T_Minimum
! 781: | T_Monitor
! 782: ;
! 783:
! 784:
! 785: /* Fudge Commands
! 786: * --------------
! 787: */
! 788:
! 789: fudge_command
! 790: : T_Fudge address fudge_factor_list
! 791: { enqueue(cfgt.fudge, create_addr_opts_node($2, $3)); }
! 792: ;
! 793:
! 794: fudge_factor_list
! 795: : fudge_factor_list fudge_factor
! 796: { enqueue($1, $2); }
! 797: | fudge_factor
! 798: { $$ = enqueue_in_new_queue($1); }
! 799: ;
! 800:
! 801: fudge_factor
! 802: : fudge_factor_dbl_keyword number
! 803: { $$ = create_attr_dval($1, $2); }
! 804: | fudge_factor_bool_keyword boolean
! 805: { $$ = create_attr_ival($1, $2); }
! 806: | T_Stratum T_Integer
! 807: { $$ = create_attr_ival($1, $2); }
! 808: | T_Refid T_String
! 809: { $$ = create_attr_sval($1, $2); }
! 810: ;
! 811:
! 812: fudge_factor_dbl_keyword
! 813: : T_Time1
! 814: | T_Time2
! 815: ;
! 816:
! 817: fudge_factor_bool_keyword
! 818: : T_Flag1
! 819: | T_Flag2
! 820: | T_Flag3
! 821: | T_Flag4
! 822: ;
! 823:
! 824:
! 825: /* Command for System Options
! 826: * --------------------------
! 827: */
! 828:
! 829: system_option_command
! 830: : T_Enable system_option_list
! 831: { append_queue(cfgt.enable_opts, $2); }
! 832: | T_Disable system_option_list
! 833: { append_queue(cfgt.disable_opts, $2); }
! 834: ;
! 835:
! 836: system_option_list
! 837: : system_option_list system_option
! 838: {
! 839: if ($2 != NULL)
! 840: $$ = enqueue($1, $2);
! 841: else
! 842: $$ = $1;
! 843: }
! 844: | system_option
! 845: {
! 846: if ($1 != NULL)
! 847: $$ = enqueue_in_new_queue($1);
! 848: else
! 849: $$ = create_queue();
! 850: }
! 851: ;
! 852:
! 853: system_option
! 854: : system_option_flag_keyword
! 855: { $$ = create_attr_ival(T_Flag, $1); }
! 856: | T_Stats
! 857: {
! 858: if (input_from_file) {
! 859: $$ = create_attr_ival(T_Flag, $1);
! 860: } else {
! 861: $$ = NULL;
! 862: yyerror("enable/disable stats remote config ignored");
! 863: }
! 864: }
! 865: ;
! 866:
! 867: system_option_flag_keyword
! 868: : T_Auth
! 869: | T_Bclient
! 870: | T_Calibrate
! 871: | T_Kernel
! 872: | T_Monitor
! 873: | T_Ntp
! 874: ;
! 875:
! 876:
! 877: /* Tinker Commands
! 878: * ---------------
! 879: */
! 880:
! 881: tinker_command
! 882: : T_Tinker tinker_option_list { append_queue(cfgt.tinker, $2); }
! 883: ;
! 884:
! 885: tinker_option_list
! 886: : tinker_option_list tinker_option { $$ = enqueue($1, $2); }
! 887: | tinker_option { $$ = enqueue_in_new_queue($1); }
! 888: ;
! 889:
! 890: tinker_option
! 891: : tinker_option_keyword number
! 892: { $$ = create_attr_dval($1, $2); }
! 893: ;
! 894:
! 895: tinker_option_keyword
! 896: : T_Allan
! 897: | T_Dispersion
! 898: | T_Freq
! 899: | T_Huffpuff
! 900: | T_Panic
! 901: | T_Step
! 902: | T_Stepout
! 903: ;
! 904:
! 905:
! 906: /* Miscellaneous Commands
! 907: * ----------------------
! 908: */
! 909:
! 910: miscellaneous_command
! 911: : interface_command
! 912: | misc_cmd_dbl_keyword number
! 913: {
! 914: struct attr_val *av;
! 915:
! 916: av = create_attr_dval($1, $2);
! 917: enqueue(cfgt.vars, av);
! 918: }
! 919: | misc_cmd_str_keyword T_String
! 920: {
! 921: struct attr_val *av;
! 922:
! 923: av = create_attr_sval($1, $2);
! 924: enqueue(cfgt.vars, av);
! 925: }
! 926: | misc_cmd_str_lcl_keyword T_String
! 927: {
! 928: char error_text[64];
! 929: struct attr_val *av;
! 930:
! 931: if (input_from_file) {
! 932: av = create_attr_sval($1, $2);
! 933: enqueue(cfgt.vars, av);
! 934: } else {
! 935: YYFREE($2);
! 936: snprintf(error_text, sizeof(error_text),
! 937: "%s remote config ignored",
! 938: keyword($1));
! 939: yyerror(error_text);
! 940: }
! 941: }
! 942: | T_Includefile T_String command
! 943: {
! 944: if (!input_from_file) {
! 945: yyerror("remote includefile ignored");
! 946: break;
! 947: }
! 948: if (curr_include_level >= MAXINCLUDELEVEL) {
! 949: fprintf(stderr, "getconfig: Maximum include file level exceeded.\n");
! 950: msyslog(LOG_ERR, "getconfig: Maximum include file level exceeded.\n");
! 951: } else {
! 952: fp[curr_include_level + 1] = F_OPEN(FindConfig($2), "r");
! 953: if (fp[curr_include_level + 1] == NULL) {
! 954: fprintf(stderr, "getconfig: Couldn't open <%s>\n", FindConfig($2));
! 955: msyslog(LOG_ERR, "getconfig: Couldn't open <%s>\n", FindConfig($2));
! 956: } else {
! 957: ip_file = fp[++curr_include_level];
! 958: }
! 959: }
! 960: }
! 961: | T_End
! 962: {
! 963: while (curr_include_level != -1)
! 964: FCLOSE(fp[curr_include_level--]);
! 965: }
! 966: | T_Calldelay T_Integer
! 967: { enqueue(cfgt.vars, create_attr_ival($1, $2)); }
! 968: | T_Driftfile drift_parm
! 969: { /* Null action, possibly all null parms */ }
! 970: | T_Logconfig log_config_list
! 971: { append_queue(cfgt.logconfig, $2); }
! 972: | T_Phone string_list
! 973: { append_queue(cfgt.phone, $2); }
! 974: | T_Setvar variable_assign
! 975: { enqueue(cfgt.setvar, $2); }
! 976: | T_Trap ip_address
! 977: { enqueue(cfgt.trap, create_addr_opts_node($2, NULL)); }
! 978: | T_Trap ip_address trap_option_list
! 979: { enqueue(cfgt.trap, create_addr_opts_node($2, $3)); }
! 980: | T_Ttl integer_list
! 981: { append_queue(cfgt.ttl, $2); }
! 982: ;
! 983:
! 984: misc_cmd_dbl_keyword
! 985: : T_Broadcastdelay
! 986: | T_Tick
! 987: ;
! 988:
! 989: misc_cmd_str_keyword
! 990: : T_Leapfile
! 991: | T_Pidfile
! 992: | T_Qos
! 993: ;
! 994:
! 995: misc_cmd_str_lcl_keyword
! 996: : T_Logfile
! 997: | T_Saveconfigdir
! 998: ;
! 999:
! 1000: drift_parm
! 1001: : T_String
! 1002: { enqueue(cfgt.vars, create_attr_sval(T_Driftfile, $1)); }
! 1003: | T_String T_Double
! 1004: { enqueue(cfgt.vars, create_attr_dval(T_WanderThreshold, $2));
! 1005: enqueue(cfgt.vars, create_attr_sval(T_Driftfile, $1)); }
! 1006: | /* Null driftfile, indicated by null string "\0" */
! 1007: { enqueue(cfgt.vars, create_attr_sval(T_Driftfile, "\0")); }
! 1008: ;
! 1009:
! 1010: variable_assign
! 1011: : T_String '=' T_String t_default_or_zero
! 1012: { $$ = create_setvar_node($1, $3, $4); }
! 1013: ;
! 1014:
! 1015: t_default_or_zero
! 1016: : T_Default
! 1017: | /* empty, no "default" modifier */
! 1018: { $$ = 0; }
! 1019: ;
! 1020:
! 1021: trap_option_list
! 1022: : trap_option_list trap_option
! 1023: { $$ = enqueue($1, $2); }
! 1024: | trap_option { $$ = enqueue_in_new_queue($1); }
! 1025: ;
! 1026:
! 1027: trap_option
! 1028: : T_Port T_Integer { $$ = create_attr_ival($1, $2); }
! 1029: | T_Interface ip_address { $$ = create_attr_pval($1, $2); }
! 1030: ;
! 1031:
! 1032: log_config_list
! 1033: : log_config_list log_config_command { $$ = enqueue($1, $2); }
! 1034: | log_config_command { $$ = enqueue_in_new_queue($1); }
! 1035: ;
! 1036:
! 1037: log_config_command
! 1038: : T_String
! 1039: {
! 1040: char prefix = $1[0];
! 1041: char *type = $1 + 1;
! 1042:
! 1043: if (prefix != '+' && prefix != '-' && prefix != '=') {
! 1044: yyerror("Logconfig prefix is not '+', '-' or '='\n");
! 1045: }
! 1046: else
! 1047: $$ = create_attr_sval(prefix, estrdup(type));
! 1048: YYFREE($1);
! 1049: }
! 1050: ;
! 1051:
! 1052: interface_command
! 1053: : interface_nic nic_rule_action nic_rule_class
! 1054: {
! 1055: enqueue(cfgt.nic_rules,
! 1056: create_nic_rule_node($3, NULL, $2));
! 1057: }
! 1058: | interface_nic nic_rule_action T_String
! 1059: {
! 1060: enqueue(cfgt.nic_rules,
! 1061: create_nic_rule_node(0, $3, $2));
! 1062: }
! 1063: ;
! 1064:
! 1065: interface_nic
! 1066: : T_Interface
! 1067: | T_Nic
! 1068: ;
! 1069:
! 1070: nic_rule_class
! 1071: : T_All
! 1072: | T_Ipv4
! 1073: | T_Ipv6
! 1074: | T_Wildcard
! 1075: ;
! 1076:
! 1077: nic_rule_action
! 1078: : T_Listen
! 1079: | T_Ignore
! 1080: | T_Drop
! 1081: ;
! 1082:
! 1083:
! 1084:
! 1085: /* Miscellaneous Rules
! 1086: * -------------------
! 1087: */
! 1088:
! 1089: integer_list
! 1090: : integer_list T_Integer { $$ = enqueue($1, create_ival($2)); }
! 1091: | T_Integer { $$ = enqueue_in_new_queue(create_ival($1)); }
! 1092: ;
! 1093:
! 1094: integer_list_range
! 1095: : integer_list_range integer_list_range_elt
! 1096: { $$ = enqueue($1, $2); }
! 1097: | integer_list_range_elt
! 1098: { $$ = enqueue_in_new_queue($1); }
! 1099: ;
! 1100:
! 1101: integer_list_range_elt
! 1102: : T_Integer
! 1103: { $$ = create_attr_ival('i', $1); }
! 1104: | integer_range /* default of $$ = $1 is good */
! 1105: ;
! 1106:
! 1107: integer_range /* limited to unsigned shorts */
! 1108: : '(' T_Integer T_Ellipsis T_Integer ')'
! 1109: { $$ = create_attr_shorts('-', $2, $4); }
! 1110: ;
! 1111:
! 1112: string_list
! 1113: : string_list T_String { $$ = enqueue($1, create_pval($2)); }
! 1114: | T_String { $$ = enqueue_in_new_queue(create_pval($1)); }
! 1115: ;
! 1116:
! 1117: address_list
! 1118: : address_list address { $$ = enqueue($1, $2); }
! 1119: | address { $$ = enqueue_in_new_queue($1); }
! 1120: ;
! 1121:
! 1122: boolean
! 1123: : T_Integer
! 1124: {
! 1125: if ($1 != 0 && $1 != 1) {
! 1126: yyerror("Integer value is not boolean (0 or 1). Assuming 1");
! 1127: $$ = 1;
! 1128: } else {
! 1129: $$ = $1;
! 1130: }
! 1131: }
! 1132: | T_True { $$ = 1; }
! 1133: | T_False { $$ = 0; }
! 1134: ;
! 1135:
! 1136: number
! 1137: : T_Integer { $$ = (double)$1; }
! 1138: | T_Double
! 1139: ;
! 1140:
! 1141:
! 1142: /* Simulator Configuration Commands
! 1143: * --------------------------------
! 1144: */
! 1145:
! 1146: simulate_command
! 1147: : sim_conf_start '{' sim_init_statement_list sim_server_list '}'
! 1148: {
! 1149: cfgt.sim_details = create_sim_node($3, $4);
! 1150:
! 1151: /* Reset the old_config_style variable */
! 1152: old_config_style = 1;
! 1153: }
! 1154: ;
! 1155:
! 1156: /* The following is a terrible hack to get the configuration file to
! 1157: * treat newlines as whitespace characters within the simulation.
! 1158: * This is needed because newlines are significant in the rest of the
! 1159: * configuration file.
! 1160: */
! 1161: sim_conf_start
! 1162: : T_Simulate { old_config_style = 0; }
! 1163: ;
! 1164:
! 1165: sim_init_statement_list
! 1166: : sim_init_statement_list sim_init_statement T_EOC { $$ = enqueue($1, $2); }
! 1167: | sim_init_statement T_EOC { $$ = enqueue_in_new_queue($1); }
! 1168: ;
! 1169:
! 1170: sim_init_statement
! 1171: : T_Beep_Delay '=' number { $$ = create_attr_dval($1, $3); }
! 1172: | T_Sim_Duration '=' number { $$ = create_attr_dval($1, $3); }
! 1173: ;
! 1174:
! 1175: sim_server_list
! 1176: : sim_server_list sim_server { $$ = enqueue($1, $2); }
! 1177: | sim_server { $$ = enqueue_in_new_queue($1); }
! 1178: ;
! 1179:
! 1180: sim_server
! 1181: : sim_server_name '{' sim_server_offset sim_act_list '}'
! 1182: { $$ = create_sim_server($1, $3, $4); }
! 1183: ;
! 1184:
! 1185: sim_server_offset
! 1186: : T_Server_Offset '=' number T_EOC { $$ = $3; }
! 1187: ;
! 1188:
! 1189: sim_server_name
! 1190: : T_Server '=' address { $$ = $3; }
! 1191: ;
! 1192:
! 1193: sim_act_list
! 1194: : sim_act_list sim_act { $$ = enqueue($1, $2); }
! 1195: | sim_act { $$ = enqueue_in_new_queue($1); }
! 1196: ;
! 1197:
! 1198: sim_act
! 1199: : T_Duration '=' number '{' sim_act_stmt_list '}'
! 1200: { $$ = create_sim_script_info($3, $5); }
! 1201: ;
! 1202:
! 1203: sim_act_stmt_list
! 1204: : sim_act_stmt_list sim_act_stmt T_EOC { $$ = enqueue($1, $2); }
! 1205: | sim_act_stmt T_EOC { $$ = enqueue_in_new_queue($1); }
! 1206: ;
! 1207:
! 1208: sim_act_stmt
! 1209: : T_Freq_Offset '=' number
! 1210: { $$ = create_attr_dval($1, $3); }
! 1211: | T_Wander '=' number
! 1212: { $$ = create_attr_dval($1, $3); }
! 1213: | T_Jitter '=' number
! 1214: { $$ = create_attr_dval($1, $3); }
! 1215: | T_Prop_Delay '=' number
! 1216: { $$ = create_attr_dval($1, $3); }
! 1217: | T_Proc_Delay '=' number
! 1218: { $$ = create_attr_dval($1, $3); }
! 1219: ;
! 1220:
! 1221:
! 1222: %%
! 1223:
! 1224: void
! 1225: yyerror(
! 1226: const char *msg
! 1227: )
! 1228: {
! 1229: int retval;
! 1230:
! 1231: ip_file->err_line_no = ip_file->prev_token_line_no;
! 1232: ip_file->err_col_no = ip_file->prev_token_col_no;
! 1233:
! 1234: msyslog(LOG_ERR,
! 1235: "line %d column %d %s",
! 1236: ip_file->err_line_no,
! 1237: ip_file->err_col_no,
! 1238: msg);
! 1239: if (!input_from_file) {
! 1240: /* Save the error message in the correct buffer */
! 1241: retval = snprintf(remote_config.err_msg + remote_config.err_pos,
! 1242: MAXLINE - remote_config.err_pos,
! 1243: "column %d %s",
! 1244: ip_file->err_col_no, msg);
! 1245:
! 1246: /* Increment the value of err_pos */
! 1247: if (retval > 0)
! 1248: remote_config.err_pos += retval;
! 1249:
! 1250: /* Increment the number of errors */
! 1251: ++remote_config.no_errors;
! 1252: }
! 1253: }
! 1254:
! 1255:
! 1256: /*
! 1257: * token_name - Convert T_ token integers to text.
! 1258: * Example: token_name(T_Server) returns "T_Server".
! 1259: * see also keyword(T_Server) which returns "server".
! 1260: */
! 1261: const char *
! 1262: token_name(
! 1263: int token
! 1264: )
! 1265: {
! 1266: return yytname[YYTRANSLATE(token)];
! 1267: }
! 1268:
! 1269:
! 1270: /* Initial Testing function -- ignore
! 1271: int main(int argc, char *argv[])
! 1272: {
! 1273: ip_file = FOPEN(argv[1], "r");
! 1274: if (!ip_file) {
! 1275: fprintf(stderr, "ERROR!! Could not open file: %s\n", argv[1]);
! 1276: }
! 1277: key_scanner = create_keyword_scanner(keyword_list);
! 1278: print_keyword_scanner(key_scanner, 0);
! 1279: yyparse();
! 1280: return 0;
! 1281: }
! 1282: */
! 1283:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>