Patrick Welche <prlw1@cam.ac.uk>
[netbsd-mini2440.git] / external / bsd / ntp / dist / ntpd / ntp_parser.y
blob2e6915c36f7df67dfb4e3eb86460c674f8d5f228
1 /* $NetBSD$ */
3 /* ntp_parser.y
5 * The parser for the NTP configuration file.
7 * Written By: Sachin Kamboj
8 * University of Delaware
9 * Newark, DE 19711
10 * Copyright (c) 2006
14 #ifdef HAVE_CONFIG_H
15 # include <config.h>
16 #endif
18 #include "ntpd.h"
19 #include "ntp_machine.h"
20 #include "ntp.h"
21 #include "ntp_stdlib.h"
22 #include "ntp_filegen.h"
23 #include "ntp_data_structures.h"
24 #include "ntp_scanner.h"
25 #include "ntp_config.h"
26 #include "ntp_crypto.h"
28 #include "ntpsim.h" /* HMS: Do we really want this all the time? */
29 /* SK: It might be a good idea to always
30 include the simulator code. That way
31 someone can use the same configuration file
32 for both the simulator and the daemon
36 struct FILE_INFO *ip_file; /* Pointer to the configuration file stream */
38 #define YYMALLOC emalloc
39 #define YYFREE free
40 #define YYERROR_VERBOSE
41 #define YYMAXDEPTH 1000 /* stop the madness sooner */
42 void yyerror (char *msg);
43 extern int input_from_file; /* 0=input from ntpq :config */
46 /*
47 * Enable generation of token names array even without YYDEBUG.
48 * We access via token_name() defined below.
50 %token-table
52 %union {
53 char *String;
54 double Double;
55 int Integer;
56 void *VoidPtr;
57 queue *Queue;
58 struct attr_val *Attr_val;
59 struct address_node *Address_node;
60 struct setvar_node *Set_var;
62 /* Simulation types */
63 server_info *Sim_server;
64 script_info *Sim_script;
67 /* TERMINALS (do not appear left of colon) */
68 %token <Integer> T_Age
69 %token <Integer> T_All
70 %token <Integer> T_Allan
71 %token <Integer> T_Auth
72 %token <Integer> T_Autokey
73 %token <Integer> T_Automax
74 %token <Integer> T_Average
75 %token <Integer> T_Bclient
76 %token <Integer> T_Beacon
77 %token <Integer> T_Bias
78 %token <Integer> T_Broadcast
79 %token <Integer> T_Broadcastclient
80 %token <Integer> T_Broadcastdelay
81 %token <Integer> T_Burst
82 %token <Integer> T_Calibrate
83 %token <Integer> T_Calldelay
84 %token <Integer> T_Ceiling
85 %token <Integer> T_Clockstats
86 %token <Integer> T_Cohort
87 %token <Integer> T_ControlKey
88 %token <Integer> T_Crypto
89 %token <Integer> T_Cryptostats
90 %token <Integer> T_Day
91 %token <Integer> T_Default
92 %token <Integer> T_Digest
93 %token <Integer> T_Disable
94 %token <Integer> T_Discard
95 %token <Integer> T_Dispersion
96 %token <Double> T_Double
97 %token <Integer> T_Driftfile
98 %token <Integer> T_Drop
99 %token <Integer> T_Enable
100 %token <Integer> T_End
101 %token <Integer> T_False
102 %token <Integer> T_File
103 %token <Integer> T_Filegen
104 %token <Integer> T_Flag1
105 %token <Integer> T_Flag2
106 %token <Integer> T_Flag3
107 %token <Integer> T_Flag4
108 %token <Integer> T_Flake
109 %token <Integer> T_Floor
110 %token <Integer> T_Freq
111 %token <Integer> T_Fudge
112 %token <Integer> T_Host
113 %token <Integer> T_Huffpuff
114 %token <Integer> T_Iburst
115 %token <Integer> T_Ident
116 %token <Integer> T_Ignore
117 %token <Integer> T_Includefile
118 %token <Integer> T_Integer
119 %token <Integer> T_Interface
120 %token <Integer> T_Ipv4
121 %token <Integer> T_Ipv4_flag
122 %token <Integer> T_Ipv6
123 %token <Integer> T_Ipv6_flag
124 %token <Integer> T_Kernel
125 %token <Integer> T_Key
126 %token <Integer> T_Keys
127 %token <Integer> T_Keysdir
128 %token <Integer> T_Kod
129 %token <Integer> T_Mssntp
130 %token <Integer> T_Leapfile
131 %token <Integer> T_Limited
132 %token <Integer> T_Link
133 %token <Integer> T_Listen
134 %token <Integer> T_Logconfig
135 %token <Integer> T_Logfile
136 %token <Integer> T_Loopstats
137 %token <Integer> T_Lowpriotrap
138 %token <Integer> T_Manycastclient
139 %token <Integer> T_Manycastserver
140 %token <Integer> T_Mask
141 %token <Integer> T_Maxclock
142 %token <Integer> T_Maxdist
143 %token <Integer> T_Maxpoll
144 %token <Integer> T_Minclock
145 %token <Integer> T_Mindist
146 %token <Integer> T_Minimum
147 %token <Integer> T_Minpoll
148 %token <Integer> T_Minsane
149 %token <Integer> T_Mode
150 %token <Integer> T_Monitor
151 %token <Integer> T_Month
152 %token <Integer> T_Multicastclient
153 %token <Integer> T_Nic
154 %token <Integer> T_Nolink
155 %token <Integer> T_Nomodify
156 %token <Integer> T_None
157 %token <Integer> T_Nopeer
158 %token <Integer> T_Noquery
159 %token <Integer> T_Noselect
160 %token <Integer> T_Noserve
161 %token <Integer> T_Notrap
162 %token <Integer> T_Notrust
163 %token <Integer> T_Ntp
164 %token <Integer> T_Ntpport
165 %token <Integer> T_NtpSignDsocket
166 %token <Integer> T_Orphan
167 %token <Integer> T_Panic
168 %token <Integer> T_Peer
169 %token <Integer> T_Peerstats
170 %token <Integer> T_Phone
171 %token <Integer> T_Pid
172 %token <Integer> T_Pidfile
173 %token <Integer> T_Pool
174 %token <Integer> T_Port
175 %token <Integer> T_Preempt
176 %token <Integer> T_Prefer
177 %token <Integer> T_Protostats
178 %token <Integer> T_Pw
179 %token <Integer> T_Qos
180 %token <Integer> T_Randfile
181 %token <Integer> T_Rawstats
182 %token <Integer> T_Refid
183 %token <Integer> T_Requestkey
184 %token <Integer> T_Restrict
185 %token <Integer> T_Revoke
186 %token <Integer> T_Saveconfigdir
187 %token <Integer> T_Server
188 %token <Integer> T_Setvar
189 %token <Integer> T_Sign
190 %token <Integer> T_Statistics
191 %token <Integer> T_Stats
192 %token <Integer> T_Statsdir
193 %token <Integer> T_Step
194 %token <Integer> T_Stepout
195 %token <Integer> T_Stratum
196 %token <String> T_String
197 %token <Integer> T_Sysstats
198 %token <Integer> T_Tick
199 %token <Integer> T_Time1
200 %token <Integer> T_Time2
201 %token <Integer> T_Timingstats
202 %token <Integer> T_Tinker
203 %token <Integer> T_Tos
204 %token <Integer> T_Trap
205 %token <Integer> T_True
206 %token <Integer> T_Trustedkey
207 %token <Integer> T_Ttl
208 %token <Integer> T_Type
209 %token <Integer> T_Unconfig
210 %token <Integer> T_Unpeer
211 %token <Integer> T_Version
212 %token <Integer> T_WanderThreshold /* Not a token */
213 %token <Integer> T_Week
214 %token <Integer> T_Wildcard
215 %token <Integer> T_Xleave
216 %token <Integer> T_Year
217 %token <Integer> T_Flag /* Not an actual token */
218 %token <Integer> T_Void /* Not an actual token */
219 %token <Integer> T_EOC
222 /* NTP Simulator Tokens */
223 %token <Integer> T_Simulate
224 %token <Integer> T_Beep_Delay
225 %token <Integer> T_Sim_Duration
226 %token <Integer> T_Server_Offset
227 %token <Integer> T_Duration
228 %token <Integer> T_Freq_Offset
229 %token <Integer> T_Wander
230 %token <Integer> T_Jitter
231 %token <Integer> T_Prop_Delay
232 %token <Integer> T_Proc_Delay
236 /*** NON-TERMINALS ***/
237 %type <Integer> access_control_flag
238 %type <Queue> ac_flag_list
239 %type <Address_node> address
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_line
245 %type <Queue> crypto_command_list
246 %type <Attr_val> discard_option
247 %type <Queue> discard_option_list
248 %type <Attr_val> filegen_option
249 %type <Queue> filegen_option_list
250 %type <Integer> filegen_type
251 %type <Attr_val> fudge_factor
252 %type <Queue> fudge_factor_list
253 %type <Queue> integer_list
254 %type <Integer> nic_rule_action
255 %type <Queue> interface_command
256 %type <Integer> interface_nic
257 %type <Address_node> ip_address
258 %type <Attr_val> log_config_command
259 %type <Queue> log_config_list
260 %type <Integer> nic_rule_class
261 %type <Double> number
262 %type <Attr_val> option
263 %type <Queue> option_list
264 %type <Integer> stat
265 %type <Queue> stats_list
266 %type <Queue> string_list
267 %type <Attr_val> system_option
268 %type <Queue> system_option_list
269 %type <Attr_val> tinker_option
270 %type <Queue> tinker_option_list
271 %type <Attr_val> tos_option
272 %type <Queue> tos_option_list
273 %type <Attr_val> trap_option
274 %type <Queue> trap_option_list
275 %type <Integer> unpeer_keyword
276 %type <Set_var> variable_assign
278 /* NTP Simulator non-terminals */
279 %type <Queue> sim_init_statement_list
280 %type <Attr_val> sim_init_statement
281 %type <Queue> sim_server_list
282 %type <Sim_server> sim_server
283 %type <Double> sim_server_offset
284 %type <Address_node> sim_server_name
285 %type <Queue> sim_act_list
286 %type <Sim_script> sim_act
287 %type <Queue> sim_act_stmt_list
288 %type <Attr_val> sim_act_stmt
292 /* ntp.conf
293 * Configuration File Grammar
294 * --------------------------
297 configuration
298 : command_list
301 command_list
302 : command_list command T_EOC
303 | command T_EOC
304 | error T_EOC
306 /* I will need to incorporate much more fine grained
307 * error messages. The following should suffice for
308 * the time being.
310 msyslog(LOG_ERR,
311 "syntax error in %s line %d, column %d",
312 ip_file->fname,
313 ip_file->err_line_no,
314 ip_file->err_col_no);
318 command : /* NULL STATEMENT */
319 | server_command
320 | unpeer_command
321 | other_mode_command
322 | authentication_command
323 | monitoring_command
324 | access_control_command
325 | orphan_mode_command
326 | fudge_command
327 | system_option_command
328 | tinker_command
329 | miscellaneous_command
330 | simulate_command
333 /* Server Commands
334 * ---------------
337 server_command
338 : client_type address option_list
340 struct peer_node *my_node = create_peer_node($1, $2, $3);
341 if (my_node)
342 enqueue(cfgt.peers, my_node);
344 | client_type address
346 struct peer_node *my_node = create_peer_node($1, $2, NULL);
347 if (my_node)
348 enqueue(cfgt.peers, my_node);
352 client_type
353 : T_Server
354 | T_Pool
355 | T_Peer
356 | T_Broadcast
357 | T_Manycastclient
360 address
361 : ip_address
362 | T_Ipv4_flag T_String { $$ = create_address_node($2, AF_INET); }
363 | T_Ipv6_flag T_String { $$ = create_address_node($2, AF_INET6); }
366 ip_address
367 : T_String { $$ = create_address_node($1, 0); }
370 option_list
371 : option_list option { $$ = enqueue($1, $2); }
372 | option { $$ = enqueue_in_new_queue($1); }
375 option
376 : T_Autokey { $$ = create_attr_ival(T_Flag, $1); }
377 | T_Bias number { $$ = create_attr_dval($1, $2); }
378 | T_Burst { $$ = create_attr_ival(T_Flag, $1); }
379 | T_Iburst { $$ = create_attr_ival(T_Flag, $1); }
380 | T_Key T_Integer { $$ = create_attr_ival($1, $2); }
381 | T_Minpoll T_Integer { $$ = create_attr_ival($1, $2); }
382 | T_Maxpoll T_Integer { $$ = create_attr_ival($1, $2); }
383 | T_Noselect { $$ = create_attr_ival(T_Flag, $1); }
384 | T_Preempt { $$ = create_attr_ival(T_Flag, $1); }
385 | T_Prefer { $$ = create_attr_ival(T_Flag, $1); }
386 | T_True { $$ = create_attr_ival(T_Flag, $1); }
387 | T_Xleave { $$ = create_attr_ival(T_Flag, $1); }
388 | T_Ttl T_Integer { $$ = create_attr_ival($1, $2); }
389 | T_Mode T_Integer { $$ = create_attr_ival($1, $2); }
390 | T_Version T_Integer { $$ = create_attr_ival($1, $2); }
394 /* unpeer commands
395 * ---------------
398 unpeer_command
399 : unpeer_keyword address
401 struct unpeer_node *my_node = create_unpeer_node($2);
402 if (my_node)
403 enqueue(cfgt.unpeers, my_node);
406 unpeer_keyword
407 : T_Unconfig
408 | T_Unpeer
412 /* Other Modes
413 * (broadcastclient manycastserver multicastclient)
414 * ------------------------------------------------
417 other_mode_command
418 : T_Broadcastclient
419 { cfgt.broadcastclient = 1; }
420 | T_Manycastserver address_list
421 { append_queue(cfgt.manycastserver, $2); }
422 | T_Multicastclient address_list
423 { append_queue(cfgt.multicastclient, $2); }
428 /* Authentication Commands
429 * -----------------------
432 authentication_command
433 : T_Automax T_Integer
434 { enqueue(cfgt.vars, create_attr_ival($1, $2)); }
435 | T_ControlKey T_Integer
436 { cfgt.auth.control_key = $2; }
437 | T_Crypto crypto_command_line
439 cfgt.auth.cryptosw++;
440 append_queue(cfgt.auth.crypto_cmd_list, $2);
442 | T_Keys T_String
443 { cfgt.auth.keys = $2; }
444 | T_Keysdir T_String
445 { cfgt.auth.keysdir = $2; }
446 | T_Requestkey T_Integer
447 { cfgt.auth.request_key = $2; }
448 | T_Revoke T_Integer
449 { cfgt.auth.revoke = $2; }
450 | T_Trustedkey integer_list
451 { cfgt.auth.trusted_key_list = $2; }
452 | T_NtpSignDsocket T_String
453 { cfgt.auth.ntp_signd_socket = $2; }
456 crypto_command_line
457 : crypto_command_list
458 | /* Null list */
459 { $$ = create_queue(); }
462 crypto_command_list
463 : crypto_command_list crypto_command
465 if ($2 != NULL)
466 $$ = enqueue($1, $2);
467 else
468 $$ = $1;
470 | crypto_command
472 if ($1 != NULL)
473 $$ = enqueue_in_new_queue($1);
474 else
475 $$ = create_queue();
479 crypto_command
480 : T_Host T_String
481 { $$ = create_attr_sval($1, $2); }
482 | T_Ident T_String
483 { $$ = create_attr_sval($1, $2); }
484 | T_Pw T_String
485 { $$ = create_attr_sval($1, $2); }
486 | T_Randfile T_String
487 { $$ = create_attr_sval($1, $2); }
488 | T_Sign T_String
489 { $$ = create_attr_sval($1, $2); }
490 | T_Digest T_String
491 { $$ = create_attr_sval($1, $2); }
492 | T_Revoke T_Integer
494 $$ = NULL;
495 cfgt.auth.revoke = $2;
496 msyslog(LOG_WARNING,
497 "'crypto revoke %d' is deprecated, "
498 "please use 'revoke %d' instead.",
499 cfgt.auth.revoke, cfgt.auth.revoke);
504 /* Orphan Mode Commands
505 * --------------------
508 orphan_mode_command
509 : T_Tos tos_option_list
510 { append_queue(cfgt.orphan_cmds,$2); }
513 tos_option_list
514 : tos_option_list tos_option { $$ = enqueue($1, $2); }
515 | tos_option { $$ = enqueue_in_new_queue($1); }
518 tos_option
519 : T_Ceiling T_Integer
520 { $$ = create_attr_dval($1, (double)$2); }
521 | T_Floor T_Integer
522 { $$ = create_attr_dval($1, (double)$2); }
523 | T_Cohort boolean
524 { $$ = create_attr_dval($1, (double)$2); }
525 | T_Orphan T_Integer
526 { $$ = create_attr_dval($1, (double)$2); }
527 | T_Mindist number
528 { $$ = create_attr_dval($1, $2); }
529 | T_Maxdist number
530 { $$ = create_attr_dval($1, $2); }
531 | T_Minclock number
532 { $$ = create_attr_dval($1, $2); }
533 | T_Maxclock number
534 { $$ = create_attr_dval($1, $2); }
535 | T_Minsane T_Integer
536 { $$ = create_attr_dval($1, (double)$2); }
537 | T_Beacon T_Integer
538 { $$ = create_attr_dval($1, (double)$2); }
542 /* Monitoring Commands
543 * -------------------
546 monitoring_command
547 : T_Statistics stats_list
548 { append_queue(cfgt.stats_list, $2); }
549 | T_Statsdir T_String
551 if (input_from_file)
552 cfgt.stats_dir = $2;
553 else {
554 free($2);
555 yyerror("statsdir remote configuration ignored");
558 | T_Filegen stat filegen_option_list
560 enqueue(cfgt.filegen_opts,
561 create_filegen_node($2, $3));
565 stats_list
566 : stats_list stat { $$ = enqueue($1, create_ival($2)); }
567 | stat { $$ = enqueue_in_new_queue(create_ival($1)); }
570 stat
571 : T_Clockstats
572 | T_Cryptostats
573 | T_Loopstats
574 | T_Peerstats
575 | T_Rawstats
576 | T_Sysstats
577 | T_Timingstats
578 | T_Protostats
581 filegen_option_list
582 : filegen_option_list filegen_option
584 if ($2 != NULL)
585 $$ = enqueue($1, $2);
586 else
587 $$ = $1;
589 | filegen_option
591 if ($1 != NULL)
592 $$ = enqueue_in_new_queue($1);
593 else
594 $$ = create_queue();
598 filegen_option
599 : T_File T_String
601 if (input_from_file)
602 $$ = create_attr_sval($1, $2);
603 else {
604 $$ = NULL;
605 free($2);
606 yyerror("filegen file remote configuration ignored");
609 | T_Type filegen_type
611 if (input_from_file)
612 $$ = create_attr_ival($1, $2);
613 else {
614 $$ = NULL;
615 yyerror("filegen type remote configuration ignored");
618 | T_Link
620 if (input_from_file)
621 $$ = create_attr_ival(T_Flag, $1);
622 else {
623 $$ = NULL;
624 yyerror("filegen link remote configuration ignored");
627 | T_Nolink
629 if (input_from_file)
630 $$ = create_attr_ival(T_Flag, $1);
631 else {
632 $$ = NULL;
633 yyerror("filegen nolink remote configuration ignored");
636 | T_Enable { $$ = create_attr_ival(T_Flag, $1); }
637 | T_Disable { $$ = create_attr_ival(T_Flag, $1); }
640 filegen_type
641 : T_None
642 | T_Pid
643 | T_Day
644 | T_Week
645 | T_Month
646 | T_Year
647 | T_Age
651 /* Access Control Commands
652 * -----------------------
655 access_control_command
656 : T_Discard discard_option_list
658 append_queue(cfgt.discard_opts, $2);
660 | T_Restrict address ac_flag_list
662 enqueue(cfgt.restrict_opts,
663 create_restrict_node($2, NULL, $3, ip_file->line_no));
665 | T_Restrict T_Default ac_flag_list
667 enqueue(cfgt.restrict_opts,
668 create_restrict_node(NULL, NULL, $3, ip_file->line_no));
670 | T_Restrict T_Ipv4_flag T_Default ac_flag_list
672 enqueue(cfgt.restrict_opts,
673 create_restrict_node(
674 create_address_node(
675 estrdup("0.0.0.0"),
676 AF_INET),
677 create_address_node(
678 estrdup("255.255.255.255"),
679 AF_INET),
680 $4,
681 ip_file->line_no));
683 | T_Restrict T_Ipv6_flag T_Default ac_flag_list
685 enqueue(cfgt.restrict_opts,
686 create_restrict_node(
687 create_address_node(
688 estrdup("::"),
689 AF_INET6),
690 create_address_node(
691 estrdup("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"),
692 AF_INET6),
693 $4,
694 ip_file->line_no));
696 | T_Restrict ip_address T_Mask ip_address ac_flag_list
698 enqueue(cfgt.restrict_opts,
699 create_restrict_node($2, $4, $5, ip_file->line_no));
703 ac_flag_list
704 : /* Null statement */
705 { $$ = create_queue(); }
706 | ac_flag_list access_control_flag
707 { $$ = enqueue($1, create_ival($2)); }
710 access_control_flag
711 : T_Flake
712 | T_Ignore
713 | T_Kod
714 | T_Mssntp
715 | T_Limited
716 | T_Lowpriotrap
717 | T_Nomodify
718 | T_Nopeer
719 | T_Noquery
720 | T_Noserve
721 | T_Notrap
722 | T_Notrust
723 | T_Ntpport
724 | T_Version
727 discard_option_list
728 : discard_option_list discard_option
729 { $$ = enqueue($1, $2); }
730 | discard_option
731 { $$ = enqueue_in_new_queue($1); }
734 discard_option
735 : T_Average T_Integer { $$ = create_attr_ival($1, $2); }
736 | T_Minimum T_Integer { $$ = create_attr_ival($1, $2); }
737 | T_Monitor T_Integer { $$ = create_attr_ival($1, $2); }
740 /* Fudge Commands
741 * --------------
744 fudge_command
745 : T_Fudge address fudge_factor_list
746 { enqueue(cfgt.fudge, create_addr_opts_node($2, $3)); }
749 fudge_factor_list
750 : fudge_factor_list fudge_factor
751 { enqueue($1, $2); }
752 | fudge_factor
753 { $$ = enqueue_in_new_queue($1); }
756 fudge_factor
757 : T_Time1 number { $$ = create_attr_dval($1, $2); }
758 | T_Time2 number { $$ = create_attr_dval($1, $2); }
759 | T_Stratum T_Integer { $$ = create_attr_ival($1, $2); }
760 | T_Refid T_String { $$ = create_attr_sval($1, $2); }
761 | T_Flag1 boolean { $$ = create_attr_ival($1, $2); }
762 | T_Flag2 boolean { $$ = create_attr_ival($1, $2); }
763 | T_Flag3 boolean { $$ = create_attr_ival($1, $2); }
764 | T_Flag4 boolean { $$ = create_attr_ival($1, $2); }
767 /* Command for System Options
768 * --------------------------
771 system_option_command
772 : T_Enable system_option_list
773 { append_queue(cfgt.enable_opts, $2); }
774 | T_Disable system_option_list
775 { append_queue(cfgt.disable_opts, $2); }
778 system_option_list
779 : system_option_list system_option
781 if ($2 != NULL)
782 $$ = enqueue($1, $2);
783 else
784 $$ = $1;
786 | system_option
788 if ($1 != NULL)
789 $$ = enqueue_in_new_queue($1);
790 else
791 $$ = create_queue();
795 system_option
796 : T_Auth { $$ = create_attr_ival(T_Flag, $1); }
797 | T_Bclient { $$ = create_attr_ival(T_Flag, $1); }
798 | T_Calibrate { $$ = create_attr_ival(T_Flag, $1); }
799 | T_Kernel { $$ = create_attr_ival(T_Flag, $1); }
800 | T_Monitor { $$ = create_attr_ival(T_Flag, $1); }
801 | T_Ntp { $$ = create_attr_ival(T_Flag, $1); }
802 | T_Stats
804 if (input_from_file)
805 $$ = create_attr_ival(T_Flag, $1);
806 else {
807 $$ = NULL;
808 yyerror("enable/disable stats remote configuration ignored");
813 /* Tinker Commands
814 * ---------------
817 tinker_command
818 : T_Tinker tinker_option_list { append_queue(cfgt.tinker, $2); }
821 tinker_option_list
822 : tinker_option_list tinker_option { $$ = enqueue($1, $2); }
823 | tinker_option { $$ = enqueue_in_new_queue($1); }
826 tinker_option
827 : T_Allan number { $$ = create_attr_dval($1, $2); }
828 | T_Dispersion number { $$ = create_attr_dval($1, $2); }
829 | T_Freq number { $$ = create_attr_dval($1, $2); }
830 | T_Huffpuff number { $$ = create_attr_dval($1, $2); }
831 | T_Panic number { $$ = create_attr_dval($1, $2); }
832 | T_Step number { $$ = create_attr_dval($1, $2); }
833 | T_Stepout number { $$ = create_attr_dval($1, $2); }
837 /* Miscellaneous Commands
838 * ----------------------
841 miscellaneous_command
842 : interface_command
843 | T_Includefile T_String command
845 if (curr_include_level >= MAXINCLUDELEVEL) {
846 fprintf(stderr, "getconfig: Maximum include file level exceeded.\n");
847 msyslog(LOG_ERR, "getconfig: Maximum include file level exceeded.");
849 else {
850 fp[curr_include_level + 1] = F_OPEN(FindConfig($2), "r");
851 if (fp[curr_include_level + 1] == NULL) {
852 fprintf(stderr, "getconfig: Couldn't open <%s>\n", FindConfig($2));
853 msyslog(LOG_ERR, "getconfig: Couldn't open <%s>", FindConfig($2));
855 else
856 ip_file = fp[++curr_include_level];
859 | T_End
861 while (curr_include_level != -1)
862 FCLOSE(fp[curr_include_level--]);
865 | T_Broadcastdelay number
866 { enqueue(cfgt.vars, create_attr_dval($1, $2)); }
867 | T_Calldelay T_Integer
868 { enqueue(cfgt.vars, create_attr_ival($1, $2)); }
869 | T_Tick number
870 { enqueue(cfgt.vars, create_attr_dval($1, $2)); }
871 | T_Driftfile drift_parm
872 { /* Null action, possibly all null parms */ }
873 | T_Leapfile T_String
874 { enqueue(cfgt.vars, create_attr_sval($1, $2)); }
876 | T_Pidfile T_String
877 { enqueue(cfgt.vars, create_attr_sval($1, $2)); }
878 | T_Logfile T_String
880 if (input_from_file)
881 enqueue(cfgt.vars,
882 create_attr_sval($1, $2));
883 else {
884 free($2);
885 yyerror("logfile remote configuration ignored");
889 | T_Logconfig log_config_list
890 { append_queue(cfgt.logconfig, $2); }
891 | T_Phone string_list
892 { append_queue(cfgt.phone, $2); }
893 | T_Saveconfigdir T_String
895 if (input_from_file)
896 enqueue(cfgt.vars,
897 create_attr_sval($1, $2));
898 else {
899 free($2);
900 yyerror("saveconfigdir remote configuration ignored");
903 | T_Setvar variable_assign
904 { enqueue(cfgt.setvar, $2); }
905 | T_Trap ip_address
906 { enqueue(cfgt.trap, create_addr_opts_node($2, NULL)); }
907 | T_Trap ip_address trap_option_list
908 { enqueue(cfgt.trap, create_addr_opts_node($2, $3)); }
909 | T_Ttl integer_list
910 { append_queue(cfgt.ttl, $2); }
911 | T_Qos T_String
912 { enqueue(cfgt.qos, create_attr_sval($1, $2)); }
915 drift_parm
916 : T_String
917 { enqueue(cfgt.vars, create_attr_sval(T_Driftfile, $1)); }
918 | T_String T_Double
919 { enqueue(cfgt.vars, create_attr_dval(T_WanderThreshold, $2));
920 enqueue(cfgt.vars, create_attr_sval(T_Driftfile, $1)); }
921 | /* Null driftfile, indicated by null string "\0" */
922 { enqueue(cfgt.vars, create_attr_sval(T_Driftfile, "\0")); }
925 variable_assign
926 : T_String '=' T_String T_Default
927 { $$ = create_setvar_node($1, $3, $4); }
928 | T_String '=' T_String
929 { $$ = create_setvar_node($1, $3, 0); }
932 trap_option_list
933 : trap_option_list trap_option
934 { $$ = enqueue($1, $2); }
935 | trap_option { $$ = enqueue_in_new_queue($1); }
938 trap_option
939 : T_Port T_Integer { $$ = create_attr_ival($1, $2); }
940 | T_Interface ip_address { $$ = create_attr_pval($1, $2); }
943 log_config_list
944 : log_config_list log_config_command { $$ = enqueue($1, $2); }
945 | log_config_command { $$ = enqueue_in_new_queue($1); }
948 log_config_command
949 : T_String
951 char prefix = $1[0];
952 char *type = $1 + 1;
954 if (prefix != '+' && prefix != '-' && prefix != '=') {
955 yyerror("Logconfig prefix is not '+', '-' or '='\n");
957 else
958 $$ = create_attr_sval(prefix, estrdup(type));
959 YYFREE($1);
963 interface_command
964 : interface_nic nic_rule_action nic_rule_class
966 enqueue(cfgt.nic_rules,
967 create_nic_rule_node($3, NULL, $2));
969 | interface_nic nic_rule_action T_String
971 enqueue(cfgt.nic_rules,
972 create_nic_rule_node(0, $3, $2));
976 interface_nic
977 : T_Interface
978 | T_Nic
981 nic_rule_class
982 : T_All
983 | T_Ipv4
984 | T_Ipv6
985 | T_Wildcard
988 nic_rule_action
989 : T_Listen
990 | T_Ignore
991 | T_Drop
996 /* Miscellaneous Rules
997 * -------------------
1000 integer_list
1001 : integer_list T_Integer { $$ = enqueue($1, create_ival($2)); }
1002 | T_Integer { $$ = enqueue_in_new_queue(create_ival($1)); }
1005 string_list
1006 : string_list T_String { $$ = enqueue($1, create_pval($2)); }
1007 | T_String { $$ = enqueue_in_new_queue(create_pval($1)); }
1010 address_list
1011 : address_list address { $$ = enqueue($1, $2); }
1012 | address { $$ = enqueue_in_new_queue($1); }
1015 boolean
1016 : T_Integer
1018 if ($1 != 0 && $1 != 1) {
1019 yyerror("Integer value is not boolean (0 or 1). Assuming 1");
1020 $$ = 1;
1022 else
1023 $$ = $1;
1025 | T_True { $$ = 1; }
1026 | T_False { $$ = 0; }
1029 number
1030 : T_Integer { $$ = (double)$1; }
1031 | T_Double
1035 /* Simulator Configuration Commands
1036 * --------------------------------
1039 simulate_command
1040 : sim_conf_start '{' sim_init_statement_list sim_server_list '}'
1042 cfgt.sim_details = create_sim_node($3, $4);
1044 /* Reset the old_config_style variable */
1045 old_config_style = 1;
1049 /* The following is a terrible hack to get the configuration file to
1050 * treat newlines as whitespace characters within the simulation.
1051 * This is needed because newlines are significant in the rest of the
1052 * configuration file.
1054 sim_conf_start
1055 : T_Simulate { old_config_style = 0; }
1058 sim_init_statement_list
1059 : sim_init_statement_list sim_init_statement T_EOC { $$ = enqueue($1, $2); }
1060 | sim_init_statement T_EOC { $$ = enqueue_in_new_queue($1); }
1063 sim_init_statement
1064 : T_Beep_Delay '=' number { $$ = create_attr_dval($1, $3); }
1065 | T_Sim_Duration '=' number { $$ = create_attr_dval($1, $3); }
1068 sim_server_list
1069 : sim_server_list sim_server { $$ = enqueue($1, $2); }
1070 | sim_server { $$ = enqueue_in_new_queue($1); }
1073 sim_server
1074 : sim_server_name '{' sim_server_offset sim_act_list '}'
1075 { $$ = create_sim_server($1, $3, $4); }
1078 sim_server_offset
1079 : T_Server_Offset '=' number T_EOC { $$ = $3; }
1082 sim_server_name
1083 : T_Server '=' address { $$ = $3; }
1086 sim_act_list
1087 : sim_act_list sim_act { $$ = enqueue($1, $2); }
1088 | sim_act { $$ = enqueue_in_new_queue($1); }
1091 sim_act
1092 : T_Duration '=' number '{' sim_act_stmt_list '}'
1093 { $$ = create_sim_script_info($3, $5); }
1096 sim_act_stmt_list
1097 : sim_act_stmt_list sim_act_stmt T_EOC { $$ = enqueue($1, $2); }
1098 | sim_act_stmt T_EOC { $$ = enqueue_in_new_queue($1); }
1101 sim_act_stmt
1102 : T_Freq_Offset '=' number
1103 { $$ = create_attr_dval($1, $3); }
1104 | T_Wander '=' number
1105 { $$ = create_attr_dval($1, $3); }
1106 | T_Jitter '=' number
1107 { $$ = create_attr_dval($1, $3); }
1108 | T_Prop_Delay '=' number
1109 { $$ = create_attr_dval($1, $3); }
1110 | T_Proc_Delay '=' number
1111 { $$ = create_attr_dval($1, $3); }
1117 void yyerror (char *msg)
1119 int retval;
1121 ip_file->err_line_no = ip_file->prev_token_line_no;
1122 ip_file->err_col_no = ip_file->prev_token_col_no;
1124 msyslog(LOG_ERR,
1125 "line %d column %d %s",
1126 ip_file->err_line_no,
1127 ip_file->err_col_no,
1128 msg);
1129 if (!input_from_file) {
1130 /* Save the error message in the correct buffer */
1131 retval = snprintf(remote_config.err_msg + remote_config.err_pos,
1132 MAXLINE - remote_config.err_pos,
1133 "column %d %s",
1134 ip_file->err_col_no, msg);
1136 /* Increment the value of err_pos */
1137 if (retval > 0)
1138 remote_config.err_pos += retval;
1140 /* Increment the number of errors */
1141 ++remote_config.no_errors;
1147 * token_name - convert T_ token integers to text
1148 * example: token_name(T_Server) returns "T_Server"
1150 const char *
1151 token_name(
1152 int token
1155 return yytname[YYTRANSLATE(token)];
1159 /* Initial Testing function -- ignore
1160 int main(int argc, char *argv[])
1162 ip_file = FOPEN(argv[1], "r");
1163 if (!ip_file) {
1164 fprintf(stderr, "ERROR!! Could not open file: %s\n", argv[1]);
1166 key_scanner = create_keyword_scanner(keyword_list);
1167 print_keyword_scanner(key_scanner, 0);
1168 yyparse();
1169 return 0;