]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 1764] Palisade driver doesn't build on Linux.
authorDave Hart <hart@ntp.org>
Thu, 30 Dec 2010 10:52:24 +0000 (10:52 +0000)
committerDave Hart <hart@ntp.org>
Thu, 30 Dec 2010 10:52:24 +0000 (10:52 +0000)
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

ChangeLog
include/ntp_control.h
libntp/refnumtoa.c
ntpd/ntp_control.c
ntpd/ntp_io.c
ntpd/refclock_conf.c
ntpd/refclock_palisade.c
ntpq/ntpq-subs.c
ntpq/ntpq.c
ntpq/ntpq.h

index 95ef503f62e12f3cae5176a0e03f6ef0af52b3d4..0696748e90b62ea815382c37c914a45241cd2a34 100644 (file)
--- 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 <stenn@ntp.org>
 (4.2.7p104) 2010/12/28 Released by Harlan Stenn <stenn@ntp.org>
index 1fe446e1b94ccc961fec76ac552756848a3b88e3..50f20c863331f88c51064effaf96cf58552c38eb 100644 (file)
@@ -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.
index 0654717bb86cbb09a2ad2907e4501a28bc1b384f..e6ca55aef868155723977a7de5aede61f289bb4f 100644 (file)
@@ -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;
 }
index f8b93b40cab92f83b255de7aad6bdc84105ecd6d..2b3e1ae8601dbbd46433f50e38488b62046464b1 100644 (file)
@@ -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.
index 548b93ed3ecfb61c9f3389b8cb4404a8955ea61b..de7789bf8435efb49541dd5fbb59fea69c48cd30 100644 (file)
@@ -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));
index 80e50d1880b00c00be08093f0c7a2debe3580655..afc8d04db67ca275dfca11b785d0f8d9221c97fe 100644 (file)
@@ -7,6 +7,12 @@
 
 #include <stdio.h>
 #include <sys/types.h>
+#ifdef HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>                /* TIOCMSET here in recent Linux */
+#endif
 
 #include "ntpd.h"
 #include "ntp_refclock.h"
index 078a8a54963e48d7e3854c3fcace656ac5f2ccaa..2afd70e7452a80ac4ee160f85f2ecd80e464d587 100644 (file)
@@ -74,6 +74,9 @@
 #if defined(REFCLOCK) && defined(CLOCK_PALISADE)
 
 #include <termios.h>
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>                /* TIOCMSET here in recent Linux */
+#endif
 
 # ifdef TIOCMSET
 
index a1b862b3549c5ba9a6810b1d11a5c3291d14fc26..34029094de4950160c51941f7f859df570b2097b 100644 (file)
@@ -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
index 0f7ffd0292cf1ed3aec652189895e89ee0015b3d..19d540454232fd03b3f2c0a387f06b50f42b8cd1 100644 (file)
@@ -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 != '*') {
index 5aa001106f1d4c2fcf91c922c53ba12c99bc3c2e..6398ec6ceeabc9368d719859f40bff04b86f8e02 100644 (file)
@@ -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 *);