55
56
static void pstatus P((struct parse *, FILE *));
56
57
static long when P((l_fp *, l_fp *, l_fp *));
57
58
static char * prettyinterval P((char *, long));
58
static int doprintpeers P((struct varlist *, int, int, int, char *, FILE *));
59
static int dogetpeers P((struct varlist *, int, FILE *));
60
static void dopeers P((int, FILE *));
59
static int doprintpeers P((struct varlist *, int, int, int, char *, FILE *, int));
60
static int dogetpeers P((struct varlist *, int, FILE *, int));
61
static void dopeers P((int, FILE *, int));
61
62
static void peers P((struct parse *, FILE *));
62
63
static void lpeers P((struct parse *, FILE *));
63
static void doopeers P((int, FILE *));
64
static void doopeers P((int, FILE *, int));
64
65
static void opeers P((struct parse *, FILE *));
65
66
static void lopeers P((struct parse *, FILE *));
138
139
{ "pstatus", pstatus, { UINT, NO, NO, NO },
139
140
{ "assocID", "", "", "" },
140
141
"print status information returned for a peer" },
141
{ "peers", peers, { NO, NO, NO, NO },
143
"obtain and print a list of the server's peers" },
144
{ "lpeers", lpeers, { NO, NO, NO, NO },
146
"obtain and print a list of all peers and clients" },
147
{ "opeers", opeers, { NO, NO, NO, NO },
149
"print peer list the old way, with dstadr shown rather than refid" },
150
{ "lopeers", lopeers, { NO, NO, NO, NO },
152
"obtain and print a list of all peers and clients showing dstadr" },
142
{ "peers", peers, { OPT|IP_VERSION, NO, NO, NO },
143
{ "-4|-6", "", "", "" },
144
"obtain and print a list of the server's peers [IP version]" },
145
{ "lpeers", lpeers, { OPT|IP_VERSION, NO, NO, NO },
146
{ "-4|-6", "", "", "" },
147
"obtain and print a list of all peers and clients [IP version]" },
148
{ "opeers", opeers, { OPT|IP_VERSION, NO, NO, NO },
149
{ "-4|-6", "", "", "" },
150
"print peer list the old way, with dstadr shown rather than refid [IP version]" },
151
{ "lopeers", lopeers, { OPT|IP_VERSION, NO, NO, NO },
152
{ "-4|-6", "", "", "" },
153
"obtain and print a list of all peers and clients showing dstadr [IP version]" },
153
154
{ 0, 0, { NO, NO, NO, NO },
154
{ "", "", "", "" }, "" }
155
{ "-4|-6", "", "", "" }, "" }
602
(void) fprintf(fp, "server=%s ", currenthost);
598
604
(void) fprintf(fp, "done! (no data returned)\n");
606
(void) fprintf(fp,"assID=%d ",associd);
600
607
printvars(dsize, datap, (int)rstatus,
601
608
(associd != 0) ? TYPE_PEER : TYPE_SYS, fp);
677
(void) fprintf(fp, "server=%s ", currenthost);
669
679
(void) fprintf(fp, "done! (no data returned)\n");
681
(void) fprintf(fp,"assID=%d ",associd);
671
682
printvars(dsize, datap, (int)rstatus,
672
683
(associd != 0) ? TYPE_PEER : TYPE_SYS, fp);
866
878
res = doquery(CTL_OP_READSTAT, 0, 0, 0, (char *)0, &rstatus,
867
&dsize, (char **)&datap);
879
&dsize, (void *)&datap);
872
884
if (dsize == 0) {
886
(void) fprintf(fp, "server=%s ", currenthost);
873
887
(void) fprintf(fp, "No association ID's returned\n");
877
891
if (dsize & 0x3) {
893
(void) fprintf(stderr, "server=%s ", currenthost);
878
894
(void) fprintf(stderr,
879
895
"***Server returned %d octets, should be multiple of 4\n",
927
943
* Output a header
929
945
(void) fprintf(fp,
930
"ind assID status conf reach auth condition last_event cnt\n");
946
"\nind assID status conf reach auth condition last_event cnt\n");
931
947
(void) fprintf(fp,
932
948
"===========================================================\n");
933
949
for (i = 0; i < numassoc; i++) {
934
statval = CTL_PEER_STATVAL(assoc_cache[i].status);
950
statval = (u_char) CTL_PEER_STATVAL(assoc_cache[i].status);
935
951
if (!showall && !(statval & (CTL_PST_CONFIG|CTL_PST_REACH)))
937
953
event = CTL_PEER_EVENT(assoc_cache[i].status);
1257
struct sockaddr_storage *sock
1262
struct sockaddr_in6 *sin6;
1264
switch(sock->ss_family) {
1266
dummy = ((struct sockaddr_in *)sock)->sin_addr.s_addr;
1267
dummy = ntohl(dummy);
1268
ch = (char)(((dummy&0xf0000000)==0xe0000000) ? 'm' :
1269
((dummy&0x000000ff)==0x000000ff) ? 'b' :
1270
((dummy&0xffffffff)==0x7f000001) ? 'l' :
1271
((dummy&0xffffffe0)==0x00000000) ? '-' :
1275
sin6 = (struct sockaddr_in6 *)sock;
1276
if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
1236
1289
* A list of variables required by the peers command
1323
1377
char type = '?';
1324
1378
char refid_string[10];
1325
1379
char whenbuf[8], pollbuf[8];
1380
char clock_name[LENHOSTNAME];
1327
1382
memset((char *)havevar, 0, sizeof(havevar));
1328
1383
get_systime(&ts);
1385
memset((char *)&srcadr, 0, sizeof(struct sockaddr_storage));
1386
memset((char *)&dstadr, 0, sizeof(struct sockaddr_storage));
1388
/* Initialize by zeroing out estimate variables */
1389
memset((char *)&estoffset, 0, sizeof(l_fp));
1390
memset((char *)&estdelay, 0, sizeof(l_fp));
1391
memset((char *)&estjitter, 0, sizeof(l_fp));
1392
memset((char *)&estdisp, 0, sizeof(l_fp));
1330
1394
while (nextvar(&datalen, &data, &name, &value)) {
1395
struct sockaddr_storage dum_store;
1333
1397
i = findvar(name, peer_var);
1339
1403
havevar[HAVE_SRCADR] = 1;
1341
1405
case CP_DSTADR:
1342
if (decodenetnum(value, &dummy)) {
1343
dummy = ntohl(dummy);
1344
type = ((dummy&0xf0000000)==0xe0000000) ? 'm' :
1345
((dummy&0x000000ff)==0x000000ff) ? 'b' :
1346
((dummy&0xffffffff)==0x7f000001) ? 'l' :
1347
((dummy&0xffffffe0)==0x00000000) ? '-' :
1406
if (decodenetnum(value, &dum_store))
1407
type = decodeaddrtype(&dum_store);
1350
1408
if (pvl == opeervarlist) {
1351
1409
if (decodenetnum(value, &dstadr)) {
1352
1410
havevar[HAVE_DSTADR] = 1;
1353
dstadr_refid = numtoa(dstadr);
1411
dstadr_refid = stoa(&dstadr);
1360
1418
if (*value == '\0') {
1361
1419
dstadr_refid = "0.0.0.0";
1362
1420
} else if (decodenetnum(value, &dstadr)) {
1421
if (SOCKNUL(&dstadr))
1364
1422
dstadr_refid = "0.0.0.0";
1423
else if ((dstadr.ss_family == AF_INET)
1424
&& ISREFCLOCKADR(&dstadr))
1366
dstadr_refid = nntohost(dstadr);
1367
1430
} else if ((int)strlen(value) <= 4) {
1368
1431
refid_string[0] = '.';
1369
1432
(void) strcpy(&refid_string[1], value);
1449
1512
c = flash2[CTL_PEER_STATVAL(rstatus) & 0x3];
1450
1513
if (numhosts > 1)
1451
1514
(void) fprintf(fp, "%-*s ", maxhostlen, currenthost);
1453
"%c%-15.15s %-15.15s %2ld %c %4.4s %4.4s %3lo %7.7s %8.7s %7.7s\n",
1454
c, nntohost(srcadr), dstadr_refid, stratum, type,
1455
prettyinterval(whenbuf, when(&ts, &rec, &reftime)),
1456
prettyinterval(pollbuf, (int)poll_sec), reach,
1457
lfptoms(&estdelay, 3), lfptoms(&estoffset, 3),
1458
havevar[HAVE_JITTER] ? lfptoms(&estjitter, 3) :
1459
lfptoms(&estdisp, 3));
1515
if (af == 0 || srcadr.ss_family == af){
1516
strcpy(clock_name, nntohost(&srcadr));
1519
"%c%-15.15s %-15.15s %2ld %c %4.4s %4.4s %3lo %7.7s %8.7s %7.7s\n",
1520
c, clock_name, dstadr_refid, stratum, type,
1521
prettyinterval(whenbuf, when(&ts, &rec, &reftime)),
1522
prettyinterval(pollbuf, (int)poll_sec), reach,
1523
lfptoms(&estdelay, 3), lfptoms(&estoffset, 3),
1524
havevar[HAVE_JITTER] ? lfptoms(&estjitter, 3) :
1525
lfptoms(&estdisp, 3));
1463
1532
#undef HAVE_SRCADR
1510
1580
if (dsize == 0) {
1582
(void) fprintf(stderr, "server=%s ", currenthost);
1511
1583
(void) fprintf(stderr,
1512
1584
"***No information returned for association %d\n",
1518
return doprintpeers(pvl, associd, (int)rstatus, dsize, datap, fp);
1589
return doprintpeers(pvl, associd, (int)rstatus, dsize, datap, fp, af);
1531
1603
register int i;
1532
1604
char fullname[LENHOSTNAME];
1605
struct sockaddr_storage netnum;
1535
1607
if (!dogetassoc(fp))
1540
for (i = 0; i < numhosts; ++i)
1541
{ if(getnetnum(chosts[i],&netnum,fullname))
1610
for (i = 0; i < numhosts; ++i) {
1611
if (getnetnum(chosts[i], &netnum, fullname, af))
1542
1612
if ((int)strlen(fullname) > maxhostlen)
1543
maxhostlen = strlen(fullname);
1545
(void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "host");
1613
maxhostlen = strlen(fullname);
1548
" remote refid st t when poll reach delay offset jitter\n");
1616
(void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "server");
1618
" remote refid st t when poll reach delay offset jitter\n");
1549
1619
if (numhosts > 1)
1550
1620
for (i = 0; i <= maxhostlen; ++i)
1551
1621
(void) fprintf(fp, "=");
1605
1692
register int i;
1693
char fullname[LENHOSTNAME];
1694
struct sockaddr_storage netnum;
1607
1696
if (!dogetassoc(fp))
1699
for (i = 0; i < numhosts; ++i) {
1700
if (getnetnum(chosts[i], &netnum, fullname, af))
1701
if ((int)strlen(fullname) > maxhostlen)
1702
maxhostlen = strlen(fullname);
1705
(void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "server");
1610
1706
(void) fprintf(fp,
1611
1707
" remote local st t when poll reach delay offset disp\n");
1613
" (s) (s) (ms) (ms) (ms)\n");
1709
for (i = 0; i <= maxhostlen; ++i)
1710
(void) fprintf(fp, "=");
1614
1711
(void) fprintf(fp,
1615
1712
"==============================================================================\n");