Index: contrib/ntp/lib/isc/unix/ifiter_getifaddrs.c =================================================================== --- contrib/ntp/lib/isc/unix/ifiter_getifaddrs.c (revision 281003) +++ contrib/ntp/lib/isc/unix/ifiter_getifaddrs.c (working copy) @@ -212,6 +212,9 @@ internal_current(isc_interfaceiter_t *iter) { get_addr(family, &iter->current.broadcast, ifa->ifa_broadaddr, ifa->ifa_name); +#ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX + iter->current.ifindex = if_nametoindex(iter->current.name); +#endif return (ISC_R_SUCCESS); } Index: contrib/ntp/lib/isc/unix/ifiter_ioctl.c =================================================================== --- contrib/ntp/lib/isc/unix/ifiter_ioctl.c (revision 281003) +++ contrib/ntp/lib/isc/unix/ifiter_ioctl.c (working copy) @@ -588,6 +588,9 @@ internal_current4(isc_interfaceiter_t *iter) { } iter->current.netmask.type.in6.s6_addr[i] = (~0 << bits) & 0xff; } +#ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX + iter->current.ifindex = if_nametoindex(iter->current.name); +#endif return (ISC_R_SUCCESS); inet: @@ -664,6 +667,9 @@ internal_current4(isc_interfaceiter_t *iter) { } get_addr(family, &iter->current.netmask, (struct sockaddr *)&ifreq.ifr_addr, ifreq.ifr_name); +#ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX + iter->current.ifindex = if_nametoindex(iter->current.name); +#endif return (ISC_R_SUCCESS); } @@ -704,7 +710,6 @@ internal_current6(isc_interfaceiter_t *iter) { get_addr(family, &iter->current.address, (struct sockaddr *)&lifreq.lifr_addr, lifreq.lifr_name); - iter->current.ifindex = lifreq.lifr_index; if (isc_netaddr_islinklocal(&iter->current.address)) isc_netaddr_setzone(&iter->current.address, (isc_uint32_t)lifreq.lifr_index); @@ -844,7 +849,9 @@ internal_current6(isc_interfaceiter_t *iter) { iter->current.netmask.type.in6.s6_addr[i / 8] = (~0 << bits) & 0xff; } - +#ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX + iter->current.ifindex = if_nametoindex(iter->current.name); +#endif return (ISC_R_SUCCESS); } #endif @@ -867,6 +874,9 @@ internal_current6(isc_interfaceiter_t *iter) { get_addr(family, &iter->current.netmask, (struct sockaddr *)&lifreq.lifr_addr, lifreq.lifr_name); +#ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX + iter->current.ifindex = if_nametoindex(iter->current.name); +#endif return (ISC_R_SUCCESS); } #endif Index: contrib/ntp/ntpd/ntp_crypto.c =================================================================== --- contrib/ntp/ntpd/ntp_crypto.c (revision 281003) +++ 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 == (u_int) EVP_PKEY_size(host_pkey)) { + if (vallen == (u_int)EVP_PKEY_size(host_pkey)) { u_int32 *cookiebuf = malloc( RSA_size(host_pkey->pkey.rsa)); - if (cookiebuf == NULL) { + if (!cookiebuf) { rval = 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 = crypto_key(filename, passwd, NULL); if (pinfo == NULL) { msyslog(LOG_ERR, - "crypto_setup: random seed file not specified"); - exit (-1); - } - if ((bytes = RAND_load_file(rand_file, -1)) == 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_". 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. - */ - snprintf(filename, sizeof(filename), "ntpkey_host_%s", hostname); - pinfo = crypto_key(filename, passwd, NULL); - if (pinfo == NULL) { - msyslog(LOG_ERR, "crypto_setup: host key file %s not found or corrupt", filename); exit (-1); Index: contrib/ntp/ntpd/ntp_parser.y =================================================================== --- contrib/ntp/ntpd/ntp_parser.y (revision 281003) +++ 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 - #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 -%} - -/* - * 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 T_Abbrev -%token T_Age -%token T_All -%token T_Allan -%token T_Allpeers -%token T_Auth -%token T_Autokey -%token T_Automax -%token T_Average -%token T_Bclient -%token T_Beacon -%token T_Broadcast -%token T_Broadcastclient -%token T_Broadcastdelay -%token T_Burst -%token T_Calibrate -%token T_Ceiling -%token T_Clockstats -%token T_Cohort -%token T_ControlKey -%token T_Crypto -%token T_Cryptostats -%token T_Ctl -%token T_Day -%token T_Default -%token T_Digest -%token T_Disable -%token T_Discard -%token T_Dispersion -%token T_Double /* not a token */ -%token T_Driftfile -%token T_Drop -%token T_Ellipsis /* "..." not "ellipsis" */ -%token T_Enable -%token T_End -%token T_False -%token T_File -%token T_Filegen -%token T_Filenum -%token T_Flag1 -%token T_Flag2 -%token T_Flag3 -%token T_Flag4 -%token T_Flake -%token T_Floor -%token T_Freq -%token T_Fudge -%token T_Host -%token T_Huffpuff -%token T_Iburst -%token T_Ident -%token T_Ignore -%token T_Incalloc -%token T_Incmem -%token T_Initalloc -%token T_Initmem -%token T_Includefile -%token T_Integer /* not a token */ -%token T_Interface -%token T_Intrange /* not a token */ -%token T_Io -%token T_Ipv4 -%token T_Ipv4_flag -%token T_Ipv6 -%token T_Ipv6_flag -%token T_Kernel -%token T_Key -%token T_Keys -%token T_Keysdir -%token T_Kod -%token T_Mssntp -%token T_Leapfile -%token T_Limited -%token T_Link -%token T_Listen -%token T_Logconfig -%token T_Logfile -%token T_Loopstats -%token T_Lowpriotrap -%token T_Manycastclient -%token T_Manycastserver -%token T_Mask -%token T_Maxage -%token T_Maxclock -%token T_Maxdepth -%token T_Maxdist -%token T_Maxmem -%token T_Maxpoll -%token T_Mdnstries -%token T_Mem -%token T_Memlock -%token T_Minclock -%token T_Mindepth -%token T_Mindist -%token T_Minimum -%token T_Minpoll -%token T_Minsane -%token T_Mode -%token T_Mode7 -%token T_Monitor -%token T_Month -%token T_Mru -%token T_Multicastclient -%token T_Nic -%token T_Nolink -%token T_Nomodify -%token T_Nomrulist -%token T_None -%token T_Nonvolatile -%token T_Nopeer -%token T_Noquery -%token T_Noselect -%token T_Noserve -%token T_Notrap -%token T_Notrust -%token T_Ntp -%token T_Ntpport -%token T_NtpSignDsocket -%token T_Orphan -%token T_Orphanwait -%token T_Panic -%token T_Peer -%token T_Peerstats -%token T_Phone -%token T_Pid -%token T_Pidfile -%token T_Pool -%token T_Port -%token T_Preempt -%token T_Prefer -%token T_Protostats -%token T_Pw -%token T_Randfile -%token T_Rawstats -%token T_Refid -%token T_Requestkey -%token T_Reset -%token T_Restrict -%token T_Revoke -%token T_Rlimit -%token T_Saveconfigdir -%token T_Server -%token T_Setvar -%token T_Source -%token T_Stacksize -%token T_Statistics -%token T_Stats -%token T_Statsdir -%token T_Step -%token T_Stepout -%token T_Stratum -%token T_String /* not a token */ -%token T_Sys -%token T_Sysstats -%token T_Tick -%token T_Time1 -%token T_Time2 -%token T_Timer -%token T_Timingstats -%token T_Tinker -%token T_Tos -%token T_Trap -%token T_True -%token T_Trustedkey -%token T_Ttl -%token T_Type -%token T_U_int /* Not a token */ -%token T_Unconfig -%token T_Unpeer -%token T_Version -%token T_WanderThreshold /* Not a token */ -%token T_Week -%token T_Wildcard -%token T_Xleave -%token T_Year -%token T_Flag /* Not a token */ -%token T_EOC - - -/* NTP Simulator Tokens */ -%token T_Simulate -%token T_Beep_Delay -%token T_Sim_Duration -%token T_Server_Offset -%token T_Duration -%token T_Freq_Offset -%token T_Wander -%token T_Jitter -%token T_Prop_Delay -%token T_Proc_Delay - - - -/*** NON-TERMINALS ***/ -%type access_control_flag -%type ac_flag_list -%type address -%type address_fam -%type address_list -%type boolean -%type client_type -%type counter_set_keyword -%type counter_set_list -%type crypto_command -%type crypto_command_list -%type crypto_str_keyword -%type discard_option -%type discard_option_keyword -%type discard_option_list -%type enable_disable -%type filegen_option -%type filegen_option_list -%type filegen_type -%type fudge_factor -%type fudge_factor_bool_keyword -%type fudge_factor_dbl_keyword -%type fudge_factor_list -%type integer_list -%type integer_list_range -%type integer_list_range_elt -%type integer_range -%type nic_rule_action -%type interface_command -%type interface_nic -%type ip_address -%type link_nolink -%type log_config_command -%type log_config_list -%type misc_cmd_dbl_keyword -%type misc_cmd_str_keyword -%type misc_cmd_str_lcl_keyword -%type mru_option -%type mru_option_keyword -%type mru_option_list -%type nic_rule_class -%type number -%type option -%type option_flag -%type option_flag_keyword -%type option_list -%type option_int -%type option_int_keyword -%type option_str -%type option_str_keyword -%type reset_command -%type rlimit_option_keyword -%type rlimit_option -%type rlimit_option_list -%type stat -%type stats_list -%type string_list -%type system_option -%type system_option_flag_keyword -%type system_option_local_flag_keyword -%type system_option_list -%type t_default_or_zero -%type tinker_option_keyword -%type tinker_option -%type tinker_option_list -%type tos_option -%type tos_option_dbl_keyword -%type tos_option_int_keyword -%type tos_option_list -%type trap_option -%type trap_option_list -%type unpeer_keyword -%type variable_assign - -/* NTP Simulator non-terminals */ -%type sim_init_statement -%type sim_init_statement_list -%type sim_init_keyword -%type sim_server_list -%type sim_server -%type sim_server_offset -%type sim_server_name -%type sim_act -%type sim_act_list -%type sim_act_keyword -%type sim_act_stmt_list -%type 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, - "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 = 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 - { $$ = create_address_node($2, $1); } - ; - -ip_address - : T_String - { $$ = create_address_node($1, AF_UNSPEC); } - ; - -address_fam - : T_Ipv4_flag - { $$ = AF_INET; } - | T_Ipv6_flag - { $$ = AF_INET6; } - ; - -option_list - : /* empty list */ - { $$ = NULL; } - | option_list option - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - ; - -option - : option_flag - | option_int - | option_str - ; - -option_flag - : option_flag_keyword - { $$ = 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 - { $$ = create_attr_ival($1, $2); } - | option_int_keyword T_U_int - { $$ = 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 - { $$ = create_attr_sval($1, $2); } - ; - -option_str_keyword - : T_Ident - ; - - -/* unpeer commands - * --------------- - */ - -unpeer_command - : unpeer_keyword address - { - unpeer_node *my_node; - - my_node = create_unpeer_node($2); - if (my_node) - APPEND_G_FIFO(cfgt.unpeers, my_node); - } - ; -unpeer_keyword - : T_Unconfig - | T_Unpeer - ; - - -/* Other Modes - * (broadcastclient manycastserver multicastclient) - * ------------------------------------------------ - */ - -other_mode_command - : T_Broadcastclient - { cfgt.broadcastclient = 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 = $2; } - ; - - - -/* Authentication Commands - * ----------------------- - */ - -authentication_command - : T_Automax T_Integer - { - attr_val *atrv; - - atrv = create_attr_ival($1, $2); - APPEND_G_FIFO(cfgt.vars, atrv); - } - | T_ControlKey T_Integer - { cfgt.auth.control_key = $2; } - | T_Crypto crypto_command_list - { - cfgt.auth.cryptosw++; - CONCAT_G_FIFOS(cfgt.auth.crypto_cmd_list, $2); - } - | T_Keys T_String - { cfgt.auth.keys = $2; } - | T_Keysdir T_String - { cfgt.auth.keysdir = $2; } - | T_Requestkey T_Integer - { cfgt.auth.request_key = $2; } - | T_Revoke T_Integer - { cfgt.auth.revoke = $2; } - | T_Trustedkey integer_list_range - { - cfgt.auth.trusted_key_list = $2; - - // if (!cfgt.auth.trusted_key_list) - // cfgt.auth.trusted_key_list = $2; - // else - // LINK_SLIST(cfgt.auth.trusted_key_list, $2, link); - } - | T_NtpSignDsocket T_String - { cfgt.auth.ntp_signd_socket = $2; } - ; - -crypto_command_list - : /* empty list */ - { $$ = NULL; } - | crypto_command_list crypto_command - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - ; - -crypto_command - : crypto_str_keyword T_String - { $$ = create_attr_sval($1, $2); } - | T_Revoke T_Integer - { - $$ = NULL; - cfgt.auth.revoke = $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 - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | tos_option - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -tos_option - : tos_option_int_keyword T_Integer - { $$ = create_attr_dval($1, (double)$2); } - | tos_option_dbl_keyword number - { $$ = create_attr_dval($1, $2); } - | T_Cohort boolean - { $$ = 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 = $2; - } else { - YYFREE($2); - yyerror(ip_file, "statsdir remote configuration ignored"); - } - } - | T_Filegen stat filegen_option_list - { - filegen_node *fgn; - - fgn = create_filegen_node($2, $3); - APPEND_G_FIFO(cfgt.filegen_opts, fgn); - } - ; - -stats_list - : stats_list stat - { - $$ = $1; - APPEND_G_FIFO($$, create_int_node($2)); - } - | stat - { - $$ = 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 */ - { $$ = NULL; } - | filegen_option_list filegen_option - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - ; - -filegen_option - : T_File T_String - { - if (input_from_file) { - $$ = create_attr_sval($1, $2); - } else { - $$ = NULL; - YYFREE($2); - yyerror(ip_file, "filegen file remote config ignored"); - } - } - | T_Type filegen_type - { - if (input_from_file) { - $$ = create_attr_ival($1, $2); - } else { - $$ = NULL; - yyerror(ip_file, "filegen type remote config ignored"); - } - } - | link_nolink - { - const char *err; - - if (input_from_file) { - $$ = create_attr_ival(T_Flag, $1); - } else { - $$ = NULL; - if (T_Link == $1) - err = "filegen link remote config ignored"; - else - err = "filegen nolink remote config ignored"; - yyerror(ip_file, err); - } - } - | enable_disable - { $$ = 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 = 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 = 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 = 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 = create_restrict_node( - create_address_node( - estrdup("0.0.0.0"), - AF_INET), - create_address_node( - estrdup("0.0.0.0"), - AF_INET), - $4, - ip_file->line_no); - APPEND_G_FIFO(cfgt.restrict_opts, rn); - } - | T_Restrict T_Ipv6_flag T_Default ac_flag_list - { - restrict_node *rn; - - rn = create_restrict_node( - create_address_node( - estrdup("::"), - AF_INET6), - create_address_node( - estrdup("::"), - AF_INET6), - $4, - 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 = create_restrict_node( - NULL, NULL, $3, ip_file->line_no); - APPEND_G_FIFO(cfgt.restrict_opts, rn); - } - ; - -ac_flag_list - : /* empty list is allowed */ - { $$ = NULL; } - | ac_flag_list access_control_flag - { - $$ = $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 - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | discard_option - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -discard_option - : discard_option_keyword T_Integer - { $$ = create_attr_ival($1, $2); } - ; - -discard_option_keyword - : T_Average - | T_Minimum - | T_Monitor - ; - -mru_option_list - : mru_option_list mru_option - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | mru_option - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -mru_option - : mru_option_keyword T_Integer - { $$ = 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; - - aon = create_addr_opts_node($2, $3); - APPEND_G_FIFO(cfgt.fudge, aon); - } - ; - -fudge_factor_list - : fudge_factor_list fudge_factor - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | fudge_factor - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -fudge_factor - : fudge_factor_dbl_keyword number - { $$ = create_attr_dval($1, $2); } - | fudge_factor_bool_keyword boolean - { $$ = create_attr_ival($1, $2); } - | T_Stratum T_Integer - { $$ = create_attr_ival($1, $2); } - | T_Abbrev T_String - { $$ = create_attr_sval($1, $2); } - | T_Refid T_String - { $$ = 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 - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | rlimit_option - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -rlimit_option - : rlimit_option_keyword T_Integer - { $$ = 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 - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | system_option - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -system_option - : system_option_flag_keyword - { $$ = create_attr_ival(T_Flag, $1); } - | system_option_local_flag_keyword - { - if (input_from_file) { - $$ = create_attr_ival(T_Flag, $1); - } else { - char err_str[128]; - - $$ = 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 - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | tinker_option - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -tinker_option - : tinker_option_keyword number - { $$ = 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; - - av = create_attr_dval($1, $2); - APPEND_G_FIFO(cfgt.vars, av); - } - | misc_cmd_str_keyword T_String - { - attr_val *av; - - av = 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 = 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 >= 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] = F_OPEN(FindConfig($2), "r"); - if (fp[curr_include_level + 1] == NULL) { - fprintf(stderr, "getconfig: Couldn't open <%s>\n", FindConfig($2)); - msyslog(LOG_ERR, "getconfig: Couldn't open <%s>", FindConfig($2)); - } else { - ip_file = fp[++curr_include_level]; - } - } - } - | T_End - { - while (curr_include_level != -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; - - aon = 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; - - av = create_attr_sval(T_Driftfile, $1); - APPEND_G_FIFO(cfgt.vars, av); - } - | T_String T_Double - { - attr_val *av; - - av = create_attr_sval(T_Driftfile, $1); - APPEND_G_FIFO(cfgt.vars, av); - av = create_attr_dval(T_WanderThreshold, $2); - APPEND_G_FIFO(cfgt.vars, av); - } - | /* Null driftfile, indicated by empty string "" */ - { - attr_val *av; - - av = create_attr_sval(T_Driftfile, ""); - APPEND_G_FIFO(cfgt.vars, av); - } - ; - -variable_assign - : T_String '=' T_String t_default_or_zero - { $$ = create_setvar_node($1, $3, $4); } - ; - -t_default_or_zero - : T_Default - | /* empty, no "default" modifier */ - { $$ = 0; } - ; - -trap_option_list - : /* empty list */ - { $$ = NULL; } - | trap_option_list trap_option - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - ; - -trap_option - : T_Port T_Integer - { $$ = create_attr_ival($1, $2); } - | T_Interface ip_address - { - $$ = create_attr_sval($1, estrdup($2->address)); - destroy_address_node($2); - } - ; - -log_config_list - : log_config_list log_config_command - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | log_config_command - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -log_config_command - : T_String - { - char prefix; - char * type; - - switch ($1[0]) { - - case '+': - case '-': - case '=': - prefix = $1[0]; - type = $1 + 1; - break; - - default: - prefix = '='; - type = $1; - } - - $$ = create_attr_sval(prefix, estrdup(type)); - YYFREE($1); - } - ; - -interface_command - : interface_nic nic_rule_action nic_rule_class - { - nic_rule_node *nrn; - - nrn = 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; - - nrn = 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 - { - $$ = $1; - APPEND_G_FIFO($$, create_int_node($2)); - } - | counter_set_keyword - { - $$ = 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 - { - $$ = $1; - APPEND_G_FIFO($$, create_int_node($2)); - } - | T_Integer - { - $$ = NULL; - APPEND_G_FIFO($$, create_int_node($1)); - } - ; - -integer_list_range - : integer_list_range integer_list_range_elt - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | integer_list_range_elt - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -integer_list_range_elt - : T_Integer - { $$ = create_attr_ival('i', $1); } - | integer_range - ; - -integer_range - : '(' T_Integer T_Ellipsis T_Integer ')' - { $$ = create_attr_rangeval('-', $2, $4); } - ; - -string_list - : string_list T_String - { - $$ = $1; - APPEND_G_FIFO($$, create_string_node($2)); - } - | T_String - { - $$ = NULL; - APPEND_G_FIFO($$, create_string_node($1)); - } - ; - -address_list - : address_list address - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | address - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -boolean - : T_Integer - { - if ($1 != 0 && $1 != 1) { - yyerror(ip_file, "Integer value is not boolean (0 or 1). Assuming 1"); - $$ = 1; - } else { - $$ = $1; - } - } - | T_True { $$ = 1; } - | T_False { $$ = 0; } - ; - -number - : T_Integer { $$ = (double)$1; } - | T_Double - ; - - -/* Simulator Configuration Commands - * -------------------------------- - */ - -simulate_command - : sim_conf_start '{' sim_init_statement_list sim_server_list '}' - { - sim_node *sn; - - sn = create_sim_node($3, $4); - APPEND_G_FIFO(cfgt.sim_details, sn); - - /* Revert from ; to \n for end-of-command */ - old_config_style = 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 = 0; } - ; - -sim_init_statement_list - : sim_init_statement_list sim_init_statement T_EOC - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | sim_init_statement T_EOC - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -sim_init_statement - : sim_init_keyword '=' number - { $$ = create_attr_dval($1, $3); } - ; - -sim_init_keyword - : T_Beep_Delay - | T_Sim_Duration - ; - -sim_server_list - : sim_server_list sim_server - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | sim_server - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -sim_server - : sim_server_name '{' sim_server_offset sim_act_list '}' - { $$ = ONLY_SIM(create_sim_server($1, $3, $4)); } - ; - -sim_server_offset - : T_Server_Offset '=' number T_EOC - { $$ = $3; } - ; - -sim_server_name - : T_Server '=' address - { $$ = $3; } - ; - -sim_act_list - : sim_act_list sim_act - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | sim_act - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -sim_act - : T_Duration '=' number '{' sim_act_stmt_list '}' - { $$ = ONLY_SIM(create_sim_script_info($3, $5)); } - ; - -sim_act_stmt_list - : sim_act_stmt_list sim_act_stmt T_EOC - { - $$ = $1; - APPEND_G_FIFO($$, $2); - } - | sim_act_stmt T_EOC - { - $$ = NULL; - APPEND_G_FIFO($$, $1); - } - ; - -sim_act_stmt - : sim_act_keyword '=' number - { $$ = create_attr_dval($1, $3); } - ; - -sim_act_keyword - : T_Freq_Offset - | T_Wander - | T_Jitter - | T_Prop_Delay - | T_Proc_Delay - ; - -%% - -void -yyerror( - struct FILE_INFO *ip_file, - const char *msg - ) -{ - int retval; - - ip_file->err_line_no = ip_file->prev_token_line_no; - ip_file->err_col_no = ip_file->prev_token_col_no; - - msyslog(LOG_ERR, - "line %d column %d %s", - ip_file->err_line_no, - ip_file->err_col_no, - msg); - if (!input_from_file) { - /* Save the error message in the correct buffer */ - retval = 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 += 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 = FOPEN(argv[1], "r"); - if (!ip_file) - fprintf(stderr, "ERROR!! Could not open file: %s\n", argv[1]); - yyparse(); - return 0; -} -#endif -