1178825Sdfr/*
2233294Sstas * ntpq.h - definitions of interest to ntpq
3233294Sstas */
4233294Sstas#ifdef HAVE_UNISTD_H
5178825Sdfr# include <unistd.h>
6233294Sstas#endif
7233294Sstas#include "ntp_fp.h"
8233294Sstas#include "ntp.h"
9178825Sdfr#include "ntp_stdlib.h"
10233294Sstas#include "ntp_string.h"
11233294Sstas#include "ntp_malloc.h"
12178825Sdfr#include "ntp_assert.h"
13233294Sstas#include "ntp_control.h"
14233294Sstas
15233294Sstas#include "ntpq-opts.h"
16178825Sdfr
17233294Sstas/*
18233294Sstas * Maximum number of arguments
19233294Sstas */
20178825Sdfr#define	MAXARGS	4
21233294Sstas
22233294Sstas/*
23233294Sstas * Limit on packets in a single response.  Increasing this value to
24233294Sstas * 96 will marginally speed "mrulist" operation on lossless networks
25233294Sstas * but it has been observed to cause loss on WiFi networks and with
26233294Sstas * an IPv6 go6.net tunnel over UDP.  That loss causes the request
27233294Sstas * row limit to be cut in half, and it grows back very slowly to
28233294Sstas * ensure forward progress is made and loss isn't triggered too quickly
29233294Sstas * afterward.  While the lossless case gains only marginally with
30233294Sstas * MAXFRAGS == 96, the lossy case is a lot slower due to the repeated
31233294Sstas * timeouts.  Empirally, MAXFRAGS == 32 avoids most of the routine loss
32178825Sdfr * on both the WiFi and UDP v6 tunnel tests and seems a good compromise.
33178825Sdfr * This suggests some device in the path has a limit of 32 ~512 byte UDP
34178825Sdfr * packets in queue.
35178825Sdfr * Lowering MAXFRAGS may help with particularly lossy networks, but some
36178825Sdfr * ntpq commands may rely on the longtime value of 24 implicitly,
37178825Sdfr * assuming a single multipacket response will be large enough for any
38178825Sdfr * needs.  In contrast, the "mrulist" command is implemented as a series
39233294Sstas * of requests and multipacket responses to each.
40233294Sstas */
41178825Sdfr#define	MAXFRAGS	32
42178825Sdfr
43233294Sstas/*
44178825Sdfr * Error codes for internal use
45178825Sdfr */
46178825Sdfr#define	ERR_UNSPEC		256
47178825Sdfr#define	ERR_INCOMPLETE		257
48233294Sstas#define	ERR_TIMEOUT		258
49178825Sdfr#define	ERR_TOOMUCH		259
50233294Sstas
51178825Sdfr/*
52178825Sdfr * Flags for forming descriptors.
53178825Sdfr */
54178825Sdfr#define	OPT		0x80	/* this argument is optional, or'd with type */
55178825Sdfr
56178825Sdfr#define	NO		0x0
57178825Sdfr#define	NTP_STR		0x1	/* string argument */
58233294Sstas#define	NTP_UINT	0x2	/* unsigned integer */
59178825Sdfr#define	NTP_INT		0x3	/* signed integer */
60178825Sdfr#define	NTP_ADD		0x4	/* IP network address */
61178825Sdfr#define IP_VERSION	0x5	/* IP version */
62178825Sdfr#define	NTP_ADP		0x6	/* IP address and port */
63178825Sdfr#define NTP_LFP		0x7	/* NTP timestamp */
64178825Sdfr#define NTP_MODE	0x8	/* peer mode */
65178825Sdfr#define NTP_2BIT	0x9	/* leap bits */
66178825Sdfr#define NTP_REFID	0xA	/* RefID */
67178825Sdfr
68178825Sdfr/*
69178825Sdfr * Arguments are returned in a union
70178825Sdfr */
71178825Sdfrtypedef union {
72178825Sdfr	const char *string;
73178825Sdfr	long ival;
74178825Sdfr	u_long uval;
75178825Sdfr	sockaddr_u netnum;
76178825Sdfr} arg_v;
77178825Sdfr
78178825Sdfr/*
79178825Sdfr * Structure for passing parsed command line
80178825Sdfr */
81178825Sdfrstruct parse {
82178825Sdfr	const char *keyword;
83178825Sdfr	arg_v argval[MAXARGS];
84178825Sdfr	size_t nargs;
85178825Sdfr};
86178825Sdfr
87178825Sdfr/*
88233294Sstas * ntpdc includes a command parser which could charitably be called
89178825Sdfr * crude.  The following structure is used to define the command
90178825Sdfr * syntax.
91178825Sdfr */
92178825Sdfrstruct xcmd {
93178825Sdfr  const char *keyword;		/* command key word */
94178825Sdfr	void (*handler)	(struct parse *, FILE *);	/* command handler */
95178825Sdfr	u_char arg[MAXARGS];	/* descriptors for arguments */
96178825Sdfr  const char *desc[MAXARGS];	/* descriptions for arguments */
97178825Sdfr  const char *comment;
98178825Sdfr};
99178825Sdfr
100178825Sdfr/*
101178825Sdfr * Structure to hold association data
102178825Sdfr */
103178825Sdfrstruct association {
104178825Sdfr	associd_t assid;
105178825Sdfr	u_short status;
106178825Sdfr};
107178825Sdfr
108178825Sdfr/*
109178825Sdfr * mrulist terminal status interval
110178825Sdfr */
111178825Sdfr#define	MRU_REPORT_SECS	5
112178825Sdfr
113178825Sdfr/*
114178825Sdfr * var_format is used to override cooked formatting for selected vars.
115178825Sdfr */
116178825Sdfrtypedef struct var_format_tag {
117178825Sdfr	const char *	varname;
118178825Sdfr	u_short		fmt;
119178825Sdfr} var_format;
120233294Sstas
121178825Sdfrtypedef struct chost_tag chost;
122178825Sdfrstruct chost_tag {
123178825Sdfr	const char *name;
124178825Sdfr	int 	    fam;
125178825Sdfr};
126178825Sdfr
127178825Sdfrextern chost	chosts[];
128178825Sdfr
129178825Sdfrextern int	interactive;	/* are we prompting? */
130178825Sdfrextern int	old_rv;		/* use old rv behavior? --old-rv */
131178825Sdfrextern te_Refid	drefid;		/* How should we display a refid? */
132178825Sdfrextern u_int	assoc_cache_slots;/* count of allocated array entries */
133178825Sdfrextern u_int	numassoc;	/* number of cached associations */
134178825Sdfrextern u_int	numhosts;
135178825Sdfr
136178825Sdfrextern	void	grow_assoc_cache(void);
137178825Sdfrextern	void	asciize		(int, char *, FILE *);
138178825Sdfrextern	int	getnetnum	(const char *, sockaddr_u *, char *, int);
139178825Sdfrextern	void	sortassoc	(void);
140178825Sdfrextern	void	show_error_msg	(int, associd_t);
141178825Sdfrextern	int	dogetassoc	(FILE *);
142178825Sdfrextern	int	doquery		(int, associd_t, int, size_t, const char *,
143178825Sdfr				 u_short *, size_t *, const char **);
144178825Sdfrextern	int	doqueryex	(int, associd_t, int, size_t, const char *,
145178825Sdfr				 u_short *, size_t *, const char **, int);
146178825Sdfrextern	const char * nntohost	(sockaddr_u *);
147178825Sdfrextern	const char * nntohost_col (sockaddr_u *, size_t, int);
148178825Sdfrextern	const char * nntohostp	(sockaddr_u *);
149178825Sdfrextern	int	decodets	(char *, l_fp *);
150178825Sdfrextern	int	decodeuint	(char *, u_long *);
151178825Sdfrextern	int	nextvar		(size_t *, const char **, char **, char **);
152178825Sdfrextern	int	decodetime	(char *, l_fp *);
153178825Sdfrextern	void	printvars	(size_t, const char *, int, int, int, FILE *);
154178825Sdfrextern	int	decodeint	(char *, long *);
155178825Sdfrextern	void	makeascii	(size_t, const char *, FILE *);
156178825Sdfrextern	const char * trunc_left	(const char *, size_t);
157178825Sdfrextern	const char * trunc_right(const char *, size_t);
158178825Sdfr
159178825Sdfrtypedef	int/*BOOL*/ (*Ctrl_C_Handler)(void);
160178825Sdfrextern	int/*BOOL*/ 	push_ctrl_c_handler(Ctrl_C_Handler);
161233294Sstasextern	int/*BOOL*/ 	pop_ctrl_c_handler(Ctrl_C_Handler);
162178825Sdfr