From d53b1df714d17e6cc40e901ea07ccac9d4e2ab83 Mon Sep 17 00:00:00 2001 From: Dave Hart Date: Sat, 25 Dec 2010 06:12:51 +0000 Subject: [PATCH] Add ntpq sysinfo command, similar to ntpdc's sysinfo. bk: 4d158b63r-5ZO0VEHtsNWegYPQDGZw --- ChangeLog | 1 + include/ntp_control.h | 6 ++- include/ntp_stdlib.h | 7 +-- libntp/modetoa.c | 2 +- libntp/numtoa.c | 26 ++++++++++ libntp/refnumtoa.c | 8 +-- libntp/socktoa.c | 4 +- ntpd/ntp_control.c | 58 +++++++++++++++------ ntpd/ntp_request.c | 2 +- ntpdc/ntpdc_ops.c | 10 ++-- ntpq/ntpq-subs.c | 114 ++++++++++++++++++++++++++++++++++-------- ntpq/ntpq.h | 4 ++ sntp/networking.c | 2 +- sntp/networking.h | 3 +- 14 files changed, 194 insertions(+), 53 deletions(-) diff --git a/ChangeLog b/ChangeLog index eecdb4493..4a9633d75 100644 --- 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 * Add ntpq pstats command similar to ntpdc's. * Remove ntpq pstatus command, rv/readvar does the same and more. diff --git a/include/ntp_control.h b/include/ntp_control.h index dd02d9bd5..818e4680d 100644 --- a/include/ntp_control.h +++ b/include/ntp_control.h @@ -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) diff --git a/include/ntp_stdlib.h b/include/ntp_stdlib.h index 56ae2ddef..11b869179 100644 --- a/include/ntp_stdlib.h +++ b/include/ntp_stdlib.h @@ -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); diff --git a/libntp/modetoa.c b/libntp/modetoa.c index 480767066..b476bc9e9 100644 --- a/libntp/modetoa.c +++ b/libntp/modetoa.c @@ -13,7 +13,7 @@ modetoa( ) { char *bp; - static const char *modestrings[] = { + static const char * const modestrings[] = { "unspec", "sym_active", "sym_passive", diff --git a/libntp/numtoa.c b/libntp/numtoa.c index 36a7c5819..0fbbab794 100644 --- a/libntp/numtoa.c +++ b/libntp/numtoa.c @@ -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; +} + diff --git a/libntp/refnumtoa.c b/libntp/refnumtoa.c index 32bdc6979..0654717bb 100644 --- a/libntp/refnumtoa.c +++ b/libntp/refnumtoa.c @@ -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); diff --git a/libntp/socktoa.c b/libntp/socktoa.c index 0b374096b..fcac7bcfa 100644 --- a/libntp/socktoa.c +++ b/libntp/socktoa.c @@ -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 ) diff --git a/ntpd/ntp_control.c b/ntpd/ntp_control.c index 9b64ae11d..53b03adbb 100644 --- a/ntpd/ntp_control.c +++ b/ntpd/ntp_control.c @@ -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) diff --git a/ntpd/ntp_request.c b/ntpd/ntp_request.c index 1ef266365..401a0b311 100644 --- a/ntpd/ntp_request.c +++ b/ntpd/ntp_request.c @@ -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); diff --git a/ntpdc/ntpdc_ops.c b/ntpdc/ntpdc_ops.c index c28928e86..3b7f0447c 100644 --- a/ntpdc/ntpdc_ops.c +++ b/ntpdc/ntpdc_ops.c @@ -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; diff --git a/ntpq/ntpq-subs.c b/ntpq/ntpq-subs.c index 5049f7376..4c1f998b2 100644 --- a/ntpq/ntpq-subs.c +++ b/ntpq/ntpq-subs.c @@ -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); } diff --git a/ntpq/ntpq.h b/ntpq/ntpq.h index 93b0e10ab..bf653b08e 100644 --- a/ntpq/ntpq.h +++ b/ntpq/ntpq.h @@ -57,6 +57,10 @@ #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 diff --git a/sntp/networking.c b/sntp/networking.c index 31bc5f8fd..33a5bad01 100644 --- a/sntp/networking.c +++ b/sntp/networking.c @@ -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; diff --git a/sntp/networking.h b/sntp/networking.h index 607f8bf1c..0966f5678 100644 --- a/sntp/networking.h +++ b/sntp/networking.h @@ -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 { -- 2.47.3