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