Home | History | Annotate | Line # | Download | only in include
      1 /*	$NetBSD: ntp_config.h,v 1.15 2024/08/18 20:46:50 christos Exp $	*/
      2 
      3 #ifndef NTP_CONFIG_H
      4 #define NTP_CONFIG_H
      5 
      6 #ifdef HAVE_SYS_RESOURCE_H
      7 # include <sys/resource.h>
      8 #endif /* HAVE_SYS_RESOURCE_H */
      9 
     10 #include "ntp_machine.h"
     11 #include "ntp_psl.h"
     12 #include "ntpsim.h"
     13 
     14 
     15 /*
     16  * Configuration file name
     17  */
     18 #ifndef CONFIG_FILE
     19 # ifndef SYS_WINNT
     20 #  define	CONFIG_FILE "/etc/ntp.conf"
     21 # else /* SYS_WINNT */
     22 #  define	CONFIG_FILE	"%windir%\\system32\\drivers\\etc\\ntp.conf"
     23 #  define	ALT_CONFIG_FILE "%windir%\\ntp.conf"
     24 #  define	NTP_KEYSDIR	"%windir%\\system32\\drivers\\etc"
     25 # endif /* SYS_WINNT */
     26 #endif /* not CONFIG_FILE */
     27 
     28 
     29 /*
     30  * We keep config trees around for possible saveconfig use.  When
     31  * built with configure --disable-saveconfig, and when built with
     32  * debugging enabled, include the free_config_*() routines.  In the
     33  * DEBUG case, they are used in an atexit() cleanup routine to make
     34  * postmortem leak check reports more interesting.
     35  */
     36 #if !defined(FREE_CFG_T) && (!defined(SAVECONFIG) || defined(DEBUG))
     37 #define FREE_CFG_T
     38 #endif
     39 
     40 /* Limits */
     41 #define MAXLINE 1024
     42 
     43 /* Configuration sources */
     44 
     45 #define CONF_SOURCE_FILE		0
     46 #define CONF_SOURCE_NTPQ		1
     47 
     48 /* list of servers from command line for config_peers() */
     49 extern	int	cmdline_server_count;
     50 extern	char **	cmdline_servers;
     51 
     52 /* set to zero if we're not locking memory */
     53 extern	int	cur_memlock;
     54 
     55 typedef struct int_range_tag {
     56 	int	first;
     57 	int	last;
     58 } int_range;
     59 
     60 /* generic list node */
     61 typedef struct any_node_tag any_node;
     62 struct any_node_tag {
     63 	any_node *	link;
     64 };
     65 
     66 typedef DECL_FIFO_ANCHOR(any_node) any_node_fifo;
     67 
     68 /* Structure for storing an attribute-value pair */
     69 typedef struct attr_val_tag attr_val;
     70 struct attr_val_tag {
     71 	attr_val *	link;
     72 	int		attr;
     73 	int		type;	/* T_String, T_Integer, ... */
     74 	int		flag;	/* auxiliary flags */
     75 	union val {
     76 		double		d;	/* T_Double */
     77 		int		i;	/* T_Integer */
     78 		int_range	r;	/* T_Intrange */
     79 		char *		s;	/* T_String */
     80 		u_int		u;	/* T_U_int */
     81 	} value;
     82 };
     83 
     84 typedef DECL_FIFO_ANCHOR(attr_val) attr_val_fifo;
     85 
     86 /* Structure for nodes on the syntax tree */
     87 typedef struct address_node_tag address_node;
     88 struct address_node_tag {
     89 	address_node *	link;
     90 	char *		address;
     91 	u_short		type;	/* family, AF_UNSPEC (0), AF_INET[6] */
     92 };
     93 
     94 typedef DECL_FIFO_ANCHOR(address_node) address_fifo;
     95 
     96 typedef struct int_node_tag int_node;
     97 struct int_node_tag {
     98 	int_node *	link;
     99 	int		i;
    100 };
    101 
    102 typedef DECL_FIFO_ANCHOR(int_node) int_fifo;
    103 
    104 typedef struct string_node_tag string_node;
    105 struct string_node_tag {
    106 	string_node *	link;
    107 	char *		s;
    108 };
    109 
    110 typedef DECL_FIFO_ANCHOR(string_node) string_fifo;
    111 
    112 typedef struct restrict_node_tag restrict_node;
    113 struct restrict_node_tag {
    114 	restrict_node *	link;
    115 	address_node *	addr;
    116 	address_node *	mask;
    117 	attr_val_fifo *	flag_tok_fifo;
    118 	int/*BOOL*/	remove;
    119 	int		line_no;
    120 	int		column;
    121 	short		ippeerlimit;
    122 	short		srvfuzrft;
    123 };
    124 
    125 typedef DECL_FIFO_ANCHOR(restrict_node) restrict_fifo;
    126 
    127 typedef struct peer_node_tag peer_node;
    128 struct peer_node_tag {
    129 	peer_node *	link;
    130 	int		host_mode;
    131 	address_node *	addr;
    132 	attr_val_fifo *	peerflags;
    133 	u_char		minpoll;
    134 	u_char		maxpoll;
    135 	u_int32		ttl;
    136 	u_char		peerversion;
    137 	keyid_t		peerkey;
    138 	char *		group;
    139 };
    140 
    141 typedef DECL_FIFO_ANCHOR(peer_node) peer_fifo;
    142 
    143 typedef struct unpeer_node_tag unpeer_node;
    144 struct unpeer_node_tag {
    145 	unpeer_node *	link;
    146 	associd_t	assocID;
    147 	address_node *	addr;
    148 };
    149 
    150 typedef DECL_FIFO_ANCHOR(unpeer_node) unpeer_fifo;
    151 
    152 typedef struct auth_node_tag auth_node;
    153 struct auth_node_tag {
    154 	int		control_key;
    155 	int		cryptosw;
    156 	attr_val_fifo *	crypto_cmd_list;
    157 	char *		keys;
    158 	char *		keysdir;
    159 	int		request_key;
    160 	int		revoke;
    161 	attr_val_fifo *	trusted_key_list;
    162 	char *		ntp_signd_socket;
    163 };
    164 
    165 typedef struct filegen_node_tag filegen_node;
    166 struct filegen_node_tag {
    167 	filegen_node *	link;
    168 	int		filegen_token;
    169 	attr_val_fifo *	options;
    170 };
    171 
    172 typedef DECL_FIFO_ANCHOR(filegen_node) filegen_fifo;
    173 
    174 typedef struct setvar_node_tag setvar_node;
    175 struct setvar_node_tag {
    176 	setvar_node *	link;
    177 	char *		var;
    178 	char *		val;
    179 	int		isdefault;
    180 };
    181 
    182 typedef DECL_FIFO_ANCHOR(setvar_node) setvar_fifo;
    183 
    184 typedef struct nic_rule_node_tag nic_rule_node;
    185 struct nic_rule_node_tag {
    186 	nic_rule_node *	link;
    187 	int		match_class;
    188 	char *		if_name;	/* or numeric address */
    189 	int		action;
    190 };
    191 
    192 typedef DECL_FIFO_ANCHOR(nic_rule_node) nic_rule_fifo;
    193 
    194 typedef struct addr_opts_node_tag addr_opts_node;
    195 struct addr_opts_node_tag {
    196 	addr_opts_node *link;
    197 	address_node *	addr;
    198 	attr_val_fifo *	options;
    199 };
    200 
    201 typedef DECL_FIFO_ANCHOR(addr_opts_node) addr_opts_fifo;
    202 
    203 typedef struct sim_node_tag sim_node;
    204 struct sim_node_tag {
    205 	sim_node *		link;
    206 	attr_val_fifo *		init_opts;
    207 	server_info_fifo *	servers;
    208 };
    209 
    210 typedef DECL_FIFO_ANCHOR(sim_node) sim_fifo;
    211 
    212 /* The syntax tree */
    213 typedef struct config_tree_tag config_tree;
    214 struct config_tree_tag {
    215 	config_tree *	link;
    216 
    217 	attr_val	source;
    218 	time_t		timestamp;
    219 
    220 	peer_fifo *	peers;
    221 	unpeer_fifo *	unpeers;
    222 
    223 	/* Other Modes */
    224 	int		broadcastclient;
    225 	address_fifo *	manycastserver;
    226 	address_fifo *	multicastclient;
    227 
    228 	attr_val_fifo *	orphan_cmds;	/* s/b renamed tos_options */
    229 
    230 	/* Monitoring Configuration */
    231 	int_fifo *	stats_list;
    232 	char *		stats_dir;
    233 	filegen_fifo *	filegen_opts;
    234 
    235 	/* Access Control Configuration */
    236 	attr_val_fifo *	discard_opts;
    237 	attr_val_fifo *	mru_opts;
    238 	restrict_fifo *	restrict_opts;
    239 
    240 	addr_opts_fifo *fudge;
    241 	addr_opts_fifo *device;
    242 	attr_val_fifo *	rlimit;
    243 	attr_val_fifo *	tinker;
    244 	attr_val_fifo *	enable_opts;
    245 	attr_val_fifo *	disable_opts;
    246 
    247 	auth_node	auth;
    248 
    249 	attr_val_fifo *	logconfig;
    250 	string_fifo *	phone;
    251 	setvar_fifo *	setvar;
    252 	int_fifo *	ttl;
    253 	addr_opts_fifo *trap;
    254 	attr_val_fifo *	vars;
    255 	nic_rule_fifo *	nic_rules;
    256 	int_fifo *	reset_counters;
    257 	attr_val_fifo *	pollskewlist;
    258 
    259 	sim_fifo *	sim_details;
    260 	int		mdnstries;
    261 };
    262 
    263 
    264 /* Structure for holding a remote configuration command */
    265 struct REMOTE_CONFIG_INFO {
    266 	char buffer[MAXLINE];
    267 	char err_msg[MAXLINE];
    268 	int pos;
    269 	int err_pos;
    270 	int no_errors;
    271 };
    272 
    273 
    274 /*
    275  * context for trap_name_resolved() to call ctlsettrap() once the
    276  * name->address resolution completes.
    277  */
    278 typedef struct settrap_parms_tag {
    279 	sockaddr_u	ifaddr;
    280 	int		ifaddr_nonnull;
    281 } settrap_parms;
    282 
    283 
    284 /*
    285 ** Data Minimization Items
    286 */
    287 
    288 /* Serverresponse fuzz reftime: stored in 'restrict' fifos */
    289 
    290 
    291 /* get text from T_ tokens */
    292 const char * token_name(int token);
    293 
    294 /* generic fifo routines for structs linked by 1st member */
    295 typedef void (*fifo_deleter)(void*);
    296 void *	destroy_gen_fifo(void *fifo, fifo_deleter func);
    297 void *	append_gen_fifo(void *fifo, void *entry);
    298 void *	concat_gen_fifos(void *first, void *second);
    299 #define DESTROY_G_FIFO(pf, func)	\
    300 	((pf) = destroy_gen_fifo((pf), (fifo_deleter)(func)))
    301 #define APPEND_G_FIFO(pf, pe)		\
    302 	((pf) = append_gen_fifo((pf), (pe)))
    303 #define CONCAT_G_FIFOS(first, second)	\
    304 	((first) = concat_gen_fifos((first), (second)))
    305 #define HEAD_PFIFO(pf)			\
    306 	(((pf) != NULL)			\
    307 	      ? HEAD_FIFO(*(pf))	\
    308 	      : NULL)
    309 
    310 peer_node *create_peer_node(int hmode, address_node *addr,
    311 			    attr_val_fifo *options);
    312 unpeer_node *create_unpeer_node(address_node *addr);
    313 address_node *create_address_node(char *addr, int type);
    314 void destroy_address_node(address_node *my_node);
    315 attr_val *create_attr_dval(int attr, double value);
    316 attr_val *create_attr_ival(int attr, int value);
    317 attr_val *create_attr_rval(int attr, int first, int last);
    318 attr_val *create_attr_sval(int attr, const char *s);
    319 attr_val *create_attr_uval(int attr, u_int value);
    320 void	  destroy_attr_val(attr_val *node);
    321 filegen_node *create_filegen_node(int filegen_token,
    322 				  attr_val_fifo *options);
    323 string_node *create_string_node(char *str);
    324 restrict_node *create_restrict_node(address_node *	addr,
    325 				    address_node *	mask,
    326 				    short		ippeerlimit,
    327 				    attr_val_fifo *	flag_tok_fifo,
    328 				    int/*BOOL*/		remove,
    329 				    int			nline,
    330 				    int			ncol);
    331 int_node *create_int_node(int val);
    332 addr_opts_node *create_addr_opts_node(address_node *addr,
    333 				      attr_val_fifo *options);
    334 sim_node *create_sim_node(attr_val_fifo *init_opts,
    335 			  server_info_fifo *servers);
    336 setvar_node *create_setvar_node(char *var, char *val, int isdefault);
    337 nic_rule_node *create_nic_rule_node(int match_class, char *if_name,
    338 				    int action);
    339 
    340 script_info *create_sim_script_info(double duration,
    341 				    attr_val_fifo *script_queue);
    342 server_info *create_sim_server(address_node *addr, double server_offset,
    343 			       script_info_fifo *script);
    344 
    345 extern struct REMOTE_CONFIG_INFO remote_config;
    346 void config_remotely(sockaddr_u *);
    347 
    348 #ifdef SAVECONFIG
    349 int dump_config_tree(config_tree *ptree, FILE *df, int comment);
    350 int dump_all_config_trees(FILE *df, int comment);
    351 #endif
    352 
    353 #if defined(HAVE_SETRLIMIT)
    354 void ntp_rlimit(int, rlim_t, int, const char *);
    355 #endif
    356 
    357 #endif	/* !defined(NTP_CONFIG_H) */
    358