Date: Thu, 02 Apr 2015 16:11:03 -0400 From: Jung-uk Kim <jkim@FreeBSD.org> To: Manfred Antar <null@pozo.com>, freebsd-current@freebsd.org Cc: roberto@FreeBSD.org, Cy Schubert <cy@FreeBSD.org>, Xin LI <delphij@FreeBSD.org>, Joel Dahl <joel@vnode.se> Subject: Re: ntpd errors after upgrade on current amd64 Message-ID: <551DA257.6060100@FreeBSD.org> In-Reply-To: <201504011533.t31FWRhp059914@pozo.com> References: <201504011533.t31FWRhp059914@pozo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------090800070300040107060309
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
On 04/01/2015 11:32, Manfred Antar wrote:
> After build install world on current ntpd doesn't work. Here is
> error:
>
> FreeBSD/amd64 (pozo.com) (ttyu0)
>
> login: Apr 1 08:29:19 pozo ntpd[49825]: line 22 column 1 syntax
> error
ntp_crypto.c was not properly merged. Basically, the fix for
SA-14:31.ntp was applied twice. Please try the attached patch.
> Apr 1 08:29:19 pozo ntpd[49825]: setsockopt IPV6_MULTICAST_IF 0
> for fe80::1%2 fails: Can't assign requested address
A separate issue, I think.
Jung-uk Kim
* Note: ntp_parser.y is redundant and it was the root cause of
inconsistent builds and build failures, i.e., ntp_parser.c and
ntp_parser.h may be regenerated on the *source* directory depending on
phase of the moon. Although we can re-gen them after r280915,
upstream does not support BSD yacc.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQEcBAEBCAAGBQJVHaJXAAoJEHyflib82/FGla0H/i7cQunatuUUhGYPGGenmy1X
DEo7zL/LYNWX7XY392dIDKFGZguvErehVy7KNiVXZzrlsz0JRVpQp/r8OT6xPrFF
lGFaOgGB9tfIYKZl+Bn2gE40mwtfp7UX3B2nIswwF2SFBhyuJPiIZ5Y+j3YDyIHS
/BGUs0D+CaKq9RgU66QrowMOtA/uElWix44VHVSNJ2knAL+x6cZF4VzNTC+6wG2c
DVODrTMSqMAwiIkPYJCndbxH7C9ZaQEHVq19pTmYRb1V7x2VO0/3NrBJJYSP9GGe
PQS/HiU9lkIi/JSj3AN9+ntyzKpne/DJz6/AAe/JpCGj/o1Ke+ageA6m7yoqHL8=
=wNw9
-----END PGP SIGNATURE-----
--------------090800070300040107060309
Content-Type: text/x-patch;
name="ntp.diff"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="ntp.diff"
Index: contrib/ntp/ntpd/ntp_crypto.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- contrib/ntp/ntpd/ntp_crypto.c (revision 280991)
+++ contrib/ntp/ntpd/ntp_crypto.c (working copy)
@@ -826,10 +826,10 @@ crypto_recv(
* Decrypt the cookie, hunting all the time for
* errors.
*/
- if (vallen =3D=3D (u_int) EVP_PKEY_size(host_pkey)) {
+ if (vallen =3D=3D (u_int)EVP_PKEY_size(host_pkey)) {
u_int32 *cookiebuf =3D malloc(
RSA_size(host_pkey->pkey.rsa));
- if (cookiebuf =3D=3D NULL) {
+ if (!cookiebuf) {
rval =3D XEVNT_CKY;
break;
}
@@ -3817,7 +3817,7 @@ crypto_setup(void)
randfile);
exit (-1);
}
- get_systime(&seed);
+ arc4random_buf(&seed, sizeof(l_fp));
RAND_seed(&seed, sizeof(l_fp));
RAND_write_file(randfile);
#ifdef DEBUG
@@ -3850,36 +3850,6 @@ crypto_setup(void)
pinfo =3D crypto_key(filename, passwd, NULL);
if (pinfo =3D=3D NULL) {
msyslog(LOG_ERR,
- "crypto_setup: random seed file not specified");
- exit (-1);
- }
- if ((bytes =3D RAND_load_file(rand_file, -1)) =3D=3D 0) {
- msyslog(LOG_ERR,
- "crypto_setup: random seed file %s not found\n",
- rand_file);
- exit (-1);
- }
- arc4random_buf(&seed, sizeof(l_fp));
- RAND_seed(&seed, sizeof(l_fp));
- RAND_write_file(rand_file);
- OpenSSL_add_all_algorithms();
-#ifdef DEBUG
- if (debug)
- printf(
- "crypto_setup: OpenSSL version %lx random seed file %s bytes read =
%d\n",
- SSLeay(), rand_file, bytes);
-#endif
-
- /*
- * Load required host key from file "ntpkey_host_<hostname>". If
- * no host key file is not found or has invalid password, life
- * as we know it ends. The host key also becomes the default
- * sign key.=20
- */
- snprintf(filename, sizeof(filename), "ntpkey_host_%s", hostname);
- pinfo =3D crypto_key(filename, passwd, NULL);
- if (pinfo =3D=3D NULL) {
- msyslog(LOG_ERR,
"crypto_setup: host key file %s not found or corrupt",
filename);
exit (-1);
Index: contrib/ntp/ntpd/ntp_parser.y
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- contrib/ntp/ntpd/ntp_parser.y (revision 280991)
+++ contrib/ntp/ntpd/ntp_parser.y (working copy)
@@ -1,1641 +0,0 @@
-/* ntp_parser.y
- *
- * The parser for the NTP configuration file.
- *
- * Written By: Sachin Kamboj
- * University of Delaware
- * Newark, DE 19711
- * Copyright (c) 2006
- */
-
-%parse-param { struct FILE_INFO *ip_file }
-%lex-param { struct FILE_INFO *ip_file }
-
-%{
- #ifdef HAVE_CONFIG_H
- # include <config.h>
- #endif
-
- #include "ntp.h"
- #include "ntpd.h"
- #include "ntp_machine.h"
- #include "ntp_stdlib.h"
- #include "ntp_filegen.h"
- #include "ntp_scanner.h"
- #include "ntp_config.h"
- #include "ntp_crypto.h"
-
- #include "ntpsim.h" /* HMS: Do we really want this all the time? */
- /* SK: It might be a good idea to always
- include the simulator code. That way
- someone can use the same configuration file
- for both the simulator and the daemon
- */
-
- #define YYMALLOC emalloc
- #define YYFREE free
- #define YYERROR_VERBOSE
- #define YYMAXDEPTH 1000 /* stop the madness sooner */
- void yyerror(struct FILE_INFO *ip_file, const char *msg);
-
- #ifdef SIM
- # define ONLY_SIM(a) (a)
- #else
- # define ONLY_SIM(a) NULL
- #endif
-%}
-
-/*=20
- * Enable generation of token names array even without YYDEBUG.
- * We access via token_name() defined below.
- */
-%token-table
-
-%union {
- char * String;
- double Double;
- int Integer;
- unsigned U_int;
- gen_fifo * Generic_fifo;
- attr_val * Attr_val;
- attr_val_fifo * Attr_val_fifo;
- int_fifo * Int_fifo;
- string_fifo * String_fifo;
- address_node * Address_node;
- address_fifo * Address_fifo;
- setvar_node * Set_var;
- server_info * Sim_server;
- server_info_fifo * Sim_server_fifo;
- script_info * Sim_script;
- script_info_fifo * Sim_script_fifo;
-}
-
-/* TERMINALS (do not appear left of colon) */
-%token <Integer> T_Abbrev
-%token <Integer> T_Age
-%token <Integer> T_All
-%token <Integer> T_Allan
-%token <Integer> T_Allpeers
-%token <Integer> T_Auth
-%token <Integer> T_Autokey
-%token <Integer> T_Automax
-%token <Integer> T_Average
-%token <Integer> T_Bclient
-%token <Integer> T_Beacon
-%token <Integer> T_Broadcast
-%token <Integer> T_Broadcastclient
-%token <Integer> T_Broadcastdelay
-%token <Integer> T_Burst
-%token <Integer> T_Calibrate
-%token <Integer> T_Ceiling
-%token <Integer> T_Clockstats
-%token <Integer> T_Cohort
-%token <Integer> T_ControlKey
-%token <Integer> T_Crypto
-%token <Integer> T_Cryptostats
-%token <Integer> T_Ctl
-%token <Integer> T_Day
-%token <Integer> T_Default
-%token <Integer> T_Digest
-%token <Integer> T_Disable
-%token <Integer> T_Discard
-%token <Integer> T_Dispersion
-%token <Double> T_Double /* not a token */
-%token <Integer> T_Driftfile
-%token <Integer> T_Drop
-%token <Integer> T_Ellipsis /* "..." not "ellipsis" */
-%token <Integer> T_Enable
-%token <Integer> T_End
-%token <Integer> T_False
-%token <Integer> T_File
-%token <Integer> T_Filegen
-%token <Integer> T_Filenum
-%token <Integer> T_Flag1
-%token <Integer> T_Flag2
-%token <Integer> T_Flag3
-%token <Integer> T_Flag4
-%token <Integer> T_Flake
-%token <Integer> T_Floor
-%token <Integer> T_Freq
-%token <Integer> T_Fudge
-%token <Integer> T_Host
-%token <Integer> T_Huffpuff
-%token <Integer> T_Iburst
-%token <Integer> T_Ident
-%token <Integer> T_Ignore
-%token <Integer> T_Incalloc
-%token <Integer> T_Incmem
-%token <Integer> T_Initalloc
-%token <Integer> T_Initmem
-%token <Integer> T_Includefile
-%token <Integer> T_Integer /* not a token */
-%token <Integer> T_Interface
-%token <Integer> T_Intrange /* not a token */
-%token <Integer> T_Io
-%token <Integer> T_Ipv4
-%token <Integer> T_Ipv4_flag
-%token <Integer> T_Ipv6
-%token <Integer> T_Ipv6_flag
-%token <Integer> T_Kernel
-%token <Integer> T_Key
-%token <Integer> T_Keys
-%token <Integer> T_Keysdir
-%token <Integer> T_Kod
-%token <Integer> T_Mssntp
-%token <Integer> T_Leapfile
-%token <Integer> T_Limited
-%token <Integer> T_Link
-%token <Integer> T_Listen
-%token <Integer> T_Logconfig
-%token <Integer> T_Logfile
-%token <Integer> T_Loopstats
-%token <Integer> T_Lowpriotrap
-%token <Integer> T_Manycastclient
-%token <Integer> T_Manycastserver
-%token <Integer> T_Mask
-%token <Integer> T_Maxage
-%token <Integer> T_Maxclock
-%token <Integer> T_Maxdepth
-%token <Integer> T_Maxdist
-%token <Integer> T_Maxmem
-%token <Integer> T_Maxpoll
-%token <Integer> T_Mdnstries
-%token <Integer> T_Mem
-%token <Integer> T_Memlock
-%token <Integer> T_Minclock
-%token <Integer> T_Mindepth
-%token <Integer> T_Mindist
-%token <Integer> T_Minimum
-%token <Integer> T_Minpoll
-%token <Integer> T_Minsane
-%token <Integer> T_Mode
-%token <Integer> T_Mode7
-%token <Integer> T_Monitor
-%token <Integer> T_Month
-%token <Integer> T_Mru
-%token <Integer> T_Multicastclient
-%token <Integer> T_Nic
-%token <Integer> T_Nolink
-%token <Integer> T_Nomodify
-%token <Integer> T_Nomrulist
-%token <Integer> T_None
-%token <Integer> T_Nonvolatile
-%token <Integer> T_Nopeer
-%token <Integer> T_Noquery
-%token <Integer> T_Noselect
-%token <Integer> T_Noserve
-%token <Integer> T_Notrap
-%token <Integer> T_Notrust
-%token <Integer> T_Ntp
-%token <Integer> T_Ntpport
-%token <Integer> T_NtpSignDsocket
-%token <Integer> T_Orphan
-%token <Integer> T_Orphanwait
-%token <Integer> T_Panic
-%token <Integer> T_Peer
-%token <Integer> T_Peerstats
-%token <Integer> T_Phone
-%token <Integer> T_Pid
-%token <Integer> T_Pidfile
-%token <Integer> T_Pool
-%token <Integer> T_Port
-%token <Integer> T_Preempt
-%token <Integer> T_Prefer
-%token <Integer> T_Protostats
-%token <Integer> T_Pw
-%token <Integer> T_Randfile
-%token <Integer> T_Rawstats
-%token <Integer> T_Refid
-%token <Integer> T_Requestkey
-%token <Integer> T_Reset
-%token <Integer> T_Restrict
-%token <Integer> T_Revoke
-%token <Integer> T_Rlimit
-%token <Integer> T_Saveconfigdir
-%token <Integer> T_Server
-%token <Integer> T_Setvar
-%token <Integer> T_Source
-%token <Integer> T_Stacksize
-%token <Integer> T_Statistics
-%token <Integer> T_Stats
-%token <Integer> T_Statsdir
-%token <Integer> T_Step
-%token <Integer> T_Stepout
-%token <Integer> T_Stratum
-%token <String> T_String /* not a token */
-%token <Integer> T_Sys
-%token <Integer> T_Sysstats
-%token <Integer> T_Tick
-%token <Integer> T_Time1
-%token <Integer> T_Time2
-%token <Integer> T_Timer
-%token <Integer> T_Timingstats
-%token <Integer> T_Tinker
-%token <Integer> T_Tos
-%token <Integer> T_Trap
-%token <Integer> T_True
-%token <Integer> T_Trustedkey
-%token <Integer> T_Ttl
-%token <Integer> T_Type
-%token <Integer> T_U_int /* Not a token */
-%token <Integer> T_Unconfig
-%token <Integer> T_Unpeer
-%token <Integer> T_Version
-%token <Integer> T_WanderThreshold /* Not a token */
-%token <Integer> T_Week
-%token <Integer> T_Wildcard
-%token <Integer> T_Xleave
-%token <Integer> T_Year
-%token <Integer> T_Flag /* Not a token */
-%token <Integer> T_EOC
-
-
-/* NTP Simulator Tokens */
-%token <Integer> T_Simulate
-%token <Integer> T_Beep_Delay
-%token <Integer> T_Sim_Duration
-%token <Integer> T_Server_Offset
-%token <Integer> T_Duration
-%token <Integer> T_Freq_Offset
-%token <Integer> T_Wander
-%token <Integer> T_Jitter
-%token <Integer> T_Prop_Delay
-%token <Integer> T_Proc_Delay
-
-
-
-/*** NON-TERMINALS ***/
-%type <Integer> access_control_flag
-%type <Int_fifo> ac_flag_list
-%type <Address_node> address
-%type <Integer> address_fam
-%type <Address_fifo> address_list
-%type <Integer> boolean
-%type <Integer> client_type
-%type <Integer> counter_set_keyword
-%type <Int_fifo> counter_set_list
-%type <Attr_val> crypto_command
-%type <Attr_val_fifo> crypto_command_list
-%type <Integer> crypto_str_keyword
-%type <Attr_val> discard_option
-%type <Integer> discard_option_keyword
-%type <Attr_val_fifo> discard_option_list
-%type <Integer> enable_disable
-%type <Attr_val> filegen_option
-%type <Attr_val_fifo> filegen_option_list
-%type <Integer> filegen_type
-%type <Attr_val> fudge_factor
-%type <Integer> fudge_factor_bool_keyword
-%type <Integer> fudge_factor_dbl_keyword
-%type <Attr_val_fifo> fudge_factor_list
-%type <Attr_val_fifo> integer_list
-%type <Attr_val_fifo> integer_list_range
-%type <Attr_val> integer_list_range_elt
-%type <Attr_val> integer_range
-%type <Integer> nic_rule_action
-%type <Integer> interface_command
-%type <Integer> interface_nic
-%type <Address_node> ip_address
-%type <Integer> link_nolink
-%type <Attr_val> log_config_command
-%type <Attr_val_fifo> log_config_list
-%type <Integer> misc_cmd_dbl_keyword
-%type <Integer> misc_cmd_str_keyword
-%type <Integer> misc_cmd_str_lcl_keyword
-%type <Attr_val> mru_option
-%type <Integer> mru_option_keyword
-%type <Attr_val_fifo> mru_option_list
-%type <Integer> nic_rule_class
-%type <Double> number
-%type <Attr_val> option
-%type <Attr_val> option_flag
-%type <Integer> option_flag_keyword
-%type <Attr_val_fifo> option_list
-%type <Attr_val> option_int
-%type <Integer> option_int_keyword
-%type <Attr_val> option_str
-%type <Integer> option_str_keyword
-%type <Integer> reset_command
-%type <Integer> rlimit_option_keyword
-%type <Attr_val> rlimit_option
-%type <Attr_val_fifo> rlimit_option_list
-%type <Integer> stat
-%type <Int_fifo> stats_list
-%type <String_fifo> string_list
-%type <Attr_val> system_option
-%type <Integer> system_option_flag_keyword
-%type <Integer> system_option_local_flag_keyword
-%type <Attr_val_fifo> system_option_list
-%type <Integer> t_default_or_zero
-%type <Integer> tinker_option_keyword
-%type <Attr_val> tinker_option
-%type <Attr_val_fifo> tinker_option_list
-%type <Attr_val> tos_option
-%type <Integer> tos_option_dbl_keyword
-%type <Integer> tos_option_int_keyword
-%type <Attr_val_fifo> tos_option_list
-%type <Attr_val> trap_option
-%type <Attr_val_fifo> trap_option_list
-%type <Integer> unpeer_keyword
-%type <Set_var> variable_assign
-
-/* NTP Simulator non-terminals */
-%type <Attr_val> sim_init_statement
-%type <Attr_val_fifo> sim_init_statement_list
-%type <Integer> sim_init_keyword
-%type <Sim_server_fifo> sim_server_list
-%type <Sim_server> sim_server
-%type <Double> sim_server_offset
-%type <Address_node> sim_server_name
-%type <Sim_script> sim_act
-%type <Sim_script_fifo> sim_act_list
-%type <Integer> sim_act_keyword
-%type <Attr_val_fifo> sim_act_stmt_list
-%type <Attr_val> sim_act_stmt
-
-%%
-
-/* ntp.conf
- * Configuration File Grammar
- * --------------------------
- */
-
-configuration
- : command_list
- ;
-
-command_list
- : command_list command T_EOC
- | command T_EOC
- | error T_EOC
- {
- /* I will need to incorporate much more fine grained
- * error messages. The following should suffice for
- * the time being.
- */
- msyslog(LOG_ERR,=20
- "syntax error in %s line %d, column %d",
- ip_file->fname,
- ip_file->err_line_no,
- ip_file->err_col_no);
- }
- ;
-
-command : /* NULL STATEMENT */
- | server_command
- | unpeer_command
- | other_mode_command
- | authentication_command
- | monitoring_command
- | access_control_command
- | orphan_mode_command
- | fudge_command
- | rlimit_command
- | system_option_command
- | tinker_command
- | miscellaneous_command
- | simulate_command
- ;
-
-/* Server Commands
- * ---------------
- */
-
-server_command
- : client_type address option_list
- {
- peer_node *my_node;
-
- my_node =3D create_peer_node($1, $2, $3);
- APPEND_G_FIFO(cfgt.peers, my_node);
- }
- ;
-
-client_type
- : T_Server
- | T_Pool
- | T_Peer
- | T_Broadcast
- | T_Manycastclient
- ;
-
-address
- : ip_address
- | address_fam T_String
- { $$ =3D create_address_node($2, $1); }
- ;
-
-ip_address
- : T_String=20
- { $$ =3D create_address_node($1, AF_UNSPEC); }
- ;
-
-address_fam
- : T_Ipv4_flag
- { $$ =3D AF_INET; }
- | T_Ipv6_flag
- { $$ =3D AF_INET6; }
- ;
-
-option_list
- : /* empty list */
- { $$ =3D NULL; }
- | option_list option=20
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- ;
-
-option
- : option_flag
- | option_int
- | option_str
- ;
-
-option_flag
- : option_flag_keyword
- { $$ =3D create_attr_ival(T_Flag, $1); }
- ;
-
-option_flag_keyword
- : T_Autokey
- | T_Burst
- | T_Iburst
- | T_Noselect
- | T_Preempt
- | T_Prefer
- | T_True
- | T_Xleave
- ;
-
-option_int
- : option_int_keyword T_Integer
- { $$ =3D create_attr_ival($1, $2); }
- | option_int_keyword T_U_int
- { $$ =3D create_attr_uval($1, $2); }
- ;
-
-option_int_keyword
- : T_Key
- | T_Minpoll
- | T_Maxpoll
- | T_Ttl
- | T_Mode
- | T_Version
- ;
-
-option_str
- : option_str_keyword T_String
- { $$ =3D create_attr_sval($1, $2); }
- ;
-
-option_str_keyword
- : T_Ident
- ;
-
-
-/* unpeer commands
- * ---------------
- */
-
-unpeer_command
- : unpeer_keyword address
- {
- unpeer_node *my_node;
- =09
- my_node =3D create_unpeer_node($2);
- if (my_node)
- APPEND_G_FIFO(cfgt.unpeers, my_node);
- }
- ;=09
-unpeer_keyword=09
- : T_Unconfig
- | T_Unpeer
- ;
-=09
-=09
-/* Other Modes
- * (broadcastclient manycastserver multicastclient)
- * ------------------------------------------------
- */
-
-other_mode_command
- : T_Broadcastclient
- { cfgt.broadcastclient =3D 1; }
- | T_Manycastserver address_list
- { CONCAT_G_FIFOS(cfgt.manycastserver, $2); }
- | T_Multicastclient address_list
- { CONCAT_G_FIFOS(cfgt.multicastclient, $2); }
- | T_Mdnstries T_Integer
- { cfgt.mdnstries =3D $2; }
- ;
-
-
-
-/* Authentication Commands
- * -----------------------
- */
-
-authentication_command
- : T_Automax T_Integer
- {
- attr_val *atrv;
- =09
- atrv =3D create_attr_ival($1, $2);
- APPEND_G_FIFO(cfgt.vars, atrv);
- }
- | T_ControlKey T_Integer
- { cfgt.auth.control_key =3D $2; }
- | T_Crypto crypto_command_list
- {=20
- cfgt.auth.cryptosw++;
- CONCAT_G_FIFOS(cfgt.auth.crypto_cmd_list, $2);
- }
- | T_Keys T_String
- { cfgt.auth.keys =3D $2; }
- | T_Keysdir T_String
- { cfgt.auth.keysdir =3D $2; }
- | T_Requestkey T_Integer
- { cfgt.auth.request_key =3D $2; }
- | T_Revoke T_Integer
- { cfgt.auth.revoke =3D $2; }
- | T_Trustedkey integer_list_range
- {
- cfgt.auth.trusted_key_list =3D $2;
-
- // if (!cfgt.auth.trusted_key_list)
- // cfgt.auth.trusted_key_list =3D $2;
- // else
- // LINK_SLIST(cfgt.auth.trusted_key_list, $2, link);
- }
- | T_NtpSignDsocket T_String
- { cfgt.auth.ntp_signd_socket =3D $2; }
- ;
-
-crypto_command_list
- : /* empty list */
- { $$ =3D NULL; }
- | crypto_command_list crypto_command
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- ;
-
-crypto_command
- : crypto_str_keyword T_String
- { $$ =3D create_attr_sval($1, $2); }
- | T_Revoke T_Integer
- {
- $$ =3D NULL;
- cfgt.auth.revoke =3D $2;
- msyslog(LOG_WARNING,
- "'crypto revoke %d' is deprecated, "
- "please use 'revoke %d' instead.",
- cfgt.auth.revoke, cfgt.auth.revoke);
- }
- ;
-
-crypto_str_keyword
- : T_Host
- | T_Ident
- | T_Pw
- | T_Randfile
- | T_Digest
- ;
-
-
-/* Orphan Mode Commands
- * --------------------
- */
-
-orphan_mode_command
- : T_Tos tos_option_list
- { CONCAT_G_FIFOS(cfgt.orphan_cmds, $2); }
- ;
-
-tos_option_list
- : tos_option_list tos_option
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | tos_option
- {=09
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-tos_option
- : tos_option_int_keyword T_Integer
- { $$ =3D create_attr_dval($1, (double)$2); }
- | tos_option_dbl_keyword number
- { $$ =3D create_attr_dval($1, $2); }
- | T_Cohort boolean
- { $$ =3D create_attr_dval($1, (double)$2); }
- ;
-
-tos_option_int_keyword
- : T_Ceiling
- | T_Floor
- | T_Orphan
- | T_Orphanwait
- | T_Minsane
- | T_Beacon
- ;
-
-tos_option_dbl_keyword
- : T_Mindist
- | T_Maxdist
- | T_Minclock
- | T_Maxclock
- ;
-
-
-/* Monitoring Commands
- * -------------------
- */
-
-monitoring_command
- : T_Statistics stats_list
- { CONCAT_G_FIFOS(cfgt.stats_list, $2); }
- | T_Statsdir T_String
- {
- if (input_from_file) {
- cfgt.stats_dir =3D $2;
- } else {
- YYFREE($2);
- yyerror(ip_file, "statsdir remote configuration ignored");
- }
- }
- | T_Filegen stat filegen_option_list
- {
- filegen_node *fgn;
- =09
- fgn =3D create_filegen_node($2, $3);
- APPEND_G_FIFO(cfgt.filegen_opts, fgn);
- }
- ;
-
-stats_list
- : stats_list stat=20
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, create_int_node($2));
- }
- | stat
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, create_int_node($1));
- }
- ;
-
-stat
- : T_Clockstats
- | T_Cryptostats
- | T_Loopstats
- | T_Peerstats
- | T_Rawstats
- | T_Sysstats
- | T_Timingstats
- | T_Protostats
- ;
-
-filegen_option_list
- : /* empty list */
- { $$ =3D NULL; }
- | filegen_option_list filegen_option
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- ;
-
-filegen_option
- : T_File T_String
- {
- if (input_from_file) {
- $$ =3D create_attr_sval($1, $2);
- } else {
- $$ =3D NULL;
- YYFREE($2);
- yyerror(ip_file, "filegen file remote config ignored");
- }
- }
- | T_Type filegen_type
- {
- if (input_from_file) {
- $$ =3D create_attr_ival($1, $2);
- } else {
- $$ =3D NULL;
- yyerror(ip_file, "filegen type remote config ignored");
- }
- }
- | link_nolink
- {
- const char *err;
- =09
- if (input_from_file) {
- $$ =3D create_attr_ival(T_Flag, $1);
- } else {
- $$ =3D NULL;
- if (T_Link =3D=3D $1)
- err =3D "filegen link remote config ignored";
- else
- err =3D "filegen nolink remote config ignored";
- yyerror(ip_file, err);
- }
- }
- | enable_disable
- { $$ =3D create_attr_ival(T_Flag, $1); }
- ;
-
-link_nolink
- : T_Link
- | T_Nolink
- ;
-
-enable_disable
- : T_Enable
- | T_Disable
- ;
-
-filegen_type
- : T_None
- | T_Pid
- | T_Day
- | T_Week
- | T_Month
- | T_Year
- | T_Age
- ;
-
-
-/* Access Control Commands
- * -----------------------
- */
-
-access_control_command
- : T_Discard discard_option_list
- {
- CONCAT_G_FIFOS(cfgt.discard_opts, $2);
- }
- | T_Mru mru_option_list
- {
- CONCAT_G_FIFOS(cfgt.mru_opts, $2);
- }
- | T_Restrict address ac_flag_list
- {
- restrict_node *rn;
-
- rn =3D create_restrict_node($2, NULL, $3,
- ip_file->line_no);
- APPEND_G_FIFO(cfgt.restrict_opts, rn);
- }
- | T_Restrict ip_address T_Mask ip_address ac_flag_list
- {
- restrict_node *rn;
-
- rn =3D create_restrict_node($2, $4, $5,
- ip_file->line_no);
- APPEND_G_FIFO(cfgt.restrict_opts, rn);
- }
- | T_Restrict T_Default ac_flag_list
- {
- restrict_node *rn;
-
- rn =3D create_restrict_node(NULL, NULL, $3,
- ip_file->line_no);
- APPEND_G_FIFO(cfgt.restrict_opts, rn);
- }
- | T_Restrict T_Ipv4_flag T_Default ac_flag_list
- {
- restrict_node *rn;
-
- rn =3D create_restrict_node(
- create_address_node(
- estrdup("0.0.0.0"),=20
- AF_INET),
- create_address_node(
- estrdup("0.0.0.0"),=20
- AF_INET),
- $4,=20
- ip_file->line_no);
- APPEND_G_FIFO(cfgt.restrict_opts, rn);
- }
- | T_Restrict T_Ipv6_flag T_Default ac_flag_list
- {
- restrict_node *rn;
- =09
- rn =3D create_restrict_node(
- create_address_node(
- estrdup("::"),=20
- AF_INET6),
- create_address_node(
- estrdup("::"),=20
- AF_INET6),
- $4,=20
- ip_file->line_no);
- APPEND_G_FIFO(cfgt.restrict_opts, rn);
- }
- | T_Restrict T_Source ac_flag_list
- {
- restrict_node * rn;
-
- APPEND_G_FIFO($3, create_int_node($2));
- rn =3D create_restrict_node(
- NULL, NULL, $3, ip_file->line_no);
- APPEND_G_FIFO(cfgt.restrict_opts, rn);
- }
- ;
-
-ac_flag_list
- : /* empty list is allowed */
- { $$ =3D NULL; }
- | ac_flag_list access_control_flag
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, create_int_node($2));
- }
- ;
-
-access_control_flag
- : T_Flake
- | T_Ignore
- | T_Kod
- | T_Mssntp
- | T_Limited
- | T_Lowpriotrap
- | T_Nomodify
- | T_Nomrulist
- | T_Nopeer
- | T_Noquery
- | T_Noserve
- | T_Notrap
- | T_Notrust
- | T_Ntpport
- | T_Version
- ;
-
-discard_option_list
- : discard_option_list discard_option
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | discard_option=20
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-discard_option
- : discard_option_keyword T_Integer
- { $$ =3D create_attr_ival($1, $2); }
- ;
-
-discard_option_keyword
- : T_Average
- | T_Minimum
- | T_Monitor
- ;
-
-mru_option_list
- : mru_option_list mru_option
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | mru_option=20
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-mru_option
- : mru_option_keyword T_Integer
- { $$ =3D create_attr_ival($1, $2); }
- ;
-
-mru_option_keyword
- : T_Incalloc
- | T_Incmem
- | T_Initalloc
- | T_Initmem
- | T_Maxage
- | T_Maxdepth
- | T_Maxmem
- | T_Mindepth
- ;
-
-/* Fudge Commands
- * --------------
- */
-
-fudge_command
- : T_Fudge address fudge_factor_list
- {
- addr_opts_node *aon;
- =09
- aon =3D create_addr_opts_node($2, $3);
- APPEND_G_FIFO(cfgt.fudge, aon);
- }
- ;
-
-fudge_factor_list
- : fudge_factor_list fudge_factor
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | fudge_factor
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-=09
-fudge_factor
- : fudge_factor_dbl_keyword number
- { $$ =3D create_attr_dval($1, $2); }
- | fudge_factor_bool_keyword boolean
- { $$ =3D create_attr_ival($1, $2); }
- | T_Stratum T_Integer
- { $$ =3D create_attr_ival($1, $2); }
- | T_Abbrev T_String
- { $$ =3D create_attr_sval($1, $2); }
- | T_Refid T_String
- { $$ =3D create_attr_sval($1, $2); }
- ;
-
-fudge_factor_dbl_keyword
- : T_Time1
- | T_Time2
- ;
-
-fudge_factor_bool_keyword
- : T_Flag1
- | T_Flag2
- | T_Flag3
- | T_Flag4
- ;
-
-/* rlimit Commands
- * ---------------
- */
-
-rlimit_command
- : T_Rlimit rlimit_option_list
- { CONCAT_G_FIFOS(cfgt.rlimit, $2); }
- ;
-
-rlimit_option_list
- : rlimit_option_list rlimit_option
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | rlimit_option
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-rlimit_option
- : rlimit_option_keyword T_Integer
- { $$ =3D create_attr_ival($1, $2); }
- ;
-
-rlimit_option_keyword
- : T_Memlock
- | T_Stacksize
- | T_Filenum
- ;
-
-
-/* Command for System Options
- * --------------------------
- */
-
-system_option_command
- : T_Enable system_option_list
- { CONCAT_G_FIFOS(cfgt.enable_opts, $2); }
- | T_Disable system_option_list
- { CONCAT_G_FIFOS(cfgt.disable_opts, $2); }
- ;
-
-system_option_list
- : system_option_list system_option
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | system_option
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-system_option
- : system_option_flag_keyword
- { $$ =3D create_attr_ival(T_Flag, $1); }
- | system_option_local_flag_keyword
- {=20
- if (input_from_file) {
- $$ =3D create_attr_ival(T_Flag, $1);
- } else {
- char err_str[128];
- =09
- $$ =3D NULL;
- snprintf(err_str, sizeof(err_str),
- "enable/disable %s remote configuration ignored",
- keyword($1));
- yyerror(ip_file, err_str);
- }
- }
- ;
-
-system_option_flag_keyword
- : T_Auth
- | T_Bclient
- | T_Calibrate
- | T_Kernel
- | T_Monitor
- | T_Ntp
- ;
-
-system_option_local_flag_keyword
- : T_Mode7
- | T_Stats
- ;
-
-/* Tinker Commands
- * ---------------
- */
-
-tinker_command
- : T_Tinker tinker_option_list
- { CONCAT_G_FIFOS(cfgt.tinker, $2); }
- ;
-
-tinker_option_list
- : tinker_option_list tinker_option
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | tinker_option
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-tinker_option
- : tinker_option_keyword number
- { $$ =3D create_attr_dval($1, $2); }
- ;
-
-tinker_option_keyword
- : T_Allan
- | T_Dispersion
- | T_Freq
- | T_Huffpuff
- | T_Panic
- | T_Step
- | T_Stepout
- | T_Tick
- ;
-
-
-/* Miscellaneous Commands
- * ----------------------
- */
-
-miscellaneous_command
- : interface_command
- | reset_command
- | misc_cmd_dbl_keyword number
- {
- attr_val *av;
- =09
- av =3D create_attr_dval($1, $2);
- APPEND_G_FIFO(cfgt.vars, av);
- }
- | misc_cmd_str_keyword T_String
- {
- attr_val *av;
- =09
- av =3D create_attr_sval($1, $2);
- APPEND_G_FIFO(cfgt.vars, av);
- }
- | misc_cmd_str_lcl_keyword T_String
- {
- char error_text[64];
- attr_val *av;
-
- if (input_from_file) {
- av =3D create_attr_sval($1, $2);
- APPEND_G_FIFO(cfgt.vars, av);
- } else {
- YYFREE($2);
- snprintf(error_text, sizeof(error_text),
- "%s remote config ignored",
- keyword($1));
- yyerror(ip_file, error_text);
- }
- }
- | T_Includefile T_String command
- {
- if (!input_from_file) {
- yyerror(ip_file, "remote includefile ignored");
- break;
- }
- if (curr_include_level >=3D MAXINCLUDELEVEL) {
- fprintf(stderr, "getconfig: Maximum include file level exceeded.\n")=
;
- msyslog(LOG_ERR, "getconfig: Maximum include file level exceeded.");=
- } else {
- fp[curr_include_level + 1] =3D F_OPEN(FindConfig($2), "r");
- if (fp[curr_include_level + 1] =3D=3D NULL) {
- fprintf(stderr, "getconfig: Couldn't open <%s>\n", FindConfig($2));=
- msyslog(LOG_ERR, "getconfig: Couldn't open <%s>", FindConfig($2));
- } else {
- ip_file =3D fp[++curr_include_level];
- }
- }
- }
- | T_End
- {
- while (curr_include_level !=3D -1)
- FCLOSE(fp[curr_include_level--]);
- }
- | T_Driftfile drift_parm
- { /* see drift_parm below for actions */ }
- | T_Logconfig log_config_list
- { CONCAT_G_FIFOS(cfgt.logconfig, $2); }
- | T_Phone string_list
- { CONCAT_G_FIFOS(cfgt.phone, $2); }
- | T_Setvar variable_assign
- { APPEND_G_FIFO(cfgt.setvar, $2); }
- | T_Trap ip_address trap_option_list
- {
- addr_opts_node *aon;
- =09
- aon =3D create_addr_opts_node($2, $3);
- APPEND_G_FIFO(cfgt.trap, aon);
- }
- | T_Ttl integer_list
- { CONCAT_G_FIFOS(cfgt.ttl, $2); }
- ;
-
-misc_cmd_dbl_keyword
- : T_Broadcastdelay
- | T_Nonvolatile
- | T_Tick
- ;
-
-misc_cmd_str_keyword
- : T_Ident
- | T_Leapfile
- | T_Pidfile
- ;
-
-misc_cmd_str_lcl_keyword
- : T_Logfile
- | T_Saveconfigdir
- ;
-
-drift_parm
- : T_String
- {
- attr_val *av;
- =09
- av =3D create_attr_sval(T_Driftfile, $1);
- APPEND_G_FIFO(cfgt.vars, av);
- }
- | T_String T_Double
- {
- attr_val *av;
- =09
- av =3D create_attr_sval(T_Driftfile, $1);
- APPEND_G_FIFO(cfgt.vars, av);
- av =3D create_attr_dval(T_WanderThreshold, $2);
- APPEND_G_FIFO(cfgt.vars, av);
- }
- | /* Null driftfile, indicated by empty string "" */
- {
- attr_val *av;
- =09
- av =3D create_attr_sval(T_Driftfile, "");
- APPEND_G_FIFO(cfgt.vars, av);
- }
- ;
-
-variable_assign
- : T_String '=3D' T_String t_default_or_zero
- { $$ =3D create_setvar_node($1, $3, $4); }
- ;
-
-t_default_or_zero
- : T_Default
- | /* empty, no "default" modifier */
- { $$ =3D 0; }
- ;
-
-trap_option_list
- : /* empty list */
- { $$ =3D NULL; }
- | trap_option_list trap_option
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- ;
-
-trap_option
- : T_Port T_Integer
- { $$ =3D create_attr_ival($1, $2); }
- | T_Interface ip_address
- {
- $$ =3D create_attr_sval($1, estrdup($2->address));
- destroy_address_node($2);
- }
- ;
-
-log_config_list
- : log_config_list log_config_command
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | log_config_command
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-log_config_command
- : T_String
- {
- char prefix;
- char * type;
- =09
- switch ($1[0]) {
- =09
- case '+':
- case '-':
- case '=3D':
- prefix =3D $1[0];
- type =3D $1 + 1;
- break;
- =09
- default:
- prefix =3D '=3D';
- type =3D $1;
- }=09
- =09
- $$ =3D create_attr_sval(prefix, estrdup(type));
- YYFREE($1);
- }
- ;
-
-interface_command
- : interface_nic nic_rule_action nic_rule_class
- {
- nic_rule_node *nrn;
- =09
- nrn =3D create_nic_rule_node($3, NULL, $2);
- APPEND_G_FIFO(cfgt.nic_rules, nrn);
- }
- | interface_nic nic_rule_action T_String
- {
- nic_rule_node *nrn;
- =09
- nrn =3D create_nic_rule_node(0, $3, $2);
- APPEND_G_FIFO(cfgt.nic_rules, nrn);
- }
- ;
-
-interface_nic
- : T_Interface
- | T_Nic
- ;
-
-nic_rule_class
- : T_All
- | T_Ipv4
- | T_Ipv6
- | T_Wildcard
- ;
-
-nic_rule_action
- : T_Listen
- | T_Ignore
- | T_Drop
- ;
-
-reset_command
- : T_Reset counter_set_list
- { CONCAT_G_FIFOS(cfgt.reset_counters, $2); }
- ;
-
-counter_set_list
- : counter_set_list counter_set_keyword
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, create_int_node($2));
- }
- | counter_set_keyword
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, create_int_node($1));
- }
- ;
-
-counter_set_keyword
- : T_Allpeers
- | T_Auth
- | T_Ctl
- | T_Io
- | T_Mem
- | T_Sys
- | T_Timer
- ;
-
-
-
-/* Miscellaneous Rules
- * -------------------
- */
-
-integer_list
- : integer_list T_Integer
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, create_int_node($2));
- }
- | T_Integer
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, create_int_node($1));
- }
- ;
-
-integer_list_range
- : integer_list_range integer_list_range_elt
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | integer_list_range_elt
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-integer_list_range_elt
- : T_Integer
- { $$ =3D create_attr_ival('i', $1); }
- | integer_range
- ;
-
-integer_range
- : '(' T_Integer T_Ellipsis T_Integer ')'
- { $$ =3D create_attr_rangeval('-', $2, $4); }
- ;
-
-string_list
- : string_list T_String
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, create_string_node($2));
- }
- | T_String
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, create_string_node($1));
- }
- ;
-
-address_list
- : address_list address
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | address
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-boolean
- : T_Integer
- {
- if ($1 !=3D 0 && $1 !=3D 1) {
- yyerror(ip_file, "Integer value is not boolean (0 or 1). Assuming 1"=
);
- $$ =3D 1;
- } else {
- $$ =3D $1;
- }
- }
- | T_True { $$ =3D 1; }
- | T_False { $$ =3D 0; }
- ;
-
-number
- : T_Integer { $$ =3D (double)$1; }
- | T_Double
- ;
-
-
-/* Simulator Configuration Commands
- * --------------------------------
- */
-
-simulate_command
- : sim_conf_start '{' sim_init_statement_list sim_server_list '}'
- {
- sim_node *sn;
- =09
- sn =3D create_sim_node($3, $4);
- APPEND_G_FIFO(cfgt.sim_details, sn);
-
- /* Revert from ; to \n for end-of-command */
- old_config_style =3D 1;
- }
- ;
-
-/* The following is a terrible hack to get the configuration file to
- * treat newlines as whitespace characters within the simulation.
- * This is needed because newlines are significant in the rest of the
- * configuration file.
- */
-sim_conf_start
- : T_Simulate { old_config_style =3D 0; }
- ;
-
-sim_init_statement_list
- : sim_init_statement_list sim_init_statement T_EOC
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | sim_init_statement T_EOC
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-sim_init_statement
- : sim_init_keyword '=3D' number
- { $$ =3D create_attr_dval($1, $3); }
- ;
-
-sim_init_keyword
- : T_Beep_Delay
- | T_Sim_Duration
- ;
-
-sim_server_list
- : sim_server_list sim_server
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | sim_server
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-sim_server
- : sim_server_name '{' sim_server_offset sim_act_list '}'
- { $$ =3D ONLY_SIM(create_sim_server($1, $3, $4)); }
- ;
-
-sim_server_offset
- : T_Server_Offset '=3D' number T_EOC
- { $$ =3D $3; }
- ;
-
-sim_server_name
- : T_Server '=3D' address
- { $$ =3D $3; }
- ;
-
-sim_act_list
- : sim_act_list sim_act
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | sim_act
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-sim_act
- : T_Duration '=3D' number '{' sim_act_stmt_list '}'
- { $$ =3D ONLY_SIM(create_sim_script_info($3, $5)); }
- ;
-
-sim_act_stmt_list
- : sim_act_stmt_list sim_act_stmt T_EOC
- {
- $$ =3D $1;
- APPEND_G_FIFO($$, $2);
- }
- | sim_act_stmt T_EOC
- {
- $$ =3D NULL;
- APPEND_G_FIFO($$, $1);
- }
- ;
-
-sim_act_stmt
- : sim_act_keyword '=3D' number
- { $$ =3D create_attr_dval($1, $3); }
- ;
-
-sim_act_keyword
- : T_Freq_Offset
- | T_Wander
- | T_Jitter
- | T_Prop_Delay
- | T_Proc_Delay
- ;
-
-%%
-
-void=20
-yyerror(
- struct FILE_INFO *ip_file,
- const char *msg
- )
-{
- int retval;
-
- ip_file->err_line_no =3D ip_file->prev_token_line_no;
- ip_file->err_col_no =3D ip_file->prev_token_col_no;
-=09
- msyslog(LOG_ERR,=20
- "line %d column %d %s",=20
- ip_file->err_line_no,
- ip_file->err_col_no,
- msg);
- if (!input_from_file) {
- /* Save the error message in the correct buffer */
- retval =3D snprintf(remote_config.err_msg + remote_config.err_pos,
- MAXLINE - remote_config.err_pos,
- "column %d %s",
- ip_file->err_col_no, msg);
-
- /* Increment the value of err_pos */
- if (retval > 0)
- remote_config.err_pos +=3D retval;
-
- /* Increment the number of errors */
- ++remote_config.no_errors;
- }
-}
-
-
-/*
- * token_name - convert T_ token integers to text
- * example: token_name(T_Server) returns "T_Server"
- */
-const char *
-token_name(
- int token
- )
-{
- return yytname[YYTRANSLATE(token)];
-}
-
-
-/* Initial Testing function -- ignore */
-#if 0
-int main(int argc, char *argv[])
-{
- ip_file =3D FOPEN(argv[1], "r");
- if (!ip_file)
- fprintf(stderr, "ERROR!! Could not open file: %s\n", argv[1]);
- yyparse();
- return 0;
-}
-#endif
-
--------------090800070300040107060309--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?551DA257.6060100>
