From: Dave Hart Date: Thu, 30 Dec 2010 10:52:24 +0000 (+0000) Subject: [Bug 1764] Palisade driver doesn't build on Linux. X-Git-Tag: NTP_4_2_7P107~3^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de166ddf2d4a0f0e126e7264a0cf63afeb2084fd;p=thirdparty%2Fntp.git [Bug 1764] Palisade driver doesn't build on Linux. Move ntp_control.h variable IDs to ntp_control.c, remove their use by ntpq. They are implementation details private to ntpd. [Bug 597] was caused by ntpq's reliance on these IDs it need not know about. bk: 4d1c6468ocGCtZoRi6lbPnhw6p5VWw --- diff --git a/ChangeLog b/ChangeLog index 95ef503f6..0696748e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +* [Bug 1764] Palisade driver doesn't build on Linux. +* Move ntp_control.h variable IDs to ntp_control.c, remove their use by + ntpq. They are implementation details private to ntpd. [Bug 597] was + caused by ntpq's reliance on these IDs it need not know about. * from 4.2.6p3: Update genCommitLog for the bk-5 release. (4.2.7p105) 2010/12/29 Released by Harlan Stenn (4.2.7p104) 2010/12/28 Released by Harlan Stenn diff --git a/include/ntp_control.h b/include/ntp_control.h index 1fe446e1b..50f20c863 100644 --- a/include/ntp_control.h +++ b/include/ntp_control.h @@ -146,184 +146,6 @@ struct ntp_control { #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. diff --git a/libntp/refnumtoa.c b/libntp/refnumtoa.c index 0654717bb..e6ca55aef 100644 --- a/libntp/refnumtoa.c +++ b/libntp/refnumtoa.c @@ -17,21 +17,20 @@ refnumtoa( char *buf; const char *rclock; - LIB_GETBUF(buf); - - if (ISREFCLOCKADR(num)) { - netnum = SRCADR(num); - rclock = clockname((int)((u_long)netnum >> 8) & 0xff); + if (!ISREFCLOCKADR(num)) + return socktoa(num); - if (rclock != NULL) - snprintf(buf, LIB_BUFLENGTH, "%s(%lu)", - rclock, (u_long)netnum & 0xff); - else - snprintf(buf, LIB_BUFLENGTH, "REFCLK(%lu,%lu)", - ((u_long)netnum >> 8) & 0xff, - (u_long)netnum & 0xff); + LIB_GETBUF(buf); + netnum = SRCADR(num); + rclock = clockname((int)((u_long)netnum >> 8) & 0xff); - } + if (rclock != NULL) + snprintf(buf, LIB_BUFLENGTH, "%s(%lu)", + rclock, (u_long)netnum & 0xff); + else + snprintf(buf, LIB_BUFLENGTH, "REFCLK(%lu,%lu)", + ((u_long)netnum >> 8) & 0xff, + (u_long)netnum & 0xff); return buf; } diff --git a/ntpd/ntp_control.c b/ntpd/ntp_control.c index f8b93b40c..2b3e1ae86 100644 --- a/ntpd/ntp_control.c +++ b/ntpd/ntp_control.c @@ -123,6 +123,184 @@ static const struct ctl_proc control_codes[] = { { 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. diff --git a/ntpd/ntp_io.c b/ntpd/ntp_io.c index 548b93ed3..de7789bf8 100644 --- a/ntpd/ntp_io.c +++ b/ntpd/ntp_io.c @@ -1140,7 +1140,8 @@ add_interface( IPV6_MULTICAST_IF, (void *)&ep->ifindex, sizeof(ep->ifindex)); - if (rc) + /* do not complain if bound addr scope is ifindex */ + if (rc && ep->ifindex != SCOPE(&ep->sin)) msyslog(LOG_ERR, "setsockopt IPV6_MULTICAST_IF %u for %s fails: %m", ep->ifindex, stoa(&ep->sin)); diff --git a/ntpd/refclock_conf.c b/ntpd/refclock_conf.c index 80e50d188..afc8d04db 100644 --- a/ntpd/refclock_conf.c +++ b/ntpd/refclock_conf.c @@ -7,6 +7,12 @@ #include #include +#ifdef HAVE_TERMIOS_H +# include +#endif +#ifdef HAVE_SYS_IOCTL_H +# include /* TIOCMSET here in recent Linux */ +#endif #include "ntpd.h" #include "ntp_refclock.h" diff --git a/ntpd/refclock_palisade.c b/ntpd/refclock_palisade.c index 078a8a549..2afd70e74 100644 --- a/ntpd/refclock_palisade.c +++ b/ntpd/refclock_palisade.c @@ -74,6 +74,9 @@ #if defined(REFCLOCK) && defined(CLOCK_PALISADE) #include +#ifdef HAVE_SYS_IOCTL_H +# include /* TIOCMSET here in recent Linux */ +#endif # ifdef TIOCMSET diff --git a/ntpq/ntpq-subs.c b/ntpq/ntpq-subs.c index a1b862b35..34029094d 100644 --- a/ntpq/ntpq-subs.c +++ b/ntpq/ntpq-subs.c @@ -268,7 +268,6 @@ extern int rawmode; 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 { @@ -1520,23 +1519,6 @@ struct varlist peervarlist[] = { { 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 @@ -1554,9 +1536,10 @@ doprintpeers( { 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; @@ -1576,7 +1559,6 @@ doprintpeers( 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]; @@ -1584,27 +1566,21 @@ doprintpeers( 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 && @@ -1614,98 +1590,61 @@ doprintpeers( 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; } } @@ -1755,7 +1694,7 @@ doprintpeers( 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); @@ -1772,7 +1711,7 @@ doprintpeers( (int)poll_sec), reach, lfptoms(&estdelay, 3), lfptoms(&estoffset, 3), - (havevar[HAVE_JITTER]) + (have_jitter) ? lfptoms(&estjitter, 3) : lfptoms(&estdisp, 3)); return (1); @@ -1781,22 +1720,6 @@ doprintpeers( 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 diff --git a/ntpq/ntpq.c b/ntpq/ntpq.c index 0f7ffd029..19d540454 100644 --- a/ntpq/ntpq.c +++ b/ntpq/ntpq.c @@ -104,127 +104,41 @@ volatile int jump = 0; * 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 @@ -298,6 +212,8 @@ static void output (FILE *, const char *, const char *); 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 *); @@ -2893,34 +2809,17 @@ nextvar( } -/* - * 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; +} /* @@ -3155,34 +3054,21 @@ cookedprint( 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, @@ -3190,144 +3076,92 @@ cookedprint( 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 != '*') { diff --git a/ntpq/ntpq.h b/ntpq/ntpq.h index 5aa001106..6398ec6ce 100644 --- a/ntpq/ntpq.h +++ b/ntpq/ntpq.h @@ -105,14 +105,12 @@ struct association { #define MAXASSOC 1024 /* - * Structure for translation tables between text format - * variable indices and text format. + * var_format is used to override cooked formatting for selected vars. */ -struct ctl_var { - u_short code; - u_short fmt; - const char *text; -}; +typedef struct var_format_tag { + const char * varname; + u_short fmt; +} var_format; extern int interactive; /* are we prompting? */ extern int old_rv; /* use old rv behavior? --old-rv */ @@ -136,5 +134,4 @@ extern int nextvar (int *, const char **, char **, char **); extern int decodetime (char *, l_fp *); extern void printvars (int, const char *, int, int, int, FILE *); extern int decodeint (char *, long *); -extern int findvar (char *, struct ctl_var *, int code); extern void makeascii (int, const char *, FILE *);