5 * The parser for the NTP configuration file.
7 * Written By: Sachin Kamboj
8 * University of Delaware
19 #include "ntp_machine.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
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 */
47 * Enable generation of token names array even without YYDEBUG.
48 * We access via token_name() defined below.
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
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
293 * Configuration File Grammar
294 * --------------------------
302 : command_list command T_EOC
306 /* I will need to incorporate much more fine grained
307 * error messages. The following should suffice for
311 "syntax error in %s line %d, column %d",
313 ip_file
->err_line_no
,
314 ip_file
->err_col_no
);
318 command
: /* NULL STATEMENT */
322 | authentication_command
324 | access_control_command
325 | orphan_mode_command
327 | system_option_command
329 | miscellaneous_command
338 : client_type address option_list
340 struct peer_node
*my_node
= create_peer_node
($1, $2, $3);
342 enqueue
(cfgt.peers
, my_node
);
344 | client_type address
346 struct peer_node
*my_node
= create_peer_node
($1, $2, NULL
);
348 enqueue
(cfgt.peers
, my_node
);
362 | T_Ipv4_flag T_String
{ $$
= create_address_node
($2, AF_INET
); }
363 | T_Ipv6_flag T_String
{ $$
= create_address_node
($2, AF_INET6
); }
367 : T_String
{ $$
= create_address_node
($1, 0); }
371 : option_list option
{ $$
= enqueue
($1, $2); }
372 | option
{ $$
= enqueue_in_new_queue
($1); }
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); }
399 : unpeer_keyword address
401 struct unpeer_node
*my_node
= create_unpeer_node
($2);
403 enqueue
(cfgt.unpeers
, my_node
);
413 * (broadcastclient manycastserver multicastclient)
414 * ------------------------------------------------
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);
443 { cfgt.auth.keys
= $2; }
445 { cfgt.auth.keysdir
= $2; }
446 | T_Requestkey T_Integer
447 { cfgt.auth.request_key
= $2; }
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; }
457 : crypto_command_list
459 { $$
= create_queue
(); }
463 : crypto_command_list crypto_command
466 $$
= enqueue
($1, $2);
473 $$
= enqueue_in_new_queue
($1);
481 { $$
= create_attr_sval
($1, $2); }
483 { $$
= create_attr_sval
($1, $2); }
485 { $$
= create_attr_sval
($1, $2); }
486 | T_Randfile T_String
487 { $$
= create_attr_sval
($1, $2); }
489 { $$
= create_attr_sval
($1, $2); }
491 { $$
= create_attr_sval
($1, $2); }
495 cfgt.auth.revoke
= $2;
497 "'crypto revoke %d' is deprecated, "
498 "please use 'revoke %d' instead.",
499 cfgt.auth.revoke
, cfgt.auth.revoke
);
504 /* Orphan Mode Commands
505 * --------------------
509 : T_Tos tos_option_list
510 { append_queue
(cfgt.orphan_cmds
,$2); }
514 : tos_option_list tos_option
{ $$
= enqueue
($1, $2); }
515 | tos_option
{ $$
= enqueue_in_new_queue
($1); }
519 : T_Ceiling T_Integer
520 { $$
= create_attr_dval
($1, (double)$2); }
522 { $$
= create_attr_dval
($1, (double)$2); }
524 { $$
= create_attr_dval
($1, (double)$2); }
526 { $$
= create_attr_dval
($1, (double)$2); }
528 { $$
= create_attr_dval
($1, $2); }
530 { $$
= create_attr_dval
($1, $2); }
532 { $$
= create_attr_dval
($1, $2); }
534 { $$
= create_attr_dval
($1, $2); }
535 | T_Minsane T_Integer
536 { $$
= create_attr_dval
($1, (double)$2); }
538 { $$
= create_attr_dval
($1, (double)$2); }
542 /* Monitoring Commands
543 * -------------------
547 : T_Statistics stats_list
548 { append_queue
(cfgt.stats_list
, $2); }
549 | T_Statsdir T_String
555 yyerror("statsdir remote configuration ignored");
558 | T_Filegen stat filegen_option_list
560 enqueue
(cfgt.filegen_opts
,
561 create_filegen_node
($2, $3));
566 : stats_list stat
{ $$
= enqueue
($1, create_ival
($2)); }
567 | stat
{ $$
= enqueue_in_new_queue
(create_ival
($1)); }
582 : filegen_option_list filegen_option
585 $$
= enqueue
($1, $2);
592 $$
= enqueue_in_new_queue
($1);
602 $$
= create_attr_sval
($1, $2);
606 yyerror("filegen file remote configuration ignored");
609 | T_Type filegen_type
612 $$
= create_attr_ival
($1, $2);
615 yyerror("filegen type remote configuration ignored");
621 $$
= create_attr_ival
(T_Flag
, $1);
624 yyerror("filegen link remote configuration ignored");
630 $$
= create_attr_ival
(T_Flag
, $1);
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); }
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
(
678 estrdup
("255.255.255.255"),
683 | T_Restrict T_Ipv6_flag T_Default ac_flag_list
685 enqueue
(cfgt.restrict_opts
,
686 create_restrict_node
(
691 estrdup
("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"),
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
));
704 : /* Null statement */
705 { $$
= create_queue
(); }
706 | ac_flag_list access_control_flag
707 { $$
= enqueue
($1, create_ival
($2)); }
728 : discard_option_list discard_option
729 { $$
= enqueue
($1, $2); }
731 { $$
= enqueue_in_new_queue
($1); }
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); }
745 : T_Fudge address fudge_factor_list
746 { enqueue
(cfgt.fudge
, create_addr_opts_node
($2, $3)); }
750 : fudge_factor_list fudge_factor
753 { $$
= enqueue_in_new_queue
($1); }
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); }
779 : system_option_list system_option
782 $$
= enqueue
($1, $2);
789 $$
= enqueue_in_new_queue
($1);
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); }
805 $$
= create_attr_ival
(T_Flag
, $1);
808 yyerror("enable/disable stats remote configuration ignored");
818 : T_Tinker tinker_option_list
{ append_queue
(cfgt.tinker
, $2); }
822 : tinker_option_list tinker_option
{ $$
= enqueue
($1, $2); }
823 | tinker_option
{ $$
= enqueue_in_new_queue
($1); }
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
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.");
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));
856 ip_file
= fp
[++curr_include_level
];
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)); }
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)); }
877 { enqueue
(cfgt.vars
, create_attr_sval
($1, $2)); }
882 create_attr_sval
($1, $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
897 create_attr_sval
($1, $2));
900 yyerror("saveconfigdir remote configuration ignored");
903 | T_Setvar variable_assign
904 { enqueue
(cfgt.setvar
, $2); }
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)); }
910 { append_queue
(cfgt.ttl
, $2); }
912 { enqueue
(cfgt.qos
, create_attr_sval
($1, $2)); }
917 { enqueue
(cfgt.vars
, create_attr_sval
(T_Driftfile
, $1)); }
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")); }
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); }
933 : trap_option_list trap_option
934 { $$
= enqueue
($1, $2); }
935 | trap_option
{ $$
= enqueue_in_new_queue
($1); }
939 : T_Port T_Integer
{ $$
= create_attr_ival
($1, $2); }
940 | T_Interface ip_address
{ $$
= create_attr_pval
($1, $2); }
944 : log_config_list log_config_command
{ $$
= enqueue
($1, $2); }
945 | log_config_command
{ $$
= enqueue_in_new_queue
($1); }
954 if
(prefix
!= '+' && prefix
!= '-' && prefix
!= '=') {
955 yyerror("Logconfig prefix is not '+', '-' or '='\n");
958 $$
= create_attr_sval
(prefix
, estrdup
(type
));
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));
996 /* Miscellaneous Rules
997 * -------------------
1001 : integer_list T_Integer
{ $$
= enqueue
($1, create_ival
($2)); }
1002 | T_Integer
{ $$
= enqueue_in_new_queue
(create_ival
($1)); }
1006 : string_list T_String
{ $$
= enqueue
($1, create_pval
($2)); }
1007 | T_String
{ $$
= enqueue_in_new_queue
(create_pval
($1)); }
1011 : address_list address
{ $$
= enqueue
($1, $2); }
1012 | address
{ $$
= enqueue_in_new_queue
($1); }
1018 if
($1 != 0 && $1 != 1) {
1019 yyerror("Integer value is not boolean (0 or 1). Assuming 1");
1025 | T_True
{ $$
= 1; }
1026 | T_False
{ $$
= 0; }
1030 : T_Integer
{ $$
= (double)$1; }
1035 /* Simulator Configuration Commands
1036 * --------------------------------
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.
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); }
1064 : T_Beep_Delay
'=' number
{ $$
= create_attr_dval
($1, $3); }
1065 | T_Sim_Duration
'=' number
{ $$
= create_attr_dval
($1, $3); }
1069 : sim_server_list sim_server
{ $$
= enqueue
($1, $2); }
1070 | sim_server
{ $$
= enqueue_in_new_queue
($1); }
1074 : sim_server_name
'{' sim_server_offset sim_act_list
'}'
1075 { $$
= create_sim_server
($1, $3, $4); }
1079 : T_Server_Offset
'=' number T_EOC
{ $$
= $3; }
1083 : T_Server
'=' address
{ $$
= $3; }
1087 : sim_act_list sim_act
{ $$
= enqueue
($1, $2); }
1088 | sim_act
{ $$
= enqueue_in_new_queue
($1); }
1092 : T_Duration
'=' number
'{' sim_act_stmt_list
'}'
1093 { $$
= create_sim_script_info
($3, $5); }
1097 : sim_act_stmt_list sim_act_stmt T_EOC
{ $$
= enqueue
($1, $2); }
1098 | sim_act_stmt T_EOC
{ $$
= enqueue_in_new_queue
($1); }
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
)
1121 ip_file
->err_line_no
= ip_file
->prev_token_line_no
;
1122 ip_file
->err_col_no
= ip_file
->prev_token_col_no
;
1125 "line %d column %d %s",
1126 ip_file
->err_line_no
,
1127 ip_file
->err_col_no
,
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
,
1134 ip_file
->err_col_no
, msg
);
1136 /* Increment the value of err_pos */
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"
1155 return yytname
[YYTRANSLATE
(token
)];
1159 /* Initial Testing function -- ignore
1160 int main(int argc, char *argv[])
1162 ip_file = FOPEN(argv[1], "r");
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);