]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Add ntpq sysinfo command, similar to ntpdc's sysinfo.
authorDave Hart <hart@ntp.org>
Sat, 25 Dec 2010 06:12:51 +0000 (06:12 +0000)
committerDave Hart <hart@ntp.org>
Sat, 25 Dec 2010 06:12:51 +0000 (06:12 +0000)
bk: 4d158b63r-5ZO0VEHtsNWegYPQDGZw

14 files changed:
ChangeLog
include/ntp_control.h
include/ntp_stdlib.h
libntp/modetoa.c
libntp/numtoa.c
libntp/refnumtoa.c
libntp/socktoa.c
ntpd/ntp_control.c
ntpd/ntp_request.c
ntpdc/ntpdc_ops.c
ntpq/ntpq-subs.c
ntpq/ntpq.h
sntp/networking.c
sntp/networking.h

index eecdb4493a39fe892910d13d83d16576ab9c8d12..4a9633d753d5bf9a732f945719c77ed0f8f8d9db 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+* Add ntpq sysinfo command, similar to ntpdc's sysinfo.
 (4.2.7p103) 2010/12/24 Released by Harlan Stenn <stenn@ntp.org>
 * Add ntpq pstats command similar to ntpdc's.
 * Remove ntpq pstatus command, rv/readvar does the same and more.
