📄 ntpdc_ops.c
字号:
preset( 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[qitems].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_RESET_PEER, 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");}/* * readkeys - request the server to reread the keys file *//*ARGSUSED*/static voidreadkeys( struct parse *pcmd, FILE *fp ){ int items; int itemsize; char *dummy; int res;again: res = doquery(impl_ver, REQ_REREAD_KEYS, 1, 0, 0, (char *)0, &items, &itemsize, &dummy, 0, sizeof(dummy)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == 0) (void) fprintf(fp, "done!\n"); return;}/* * trustkey - add some keys to the trusted key list */static voidtrustkey( struct parse *pcmd, FILE *fp ){ do_trustkey(pcmd, fp, REQ_TRUSTKEY);}/* * untrustkey - remove some keys from the trusted key list */static voiduntrustkey( struct parse *pcmd, FILE *fp ){ do_trustkey(pcmd, fp, REQ_UNTRUSTKEY);}/* * do_trustkey - do grunge work of adding/deleting keys */static voiddo_trustkey( struct parse *pcmd, FILE *fp, int req ){ u_long keyids[MAXARGS]; int i; int items; int itemsize; char *dummy; int ritems; int res; ritems = 0; for (i = 0; i < pcmd->nargs; i++) { keyids[ritems++] = pcmd->argval[i].uval; }again: res = doquery(impl_ver, req, 1, ritems, sizeof(u_long), (char *)keyids, &items, &itemsize, &dummy, 0, sizeof(dummy)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == 0) (void) fprintf(fp, "done!\n"); return;}/* * authinfo - obtain and print info about authentication *//*ARGSUSED*/static voidauthinfo( struct parse *pcmd, FILE *fp ){ struct info_auth *ia; int items; int itemsize; int res;again: res = doquery(impl_ver, REQ_AUTHINFO, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&ia, 0, sizeof(struct info_auth)); 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_auth))) return; (void) fprintf(fp, "time since reset: %ld\n", (u_long)ntohl(ia->timereset)); (void) fprintf(fp, "stored keys: %ld\n", (u_long)ntohl(ia->numkeys)); (void) fprintf(fp, "free keys: %ld\n", (u_long)ntohl(ia->numfreekeys)); (void) fprintf(fp, "key lookups: %ld\n", (u_long)ntohl(ia->keylookups)); (void) fprintf(fp, "keys not found: %ld\n", (u_long)ntohl(ia->keynotfound)); (void) fprintf(fp, "uncached keys: %ld\n", (u_long)ntohl(ia->keyuncached)); (void) fprintf(fp, "encryptions: %ld\n", (u_long)ntohl(ia->encryptions)); (void) fprintf(fp, "decryptions: %ld\n", (u_long)ntohl(ia->decryptions)); (void) fprintf(fp, "expired keys: %ld\n", (u_long)ntohl(ia->expired));}/* * traps - obtain and print a list of traps *//*ARGSUSED*/static voidtraps( struct parse *pcmd, FILE *fp ){ int i; struct info_trap *it; struct sockaddr_storage trap_addr, local_addr; int items; int itemsize; int res;again: res = doquery(impl_ver, REQ_TRAPS, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&it, 0, sizeof(struct info_trap)); 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_trap)) && !checkitemsize(itemsize, v4sizeof(struct info_trap))) return; for (i = 0; i < items; i++ ) { if (i != 0) (void) fprintf(fp, "\n"); memset((char *)&trap_addr, 0, sizeof(trap_addr)); memset((char *)&local_addr, 0, sizeof(local_addr)); if (it->v6_flag != 0) { GET_INADDR6(trap_addr) = it->trap_address6; GET_INADDR6(local_addr) = it->local_address6; trap_addr.ss_family = AF_INET6; local_addr.ss_family = AF_INET6; } else { GET_INADDR(trap_addr) = it->trap_address; GET_INADDR(local_addr) = it->local_address; trap_addr.ss_family = AF_INET; local_addr.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR trap_addr.ss_len = SOCKLEN(&trap_addr); local_addr.ss_len = SOCKLEN(&local_addr);#endif (void) fprintf(fp, "address %s, port %d\n", stoa(&trap_addr), ntohs(it->trap_port)); (void) fprintf(fp, "interface: %s, ", (it->local_address == 0) ? "wildcard" : stoa(&local_addr)); if (ntohl(it->flags) & TRAP_CONFIGURED) (void) fprintf(fp, "configured\n"); else if (ntohl(it->flags) & TRAP_NONPRIO) (void) fprintf(fp, "low priority\n"); else (void) fprintf(fp, "normal priority\n"); (void) fprintf(fp, "set for %ld secs, last set %ld secs ago\n", (long)ntohl(it->origtime), (long)ntohl(it->settime)); (void) fprintf(fp, "sequence %d, number of resets %ld\n", ntohs(it->sequence), (long)ntohl(it->resets)); }}/* * addtrap - configure a trap */static voidaddtrap( struct parse *pcmd, FILE *fp ){ do_addclr_trap(pcmd, fp, REQ_ADD_TRAP);}/* * clrtrap - clear a trap from the server */static voidclrtrap( struct parse *pcmd, FILE *fp ){ do_addclr_trap(pcmd, fp, REQ_CLR_TRAP);}/* * do_addclr_trap - do grunge work of adding/deleting traps */static voiddo_addclr_trap( struct parse *pcmd, FILE *fp, int req ){ struct conf_trap ctrap; int items; int itemsize; char *dummy; int res; int sendsize;again: if (impl_ver == IMPL_XNTPD) sendsize = sizeof(struct conf_trap); else sendsize = v4sizeof(struct conf_trap); if (pcmd->argval[0].netnum.ss_family == AF_INET) { ctrap.trap_address = GET_INADDR(pcmd->argval[0].netnum); if (impl_ver == IMPL_XNTPD) ctrap.v6_flag = 0; } else { if (impl_ver == IMPL_XNTPD_OLD) { fprintf(stderr, "***Server doesn't understand IPv6 addresses\n"); return; } ctrap.trap_address6 = GET_INADDR6(pcmd->argval[0].netnum); ctrap.v6_flag = 1; } ctrap.local_address = 0; ctrap.trap_port = htons(TRAPPORT); ctrap.unused = 0; if (pcmd->nargs > 1) { ctrap.trap_port = htons((u_short)(pcmd->argval[1].uval & 0xffff)); if (pcmd->nargs > 2) { if (pcmd->argval[2].netnum.ss_family != pcmd->argval[0].netnum.ss_family) { fprintf(stderr, "***Cannot mix IPv4 and IPv6 addresses\n"); return; } if (pcmd->argval[2].netnum.ss_family == AF_INET) ctrap.local_address = GET_INADDR(pcmd->argval[2].netnum); else ctrap.local_address6 = GET_INADDR6(pcmd->argval[2].netnum); } } res = doquery(impl_ver, req, 1, 1, sendsize, (char *)&ctrap, &items, &itemsize, &dummy, 0, sizeof(struct conf_trap)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == 0) (void) fprintf(fp, "done!\n"); return;}/* * requestkey - change the server's request key (a dangerous request) */static voidrequestkey( struct parse *pcmd, FILE *fp ){ do_changekey(pcmd, fp, REQ_REQUEST_KEY);}/* * controlkey - change the server's control key */static voidcontrolkey( struct parse *pcmd, FILE *fp ){ do_changekey(pcmd, fp, REQ_CONTROL_KEY);}/* * do_changekey - do grunge work of changing keys */static voiddo_changekey( struct parse *pcmd, FILE *fp, int req ){ u_long key; int items; int itemsize; char *dummy; int res; key = htonl((u_int32)pcmd->argval[0].uval);again: res = doquery(impl_ver, req, 1, 1, sizeof(u_int32), (char *)&key, &items, &itemsize, &dummy, 0, sizeof(dummy)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == 0) (void) fprintf(fp, "done!\n"); return;}/* * ctlstats - obtain and print info about authentication *//*ARGSUSED*/static voidctlstats( struct parse *pcmd, FILE *fp ){ struct info_control *ic; int items; int itemsize; int res;again: res = doquery(impl_ver, REQ_GET_CTLSTATS, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&ic, 0, sizeof(struct info_control)); 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_control))) return; (void) fprintf(fp, "time since reset: %ld\n", (u_long)ntohl(ic->ctltimereset)); (void) fprintf(fp, "requests received: %ld\n", (u_long)ntohl(ic->numctlreq)); (void) fprintf(fp, "responses sent: %ld\n", (u_long)ntohl(ic->numctlresponses)); (void) fprintf(fp, "fragments sent: %ld\n", (u_long)ntohl(ic->numctlfrags)); (void) fprintf(fp, "async messages sent: %ld\n", (u_long)ntohl(ic->numasyncmsgs)); (void) fprintf(fp, "error msgs sent: %ld\n", (u_long)ntohl(ic->numctlerrors)); (void) fprintf(fp, "total bad pkts: %ld\n", (u_long)ntohl(ic->numctlbadpkts)); (void) fprintf(fp, "packet too short: %ld\n", (u_long)ntohl(ic->numctltooshort)); (void) fprintf(fp, "response on input: %ld\n", (u_long)ntohl(ic->numctlinputresp)); (void) fprintf(fp, "fragment on input: %ld\n", (u_long)ntohl(ic->numctlinputfrag)); (void) fprintf(fp, "error set on input: %ld\n", (u_long)ntohl(ic->numctlinputerr)); (void) fprintf(fp, "bad offset on input: %ld\n", (u_long)ntohl(ic->numctlbadoffset)); (void) fprintf(fp, "bad version packets: %ld\n", (u_long)ntohl(ic->numctlbadversion)); (void) fprintf(fp, "data in pkt too short: %ld\n", (u_long)ntohl(ic->numctldatatooshort)); (void) fprintf(fp, "unknown op codes: %ld\n", (u_long)ntohl(ic->numctlbadop));}/* * clockstat - get and print clock status information */static voidclockstat( struct parse *pcmd, FILE *fp ){ struct info_clock *cl; /* 8 is the maximum number of clocks which will fit in a packet */ u_long clist[min(MAXARGS, 8)]; int qitems; int item
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -