📄 ntpdc_ops.c
字号:
struct info_io_stats *io; int items; int itemsize; int res;again: res = doquery(impl_ver, REQ_IO_STATS, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&io, 0, sizeof(struct info_io_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 (!checkitemsize(itemsize, sizeof(struct info_io_stats))) return; (void) fprintf(fp, "time since reset: %ld\n", (u_long)ntohl(io->timereset)); (void) fprintf(fp, "receive buffers: %d\n", ntohs(io->totalrecvbufs)); (void) fprintf(fp, "free receive buffers: %d\n", ntohs(io->freerecvbufs)); (void) fprintf(fp, "used receive buffers: %d\n", ntohs(io->fullrecvbufs)); (void) fprintf(fp, "low water refills: %d\n", ntohs(io->lowwater)); (void) fprintf(fp, "dropped packets: %ld\n", (u_long)ntohl(io->dropped)); (void) fprintf(fp, "ignored packets: %ld\n", (u_long)ntohl(io->ignored)); (void) fprintf(fp, "received packets: %ld\n", (u_long)ntohl(io->received)); (void) fprintf(fp, "packets sent: %ld\n", (u_long)ntohl(io->sent)); (void) fprintf(fp, "packets not sent: %ld\n", (u_long)ntohl(io->notsent)); (void) fprintf(fp, "interrupts handled: %ld\n", (u_long)ntohl(io->interrupts)); (void) fprintf(fp, "received by int: %ld\n", (u_long)ntohl(io->int_received));}/* * memstats - print peer memory statistics *//*ARGSUSED*/static voidmemstats( struct parse *pcmd, FILE *fp ){ struct info_mem_stats *mem; int i; int items; int itemsize; int res;again: res = doquery(impl_ver, REQ_MEM_STATS, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&mem, 0, sizeof(struct info_mem_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 (!checkitemsize(itemsize, sizeof(struct info_mem_stats))) return; (void) fprintf(fp, "time since reset: %ld\n", (u_long)ntohl(mem->timereset)); (void) fprintf(fp, "total peer memory: %d\n", ntohs(mem->totalpeermem)); (void) fprintf(fp, "free peer memory: %d\n", ntohs(mem->freepeermem)); (void) fprintf(fp, "calls to findpeer: %ld\n", (u_long)ntohl(mem->findpeer_calls)); (void) fprintf(fp, "new peer allocations: %ld\n", (u_long)ntohl(mem->allocations)); (void) fprintf(fp, "peer demobilizations: %ld\n", (u_long)ntohl(mem->demobilizations)); (void) fprintf(fp, "hash table counts: "); for (i = 0; i < NTP_HASH_SIZE; i++) { (void) fprintf(fp, "%4d", (int)mem->hashcount[i]); if ((i % 8) == 7 && i != (NTP_HASH_SIZE-1)) { (void) fprintf(fp, "\n "); } } (void) fprintf(fp, "\n");}/* * timerstats - print timer statistics *//*ARGSUSED*/static voidtimerstats( struct parse *pcmd, FILE *fp ){ struct info_timer_stats *tim; int items; int itemsize; int res;again: res = doquery(impl_ver, REQ_TIMER_STATS, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&tim, 0, sizeof(struct info_timer_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 (!checkitemsize(itemsize, sizeof(struct info_timer_stats))) return; (void) fprintf(fp, "time since reset: %ld\n", (u_long)ntohl(tim->timereset)); (void) fprintf(fp, "alarms handled: %ld\n", (u_long)ntohl(tim->alarms)); (void) fprintf(fp, "alarm overruns: %ld\n", (u_long)ntohl(tim->overflows)); (void) fprintf(fp, "calls to transmit: %ld\n", (u_long)ntohl(tim->xmtcalls));}/* * addpeer - configure an active mode association */static voidaddpeer( struct parse *pcmd, FILE *fp ){ doconfig(pcmd, fp, MODE_ACTIVE, 0);}/* * addserver - configure a client mode association */static voidaddserver( struct parse *pcmd, FILE *fp ){ doconfig(pcmd, fp, MODE_CLIENT, 0);}/* * addrefclock - configure a reference clock association */static voidaddrefclock( struct parse *pcmd, FILE *fp ){ doconfig(pcmd, fp, MODE_CLIENT, 1);}/* * broadcast - configure a broadcast mode association */static voidbroadcast( struct parse *pcmd, FILE *fp ){ doconfig(pcmd, fp, MODE_BROADCAST, 0);}/* * config - configure a new peer association */static voiddoconfig( struct parse *pcmd, FILE *fp, int mode, int refc ){ struct conf_peer cpeer; int items; int itemsize; char *dummy; u_long keyid; u_int version; u_char minpoll; u_int flags; u_char cmode; int res; int sendsize;again: keyid = 0; version = NTP_OLDVERSION + 1; flags = 0; res = 0; cmode = 0; minpoll = NTP_MINDPOLL; if (impl_ver == IMPL_XNTPD) sendsize = sizeof(struct conf_peer); else sendsize = v4sizeof(struct conf_peer); items = pcmd->nargs; if (refc) { if (pcmd->nargs > 1) { cmode = (u_char) pcmd->argval[1].uval; items = 2; } } else { if (pcmd->nargs > 1) { keyid = pcmd->argval[1].uval; if (keyid > 0) { flags |= CONF_FLAG_AUTHENABLE; } if (pcmd->nargs > 2) { version = (u_int)pcmd->argval[2].uval; if (version > NTP_VERSION || version < NTP_OLDVERSION) { (void)fprintf(fp, "invalid version number %u\n", version); res++; } items = 3; } } } while (pcmd->nargs > items) { if (STREQ(pcmd->argval[items].string, "prefer")) flags |= CONF_FLAG_PREFER; else if (STREQ(pcmd->argval[items].string, "burst")) flags |= CONF_FLAG_BURST; else if (STREQ(pcmd->argval[items].string, "iburst")) flags |= CONF_FLAG_IBURST; else { long val; if (!atoint(pcmd->argval[items].string, &val)) { (void) fprintf(fp, "%s not understood\n", pcmd->argval[items].string); res++; break; } else { if (val >= NTP_MINPOLL && val <= NTP_MAXPOLL) { minpoll = (u_char)val; } else { (void) fprintf(fp, "minpol must be within %d..%d\n", NTP_MINPOLL, NTP_MAXPOLL); res++; break; } } } items++; } if (res) return; memset((void *)&cpeer, 0, sizeof(cpeer)); if (pcmd->argval[0].netnum.ss_family == AF_INET) { cpeer.peeraddr = GET_INADDR(pcmd->argval[0].netnum); if (impl_ver == IMPL_XNTPD) cpeer.v6_flag = 0; } else { if (impl_ver == IMPL_XNTPD_OLD) { fprintf(stderr, "***Server doesn't understand IPv6 addresses\n"); return; } cpeer.peeraddr6 = GET_INADDR6(pcmd->argval[0].netnum); cpeer.v6_flag = 1; } cpeer.hmode = (u_char) mode; cpeer.keyid = keyid; cpeer.version = (u_char) version; cpeer.minpoll = minpoll; cpeer.maxpoll = NTP_MAXDPOLL; cpeer.flags = (u_char)flags; cpeer.ttl = cmode; res = doquery(impl_ver, REQ_CONFIG, 1, 1, sendsize, (char *)&cpeer, &items, &itemsize, &dummy, 0, sizeof(struct conf_peer)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == INFO_ERR_FMT) { (void) fprintf(fp, "***Retrying command with old conf_peer size\n"); res = doquery(impl_ver, REQ_CONFIG, 1, 1, sizeof(struct old_conf_peer), (char *)&cpeer, &items, &itemsize, &dummy, 0, sizeof(struct conf_peer)); } if (res == 0) (void) fprintf(fp, "done!\n"); return;}/* * unconfig - unconfigure some associations */static voidunconfig( struct parse *pcmd, FILE *fp ){ /* 8 is the maximum number of peers which will fit in a packet */ struct conf_unpeer *pl, plist[min(MAXARGS, 8)]; int qitems; int items; int itemsize; char *dummy; int res; int sendsize;again: if (impl_ver == IMPL_XNTPD) sendsize = sizeof(struct conf_unpeer); else sendsize = v4sizeof(struct conf_unpeer); for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 8); qitems++) { if (pcmd->argval[0].netnum.ss_family == AF_INET) { pl->peeraddr = 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->peeraddr6 = GET_INADDR6(pcmd->argval[qitems].netnum); pl->v6_flag = 1; } pl = (struct conf_unpeer *)((char *)pl + sendsize); } res = doquery(impl_ver, REQ_UNCONFIG, 1, qitems, sendsize, (char *)plist, &items, &itemsize, &dummy, 0, sizeof(struct conf_unpeer)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == 0) (void) fprintf(fp, "done!\n");}/* * set - set some system flags */static voidset( struct parse *pcmd, FILE *fp ){ doset(pcmd, fp, REQ_SET_SYS_FLAG);}/* * clear - clear some system flags */static voidsys_clear( struct parse *pcmd, FILE *fp ){ doset(pcmd, fp, REQ_CLR_SYS_FLAG);}/* * doset - set/clear system flags */static voiddoset( struct parse *pcmd, FILE *fp, int req ){ /* 8 is the maximum number of peers which will fit in a packet */ struct conf_sys_flags sys; int items; int itemsize; char *dummy; int res; sys.flags = 0; res = 0; for (items = 0; items < pcmd->nargs; items++) { if (STREQ(pcmd->argval[items].string, "auth")) sys.flags |= SYS_FLAG_AUTH; else if (STREQ(pcmd->argval[items].string, "bclient")) sys.flags |= SYS_FLAG_BCLIENT; else if (STREQ(pcmd->argval[items].string, "calibrate")) sys.flags |= SYS_FLAG_CAL; else if (STREQ(pcmd->argval[items].string, "kernel")) sys.flags |= SYS_FLAG_KERNEL; else if (STREQ(pcmd->argval[items].string, "monitor")) sys.flags |= SYS_FLAG_MONITOR; else if (STREQ(pcmd->argval[items].string, "ntp")) sys.flags |= SYS_FLAG_NTP; else if (STREQ(pcmd->argval[items].string, "pps")) sys.flags |= SYS_FLAG_PPS; else if (STREQ(pcmd->argval[items].string, "stats")) sys.flags |= SYS_FLAG_FILEGEN; else { (void) fprintf(fp, "Unknown flag %s\n", pcmd->argval[items].string); res = 1; } } if (res || sys.flags == 0) return;again: res = doquery(impl_ver, req, 1, 1, sizeof(struct conf_sys_flags), (char *)&sys, &items, &itemsize, &dummy, 0, sizeof(struct conf_sys_flags)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == 0) (void) fprintf(fp, "done!\n");}/* * data for printing/interrpreting the restrict flags */struct resflags { const char *str; int bit;};/* XXX: HMS: we apparently don't report set bits we do not recognize. */static struct resflags resflagsV2[] = { { "ignore", 0x001 }, { "noserve", 0x002 }, { "notrust", 0x004 }, { "noquery", 0x008 }, { "nomodify", 0x010 }, { "nopeer", 0x020 }, { "notrap", 0x040 }, { "lptrap", 0x080 }, { "limited", 0x100 }, { "", 0 }};static struct resflags resflagsV3[] = { { "ignore", RES_IGNORE }, { "noserve", RES_DONTSERVE }, { "notrust", RES_DONTTRUST }, { "noquery", RES_NOQUERY }, { "nomodify", RES_NOMODIFY }, { "nopeer", RES_NOPEER }, { "notrap", RES_NOTRAP }, { "lptrap", RES_LPTRAP }, { "limited", RES_LIMITED }, { "version", RES_VERSION }, { "kod", RES_DEMOBILIZE }, { "timeout", RES_TIMEOUT }, { "", 0 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -