#define CERR_NORESOURCE CERR_PERMISSION /* wish there was a different code */
-/*
- * System variables we understand
- */
-#define CS_LEAP 1
-#define CS_STRATUM 2
-#define CS_PRECISION 3
-#define CS_ROOTDELAY 4
-#define CS_ROOTDISPERSION 5
-#define CS_REFID 6
-#define CS_REFTIME 7
-#define CS_POLL 8
-#define CS_PEERID 9
-#define CS_OFFSET 10
-#define CS_DRIFT 11
-#define CS_JITTER 12
-#define CS_ERROR 13
-#define CS_CLOCK 14
-#define CS_PROCESSOR 15
-#define CS_SYSTEM 16
-#define CS_VERSION 17
-#define CS_STABIL 18
-#define CS_VARLIST 19
-#define CS_TAI 20
-#define CS_LEAPTAB 21
-#define CS_LEAPEND 22
-#define CS_RATE 23
-#define CS_MRU_ENABLED 24
-#define CS_MRU_DEPTH 25
-#define CS_MRU_DEEPEST 26
-#define CS_MRU_MINDEPTH 27
-#define CS_MRU_MAXAGE 28
-#define CS_MRU_MAXDEPTH 29
-#define CS_MRU_MEM 30
-#define CS_MRU_MAXMEM 31
-#define CS_SS_UPTIME 32
-#define CS_SS_RESET 33
-#define CS_SS_RECEIVED 34
-#define CS_SS_THISVER 35
-#define CS_SS_OLDVER 36
-#define CS_SS_BADFORMAT 37
-#define CS_SS_BADAUTH 38
-#define CS_SS_DECLINED 39
-#define CS_SS_RESTRICTED 40
-#define CS_SS_LIMITED 41
-#define CS_SS_KODSENT 42
-#define CS_SS_PROCESSED 43
-#define CS_PEERADR 44
-#define CS_PEERMODE 45
-#define CS_BCASTDELAY 46
-#define CS_AUTHDELAY 47
-#define CS_AUTHKEYS 48
-#define CS_AUTHFREEK 49
-#define CS_AUTHKLOOKUPS 50
-#define CS_AUTHKNOTFOUND 51
-#define CS_AUTHKUNCACHED 52
-#define CS_AUTHKEXPIRED 53
-#define CS_AUTHENCRYPTS 54
-#define CS_AUTHDECRYPTS 55
-#define CS_AUTHRESET 56
-#define CS_K_OFFSET 57
-#define CS_K_FREQ 58
-#define CS_K_MAXERR 59
-#define CS_K_ESTERR 60
-#define CS_K_STFLAGS 61
-#define CS_K_TIMECONST 62
-#define CS_K_PRECISION 63
-#define CS_K_FREQTOL 64
-#define CS_K_PPS_FREQ 65
-#define CS_K_PPS_STABIL 66
-#define CS_K_PPS_JITTER 67
-#define CS_K_PPS_CALIBDUR 68
-#define CS_K_PPS_CALIBS 69
-#define CS_K_PPS_CALIBERRS 70
-#define CS_K_PPS_JITEXC 71
-#define CS_K_PPS_STBEXC 72
-#define CS_KERN_FIRST CS_K_OFFSET
-#define CS_KERN_LAST CS_K_PPS_STBEXC
-#define CS_MAX_NOAUTOKEY CS_KERN_LAST
-#ifdef AUTOKEY
-#define CS_FLAGS (1 + CS_MAX_NOAUTOKEY)
-#define CS_HOST (2 + CS_MAX_NOAUTOKEY)
-#define CS_PUBLIC (3 + CS_MAX_NOAUTOKEY)
-#define CS_CERTIF (4 + CS_MAX_NOAUTOKEY)
-#define CS_SIGNATURE (5 + CS_MAX_NOAUTOKEY)
-#define CS_REVTIME (6 + CS_MAX_NOAUTOKEY)
-#define CS_IDENT (7 + CS_MAX_NOAUTOKEY)
-#define CS_DIGEST (8 + CS_MAX_NOAUTOKEY)
-#define CS_MAXCODE CS_DIGEST
-#else /* !AUTOKEY follows */
-#define CS_MAXCODE CS_MAX_NOAUTOKEY
-#endif /* !AUTOKEY */
-
-/*
- * Peer variables we understand
- */
-#define CP_CONFIG 1
-#define CP_AUTHENABLE 2
-#define CP_AUTHENTIC 3
-#define CP_SRCADR 4
-#define CP_SRCPORT 5
-#define CP_DSTADR 6
-#define CP_DSTPORT 7
-#define CP_LEAP 8
-#define CP_HMODE 9
-#define CP_STRATUM 10
-#define CP_PPOLL 11
-#define CP_HPOLL 12
-#define CP_PRECISION 13
-#define CP_ROOTDELAY 14
-#define CP_ROOTDISPERSION 15
-#define CP_REFID 16
-#define CP_REFTIME 17
-#define CP_ORG 18
-#define CP_REC 19
-#define CP_XMT 20
-#define CP_REACH 21
-#define CP_UNREACH 22
-#define CP_TIMER 23
-#define CP_DELAY 24
-#define CP_OFFSET 25
-#define CP_JITTER 26
-#define CP_DISPERSION 27
-#define CP_KEYID 28
-#define CP_FILTDELAY 29
-#define CP_FILTOFFSET 30
-#define CP_PMODE 31
-#define CP_RECEIVED 32
-#define CP_SENT 33
-#define CP_FILTERROR 34
-#define CP_FLASH 35
-#define CP_TTL 36
-#define CP_VARLIST 37
-#define CP_IN 38
-#define CP_OUT 39
-#define CP_RATE 40
-#define CP_BIAS 41
-#define CP_SRCHOST 42
-#define CP_TIMEREC 43
-#define CP_TIMEREACH 44
-#define CP_BADAUTH 45
-#define CP_BOGUSORG 46
-#define CP_OLDPKT 47
-#define CP_SELDISP 48
-#define CP_SELBROKEN 49
-#define CP_CANDIDATE 50
-#define CP_MAX_NOAUTOKEY CP_CANDIDATE
-#ifdef AUTOKEY
-#define CP_FLAGS (1 + CP_MAX_NOAUTOKEY)
-#define CP_HOST (2 + CP_MAX_NOAUTOKEY)
-#define CP_VALID (3 + CP_MAX_NOAUTOKEY)
-#define CP_INITSEQ (4 + CP_MAX_NOAUTOKEY)
-#define CP_INITKEY (5 + CP_MAX_NOAUTOKEY)
-#define CP_INITTSP (6 + CP_MAX_NOAUTOKEY)
-#define CP_SIGNATURE (7 + CP_MAX_NOAUTOKEY)
-#define CP_IDENT (8 + CP_MAX_NOAUTOKEY)
-#define CP_MAXCODE CP_IDENT
-#else /* !AUTOKEY follows */
-#define CP_MAXCODE CP_MAX_NOAUTOKEY
-#endif /* !AUTOKEY */
-
-/*
- * Clock variables we understand
- */
-#define CC_TYPE 1
-#define CC_TIMECODE 2
-#define CC_POLL 3
-#define CC_NOREPLY 4
-#define CC_BADFORMAT 5
-#define CC_BADDATA 6
-#define CC_FUDGETIME1 7
-#define CC_FUDGETIME2 8
-#define CC_FUDGEVAL1 9
-#define CC_FUDGEVAL2 10
-#define CC_FLAGS 11
-#define CC_DEVICE 12
-#define CC_VARLIST 13
-#define CC_MAXCODE CC_VARLIST
-
/*
* Definition of the structure used internally to hold trap information.
* ntp_request.c wants to see this.
{ NO_REQUEST, 0 }
};
+/*
+ * System variables we understand
+ */
+#define CS_LEAP 1
+#define CS_STRATUM 2
+#define CS_PRECISION 3
+#define CS_ROOTDELAY 4
+#define CS_ROOTDISPERSION 5
+#define CS_REFID 6
+#define CS_REFTIME 7
+#define CS_POLL 8
+#define CS_PEERID 9
+#define CS_OFFSET 10
+#define CS_DRIFT 11
+#define CS_JITTER 12
+#define CS_ERROR 13
+#define CS_CLOCK 14
+#define CS_PROCESSOR 15
+#define CS_SYSTEM 16
+#define CS_VERSION 17
+#define CS_STABIL 18
+#define CS_VARLIST 19
+#define CS_TAI 20
+#define CS_LEAPTAB 21
+#define CS_LEAPEND 22
+#define CS_RATE 23
+#define CS_MRU_ENABLED 24
+#define CS_MRU_DEPTH 25
+#define CS_MRU_DEEPEST 26
+#define CS_MRU_MINDEPTH 27
+#define CS_MRU_MAXAGE 28
+#define CS_MRU_MAXDEPTH 29
+#define CS_MRU_MEM 30
+#define CS_MRU_MAXMEM 31
+#define CS_SS_UPTIME 32
+#define CS_SS_RESET 33
+#define CS_SS_RECEIVED 34
+#define CS_SS_THISVER 35
+#define CS_SS_OLDVER 36
+#define CS_SS_BADFORMAT 37
+#define CS_SS_BADAUTH 38
+#define CS_SS_DECLINED 39
+#define CS_SS_RESTRICTED 40
+#define CS_SS_LIMITED 41
+#define CS_SS_KODSENT 42
+#define CS_SS_PROCESSED 43
+#define CS_PEERADR 44
+#define CS_PEERMODE 45
+#define CS_BCASTDELAY 46
+#define CS_AUTHDELAY 47
+#define CS_AUTHKEYS 48
+#define CS_AUTHFREEK 49
+#define CS_AUTHKLOOKUPS 50
+#define CS_AUTHKNOTFOUND 51
+#define CS_AUTHKUNCACHED 52
+#define CS_AUTHKEXPIRED 53
+#define CS_AUTHENCRYPTS 54
+#define CS_AUTHDECRYPTS 55
+#define CS_AUTHRESET 56
+#define CS_K_OFFSET 57
+#define CS_K_FREQ 58
+#define CS_K_MAXERR 59
+#define CS_K_ESTERR 60
+#define CS_K_STFLAGS 61
+#define CS_K_TIMECONST 62
+#define CS_K_PRECISION 63
+#define CS_K_FREQTOL 64
+#define CS_K_PPS_FREQ 65
+#define CS_K_PPS_STABIL 66
+#define CS_K_PPS_JITTER 67
+#define CS_K_PPS_CALIBDUR 68
+#define CS_K_PPS_CALIBS 69
+#define CS_K_PPS_CALIBERRS 70
+#define CS_K_PPS_JITEXC 71
+#define CS_K_PPS_STBEXC 72
+#define CS_KERN_FIRST CS_K_OFFSET
+#define CS_KERN_LAST CS_K_PPS_STBEXC
+#define CS_MAX_NOAUTOKEY CS_KERN_LAST
+#ifdef AUTOKEY
+#define CS_FLAGS (1 + CS_MAX_NOAUTOKEY)
+#define CS_HOST (2 + CS_MAX_NOAUTOKEY)
+#define CS_PUBLIC (3 + CS_MAX_NOAUTOKEY)
+#define CS_CERTIF (4 + CS_MAX_NOAUTOKEY)
+#define CS_SIGNATURE (5 + CS_MAX_NOAUTOKEY)
+#define CS_REVTIME (6 + CS_MAX_NOAUTOKEY)
+#define CS_IDENT (7 + CS_MAX_NOAUTOKEY)
+#define CS_DIGEST (8 + CS_MAX_NOAUTOKEY)
+#define CS_MAXCODE CS_DIGEST
+#else /* !AUTOKEY follows */
+#define CS_MAXCODE CS_MAX_NOAUTOKEY
+#endif /* !AUTOKEY */
+
+/*
+ * Peer variables we understand
+ */
+#define CP_CONFIG 1
+#define CP_AUTHENABLE 2
+#define CP_AUTHENTIC 3
+#define CP_SRCADR 4
+#define CP_SRCPORT 5
+#define CP_DSTADR 6
+#define CP_DSTPORT 7
+#define CP_LEAP 8
+#define CP_HMODE 9
+#define CP_STRATUM 10
+#define CP_PPOLL 11
+#define CP_HPOLL 12
+#define CP_PRECISION 13
+#define CP_ROOTDELAY 14
+#define CP_ROOTDISPERSION 15
+#define CP_REFID 16
+#define CP_REFTIME 17
+#define CP_ORG 18
+#define CP_REC 19
+#define CP_XMT 20
+#define CP_REACH 21
+#define CP_UNREACH 22
+#define CP_TIMER 23
+#define CP_DELAY 24
+#define CP_OFFSET 25
+#define CP_JITTER 26
+#define CP_DISPERSION 27
+#define CP_KEYID 28
+#define CP_FILTDELAY 29
+#define CP_FILTOFFSET 30
+#define CP_PMODE 31
+#define CP_RECEIVED 32
+#define CP_SENT 33
+#define CP_FILTERROR 34
+#define CP_FLASH 35
+#define CP_TTL 36
+#define CP_VARLIST 37
+#define CP_IN 38
+#define CP_OUT 39
+#define CP_RATE 40
+#define CP_BIAS 41
+#define CP_SRCHOST 42
+#define CP_TIMEREC 43
+#define CP_TIMEREACH 44
+#define CP_BADAUTH 45
+#define CP_BOGUSORG 46
+#define CP_OLDPKT 47
+#define CP_SELDISP 48
+#define CP_SELBROKEN 49
+#define CP_CANDIDATE 50
+#define CP_MAX_NOAUTOKEY CP_CANDIDATE
+#ifdef AUTOKEY
+#define CP_FLAGS (1 + CP_MAX_NOAUTOKEY)
+#define CP_HOST (2 + CP_MAX_NOAUTOKEY)
+#define CP_VALID (3 + CP_MAX_NOAUTOKEY)
+#define CP_INITSEQ (4 + CP_MAX_NOAUTOKEY)
+#define CP_INITKEY (5 + CP_MAX_NOAUTOKEY)
+#define CP_INITTSP (6 + CP_MAX_NOAUTOKEY)
+#define CP_SIGNATURE (7 + CP_MAX_NOAUTOKEY)
+#define CP_IDENT (8 + CP_MAX_NOAUTOKEY)
+#define CP_MAXCODE CP_IDENT
+#else /* !AUTOKEY follows */
+#define CP_MAXCODE CP_MAX_NOAUTOKEY
+#endif /* !AUTOKEY */
+
+/*
+ * Clock variables we understand
+ */
+#define CC_TYPE 1
+#define CC_TIMECODE 2
+#define CC_POLL 3
+#define CC_NOREPLY 4
+#define CC_BADFORMAT 5
+#define CC_BADDATA 6
+#define CC_FUDGETIME1 7
+#define CC_FUDGETIME2 8
+#define CC_FUDGEVAL1 9
+#define CC_FUDGEVAL2 10
+#define CC_FLAGS 11
+#define CC_DEVICE 12
+#define CC_VARLIST 13
+#define CC_MAXCODE CC_VARLIST
+
/*
* System variable values. The array can be indexed by the variable
* index to find the textual name.
extern struct servent *server_entry;
extern struct association assoc_cache[];
extern u_char pktversion;
-extern struct ctl_var peer_var[];
typedef struct mru_tag mru;
struct mru_tag {
{ 0, 0 }
};
-#define HAVE_SRCADR 0
-#define HAVE_DSTADR 1
-#define HAVE_REFID 1
-#define HAVE_STRATUM 2
-#define HAVE_HPOLL 3
-#define HAVE_PPOLL 4
-#define HAVE_REACH 5
-#define HAVE_DELAY 6
-#define HAVE_OFFSET 7
-#define HAVE_JITTER 8
-#define HAVE_DISPERSION 9
-#define HAVE_REC 10
-#define HAVE_REFTIME 11
-#define HAVE_SRCPORT 12
-#define HAVE_HMODE 13
-#define HAVE_SRCHOST 14
-#define MAX_HAVE 14
/*
* Decode an incoming data buffer and print a line in the peer list
{
char *name;
char *value = NULL;
- int i;
int c;
int len;
+ int have_srchost;
+ int have_jitter;
sockaddr_u srcadr;
sockaddr_u dstadr;
sockaddr_u dum_store;
l_fp reftime;
l_fp rec;
l_fp ts;
- u_char havevar[MAX_HAVE + 1];
u_long poll_sec;
char type = '?';
char whenbuf[8], pollbuf[8];
get_systime(&ts);
- memset(havevar, 0, sizeof(havevar));
+ have_srchost = FALSE;
+ have_jitter = FALSE;
ZERO_SOCK(&srcadr);
ZERO_SOCK(&dstadr);
clock_name[0] = '\0';
-
- /* Initialize by zeroing out estimate variables */
memset(&estoffset, 0, sizeof(estoffset));
memset(&estdelay, 0, sizeof(estdelay));
memset(&estjitter, 0, sizeof(estjitter));
memset(&estdisp, 0, sizeof(estdisp));
while (nextvar(&datalen, &data, &name, &value)) {
- i = findvar(name, peer_var, 1);
- if (i == 0)
- continue; /* don't know this one */
- switch (i) {
- case CP_SRCADR:
- if (decodenetnum(value, &srcadr))
- havevar[HAVE_SRCADR] = 1;
- break;
- case CP_SRCHOST:
+ if (!strcmp("srcadr", name) ||
+ !strcmp("peeradr", name)) {
+ decodenetnum(value, &srcadr);
+ } else if (!strcmp("srchost", name)) {
if (pvl == peervarlist) {
len = strlen(value);
if (2 < len &&
len -= 2;
memcpy(clock_name, value, len);
clock_name[len] = '\0';
- havevar[HAVE_SRCHOST] = 1;
+ have_srchost = TRUE;
}
}
- break;
- case CP_DSTADR:
+ } else if (!strcmp("dstadr", name)) {
if (decodenetnum(value, &dum_store)) {
type = decodeaddrtype(&dum_store);
if (pvl == opeervarlist) {
- havevar[HAVE_DSTADR] = 1;
dstadr = dum_store;
dstadr_refid = stoa(&dstadr);
}
}
- break;
- case CP_HMODE:
- if (decodeint(value, &hmode))
- havevar[HAVE_HMODE] = 1;
- break;
- case CP_REFID:
+ } else if (!strcmp("hmode", name)) {
+ decodeint(value, &hmode);
+ } else if (!strcmp("refid", name)) {
if (pvl == peervarlist) {
- havevar[HAVE_REFID] = 1;
if (*value == '\0') {
dstadr_refid = "";
} else if (strlen(value) <= 4) {
- strncpy((void *)&u32, value, sizeof(u32));
+ strncpy((void *)&u32, value,
+ sizeof(u32));
dstadr_refid = refid_str(u32, 1);
} else if (decodenetnum(value, &dstadr)) {
- if (ISREFCLOCKADR(&dstadr))
- dstadr_refid =
- refnumtoa(&dstadr);
- else
- dstadr_refid =
- stoa(&dstadr);
- } else {
- havevar[HAVE_REFID] = 0;
+ dstadr_refid =
+ refnumtoa(&dstadr);
}
}
- break;
- case CP_STRATUM:
- if (decodeuint(value, &stratum))
- havevar[HAVE_STRATUM] = 1;
- break;
- case CP_HPOLL:
- if (decodeint(value, &hpoll)) {
- havevar[HAVE_HPOLL] = 1;
- if (hpoll < 0)
- hpoll = NTP_MINPOLL;
- }
- break;
- case CP_PPOLL:
- if (decodeint(value, &ppoll)) {
- havevar[HAVE_PPOLL] = 1;
- if (ppoll < 0)
- ppoll = NTP_MINPOLL;
- }
- break;
- case CP_REACH:
- if (decodeuint(value, &reach))
- havevar[HAVE_REACH] = 1;
- break;
- case CP_DELAY:
- if (decodetime(value, &estdelay))
- havevar[HAVE_DELAY] = 1;
- break;
- case CP_OFFSET:
- if (decodetime(value, &estoffset))
- havevar[HAVE_OFFSET] = 1;
- break;
- case CP_JITTER:
- if (pvl == peervarlist)
- if (decodetime(value, &estjitter))
- havevar[HAVE_JITTER] = 1;
- break;
- case CP_DISPERSION:
- if (decodetime(value, &estdisp))
- havevar[HAVE_DISPERSION] = 1;
- break;
- case CP_REC:
- if (decodets(value, &rec))
- havevar[HAVE_REC] = 1;
- break;
- case CP_SRCPORT:
- if (decodeuint(value, &srcport))
- havevar[HAVE_SRCPORT] = 1;
- break;
- case CP_REFTIME:
- havevar[HAVE_REFTIME] = 1;
+ } else if (!strcmp("stratum", name)) {
+ decodeuint(value, &stratum);
+ } else if (!strcmp("hpoll", name)) {
+ if (decodeint(value, &hpoll) && hpoll < 0)
+ hpoll = NTP_MINPOLL;
+ } else if (!strcmp("ppoll", name)) {
+ if (decodeint(value, &ppoll) && ppoll < 0)
+ ppoll = NTP_MINPOLL;
+ } else if (!strcmp("reach", name)) {
+ decodeuint(value, &reach);
+ } else if (!strcmp("delay", name)) {
+ decodetime(value, &estdelay);
+ } else if (!strcmp("offset", name)) {
+ decodetime(value, &estoffset);
+ } else if (!strcmp("jitter", name)) {
+ if (pvl == peervarlist &&
+ decodetime(value, &estjitter))
+ have_jitter = 1;
+ } else if (!strcmp("rootdisp", name) ||
+ !strcmp("dispersion", name)) {
+ decodetime(value, &estdisp);
+ } else if (!strcmp("rec", name)) {
+ decodets(value, &rec);
+ } else if (!strcmp("srcport", name) ||
+ !strcmp("peerport", name)) {
+ decodeuint(value, &srcport);
+ } else if (!strcmp("reftime", name)) {
if (!decodets(value, &reftime))
L_CLR(&reftime);
- break;
- default:
- break;
}
}
if (numhosts > 1)
fprintf(fp, "%-*s ", maxhostlen, currenthost);
if (AF_UNSPEC == af || AF(&srcadr) == af) {
- if (!havevar[HAVE_SRCHOST])
+ if (!have_srchost)
strncpy(clock_name, nntohost(&srcadr),
sizeof(clock_name));
fprintf(fp, "%c%-15.15s ", c, clock_name);
(int)poll_sec),
reach, lfptoms(&estdelay, 3),
lfptoms(&estoffset, 3),
- (havevar[HAVE_JITTER])
+ (have_jitter)
? lfptoms(&estjitter, 3)
: lfptoms(&estdisp, 3));
return (1);
return(1);
}
-#undef HAVE_SRCADR
-#undef HAVE_DSTADR
-#undef HAVE_STRATUM
-#undef HAVE_PPOLL
-#undef HAVE_HPOLL
-#undef HAVE_REACH
-#undef HAVE_ESTDELAY
-#undef HAVE_ESTOFFSET
-#undef HAVE_JITTER
-#undef HAVE_ESTDISP
-#undef HAVE_REFID
-#undef HAVE_REC
-#undef HAVE_SRCPORT
-#undef HAVE_REFTIME
-#undef MAX_HAVE
-
/*
* dogetpeers - given an association ID, read and print the spreadsheet
* Format values
*/
#define PADDING 0
-#define TS 1 /* time stamp */
-#define FL 2 /* l_fp type value */
-#define FU 3 /* u_fp type value */
-#define FS 4 /* s_fp type value */
-#define UI 5 /* unsigned integer value */
-#define SI 6 /* signed integer value */
-#define HA 7 /* host address */
-#define NA 8 /* network address */
-#define ST 9 /* string value */
-#define RF 10 /* refid (sometimes string, sometimes not) */
-#define LP 11 /* leap (print in binary) */
-#define OC 12 /* integer, print in octal */
-#define MD 13 /* mode */
-#define AR 14 /* array of times */
-#define FX 15 /* test flags */
+#define HA 1 /* host address */
+#define NA 2 /* network address */
+#define LP 3 /* leap (print in binary) */
+#define RF 4 /* refid (sometimes string, sometimes not) */
+#define AR 5 /* array of times */
+#define FX 6 /* test flags */
+#define TS 7 /* l_fp timestamp in hex */
+#define OC 8 /* integer, print in octal */
#define EOV 255 /* end of table */
-
-/*
- * System variable values. The array can be indexed by
- * the variable index to find the textual name.
- */
-struct ctl_var sys_var[] = {
- { 0, PADDING, "" }, /* 0 */
- { CS_LEAP, LP, "leap" }, /* 1 */
- { CS_STRATUM, UI, "stratum" }, /* 2 */
- { CS_PRECISION, SI, "precision" }, /* 3 */
- { CS_ROOTDELAY, FS, "rootdelay" }, /* 4 */
- { CS_ROOTDISPERSION, FU, "rootdispersion" }, /* 5 */
- { CS_REFID, RF, "refid" }, /* 6 */
- { CS_REFTIME, TS, "reftime" }, /* 7 */
- { CS_POLL, UI, "poll" }, /* 8 */
- { CS_PEERID, UI, "peer" }, /* 9 */
- { CS_OFFSET, FL, "offset" }, /* 10 */
- { CS_DRIFT, FS, "frequency" }, /* 11 */
- { CS_JITTER, FU, "jitter" }, /* 12 */
- { CS_CLOCK, TS, "clock" }, /* 13 */
- { CS_PROCESSOR, ST, "processor" }, /* 14 */
- { CS_SYSTEM, ST, "system" }, /* 15 */
- { CS_VERSION, ST, "version" }, /* 16 */
- { CS_STABIL, FS, "stability" }, /* 17 */
- { CS_VARLIST, ST, "sys_var_list" }, /* 18 */
- { 0, EOV, "" }
-};
-
-
/*
- * Peer variable list
- */
-struct ctl_var peer_var[] = {
- { 0, PADDING, "" }, /* 0 */
- { CP_CONFIG, UI, "config" }, /* 1 */
- { CP_AUTHENABLE, UI, "authenable" }, /* 2 */
- { CP_AUTHENTIC, UI, "authentic" }, /* 3 */
- { CP_SRCADR, HA, "srcadr" }, /* 4 */
- { CP_SRCPORT, UI, "srcport" }, /* 5 */
- { CP_DSTADR, NA, "dstadr" }, /* 6 */
- { CP_DSTPORT, UI, "dstport" }, /* 7 */
- { CP_LEAP, LP, "leap" }, /* 8 */
- { CP_HMODE, MD, "hmode" }, /* 9 */
- { CP_STRATUM, UI, "stratum" }, /* 10 */
- { CP_PPOLL, UI, "ppoll" }, /* 11 */
- { CP_HPOLL, UI, "hpoll" }, /* 12 */
- { CP_PRECISION, SI, "precision" }, /* 13 */
- { CP_ROOTDELAY, FS, "rootdelay" }, /* 14 */
- { CP_ROOTDISPERSION, FU, "rootdisp" }, /* 15 */
- { CP_REFID, RF, "refid" }, /* 16 */
- { CP_REFTIME, TS, "reftime" }, /* 17 */
- { CP_ORG, TS, "org" }, /* 18 */
- { CP_REC, TS, "rec" }, /* 19 */
- { CP_XMT, TS, "xmt" }, /* 20 */
- { CP_REACH, OC, "reach" }, /* 21 */
- { CP_UNREACH, UI, "unreach" }, /* 22 */
- { CP_TIMER, UI, "timer" }, /* 23 */
- { CP_DELAY, FS, "delay" }, /* 24 */
- { CP_OFFSET, FL, "offset" }, /* 25 */
- { CP_JITTER, FU, "jitter" }, /* 26 */
- { CP_DISPERSION, FU, "dispersion" }, /* 27 */
- { CP_KEYID, UI, "keyid" }, /* 28 */
- { CP_FILTDELAY, AR, "filtdelay" }, /* 29 */
- { CP_FILTOFFSET, AR, "filtoffset" }, /* 30 */
- { CP_PMODE, ST, "pmode" }, /* 31 */
- { CP_RECEIVED, UI, "received" }, /* 32 */
- { CP_SENT, UI, "sent" }, /* 33 */
- { CP_FILTERROR, AR, "filtdisp" }, /* 34 */
- { CP_FLASH, FX, "flash" }, /* 35 */
- { CP_TTL, UI, "ttl" }, /* 36 */
- { CP_SRCHOST, ST, "srchost" }, /* 37 */
- /*
- * These are duplicate entries using different on-wire variable
- * names so that we can interoperate with another flavor.
- */
- { CP_SRCADR, HA, "peeraddr" }, /* 38 */
- { CP_SRCPORT, UI, "peerport" }, /* 39 */
- { CP_PPOLL, UI, "peerpoll" }, /* 40 */
- { CP_HPOLL, UI, "hostpoll" }, /* 41 */
- { CP_FILTERROR, AR, "filterror" }, /* 42 */
- { 0, EOV, "" }
+ * For the most part ntpq simply displays what ntpd provides in the
+ * mostly plain-text mode 6 responses. A few variable names are by
+ * default "cooked" to provide more human-friendly output.
+ */
+const var_format cookedvars[] = {
+ { "leap", LP },
+ { "reach", OC },
+ { "refid", RF },
+ { "reftime", TS },
+ { "clock", TS },
+ { "org", TS },
+ { "rec", TS },
+ { "xmt", TS },
+ { "flash", FX },
+ { "srcadr", HA },
+ { "peeradr", HA }, /* compat with others */
+ { "dstadr", NA },
+ { "filtdelay", AR },
+ { "filtoffset", AR },
+ { "filtdisp", AR },
+ { "filterror", AR }, /* compat with others */
};
-/*
- * Clock variable list
- */
-struct ctl_var clock_var[] = {
- { 0, PADDING, "" }, /* 0 */
- { CC_TYPE, UI, "type" }, /* 1 */
- { CC_TIMECODE, ST, "timecode" }, /* 2 */
- { CC_POLL, UI, "poll" }, /* 3 */
- { CC_NOREPLY, UI, "noreply" }, /* 4 */
- { CC_BADFORMAT, UI, "badformat" }, /* 5 */
- { CC_BADDATA, UI, "baddata" }, /* 6 */
- { CC_FUDGETIME1, FL, "fudgetime1" }, /* 7 */
- { CC_FUDGETIME2, FL, "fudgetime2" }, /* 8 */
- { CC_FUDGEVAL1, UI, "stratum" }, /* 9 */
- { CC_FUDGEVAL2, RF, "refid" }, /* 10 */
- { CC_FLAGS, UI, "flags" }, /* 11 */
- { CC_DEVICE, ST, "device" }, /* 12 */
- { 0, EOV, "" }
-};
-
/*
* flasher bits
static void endoutput (FILE *);
static void outputarr (FILE *, char *, int, l_fp *);
static int assoccmp (const void *, const void *);
+ u_short varfmt (const char *);
+
void ntpq_custom_opt_handler (tOptions *, tOptDesc *);
}
-/*
- * findvar - see if this variable is known to us.
- * If "code" is 1, return ctl_var->code.
- * Otherwise return the ordinal position of the found variable.
- */
-int
-findvar(
- char *varname,
- struct ctl_var *varlist,
- int code
- )
+u_short
+varfmt(const char * varname)
{
- register char *np;
- register struct ctl_var *vl;
-
- vl = varlist;
- np = varname;
- while (vl->fmt != EOV) {
- if (vl->fmt != PADDING && STREQ(np, vl->text))
- return (code)
- ? vl->code
- : (vl - varlist)
- ;
- vl++;
- }
- return 0;
-}
+ u_int n;
+ for (n = 0; n < COUNTOF(cookedvars); n++)
+ if (!strcmp(varname, cookedvars[n].varname))
+ return cookedvars[n].fmt;
+
+ return PADDING;
+}
/*
FILE *fp
)
{
- register int varid;
char *name;
char *value;
char output_raw;
int fmt;
- struct ctl_var *varlist;
l_fp lfp;
- long ival;
sockaddr_u hval;
u_long uval;
- l_fp lfparr[8];
int narr;
+ size_t len;
+ l_fp lfparr[8];
+ char b[12];
+ char bn[2 * MAXVARLEN];
+ char bv[2 * MAXVARLEN];
- switch (datatype) {
- case TYPE_PEER:
- varlist = peer_var;
- break;
- case TYPE_SYS:
- varlist = sys_var;
- break;
- case TYPE_CLOCK:
- varlist = clock_var;
- break;
- default:
- fprintf(stderr, "Unknown datatype(0x%x) in cookedprint\n",
- datatype);
- return;
- }
+ UNUSED_ARG(datatype);
if (!quiet)
fprintf(fp, "status=%04x %s,\n", status,
startoutput();
while (nextvar(&length, &data, &name, &value)) {
- varid = findvar(name, varlist, 0);
- if (varid == 0) {
+ fmt = varfmt(name);
+ output_raw = 0;
+ switch (fmt) {
+
+ case PADDING:
output_raw = '*';
- } else {
- output_raw = 0;
- fmt = varlist[varid].fmt;
- switch(fmt) {
- case TS:
- if (!decodets(value, &lfp))
- output_raw = '?';
- else
- output(fp, name, prettydate(&lfp));
- break;
- case FL:
- case FU:
- case FS:
- if (!decodetime(value, &lfp))
- output_raw = '?';
- else {
- switch (fmt) {
- case FL:
- output(fp, name,
- lfptoms(&lfp, 3));
- break;
- case FU:
- output(fp, name,
- ulfptoms(&lfp, 3));
- break;
- case FS:
- output(fp, name,
- lfptoms(&lfp, 3));
- break;
- }
- }
- break;
-
- case UI:
- if (!decodeuint(value, &uval))
- output_raw = '?';
- else
- output(fp, name, uinttoa(uval));
- break;
-
- case SI:
- if (!decodeint(value, &ival))
- output_raw = '?';
- else
- output(fp, name, inttoa(ival));
- break;
-
- case HA:
- case NA:
- if (!decodenetnum(value, &hval))
- output_raw = '?';
- else if (fmt == HA){
- output(fp, name, nntohost(&hval));
- } else {
- output(fp, name, stoa(&hval));
- }
- break;
-
- case ST:
- output_raw = '*';
- break;
-
- case RF:
- if (decodenetnum(value, &hval)) {
- if (ISREFCLOCKADR(&hval))
- output(fp, name,
- refnumtoa(&hval));
- else
- output(fp, name, stoa(&hval));
- } else if ((int)strlen(value) <= 4)
- output(fp, name, value);
- else
- output_raw = '?';
- break;
-
- case LP:
- if (!decodeuint(value, &uval) || uval > 3)
- output_raw = '?';
- else {
- char b[3];
- b[0] = b[1] = '0';
- if (uval & 0x2)
- b[0] = '1';
- if (uval & 0x1)
- b[1] = '1';
- b[2] = '\0';
- output(fp, name, b);
- }
- break;
+ break;
- case OC:
- if (!decodeuint(value, &uval))
- output_raw = '?';
- else {
- char b[12];
+ case TS:
+ if (!decodets(value, &lfp))
+ output_raw = '?';
+ else
+ output(fp, name, prettydate(&lfp));
+ break;
- (void) snprintf(b, sizeof b, "%03lo", uval);
- output(fp, name, b);
- }
- break;
-
- case MD:
- if (!decodeuint(value, &uval))
- output_raw = '?';
- else
- output(fp, name, uinttoa(uval));
- break;
-
- case AR:
- if (!decodearr(value, &narr, lfparr))
- output_raw = '?';
+ case HA: /* fallthru */
+ case NA:
+ if (!decodenetnum(value, &hval)) {
+ output_raw = '?';
+ } else if (fmt == HA){
+ output(fp, name, nntohost(&hval));
+ } else {
+ output(fp, name, stoa(&hval));
+ }
+ break;
+
+ case RF:
+ if (decodenetnum(value, &hval)) {
+ if (ISREFCLOCKADR(&hval))
+ output(fp, name,
+ refnumtoa(&hval));
else
- outputarr(fp, name, narr, lfparr);
- break;
+ output(fp, name, stoa(&hval));
+ } else if (strlen(value) <= 4) {
+ output(fp, name, value);
+ } else {
+ output_raw = '?';
+ }
+ break;
- case FX:
- if (!decodeuint(value, &uval))
- output_raw = '?';
- else
- output(fp, name, tstflags(uval));
- break;
-
- default:
- (void) fprintf(stderr,
- "Internal error in cookedprint, %s=%s, fmt %d\n",
- name, value, fmt);
- break;
+ case LP:
+ if (!decodeuint(value, &uval) || uval > 3) {
+ output_raw = '?';
+ } else {
+ b[0] = (0x2 & uval)
+ ? '1'
+ : '0';
+ b[1] = (0x1 & uval)
+ ? '1'
+ : '0';
+ b[2] = '\0';
+ output(fp, name, b);
+ }
+ break;
+
+ case OC:
+ if (!decodeuint(value, &uval)) {
+ output_raw = '?';
+ } else {
+ snprintf(b, sizeof(b), "%03lo", uval);
+ output(fp, name, b);
}
+ break;
+
+ case AR:
+ if (!decodearr(value, &narr, lfparr))
+ output_raw = '?';
+ else
+ outputarr(fp, name, narr, lfparr);
+ break;
+ case FX:
+ if (!decodeuint(value, &uval))
+ output_raw = '?';
+ else
+ output(fp, name, tstflags(uval));
+ break;
+
+ default:
+ fprintf(stderr, "Internal error in cookedprint, %s=%s, fmt %d\n",
+ name, value, fmt);
+ output_raw = '?';
+ break;
}
- if (output_raw != 0) {
- char bn[401];
- char bv[401];
- int len;
+ if (output_raw != 0) {
atoascii(name, MAXVARLEN, bn, sizeof(bn));
atoascii(value, MAXVARLEN, bv, sizeof(bv));
if (output_raw != '*') {