{ 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;
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];
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;
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)
u_int32 noise;
u_int which;
u_int remaining;
- char * pch;
+ const char * pch;
remaining = COUNTOF(sent);
memset(sent, 0, sizeof(sent));
struct ctl_var * in_parms;
struct ctl_var * v;
char * val;
- char * pch;
+ const char * pch;
char * pnonce;
int nonce_valid;
int i;
u_int32 noise;
u_int which;
u_int remaining;
- char * pch;
+ const char *pch;
remaining = COUNTOF(sent);
memset(sent, 0, sizeof(sent));
* 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)
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 *);
/*
"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]" },
{ "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" },
union {
char * str;
sockaddr_u sau; /* NTP_ADD */
+ l_fp lfp; /* NTP_LFP */
} v; /* retrieved value */
} vdc;
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
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;
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];
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 =
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;
size_t taglen;
int match;
u_long ul;
+ int vtype;
memset(vl, 0, sizeof(vl));
for (pvdc = table; pvdc->tag != NULL; pvdc++) {
}
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 */
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) {
}
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);
{ 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);
}
{ "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(
if (0 == associd)
return;
- collect_display_vdc(associd, pstats_vdc, fp);
+ collect_display_vdc(associd, pstats_vdc, TRUE, fp);
}