📄 ntpdc_ops.c
字号:
"ppoll %d, hpoll %d, keyid %lu, version %d, association %u\n", pp->ppoll, pp->hpoll, (u_long)pp->keyid, pp->version, ntohs(pp->associd)); (void) fprintf(fp, "reach %03o, unreach %d, flash 0x%04x, ", pp->reach, pp->unreach, pp->flash2); (void) fprintf(fp, "boffset %s, ttl/mode %d\n", fptoa(NTOHS_FP(pp->estbdelay), 5), pp->ttl); (void) fprintf(fp, "timer %lds, flags", (long)ntohl(pp->timer)); if (pp->flags == 0) { (void) fprintf(fp, " none\n"); } else { str = ""; if (pp->flags & INFO_FLAG_SYSPEER) { (void) fprintf(fp, " system_peer"); str = ","; } if (pp->flags & INFO_FLAG_CONFIG) { (void) fprintf(fp, "%s config", str); str = ","; } if (pp->flags & INFO_FLAG_REFCLOCK) { (void) fprintf(fp, "%s refclock", str); str = ","; } if (pp->flags & INFO_FLAG_AUTHENABLE) { (void) fprintf(fp, "%s auth", str); str = ","; } if (pp->flags & INFO_FLAG_BCLIENT) { (void) fprintf(fp, "%s bclient", str); str = ","; } if (pp->flags & INFO_FLAG_PREFER) { (void) fprintf(fp, "%s prefer", str); str = ","; } if (pp->flags & INFO_FLAG_BURST) { (void) fprintf(fp, "%s burst", str); } (void) fprintf(fp, "\n"); } NTOHL_FP(&pp->reftime, &tempts); (void) fprintf(fp, "reference time: %s\n", prettydate(&tempts)); NTOHL_FP(&pp->org, &tempts); (void) fprintf(fp, "originate timestamp: %s\n", prettydate(&tempts)); NTOHL_FP(&pp->rec, &tempts); (void) fprintf(fp, "receive timestamp: %s\n", prettydate(&tempts)); NTOHL_FP(&pp->xmt, &tempts); (void) fprintf(fp, "transmit timestamp: %s\n", prettydate(&tempts)); (void) fprintf(fp, "filter delay: "); for (i = 0; i < NTP_SHIFT; i++) { (void) fprintf(fp, " %-8.8s", fptoa(NTOHS_FP(pp->filtdelay[i]), 5)); if (i == (NTP_SHIFT>>1)-1) (void) fprintf(fp, "\n "); } (void) fprintf(fp, "\n"); (void) fprintf(fp, "filter offset:"); for (i = 0; i < NTP_SHIFT; i++) { NTOHL_FP(&pp->filtoffset[i], &tempts); (void) fprintf(fp, " %-8.8s", lfptoa(&tempts, 6)); if (i == (NTP_SHIFT>>1)-1) (void) fprintf(fp, "\n "); } (void) fprintf(fp, "\n"); (void) fprintf(fp, "filter order: "); for (i = 0; i < NTP_SHIFT; i++) { (void) fprintf(fp, " %-8d", pp->order[i]); if (i == (NTP_SHIFT>>1)-1) (void) fprintf(fp, "\n "); } (void) fprintf(fp, "\n"); NTOHL_FP(&pp->offset, &tempts); (void) fprintf(fp, "offset %s, delay %s, error bound %s, filter error %s\n", lfptoa(&tempts, 6), fptoa(NTOHS_FP(pp->delay), 5), ufptoa(NTOHS_FP(pp->dispersion), 5), ufptoa(NTOHS_FP(pp->selectdisp), 5));}/* * showpeer - show detailed information for a peer */static voidshowpeer( struct parse *pcmd, FILE *fp ){ struct info_peer *pp; /* 4 is the maximum number of peers which will fit in a packet */ struct info_peer_list *pl, plist[min(MAXARGS, 4)]; int qitems; int items; int itemsize; int res; int sendsize;again: if (impl_ver == IMPL_XNTPD) sendsize = sizeof(struct info_peer_list); else sendsize = v4sizeof(struct info_peer_list); for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 4); qitems++) { if (pcmd->argval[qitems].netnum.ss_family == AF_INET) { pl->addr = GET_INADDR(pcmd->argval[qitems].netnum); if (impl_ver == IMPL_XNTPD) pl->v6_flag = 0; } else { if (impl_ver == IMPL_XNTPD_OLD) { fprintf(stderr, "***Server doesn't understand IPv6 addresses\n"); return; } pl->addr6 = GET_INADDR6(pcmd->argval[qitems].netnum); pl->v6_flag = 1; } pl->port = (u_short)s_port; pl->hmode = pl->flags = 0; pl = (struct info_peer_list *)((char *)pl + sendsize); } res = doquery(impl_ver, REQ_PEER_INFO, 0, qitems, sendsize, (char *)plist, &items, &itemsize, (void *)&pp, 0, sizeof(struct info_peer)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res != 0) return; if (!checkitems(items, fp)) return; if (!checkitemsize(itemsize, sizeof(struct info_peer)) && !checkitemsize(itemsize, v4sizeof(struct info_peer))) return; while (items-- > 0) { printpeer(pp, fp); if (items > 0) (void) fprintf(fp, "\n"); pp++; }}/* * peerstats - return statistics for a peer */static voidpeerstats( struct parse *pcmd, FILE *fp ){ struct info_peer_stats *pp; /* 4 is the maximum number of peers which will fit in a packet */ struct info_peer_list *pl, plist[min(MAXARGS, 4)]; struct sockaddr_storage src, dst; int qitems; int items; int itemsize; int res; int sendsize;again: if (impl_ver == IMPL_XNTPD) sendsize = sizeof(struct info_peer_list); else sendsize = v4sizeof(struct info_peer_list); memset((char *)plist, 0, sizeof(struct info_peer_list) * min(MAXARGS, 4)); for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 4); qitems++) { if (pcmd->argval[qitems].netnum.ss_family == AF_INET) { pl->addr = GET_INADDR(pcmd->argval[qitems].netnum); if (impl_ver == IMPL_XNTPD) pl->v6_flag = 0; } else { if (impl_ver == IMPL_XNTPD_OLD) { fprintf(stderr, "***Server doesn't understand IPv6 addresses\n"); return; } pl->addr6 = GET_INADDR6(pcmd->argval[qitems].netnum); pl->v6_flag = 1; } pl->port = (u_short)s_port; pl->hmode = plist[qitems].flags = 0; pl = (struct info_peer_list *)((char *)pl + sendsize); } res = doquery(impl_ver, REQ_PEER_STATS, 0, qitems, sendsize, (char *)plist, &items, &itemsize, (void *)&pp, 0, sizeof(struct info_peer_stats)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res != 0) return; if (!checkitems(items, fp)) return; if (!checkitemsize(itemsize, sizeof(struct info_peer_stats)) && !checkitemsize(itemsize, v4sizeof(struct info_peer_stats))) return; while (items-- > 0) { memset((char *)&src, 0, sizeof(src)); memset((char *)&dst, 0, sizeof(dst)); if (pp->v6_flag != 0) { GET_INADDR6(src) = pp->srcadr6; GET_INADDR6(dst) = pp->dstadr6; src.ss_family = AF_INET6; dst.ss_family = AF_INET6; } else { GET_INADDR(src) = pp->srcadr; GET_INADDR(dst) = pp->dstadr; src.ss_family = AF_INET; dst.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR src.ss_len = SOCKLEN(&src); dst.ss_len = SOCKLEN(&dst);#endif (void) fprintf(fp, "remote host: %s\n", nntohost(&src)); (void) fprintf(fp, "local interface: %s\n", stoa(&dst)); (void) fprintf(fp, "time last received: %lds\n", (long)ntohl(pp->timereceived)); (void) fprintf(fp, "time until next send: %lds\n", (long)ntohl(pp->timetosend)); (void) fprintf(fp, "reachability change: %lds\n", (long)ntohl(pp->timereachable)); (void) fprintf(fp, "packets sent: %ld\n", (long)ntohl(pp->sent)); (void) fprintf(fp, "packets received: %ld\n", (long)ntohl(pp->processed)); (void) fprintf(fp, "bad authentication: %ld\n", (long)ntohl(pp->badauth)); (void) fprintf(fp, "bogus origin: %ld\n", (long)ntohl(pp->bogusorg)); (void) fprintf(fp, "duplicate: %ld\n", (long)ntohl(pp->oldpkt)); (void) fprintf(fp, "bad dispersion: %ld\n", (long)ntohl(pp->seldisp)); (void) fprintf(fp, "bad reference time: %ld\n", (long)ntohl(pp->selbroken)); (void) fprintf(fp, "candidate order: %d\n", (int)pp->candidate); if (items > 0) (void) fprintf(fp, "\n"); pp++; }}/* * loopinfo - show loop filter information */static voidloopinfo( struct parse *pcmd, FILE *fp ){ struct info_loop *il; int items; int itemsize; int oneline = 0; int res; l_fp tempts; if (pcmd->nargs > 0) { if (STREQ(pcmd->argval[0].string, "oneline")) oneline = 1; else if (STREQ(pcmd->argval[0].string, "multiline")) oneline = 0; else { (void) fprintf(stderr, "How many lines?\n"); return; } }again: res = doquery(impl_ver, REQ_LOOP_INFO, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&il, 0, sizeof(struct info_loop)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res != 0) return; if (!check1item(items, fp)) return; if (!checkitemsize(itemsize, sizeof(struct info_loop))) return; if (oneline) { l_fp temp2ts; NTOHL_FP(&il->last_offset, &tempts); NTOHL_FP(&il->drift_comp, &temp2ts); (void) fprintf(fp, "offset %s, frequency %s, time_const %ld, watchdog %ld\n", lfptoa(&tempts, 6), lfptoa(&temp2ts, 3), (u_long)ntohl((u_long)il->compliance), (u_long)ntohl((u_long)il->watchdog_timer)); } else { NTOHL_FP(&il->last_offset, &tempts); (void) fprintf(fp, "offset: %s s\n", lfptoa(&tempts, 6)); NTOHL_FP(&il->drift_comp, &tempts); (void) fprintf(fp, "frequency: %s ppm\n", lfptoa(&tempts, 3)); (void) fprintf(fp, "poll adjust: %ld\n", (u_long)ntohl(il->compliance)); (void) fprintf(fp, "watchdog timer: %ld s\n", (u_long)ntohl(il->watchdog_timer)); }}/* * sysinfo - show current system state *//*ARGSUSED*/static voidsysinfo( struct parse *pcmd, FILE *fp ){ struct info_sys *is; struct sockaddr_storage peeraddr; int items; int itemsize; int res; l_fp tempts;again: res = doquery(impl_ver, REQ_SYS_INFO, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&is, 0, sizeof(struct info_sys)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res != 0) return; if (!check1item(items, fp)) return; if (!checkitemsize(itemsize, sizeof(struct info_sys)) && !checkitemsize(itemsize, v4sizeof(struct info_sys))) return; memset((char *)&peeraddr, 0, sizeof(peeraddr)); if (is->v6_flag != 0) { GET_INADDR6(peeraddr) = is->peer6; peeraddr.ss_family = AF_INET6; } else { GET_INADDR(peeraddr) = is->peer; peeraddr.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR peeraddr.ss_len = SOCKLEN(&peeraddr);#endif (void) fprintf(fp, "system peer: %s\n", nntohost(&peeraddr)); (void) fprintf(fp, "system peer mode: %s\n", modetoa(is->peer_mode)); (void) fprintf(fp, "leap indicator: %c%c\n", is->leap & 0x2 ? '1' : '0', is->leap & 0x1 ? '1' : '0'); (void) fprintf(fp, "stratum: %d\n", (int)is->stratum); (void) fprintf(fp, "precision: %d\n", (int)is->precision); (void) fprintf(fp, "root distance: %s s\n", fptoa(NTOHS_FP(is->rootdelay), 5)); (void) fprintf(fp, "root dispersion: %s s\n", ufptoa(NTOHS_FP(is->rootdispersion), 5)); (void) fprintf(fp, "reference ID: [%s]\n", refid_string(is->refid, is->stratum)); NTOHL_FP(&is->reftime, &tempts); (void) fprintf(fp, "reference time: %s\n", prettydate(&tempts)); (void) fprintf(fp, "system flags: "); if ((is->flags & (INFO_FLAG_BCLIENT | INFO_FLAG_AUTHENABLE | INFO_FLAG_NTP | INFO_FLAG_KERNEL| INFO_FLAG_CAL | INFO_FLAG_PPS_SYNC | INFO_FLAG_MONITOR | INFO_FLAG_FILEGEN)) == 0) { (void) fprintf(fp, "none\n"); } else { if (is->flags & INFO_FLAG_BCLIENT) (void) fprintf(fp, "bclient "); if (is->flags & INFO_FLAG_AUTHENTICATE) (void) fprintf(fp, "auth "); if (is->flags & INFO_FLAG_MONITOR) (void) fprintf(fp, "monitor "); if (is->flags & INFO_FLAG_NTP) (void) fprintf(fp, "ntp "); if (is->flags & INFO_FLAG_KERNEL) (void) fprintf(fp, "kernel "); if (is->flags & INFO_FLAG_FILEGEN) (void) fprintf(fp, "stats "); if (is->flags & INFO_FLAG_CAL) (void) fprintf(fp, "calibrate "); if (is->flags & INFO_FLAG_PPS_SYNC) (void) fprintf(fp, "pps "); (void) fprintf(fp, "\n"); } (void) fprintf(fp, "jitter: %s s\n", fptoa(ntohl(is->frequency), 6)); (void) fprintf(fp, "stability: %s ppm\n", ufptoa(ntohl(is->stability), 3)); (void) fprintf(fp, "broadcastdelay: %s s\n", fptoa(NTOHS_FP(is->bdelay), 6)); NTOHL_FP(&is->authdelay, &tempts); (void) fprintf(fp, "authdelay: %s s\n", lfptoa(&tempts, 6));}/* * sysstats - print system statistics *//*ARGSUSED*/static voidsysstats( struct parse *pcmd, FILE *fp ){ struct info_sys_stats *ss; int items; int itemsize; int res;again: res = doquery(impl_ver, REQ_SYS_STATS, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&ss, 0, sizeof(struct info_sys_stats)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res != 0) return; if (!check1item(items, fp)) return; if (itemsize != sizeof(struct info_sys_stats) && itemsize != sizeof(struct old_info_sys_stats)) { /* issue warning according to new structure size */ checkitemsize(itemsize, sizeof(struct info_sys_stats)); return; } fprintf(fp, "time since restart: %ld\n", (u_long)ntohl(ss->timeup)); fprintf(fp, "time since reset: %ld\n", (u_long)ntohl(ss->timereset)); fprintf(fp, "packets received: %ld\n", (u_long)ntohl(ss->received)); fprintf(fp, "packets processed: %ld\n", (u_long)ntohl(ss->processed)); fprintf(fp, "current version: %ld\n", (u_long)ntohl(ss->newversionpkt)); fprintf(fp, "previous version: %ld\n", (u_long)ntohl(ss->oldversionpkt)); fprintf(fp, "bad version: %ld\n", (u_long)ntohl(ss->unknownversion)); fprintf(fp, "access denied: %ld\n", (u_long)ntohl(ss->denied)); fprintf(fp, "bad length or format: %ld\n", (u_long)ntohl(ss->badlength)); fprintf(fp, "bad authentication: %ld\n", (u_long)ntohl(ss->badauth)); if (itemsize != sizeof(struct info_sys_stats)) return; fprintf(fp, "rate exceeded: %ld\n", (u_long)ntohl(ss->limitrejected));}/* * iostats - print I/O statistics *//*ARGSUSED*/static voidiostats( struct parse *pcmd, FILE *fp ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -