📄 ntpdc_ops.c
字号:
/* * ntpdc_ops.c - subroutines which are called to perform operations by xntpdc */#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <stdio.h>#include <stddef.h>#include "ntpdc.h"#include "ntp_control.h"#include "ntp_refclock.h"#include "ntp_stdlib.h"#include <ctype.h>#ifdef HAVE_SYS_TIMEX_H# include <sys/timex.h>#endif#if !defined(__bsdi__) && !defined(apollo)#include <netinet/in.h>#endif#include <arpa/inet.h>/* * Declarations for command handlers in here */static int checkitems P((int, FILE *));static int checkitemsize P((int, int));static int check1item P((int, FILE *));static void peerlist P((struct parse *, FILE *));static void peers P((struct parse *, FILE *));static void doconfig P((struct parse *pcmd, FILE *fp, int mode, int refc));static void dmpeers P((struct parse *, FILE *));static void dopeers P((struct parse *, FILE *, int));static void printpeer P((struct info_peer *, FILE *));static void showpeer P((struct parse *, FILE *));static void peerstats P((struct parse *, FILE *));static void loopinfo P((struct parse *, FILE *));static void sysinfo P((struct parse *, FILE *));static void sysstats P((struct parse *, FILE *));static void iostats P((struct parse *, FILE *));static void memstats P((struct parse *, FILE *));static void timerstats P((struct parse *, FILE *));static void addpeer P((struct parse *, FILE *));static void addserver P((struct parse *, FILE *));static void addrefclock P((struct parse *, FILE *));static void broadcast P((struct parse *, FILE *));static void doconfig P((struct parse *, FILE *, int, int));static void unconfig P((struct parse *, FILE *));static void set P((struct parse *, FILE *));static void sys_clear P((struct parse *, FILE *));static void doset P((struct parse *, FILE *, int));static void reslist P((struct parse *, FILE *));static void new_restrict P((struct parse *, FILE *));static void unrestrict P((struct parse *, FILE *));static void delrestrict P((struct parse *, FILE *));static void do_restrict P((struct parse *, FILE *, int));static void monlist P((struct parse *, FILE *));static void reset P((struct parse *, FILE *));static void preset P((struct parse *, FILE *));static void readkeys P((struct parse *, FILE *));static void trustkey P((struct parse *, FILE *));static void untrustkey P((struct parse *, FILE *));static void do_trustkey P((struct parse *, FILE *, int));static void authinfo P((struct parse *, FILE *));static void traps P((struct parse *, FILE *));static void addtrap P((struct parse *, FILE *));static void clrtrap P((struct parse *, FILE *));static void do_addclr_trap P((struct parse *, FILE *, int));static void requestkey P((struct parse *, FILE *));static void controlkey P((struct parse *, FILE *));static void do_changekey P((struct parse *, FILE *, int));static void ctlstats P((struct parse *, FILE *));static void clockstat P((struct parse *, FILE *));static void fudge P((struct parse *, FILE *));static void clkbug P((struct parse *, FILE *));static void kerninfo P((struct parse *, FILE *));/* * Commands we understand. Ntpdc imports this. */struct xcmd opcmds[] = { { "listpeers", peerlist, { OPT|IP_VERSION, NO, NO, NO }, { "-4|-6", "", "", "" }, "display list of peers the server knows about [IP Version]" }, { "peers", peers, { OPT|IP_VERSION, NO, NO, NO }, { "-4|-6", "", "", "" }, "display peer summary information [IP Version]" }, { "dmpeers", dmpeers, { OPT|IP_VERSION, NO, NO, NO }, { "-4|-6", "", "", "" }, "display peer summary info the way Dave Mills likes it (IP Version)" }, { "showpeer", showpeer, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD}, { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, "display detailed information for one or more peers" }, { "pstats", peerstats, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, "display statistical information for one or more peers" }, { "loopinfo", loopinfo, { OPT|NTP_STR, NO, NO, NO }, { "oneline|multiline", "", "", "" }, "display loop filter information" }, { "sysinfo", sysinfo, { NO, NO, NO, NO }, { "", "", "", "" }, "display local server information" }, { "sysstats", sysstats, { NO, NO, NO, NO }, { "", "", "", "" }, "display local server statistics" }, { "memstats", memstats, { NO, NO, NO, NO }, { "", "", "", "" }, "display peer memory usage statistics" }, { "iostats", iostats, { NO, NO, NO, NO }, { "", "", "", "" }, "display I/O subsystem statistics" }, { "timerstats", timerstats, { NO, NO, NO, NO }, { "", "", "", "" }, "display event timer subsystem statistics" }, { "addpeer", addpeer, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_STR }, { "addr", "keyid", "version", "minpoll|prefer|burst ..." }, "configure a new peer association" }, { "addserver", addserver, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_STR }, { "addr", "keyid", "version", "minpoll|prefer|burst|iburst ..." }, "configure a new server" }, { "addrefclock",addrefclock, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_STR, OPT|NTP_STR }, { "addr", "mode", "minpoll|prefer", "minpoll|prefer" }, "configure a new server" }, { "broadcast", broadcast, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_STR }, { "addr", "keyid", "version", "minpoll" }, "configure broadcasting time service" }, { "unconfig", unconfig, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, "unconfigure existing peer assocations" }, { "enable", set, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, { "auth|bclient|monitor|pll|kernel|stats", "...", "...", "..." }, "set a system flag (auth, bclient, monitor, pll, kernel, stats)" }, { "disable", sys_clear, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, { "auth|bclient|monitor|pll|kernel|stats", "...", "...", "..." }, "clear a system flag (auth, bclient, monitor, pll, kernel, stats)" }, { "reslist", reslist, {OPT|IP_VERSION, NO, NO, NO }, { "-4|-6", "", "", "" }, "display the server's restrict list" }, { "restrict", new_restrict, { NTP_ADD, NTP_ADD, NTP_STR, OPT|NTP_STR }, { "address", "mask", "ntpport|ignore|noserve|notrust|noquery|nomodify|nopeer|version|kod", "..." }, "create restrict entry/add flags to entry" }, { "unrestrict", unrestrict, { NTP_ADD, NTP_ADD, NTP_STR, OPT|NTP_STR }, { "address", "mask", "ntpport|ignore|noserve|notrust|noquery|nomodify|nopeer|version|kod", "..." }, "remove flags from a restrict entry" }, { "delrestrict", delrestrict, { NTP_ADD, NTP_ADD, OPT|NTP_STR, NO }, { "address", "mask", "ntpport", "" }, "delete a restrict entry" }, { "monlist", monlist, { OPT|NTP_INT, NO, NO, NO }, { "version", "", "", "" }, "display data the server's monitor routines have collected" }, { "reset", reset, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, { "io|sys|mem|timer|auth|allpeers", "...", "...", "..." }, "reset various subsystem statistics counters" }, { "preset", preset, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, "reset stat counters associated with particular peer(s)" }, { "readkeys", readkeys, { NO, NO, NO, NO }, { "", "", "", "" }, "request a reread of the keys file and re-init of system keys" }, { "trustedkey", trustkey, { NTP_UINT, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_UINT }, { "keyid", "keyid", "keyid", "keyid" }, "add one or more key ID's to the trusted list" }, { "untrustedkey", untrustkey, { NTP_UINT, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_UINT }, { "keyid", "keyid", "keyid", "keyid" }, "remove one or more key ID's from the trusted list" }, { "authinfo", authinfo, { NO, NO, NO, NO }, { "", "", "", "" }, "display the state of the authentication code" }, { "traps", traps, { NO, NO, NO, NO }, { "", "", "", "" }, "display the traps set in the server" }, { "addtrap", addtrap, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_ADD, NO }, { "address", "port", "interface", "" }, "configure a trap in the server" }, { "clrtrap", clrtrap, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_ADD, NO }, { "address", "port", "interface", "" }, "remove a trap (configured or otherwise) from the server" }, { "requestkey", requestkey, { NTP_UINT, NO, NO, NO }, { "keyid", "", "", "" }, "change the keyid the server uses to authenticate requests" }, { "controlkey", controlkey, { NTP_UINT, NO, NO, NO }, { "keyid", "", "", "" }, "change the keyid the server uses to authenticate control messages" }, { "ctlstats", ctlstats, { NO, NO, NO, NO }, { "", "", "", "" }, "display packet count statistics from the control module" }, { "clockstat", clockstat, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, { "address", "address", "address", "address" }, "display clock status information" }, { "fudge", fudge, { NTP_ADD, NTP_STR, NTP_STR, NO }, { "address", "time1|time2|val1|val2|flags", "value", "" }, "set/change one of a clock's fudge factors" }, { "clkbug", clkbug, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, { "address", "address", "address", "address" }, "display clock debugging information" }, { "kerninfo", kerninfo, { NO, NO, NO, NO }, { "", "", "", "" }, "display the kernel pll/pps variables" }, { 0, 0, { NO, NO, NO, NO }, { "", "", "", "" }, "" }};/* * For quick string comparisons */#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0)/* * checkitems - utility to print a message if no items were returned */static intcheckitems( int items, FILE *fp ){ if (items == 0) { (void) fprintf(fp, "No data returned in response to query\n"); return 0; } return 1;}/* * checkitemsize - utility to print a message if the item size is wrong */static intcheckitemsize( int itemsize, int expected ){ if (itemsize != expected) { (void) fprintf(stderr, "***Incorrect item size returned by remote host (%d should be %d)\n", itemsize, expected); return 0; } return 1;}/* * check1item - check to make sure we have exactly one item */static intcheck1item( int items, FILE *fp ){ if (items == 0) { (void) fprintf(fp, "No data returned in response to query\n"); return 0; } if (items > 1) { (void) fprintf(fp, "Expected one item in response, got %d\n", items); return 0; } return 1;}/* * peerlist - get a short list of peers *//*ARGSUSED*/static voidpeerlist( struct parse *pcmd, FILE *fp ){ struct info_peer_list *plist; struct sockaddr_storage paddr; int items; int itemsize; int res;again: res = doquery(impl_ver, REQ_PEER_LIST, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&plist, 0, sizeof(struct info_peer_list)); 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_list)) && !checkitemsize(itemsize, v4sizeof(struct info_peer_list))) return; while (items > 0) { memset((char *)&paddr, 0, sizeof(paddr)); if (plist->v6_flag != 0) { GET_INADDR6(paddr) = plist->addr6; paddr.ss_family = AF_INET6; } else { GET_INADDR(paddr) = plist->addr; paddr.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR paddr.ss_len = SOCKLEN(&paddr);#endif if ((pcmd->nargs == 0) || ((pcmd->argval->ival == 6) && (plist->v6_flag != 0)) || ((pcmd->argval->ival == 4) && (plist->v6_flag == 0))) (void) fprintf(fp, "%-9s %s\n", modetoa(plist->hmode), nntohost(&paddr)); plist++; items--; }}/* * peers - show peer summary */static voidpeers( struct parse *pcmd, FILE *fp ){ dopeers(pcmd, fp, 0);}/* * dmpeers - show peer summary, Dave Mills style */static voiddmpeers( struct parse *pcmd, FILE *fp ){ dopeers(pcmd, fp, 1);}/* * peers - show peer summary *//*ARGSUSED*/static voiddopeers( struct parse *pcmd, FILE *fp, int dmstyle ){ struct info_peer_summary *plist; struct sockaddr_storage dstadr; struct sockaddr_storage srcadr; int items; int itemsize; int ntp_poll; int res; int c; l_fp tempts;again: res = doquery(impl_ver, REQ_PEER_LIST_SUM, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&plist, 0, sizeof(struct info_peer_summary)); 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_summary)) && !checkitemsize(itemsize, v4sizeof(struct info_peer_summary))) return; (void) fprintf(fp, " remote local st poll reach delay offset disp\n"); (void) fprintf(fp, "=======================================================================\n"); while (items > 0) { if (!dmstyle) { if (plist->flags & INFO_FLAG_SYSPEER) c = '*'; else if (plist->hmode == MODE_ACTIVE) c = '+'; else if (plist->hmode == MODE_PASSIVE) c = '-'; else if (plist->hmode == MODE_CLIENT) c = '='; else if (plist->hmode == MODE_BROADCAST) c = '^'; else if (plist->hmode == MODE_BCLIENT) c = '~'; else c = ' '; } else { if (plist->flags & INFO_FLAG_SYSPEER) c = '*'; else if (plist->flags & INFO_FLAG_SHORTLIST) c = '+'; else if (plist->flags & INFO_FLAG_SEL_CANDIDATE) c = '.'; else c = ' '; } NTOHL_FP(&(plist->offset), &tempts); ntp_poll = 1<<max(min3(plist->ppoll, plist->hpoll, NTP_MAXPOLL), NTP_MINPOLL); memset((char *)&dstadr, 0, sizeof(dstadr)); memset((char *)&srcadr, 0, sizeof(srcadr)); if (plist->v6_flag != 0) { GET_INADDR6(dstadr) = plist->dstadr6; GET_INADDR6(srcadr) = plist->srcadr6; srcadr.ss_family = AF_INET6; dstadr.ss_family = AF_INET6; } else { GET_INADDR(dstadr) = plist->dstadr; GET_INADDR(srcadr) = plist->srcadr; srcadr.ss_family = AF_INET; dstadr.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR srcadr.ss_len = SOCKLEN(&srcadr); dstadr.ss_len = SOCKLEN(&dstadr);#endif if ((pcmd->nargs == 0) || ((pcmd->argval->ival == 6) && (plist->v6_flag != 0)) || ((pcmd->argval->ival == 4) && (plist->v6_flag == 0))) (void) fprintf(fp, "%c%-15.15s %-15.15s %2d %4d %3o %7.7s %9.9s %7.7s\n", c, nntohost(&srcadr), stoa(&dstadr), plist->stratum, ntp_poll, plist->reach, fptoa(NTOHS_FP(plist->delay), 5), lfptoa(&tempts, 6), ufptoa(NTOHS_FP(plist->dispersion), 5)); plist++; items--; }}/* Convert a refid & stratum (in host order) to a string */static char*refid_string( u_int32 refid, int stratum ){ if (stratum <= 1) { static char junk[5]; junk[4] = 0; memmove(junk, (char *)&refid, 4); return junk; } return numtoa(refid);}/* * printpeer - print detail information for a peer */static voidprintpeer( register struct info_peer *pp, FILE *fp ){ register int i; const char *str; l_fp tempts; struct sockaddr_storage srcadr, dstadr; memset((char *)&srcadr, 0, sizeof(srcadr)); memset((char *)&dstadr, 0, sizeof(dstadr)); if (pp->v6_flag != 0) { srcadr.ss_family = AF_INET6; dstadr.ss_family = AF_INET6; GET_INADDR6(srcadr) = pp->srcadr6; GET_INADDR6(dstadr) = pp->dstadr6; } else { srcadr.ss_family = AF_INET; dstadr.ss_family = AF_INET; GET_INADDR(srcadr) = pp->srcadr; GET_INADDR(dstadr) = pp->dstadr; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR srcadr.ss_len = SOCKLEN(&srcadr); dstadr.ss_len = SOCKLEN(&dstadr);#endif (void) fprintf(fp, "remote %s, local %s\n", stoa(&srcadr), stoa(&dstadr)); (void) fprintf(fp, "hmode %s, pmode %s, stratum %d, precision %d\n", modetoa(pp->hmode), modetoa(pp->pmode), pp->stratum, pp->precision); (void) fprintf(fp, "leap %c%c, refid [%s], rootdistance %s, rootdispersion %s\n", pp->leap & 0x2 ? '1' : '0', pp->leap & 0x1 ? '1' : '0', refid_string(pp->refid, pp->stratum), fptoa(NTOHS_FP(pp->rootdelay), 5), ufptoa(NTOHS_FP(pp->rootdispersion), 5)); (void) fprintf(fp,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -