📄 ntpq_ops.c
字号:
(void) fprintf(fp, "server=%s ", currenthost); if (dsize == 0) { (void) fprintf(fp, "No information returned for association %u\n", associd); return; } (void) fprintf(fp,"assID=%d ",associd); printvars(dsize, datap, (int)rstatus, TYPE_PEER, fp);}/* * when - print how long its been since his last packet arrived */static longwhen( l_fp *ts, l_fp *rec, l_fp *reftime ){ l_fp *lasttime; if (rec->l_ui != 0) lasttime = rec; else if (reftime->l_ui != 0) lasttime = reftime; else return 0; return (ts->l_ui - lasttime->l_ui);}/* * Pretty-print an interval into the given buffer, in a human-friendly format. */static char *prettyinterval( char *buf, long diff ){ if (diff <= 0) { buf[0] = '-'; buf[1] = 0; return buf; } if (diff <= 2048) { (void) sprintf(buf, "%ld", (long int)diff); return buf; } diff = (diff + 29) / 60; if (diff <= 300) { (void) sprintf(buf, "%ldm", (long int)diff); return buf; } diff = (diff + 29) / 60; if (diff <= 96) { (void) sprintf(buf, "%ldh", (long int)diff); return buf; } diff = (diff + 11) / 24; (void) sprintf(buf, "%ldd", (long int)diff); return buf;}static chardecodeaddrtype( struct sockaddr_storage *sock ){ char ch = '-'; u_int32 dummy; struct sockaddr_in6 *sin6; switch(sock->ss_family) { case AF_INET: dummy = ((struct sockaddr_in *)sock)->sin_addr.s_addr; dummy = ntohl(dummy); ch = (char)(((dummy&0xf0000000)==0xe0000000) ? 'm' : ((dummy&0x000000ff)==0x000000ff) ? 'b' : ((dummy&0xffffffff)==0x7f000001) ? 'l' : ((dummy&0xffffffe0)==0x00000000) ? '-' : 'u'); break; case AF_INET6: sin6 = (struct sockaddr_in6 *)sock; if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) ch = 'm'; else ch = 'u'; break; default: ch = '-'; break; } return ch;}/* * A list of variables required by the peers command */struct varlist opeervarlist[] = { { "srcadr", 0 }, /* 0 */ { "dstadr", 0 }, /* 1 */ { "stratum", 0 }, /* 2 */ { "hpoll", 0 }, /* 3 */ { "ppoll", 0 }, /* 4 */ { "reach", 0 }, /* 5 */ { "delay", 0 }, /* 6 */ { "offset", 0 }, /* 7 */ { "jitter", 0 }, /* 8 */ { "dispersion", 0 }, /* 9 */ { "rec", 0 }, /* 10 */ { "reftime", 0 }, /* 11 */ { "srcport", 0 }, /* 12 */ { 0, 0 }};struct varlist peervarlist[] = { { "srcadr", 0 }, /* 0 */ { "refid", 0 }, /* 1 */ { "stratum", 0 }, /* 2 */ { "hpoll", 0 }, /* 3 */ { "ppoll", 0 }, /* 4 */ { "reach", 0 }, /* 5 */ { "delay", 0 }, /* 6 */ { "offset", 0 }, /* 7 */ { "jitter", 0 }, /* 8 */ { "dispersion", 0 }, /* 9 */ { "rec", 0 }, /* 10 */ { "reftime", 0 }, /* 11 */ { "srcport", 0 }, /* 12 */ { 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 MAXHAVE 13/* * Decode an incoming data buffer and print a line in the peer list */static intdoprintpeers( struct varlist *pvl, int associd, int rstatus, int datalen, char *data, FILE *fp, int af ){ char *name; char *value = NULL; int i; int c; struct sockaddr_storage srcadr; struct sockaddr_storage dstadr; u_long srcport = 0; char *dstadr_refid = "0.0.0.0"; u_long stratum = 0; long ppoll = 0; long hpoll = 0; u_long reach = 0; l_fp estoffset; l_fp estdelay; l_fp estjitter; l_fp estdisp; l_fp reftime; l_fp rec; l_fp ts; u_char havevar[MAXHAVE]; u_long poll_sec; char type = '?'; char refid_string[10]; char whenbuf[8], pollbuf[8]; char clock_name[LENHOSTNAME]; memset((char *)havevar, 0, sizeof(havevar)); get_systime(&ts); memset((char *)&srcadr, 0, sizeof(struct sockaddr_storage)); memset((char *)&dstadr, 0, sizeof(struct sockaddr_storage)); /* Initialize by zeroing out estimate variables */ memset((char *)&estoffset, 0, sizeof(l_fp)); memset((char *)&estdelay, 0, sizeof(l_fp)); memset((char *)&estjitter, 0, sizeof(l_fp)); memset((char *)&estdisp, 0, sizeof(l_fp)); while (nextvar(&datalen, &data, &name, &value)) { struct sockaddr_storage dum_store; 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_DSTADR: if (decodenetnum(value, &dum_store)) type = decodeaddrtype(&dum_store); if (pvl == opeervarlist) { if (decodenetnum(value, &dstadr)) { havevar[HAVE_DSTADR] = 1; dstadr_refid = stoa(&dstadr); } } break; case CP_REFID: if (pvl == peervarlist) { havevar[HAVE_REFID] = 1; if (*value == '\0') { dstadr_refid = "0.0.0.0"; } else if (decodenetnum(value, &dstadr)) { if (SOCKNUL(&dstadr)) dstadr_refid = "0.0.0.0"; else if ((dstadr.ss_family == AF_INET) && ISREFCLOCKADR(&dstadr)) dstadr_refid = refnumtoa(&dstadr); else dstadr_refid = stoa(&dstadr); } else if ((int)strlen(value) <= 4) { refid_string[0] = '.'; (void) strcpy(&refid_string[1], value); i = strlen(refid_string); refid_string[i] = '.'; refid_string[i+1] = '\0'; dstadr_refid = refid_string; } else { havevar[HAVE_REFID] = 0; } } 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 (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; if (!decodets(value, &reftime)) L_CLR(&reftime); break; default: break; } } /* * Check to see if the srcport is NTP's port. If not this probably * isn't a valid peer association. */ if (havevar[HAVE_SRCPORT] && srcport != NTP_PORT) return (1); /* * Got everything, format the line */ poll_sec = 1<<max(min3(ppoll, hpoll, NTP_MAXPOLL), NTP_MINPOLL); if (pktversion > NTP_OLDVERSION) c = flash3[CTL_PEER_STATVAL(rstatus) & 0x7]; else c = flash2[CTL_PEER_STATVAL(rstatus) & 0x3]; if (numhosts > 1) (void) fprintf(fp, "%-*s ", maxhostlen, currenthost); if (af == 0 || srcadr.ss_family == af){ strcpy(clock_name, nntohost(&srcadr)); (void) fprintf(fp, "%c%-15.15s %-15.15s %2ld %c %4.4s %4.4s %3lo %7.7s %8.7s %7.7s\n", c, clock_name, dstadr_refid, stratum, type, prettyinterval(whenbuf, when(&ts, &rec, &reftime)), prettyinterval(pollbuf, (int)poll_sec), reach, lfptoms(&estdelay, 3), lfptoms(&estoffset, 3), havevar[HAVE_JITTER] ? lfptoms(&estjitter, 3) : lfptoms(&estdisp, 3)); return (1); } else 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 MAXHAVE/* * dogetpeers - given an association ID, read and print the spreadsheet * peer variables. */static intdogetpeers( struct varlist *pvl, int associd, FILE *fp, int af ){ char *datap; int res; int dsize; u_short rstatus;#ifdef notdef res = doquerylist(pvl, CTL_OP_READVAR, associd, 0, &rstatus, &dsize, &datap);#else /* * Damn fuzzballs */ res = doquery(CTL_OP_READVAR, associd, 0, 0, (char *)0, &rstatus, &dsize, &datap);#endif if (res != 0) return 0; if (dsize == 0) { if (numhosts > 1) (void) fprintf(stderr, "server=%s ", currenthost); (void) fprintf(stderr, "***No information returned for association %d\n", associd); return 0; } return doprintpeers(pvl, associd, (int)rstatus, dsize, datap, fp, af);}/* * peers - print a peer spreadsheet */static voiddopeers( int showall, FILE *fp, int af ){ register int i; char fullname[LENHOSTNAME]; struct sockaddr_storage netnum; if (!dogetassoc(fp)) return; for (i = 0; i < numhosts; ++i) { if (getnetnum(chosts[i], &netnum, fullname, af)) if ((int)strlen(fullname) > maxhostlen) maxhostlen = strlen(fullname); } if (numhosts > 1) (void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "server"); (void) fprintf(fp, " remote refid st t when poll reach delay offset jitter\n"); if (numhosts > 1) for (i = 0; i <= maxhostlen; ++i) (void) fprintf(fp, "="); (void) fprintf(fp, "==============================================================================\n"); for (i = 0; i < numassoc; i++) { if (!showall && !(CTL_PEER_STATVAL(assoc_cache[i].status) & (CTL_PST_CONFIG|CTL_PST_REACH))) continue; if (!dogetpeers(peervarlist, (int)assoc_cache[i].assid, fp, af)) { return; } } return;}/* * peers - print a peer spreadsheet *//*ARGSUSED*/static voidpeers( struct parse *pcmd, FILE *fp ){ int af = 0; if (pcmd->nargs == 1) { if (pcmd->argval->ival == 6) af = AF_INET6; else af = AF_INET; } dopeers(0, fp, af);}/* * lpeers - print a peer spreadsheet including all fuzzball peers *//*ARGSUSED*/static voidlpeers( struct parse *pcmd, FILE *fp ){ int af = 0; if (pcmd->nargs == 1) { if (pcmd->argval->ival == 6) af = AF_INET6; else af = AF_INET; } dopeers(1, fp, af);}/* * opeers - print a peer spreadsheet */static voiddoopeers( int showall, FILE *fp, int af ){ register int i; char fullname[LENHOSTNAME]; struct sockaddr_storage netnum; if (!dogetassoc(fp)) return; for (i = 0; i < numhosts; ++i) { if (getnetnum(chosts[i], &netnum, fullname, af)) if ((int)strlen(fullname) > maxhostlen) maxhostlen = strlen(fullname); } if (numhosts > 1) (void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "server"); (void) fprintf(fp, " remote local st t when poll reach delay offset disp\n"); if (numhosts > 1) for (i = 0; i <= maxhostlen; ++i) (void) fprintf(fp, "="); (void) fprintf(fp, "==============================================================================\n"); for (i = 0; i < numassoc; i++) { if (!showall && !(CTL_PEER_STATVAL(assoc_cache[i].status) & (CTL_PST_CONFIG|CTL_PST_REACH))) continue; if (!dogetpeers(opeervarlist, (int)assoc_cache[i].assid, fp, af)) { return; } } return;}/* * opeers - print a peer spreadsheet the old way *//*ARGSUSED*/static voidopeers( struct parse *pcmd, FILE *fp ){ int af = 0; if (pcmd->nargs == 1) { if (pcmd->argval->ival == 6) af = AF_INET6; else af = AF_INET; } doopeers(0, fp, af);}/* * lopeers - print a peer spreadsheet including all fuzzball peers *//*ARGSUSED*/static voidlopeers( struct parse *pcmd, FILE *fp ){ int af = 0; if (pcmd->nargs == 1) { if (pcmd->argval->ival == 6) af = AF_INET6; else af = AF_INET; } doopeers(1, fp, af);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -