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>