index dd02d9bd522becfb20aa95ac3869a09f39ac4769..818e4680de11388373e40f975bf07c3b4d73e910 100644 (file)
@@ -192,7 +192,11 @@ struct ntp_control {
 #define        CS_SS_LIMITED           41
 #define        CS_SS_KODSENT           42
 #define        CS_SS_PROCESSED         43
-#define        CS_MAX_NOAUTOKEY        CS_SS_PROCESSED
+#define        CS_PEERADR              44
+#define        CS_PEERMODE             45
+#define        CS_BCASTDELAY           46
+#define        CS_AUTHDELAY            47
+#define        CS_MAX_NOAUTOKEY        CS_AUTHDELAY
 #ifdef AUTOKEY
 #define        CS_FLAGS                (1 + CS_MAX_NOAUTOKEY)
 #define        CS_HOST                 (2 + CS_MAX_NOAUTOKEY)
index 56ae2ddeff97c3cb810c58440c5c6f73a206df37..11b869179ae9c6c4b780f669bdf322ab5a9c9b02 100644 (file)
@@ -117,13 +117,14 @@ extern  const char * clockstatstr (int);
 extern sockaddr_u * netof      (sockaddr_u *);
 extern char *  numtoa          (u_int32);
 extern char *  numtohost       (u_int32);
-extern char *  socktoa         (const sockaddr_u *);
-extern char *  sockporttoa     (const sockaddr_u *);
+extern const char * socktoa    (const sockaddr_u *);
+extern const char * sockporttoa(const sockaddr_u *);
 extern u_short sock_hash       (const sockaddr_u *);
 extern char *  socktohost      (const sockaddr_u *);
 extern int     octtoint        (const char *, u_long *);
 extern u_long  ranp2           (int);
-extern char *  refnumtoa       (sockaddr_u *);
+extern const char *refnumtoa   (sockaddr_u *);
+extern const char *refid_str   (u_int32, int);
 extern int     tsftomsu        (u_long, int);
 extern char *  uinttoa         (u_long);
 
index 48076706684783f8acb966e808ae16ddaef1e661..b476bc9e90f25e494a1fc8cd7b12caaf8e43b1c2 100644 (file)
@@ -13,7 +13,7 @@ modetoa(
        )
 {
        char *bp;
-       static const char *modestrings[] = {
+       static const char * const modestrings[] = {
                "unspec",
                "sym_active",
                "sym_passive",
index 36a7c5819a4cfa6db2e226d8f1f676831e46078b..0fbbab794e3dc9442f751e6df20e3d39d5ab516c 100644 (file)
@@ -31,3 +31,29 @@ numtoa(
                 (u_long)netnum & 0xff);
        return buf;
 }
+
+
+/* Convert a refid & stratum to a string */
+const char *
+refid_str(
+       u_int32 refid,
+       int     stratum
+       )
+{
+       char *  text;
+       size_t  tlen;
+
+       if (stratum > 1)
+               return numtoa(refid);
+
+       LIB_GETBUF(text);
+       text[0] = '.';
+       strncpy(&text[1], (void *)&refid, sizeof(refid));
+       text[1 + sizeof(refid)] = '\0';
+       tlen = strlen(text);
+       text[tlen] = '.';
+       text[tlen + 1] = '\0';
+
+       return text;
+}
+
index 32bdc69793514c61d3d4ab5b86b2a96ea4373a1c..0654717bb86cbb09a2ad2907e4501a28bc1b384f 100644 (file)
@@ -8,14 +8,14 @@
 #include "lib_strbuf.h"
 #include "ntp_stdlib.h"
 
-char *
+const char *
 refnumtoa(
        sockaddr_u *num
        )
 {
-       register u_int32 netnum;
-       register char *buf;
-       register const char *rclock;
+       u_int32 netnum;
+       char *buf;
+       const char *rclock;
 
        LIB_GETBUF(buf);
 
index 0b374096b7a29e946ec630d40de37af3d9746193..fcac7bcfaaca4bd0e662f1f69ea94282750b3bef 100644 (file)
@@ -30,7 +30,7 @@
 /*
  * socktoa - return a numeric host name from a sockaddr_storage structure
  */
-char *
+const char *
 socktoa(
        const sockaddr_u *sock
        )
@@ -75,7 +75,7 @@ socktoa(
 }
 
 
-char *
+const char *
 sockporttoa(
        const sockaddr_u *sock
        )
index 9b64ae11d06b5dda246bad8d84aa82f7ec5d2f77..53b03adbb3c94b56801ac2c1124d0408bc585c4d 100644 (file)
@@ -160,17 +160,21 @@ static struct ctl_var sys_var[] = {
        { CS_SS_LIMITED,        RO, "ss_limited" },     /* 41 */
        { CS_SS_KODSENT,        RO, "ss_kodsent" },     /* 42 */
        { CS_SS_PROCESSED,      RO, "ss_processed" },   /* 43 */
+       { CS_PEERADR,           RO, "peeradr" },        /* 44 */
+       { CS_PEERMODE,          RO, "peermode" },       /* 45 */
+       { CS_BCASTDELAY,        RO, "bcastdelay" },     /* 46 */
+       { CS_AUTHDELAY,         RO, "authdelay" },      /* 47 */
 #ifdef AUTOKEY
-       { CS_FLAGS,     RO, "flags" },          /* 44 */
-       { CS_HOST,      RO, "host" },           /* 45 */
-       { CS_PUBLIC,    RO, "update" },         /* 46 */
-       { CS_CERTIF,    RO, "cert" },           /* 47 */
-       { CS_SIGNATURE, RO, "signature" },      /* 48 */
-       { CS_REVTIME,   RO, "until" },          /* 49 */
-       { CS_GROUP,     RO, "group" },          /* 50 */
-       { CS_DIGEST,    RO, "digest" },         /* 51 */
+       { CS_FLAGS,     RO, "flags" },          /* 1 + CS_MAX_NOAUTOKEY */
+       { CS_HOST,      RO, "host" },           /* 2 + CS_MAX_NOAUTOKEY */
+       { CS_PUBLIC,    RO, "update" },         /* 3 + CS_MAX_NOAUTOKEY */
+       { CS_CERTIF,    RO, "cert" },           /* 4 + CS_MAX_NOAUTOKEY */
+       { CS_SIGNATURE, RO, "signature" },      /* 5 + CS_MAX_NOAUTOKEY */
+       { CS_REVTIME,   RO, "until" },          /* 6 + CS_MAX_NOAUTOKEY */
+       { CS_GROUP,     RO, "group" },          /* 7 + CS_MAX_NOAUTOKEY */
+       { CS_DIGEST,    RO, "digest" },         /* 8 + CS_MAX_NOAUTOKEY */
 #endif /* AUTOKEY */
-       { 0,            EOV, "" }               /* 44/52 */
+       { 0,            EOV, "" }               /* 48/56 */
 };
 
 static struct ctl_var *ext_sys_var = NULL;
@@ -1416,10 +1420,12 @@ ctl_putsys(
        char buf[CTL_MAX_DATA_LEN];
        u_int u;
        double kb;
+       double dtemp;
        char *s, *t, *be;
        const char *ss;
        int i;
        struct ctl_var *k;
+       sockaddr_u sau;
 #ifdef AUTOKEY
        struct cert_info *cp;
        char cbuf[256];
@@ -1473,6 +1479,21 @@ ctl_putsys(
                                    sys_peer->associd);
                break;
 
+       case CS_PEERADR:
+               if (sys_peer != NULL && sys_peer->dstadr != NULL)
+                       ss = sptoa(&sys_peer->srcadr);
+               else
+                       ss = "0.0.0.0:0";
+               ctl_putunqstr(sys_var[CS_PEERADR].text, ss, strlen(ss));
+               break;
+
+       case CS_PEERMODE:
+               u = (sys_peer != NULL)
+                       ? sys_peer->hmode
+                       : MODE_UNSPEC;
+               ctl_putuint(sys_var[CS_PEERMODE].text, u);
+               break;
+
        case CS_OFFSET:
                ctl_putdbl(sys_var[CS_OFFSET].text, last_offset * 1e3);
                break;
@@ -1685,6 +1706,15 @@ ctl_putsys(
        case CS_SS_PROCESSED:
                ctl_putuint(sys_var[varid].text, sys_processed);
                break;
+
+       case CS_BCASTDELAY:
+               ctl_putdbl(sys_var[varid].text, sys_bdelay * 1e3);
+               break;
+
+       case CS_AUTHDELAY:
+               LFPTOD(&sys_authdelay, dtemp);
+               ctl_putdbl(sys_var[varid].text, dtemp * 1e3);
+               break;
 #ifdef AUTOKEY
        case CS_FLAGS:
                if (crypto_flags)
@@ -2846,7 +2876,7 @@ send_mru_entry(
        u_int32 noise;
        u_int   which;
        u_int   remaining;
-       char *  pch;
+       const char * pch;
 
        remaining = COUNTOF(sent);
        memset(sent, 0, sizeof(sent));
@@ -3068,7 +3098,7 @@ static void read_mru_list(
        struct ctl_var *        in_parms;
        struct ctl_var *        v;
        char *                  val;
-       char *                  pch;
+       const char *            pch;
        char *                  pnonce;
        int                     nonce_valid;
        int                     i;
@@ -3281,7 +3311,7 @@ send_ifstats_entry(
        u_int32 noise;
        u_int   which;
        u_int   remaining;
-       char *  pch;
+       const char *pch;
 
        remaining = COUNTOF(sent);
        memset(sent, 0, sizeof(sent));
@@ -3823,8 +3853,8 @@ report_event(
                 * Discard a peer report if the number of reports of
                 * the same type exceeds the maximum for that peer.
                 */
-               char    *src;
-               u_char  errlast;
+               const char *    src;
+               u_char          errlast;
 
                errlast = (u_char)err & ~PEER_EVENT; 
                if (peer->last_event == errlast)
index 1ef2663657e665737878dc00b272178478045750..401a0b311a63c7f9c9690d3cf4ff05a650027596 100644 (file)
@@ -1087,7 +1087,7 @@ sys_info(
        is->rootdelay = htonl(DTOFP(sys_rootdelay));
        is->rootdispersion = htonl(DTOUFP(sys_rootdisp));
        is->frequency = htonl(DTOFP(sys_jitter));
-       is->stability = htonl(DTOUFP(clock_stability));
+       is->stability = htonl(DTOUFP(clock_stability * 1e6));
        is->refid = sys_refid;
        HTONL_FP(&sys_reftime, &is->reftime);
 
index c28928e86424cbc4228a855ee2bd395658fee4e5..3b7f0447c56b29455b49181eed475898e0e151c7 100644 (file)
@@ -532,7 +532,7 @@ again:
 }
 
 /* Convert a refid & stratum (in host order) to a string */
-static char*
+static char *
 refid_string(
        u_int32 refid,
        int stratum
@@ -541,7 +541,7 @@ refid_string(
        if (stratum <= 1) {
                static char junk[5];
                junk[4] = 0;
-               memmove(junk, (char *)&refid, 4);
+               memcpy(junk, &refid, 4);
                return junk;
        }
 
@@ -595,7 +595,7 @@ print_pflag(
                fprintf(fp, "%s candidate", dlim);
                dlim = comma;
        }
-       if (flags & INFO_FLAG_PREFER) {
+       if (flags & INFO_FLAG_SHORTLIST) {
                fprintf(fp, "%s shortlist", dlim);
                dlim = comma;
        }
@@ -1704,8 +1704,8 @@ reslist(
        int itemsize;
        int res;
        int skip;
-       char *addr;
-       char *mask;
+       const char *addr;
+       const char *mask;
        struct resflags *rf;
        u_int32 count;
        u_short flags;
index 5049f7376e768e67d55b0c0b5f9f3effa420af37..4c1f998b26aed201ad58943f78b846f3db9bf905 100644 (file)
@@ -68,6 +68,7 @@ static        void    config_from_file(struct parse *, FILE *);
 static void    mrulist         (struct parse *, FILE *);
 static void    ifstats         (struct parse *, FILE *);
 static void    sysstats        (struct parse *, FILE *);
+static void    sysinfo         (struct parse *, FILE *);
 static void    monstats        (struct parse *, FILE *);
 
 /*
@@ -145,7 +146,7 @@ struct xcmd opcmds[] = {
          "read clock variables" },
        { "pstats",    pstats,    { NTP_UINT, NO, NO, NO },
          { "assocID", "", "", "" },
-         "print status information returned for a peer" },
+         "show statistics for a peer" },
        { "peers",  peers,      { OPT|IP_VERSION, NO, NO, NO },
          { "-4|-6", "", "", "" },
          "obtain and print a list of the server's peers [IP version]" },
@@ -170,6 +171,9 @@ struct xcmd opcmds[] = {
        { "ifstats", ifstats, { NO, NO, NO, NO },
          { "", "", "", "" },
          "show statistics for each local address ntpd is using" },
+       { "sysinfo", sysinfo, { NO, NO, NO, NO },
+         { "", "", "", "" },
+         "display system summary" },
        { "sysstats", sysstats, { NO, NO, NO, NO },
          { "", "", "", "" },
          "display system uptime and packet counts" },
@@ -294,6 +298,7 @@ typedef struct var_display_collection_tag {
        union {
                char *          str;
                sockaddr_u      sau;    /* NTP_ADD */
+               l_fp            lfp;    /* NTP_LFP */
        } v;                            /* retrieved value */
 } vdc;
 
@@ -311,7 +316,8 @@ static int  qcmp_mru_count(const void *, const void *);
 static int     qcmp_mru_r_count(const void *, const void *);
 static void    validate_ifnum(u_int, int, ifstats_row *);
 static void    another_ifstats_field(int *, ifstats_row *, FILE *);
-static void    collect_display_vdc(associd_t as, vdc *table, FILE *fp);
+static void    collect_display_vdc(associd_t as, vdc *table,
+                                   int decodestatus, FILE *fp);
 
 /*
  * static globals
@@ -1548,7 +1554,8 @@ doprintpeers(
        sockaddr_u dum_store;
        long hmode = 0;
        u_long srcport = 0;
-       char *dstadr_refid = "0.0.0.0";
+       u_int32 u32;
+       const char *dstadr_refid = "0.0.0.0";
        size_t drlen;
        u_long stratum = 0;
        long ppoll = 0;
@@ -1564,7 +1571,6 @@ doprintpeers(
        u_char havevar[MAX_HAVE + 1];
        u_long poll_sec;
        char type = '?';
-       char refid_string[10];
        char whenbuf[8], pollbuf[8];
        char clock_name[LENHOSTNAME];
 
@@ -1624,12 +1630,8 @@ doprintpeers(
                                if (*value == '\0') {
                                        dstadr_refid = "";
                                } else if (strlen(value) <= 4) {
-                                       refid_string[0] = '.';
-                                       strncpy(&refid_string[1], value, sizeof(refid_string) - 1);
-                                       i = strlen(refid_string);
-                                       refid_string[i] = '.';
-                                       refid_string[i+1] = '\0';
-                                       dstadr_refid = refid_string;
+                                       strncpy((void *)&u32, value, sizeof(u32));
+                                       dstadr_refid = refid_str(u32, 1);
                                } else if (decodenetnum(value, &dstadr)) {
                                        if (ISREFCLOCKADR(&dstadr))
                                                dstadr_refid =
@@ -3204,10 +3206,13 @@ static void
 collect_display_vdc(
        associd_t       as,
        vdc *           table,
+       int             decodestatus,
        FILE *          fp
        )
 {
        static const char * const suf[2] = { "adr", "port" };
+       static const char * const leapbits[4] = { "00", "01",
+                                                 "10", "11" };
        struct varlist vl[MAXLIST];
        char tagbuf[32];
        vdc *pvdc;
@@ -3221,6 +3226,7 @@ collect_display_vdc(
        size_t taglen;
        int match;
        u_long ul;
+       int vtype;
 
        memset(vl, 0, sizeof(vl));
        for (pvdc = table; pvdc->tag != NULL; pvdc++) {
@@ -3267,9 +3273,23 @@ collect_display_vdc(
                }
                if (NULL == pvdc->tag)
                        continue;
-               if (NTP_STR == pvdc->type) {
+               switch (pvdc->type) {
+
+               case NTP_STR:   /* fallthru */
+               case NTP_MODE:  /* fallthru */
+               case NTP_2BIT:
                        pvdc->v.str = estrdup(val);
-               } else if (NTP_ADD == pvdc->type) {
+                       break;
+
+               case NTP_LFP:
+                       decodets(val, &pvdc->v.lfp);
+                       break;
+
+               case NTP_ADP:
+                       decodenetnum(val, &pvdc->v.sau);
+                       break;
+
+               case NTP_ADD:
                        if (0 == n) {   /* adr */
                                decodenetnum(val, &pvdc->v.sau);
                        } else {        /* port */
@@ -3277,13 +3297,18 @@ collect_display_vdc(
                                        SET_PORT(&pvdc->v.sau, 
                                                 (u_short)ul);
                        }
+                       break;
                }
        }
 
        /* and display */
-       if (as != 0)
+       if (decodestatus) {
+               vtype = (0 == as)
+                           ? TYPE_SYS
+                           : TYPE_PEER;
                fprintf(fp, "associd=%u status=%04x %s,\n", as, rstatus,
-                       statustoa(TYPE_PEER, rstatus));
+                       statustoa(vtype, rstatus));
+       }
 
        for (pvdc = table; pvdc->tag != NULL; pvdc++) {
                switch (pvdc->type) {
@@ -3297,11 +3322,29 @@ collect_display_vdc(
                        }
                        break;
 
-               case NTP_ADD:
+               case NTP_ADD:   /* fallthru */
+               case NTP_ADP:
                        fprintf(fp, "%s  %s\n", pvdc->display,
                                nntohostp(&pvdc->v.sau));
                        break;
 
+               case NTP_LFP:
+                       fprintf(fp, "%s  %s\n", pvdc->display,
+                               prettydate(&pvdc->v.lfp));
+                       break;
+
+               case NTP_MODE:
+                       atouint(pvdc->v.str, &ul);
+                       fprintf(fp, "%s  %s\n", pvdc->display,
+                               modetoa((int)ul));
+                       break;
+
+               case NTP_2BIT:
+                       atouint(pvdc->v.str, &ul);
+                       fprintf(fp, "%s  %s\n", pvdc->display,
+                               leapbits[ul & 0x3]);
+                       break;
+
                default:
                        fprintf(stderr, "unexpected vdc type %d for %s\n",
                                pvdc->type, pvdc->tag);
@@ -3336,7 +3379,38 @@ sysstats(
        { NULL,                 NULL,                     0       }
     };
 
-       collect_display_vdc(0, sysstats_vdc, fp);
+       collect_display_vdc(0, sysstats_vdc, FALSE, fp);
+}
+
+       
+/*
+ * sysinfo - modeled on ntpdc's sysinfo
+ */
+static void
+sysinfo(
+       struct parse *pcmd,
+       FILE *fp
+       )
+{
+    static vdc sysinfo_vdc[] = {
+       { "peeradr",            "system peer:      ", NTP_ADP },
+       { "peermode",           "system peer mode: ", NTP_MODE },
+       { "leap",               "leap indicator:   ", NTP_2BIT },
+       { "stratum",            "stratum:          ", NTP_STR },
+       { "precision",          "log2 precision:   ", NTP_STR },
+       { "rootdelay",          "root delay:       ", NTP_STR },
+       { "rootdisp",           "root dispersion:  ", NTP_STR },
+       { "refid",              "reference ID:     ", NTP_STR },
+       { "reftime",            "reference time:   ", NTP_LFP },
+       { "sys_jitter",         "system jitter:    ", NTP_STR },
+       { "clk_jitter",         "clock jitter:     ", NTP_STR },
+       { "clk_wander",         "clock wander:     ", NTP_STR },
+       { "bcastdelay",         "broadcast delay:  ", NTP_STR },
+       { "authdelay",          "symm. auth. delay:", NTP_STR },
+       { NULL,                 NULL,                 0       }
+    };
+
+       collect_display_vdc(0, sysinfo_vdc, TRUE, fp);
 }
 
        
@@ -3358,15 +3432,15 @@ monstats(
        { "mru_maxage",         "reclaim older than: ", NTP_STR },
        { "mru_mem",            "kilobytes:          ", NTP_STR },
        { "mru_maxmem",         "maximum kilobytes:  ", NTP_STR },
-       { NULL,                 NULL,                    0       }
+       { NULL,                 NULL,                   0       }
     };
 
-       collect_display_vdc(0, monstats_vdc, fp);
+       collect_display_vdc(0, monstats_vdc, FALSE, fp);
 }
 
 
 /*
- * pstats - print peer statistics returned by the server
+ * pstats - show statistics for a peer
  */
 static void
 pstats(
@@ -3396,6 +3470,6 @@ pstats(
        if (0 == associd)
                return;
 
-       collect_display_vdc(associd, pstats_vdc, fp);
+       collect_display_vdc(associd, pstats_vdc, TRUE, fp);
 }
 
index 93b0e10abbf9d6710b63cadbb0db9aa50831c813..bf653b08e962a121edb8fff8e00a0e5664b1e275 100644 (file)
 #define        NTP_INT         0x3     /* signed integer */
 #define        NTP_ADD         0x4     /* IP network address */
 #define IP_VERSION     0x5     /* IP version */
+#define        NTP_ADP         0x6     /* IP address and port */
+#define NTP_LFP                0x7     /* NTP timestamp */
+#define NTP_MODE       0x8     /* peer mode */
+#define NTP_2BIT       0x9     /* leap bits */
 
 /*
  * Arguments are returned in a union
index 31bc5f8fdf91d1b2acdbe350b89d72e107954b02..33a5bad010baaa6b09dd9d1b8041fd0f419e55b4 100644 (file)
@@ -289,7 +289,7 @@ process_pkt (
        int pkt_len,
        int mode,
        struct pkt *spkt,
-       char * func_name
+       const char * func_name
        )
 {
        unsigned int key_id = 0;
index 607f8bf1cb60f2745b169ba9bb258f108dc03c09..0966f5678e0b1665c80d2e030f39ef1eb13a65cd 100644 (file)
@@ -50,7 +50,8 @@ int recv_bcst_data (SOCKET rsock, char *rdata, int rdata_len, sockaddr_u *sas, s
 
 int recv_bcst_pkt (SOCKET rsock, struct pkt *rpkt, unsigned int rsize, sockaddr_u *sas);
 
-int process_pkt (struct pkt *rpkt, sockaddr_u *sas,    int pkt_len, int mode, struct pkt *spkt, char * func_name);
+int process_pkt (struct pkt *rpkt, sockaddr_u *sas, int pkt_len,
+                int mode, struct pkt *spkt, const char *func_name);
 
 /* Shortened peer structure. Not absolutely necessary yet */
 struct speer {