1/*	$NetBSD: ntp_config.h,v 1.14 2022/10/09 21:41:03 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() */
49extern	int	cmdline_server_count;
50extern	char **	cmdline_servers;
51
52/* set to zero if we're not locking memory */
53extern	int	cur_memlock;
54
55typedef struct int_range_tag {
56	int	first;
57	int	last;
58} int_range;
59
60/* generic list node */
61typedef struct any_node_tag any_node;
62struct any_node_tag {
63	any_node *	link;
64};
65
66typedef DECL_FIFO_ANCHOR(any_node) any_node_fifo;
67
68/* Structure for storing an attribute-value pair */
69typedef struct attr_val_tag attr_val;
70struct 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
84typedef DECL_FIFO_ANCHOR(attr_val) attr_val_fifo;
85
86/* Structure for nodes on the syntax tree */
87typedef struct address_node_tag address_node;
88struct address_node_tag {
89	address_node *	link;
90	char *		address;
91	u_short		type;	/* family, AF_UNSPEC (0), AF_INET[6] */
92};
93
94typedef DECL_FIFO_ANCHOR(address_node) address_fifo;
95
96typedef struct int_node_tag int_node;
97struct int_node_tag {
98	int_node *	link;
99	int		i;
100};
101
102typedef DECL_FIFO_ANCHOR(int_node) int_fifo;
103
104typedef struct string_node_tag string_node;
105struct string_node_tag {
106	string_node *	link;
107	char *		s;
108};
109
110typedef DECL_FIFO_ANCHOR(string_node) string_fifo;
111
112typedef struct restrict_node_tag restrict_node;
113struct restrict_node_tag {
114	restrict_node *	link;
115	address_node *	addr;
116	address_node *	mask;
117	attr_val_fifo *	flag_tok_fifo;
118	int		line_no;
119	short		ippeerlimit;
120	short		srvfuzrft;
121};
122
123typedef DECL_FIFO_ANCHOR(restrict_node) restrict_fifo;
124
125typedef struct peer_node_tag peer_node;
126struct peer_node_tag {
127	peer_node *	link;
128	int		host_mode;
129	address_node *	addr;
130	attr_val_fifo *	peerflags;
131	u_char		minpoll;
132	u_char		maxpoll;
133	u_int32		ttl;
134	u_char		peerversion;
135	keyid_t		peerkey;
136	char *		group;
137};
138
139typedef DECL_FIFO_ANCHOR(peer_node) peer_fifo;
140
141typedef struct unpeer_node_tag unpeer_node;
142struct unpeer_node_tag {
143	unpeer_node *	link;
144	associd_t	assocID;
145	address_node *	addr;
146};
147
148typedef DECL_FIFO_ANCHOR(unpeer_node) unpeer_fifo;
149
150typedef struct auth_node_tag auth_node;
151struct auth_node_tag {
152	int		control_key;
153	int		cryptosw;
154	attr_val_fifo *	crypto_cmd_list;
155	char *		keys;
156	char *		keysdir;
157	int		request_key;
158	int		revoke;
159	attr_val_fifo *	trusted_key_list;
160	char *		ntp_signd_socket;
161};
162
163typedef struct filegen_node_tag filegen_node;
164struct filegen_node_tag {
165	filegen_node *	link;
166	int		filegen_token;
167	attr_val_fifo *	options;
168};
169
170typedef DECL_FIFO_ANCHOR(filegen_node) filegen_fifo;
171
172typedef struct setvar_node_tag setvar_node;
173struct setvar_node_tag {
174	setvar_node *	link;
175	char *		var;
176	char *		val;
177	int		isdefault;
178};
179
180typedef DECL_FIFO_ANCHOR(setvar_node) setvar_fifo;
181
182typedef struct nic_rule_node_tag nic_rule_node;
183struct nic_rule_node_tag {
184	nic_rule_node *	link;
185	int		match_class;
186	char *		if_name;	/* or numeric address */
187	int		action;
188};
189
190typedef DECL_FIFO_ANCHOR(nic_rule_node) nic_rule_fifo;
191
192typedef struct addr_opts_node_tag addr_opts_node;
193struct addr_opts_node_tag {
194	addr_opts_node *link;
195	address_node *	addr;
196	attr_val_fifo *	options;
197};
198
199typedef DECL_FIFO_ANCHOR(addr_opts_node) addr_opts_fifo;
200
201typedef struct sim_node_tag sim_node;
202struct sim_node_tag {
203	sim_node *		link;
204	attr_val_fifo *		init_opts;
205	server_info_fifo *	servers;
206};
207
208typedef DECL_FIFO_ANCHOR(sim_node) sim_fifo;
209
210/* The syntax tree */
211typedef struct config_tree_tag config_tree;
212struct config_tree_tag {
213	config_tree *	link;
214
215	attr_val	source;
216	time_t		timestamp;
217
218	peer_fifo *	peers;
219	unpeer_fifo *	unpeers;
220
221	/* Other Modes */
222	int		broadcastclient;
223	address_fifo *	manycastserver;
224	address_fifo *	multicastclient;
225
226	attr_val_fifo *	orphan_cmds;	/* s/b renamed tos_options */
227
228	/* Monitoring Configuration */
229	int_fifo *	stats_list;
230	char *		stats_dir;
231	filegen_fifo *	filegen_opts;
232
233	/* Access Control Configuration */
234	attr_val_fifo *	discard_opts;
235	attr_val_fifo *	mru_opts;
236	restrict_fifo *	restrict_opts;
237
238	addr_opts_fifo *fudge;
239	attr_val_fifo *	rlimit;
240	attr_val_fifo *	tinker;
241	attr_val_fifo *	enable_opts;
242	attr_val_fifo *	disable_opts;
243
244	auth_node	auth;
245
246	attr_val_fifo *	logconfig;
247	string_fifo *	phone;
248	setvar_fifo *	setvar;
249	int_fifo *	ttl;
250	addr_opts_fifo *trap;
251	attr_val_fifo *	vars;
252	nic_rule_fifo *	nic_rules;
253	int_fifo *	reset_counters;
254	attr_val_fifo *	pollskewlist;
255
256	sim_fifo *	sim_details;
257	int		mdnstries;
258};
259
260
261/* Structure for holding a remote configuration command */
262struct REMOTE_CONFIG_INFO {
263	char buffer[MAXLINE];
264	char err_msg[MAXLINE];
265	int pos;
266	int err_pos;
267	int no_errors;
268};
269
270
271/*
272 * context for trap_name_resolved() to call ctlsettrap() once the
273 * name->address resolution completes.
274 */
275typedef struct settrap_parms_tag {
276	sockaddr_u	ifaddr;
277	int		ifaddr_nonnull;
278} settrap_parms;
279
280
281/*
282** Data Minimization Items
283*/
284
285/* Serverresponse fuzz reftime: stored in 'restrict' fifos */
286
287
288/* get text from T_ tokens */
289const char * token_name(int token);
290
291/* generic fifo routines for structs linked by 1st member */
292typedef void (*fifo_deleter)(void*);
293void *	destroy_gen_fifo(void *fifo, fifo_deleter func);
294void *	append_gen_fifo(void *fifo, void *entry);
295void *	concat_gen_fifos(void *first, void *second);
296#define DESTROY_G_FIFO(pf, func)	\
297	((pf) = destroy_gen_fifo((pf), (fifo_deleter)(func)))
298#define APPEND_G_FIFO(pf, pe)		\
299	((pf) = append_gen_fifo((pf), (pe)))
300#define CONCAT_G_FIFOS(first, second)	\
301	((first) = concat_gen_fifos((first), (second)))
302#define HEAD_PFIFO(pf)			\
303	(((pf) != NULL)			\
304	      ? HEAD_FIFO(*(pf))	\
305	      : NULL)
306
307peer_node *create_peer_node(int hmode, address_node *addr,
308			    attr_val_fifo *options);
309unpeer_node *create_unpeer_node(address_node *addr);
310address_node *create_address_node(char *addr, int type);
311void destroy_address_node(address_node *my_node);
312attr_val *create_attr_dval(int attr, double value);
313attr_val *create_attr_ival(int attr, int value);
314attr_val *create_attr_rval(int attr, int first, int last);
315attr_val *create_attr_sval(int attr, const char *s);
316attr_val *create_attr_uval(int attr, u_int value);
317void	  destroy_attr_val(attr_val *node);
318filegen_node *create_filegen_node(int filegen_token,
319				  attr_val_fifo *options);
320string_node *create_string_node(char *str);
321restrict_node *create_restrict_node(address_node *addr,
322				    address_node *mask,
323				    short ippeerlimit,
324				    attr_val_fifo *flags, int line_no);
325int_node *create_int_node(int val);
326addr_opts_node *create_addr_opts_node(address_node *addr,
327				      attr_val_fifo *options);
328sim_node *create_sim_node(attr_val_fifo *init_opts,
329			  server_info_fifo *servers);
330setvar_node *create_setvar_node(char *var, char *val, int isdefault);
331nic_rule_node *create_nic_rule_node(int match_class, char *if_name,
332				    int action);
333
334script_info *create_sim_script_info(double duration,
335				    attr_val_fifo *script_queue);
336server_info *create_sim_server(address_node *addr, double server_offset,
337			       script_info_fifo *script);
338
339extern struct REMOTE_CONFIG_INFO remote_config;
340void config_remotely(sockaddr_u *);
341
342#ifdef SAVECONFIG
343int dump_config_tree(config_tree *ptree, FILE *df, int comment);
344int dump_all_config_trees(FILE *df, int comment);
345#endif
346
347#if defined(HAVE_SETRLIMIT)
348void ntp_rlimit(int, rlim_t, int, const char *);
349#endif
350
351#endif	/* !defined(NTP_CONFIG_H) */
352