📄 ntp_request.c
字号:
register struct peer *peer; struct sockaddr_storage peeraddr; int bad; /* * We check first to see that every peer exists. If not, * we return an error. */ items = INFO_NITEMS(inpkt->err_nitems); cp = (struct conf_unpeer *)inpkt->data; bad = 0; while (items-- > 0 && !bad) { memset((char *)&peeraddr, 0, sizeof(peeraddr)); if (client_v6_capable && cp->v6_flag != 0) { GET_INADDR6(peeraddr) = cp->peeraddr6; peeraddr.ss_family = AF_INET6; } else { GET_INADDR(peeraddr) = cp->peeraddr; peeraddr.ss_family = AF_INET; } NSRCPORT(&peeraddr) = htons(NTP_PORT);#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR peeraddr.ss_len = SOCKLEN(&peeraddr);#endif peer = findexistingpeer(&peeraddr, (struct peer *)0, -1); if (peer == (struct peer *)0) bad++; cp = (struct conf_unpeer *)((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); } if (bad) { req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); return; } /* * Now do it in earnest. */ items = INFO_NITEMS(inpkt->err_nitems); cp = (struct conf_unpeer *)inpkt->data; while (items-- > 0) { memset((char *)&peeraddr, 0, sizeof(peeraddr)); if (client_v6_capable && cp->v6_flag != 0) { GET_INADDR6(peeraddr) = cp->peeraddr6; peeraddr.ss_family = AF_INET6; } else { GET_INADDR(peeraddr) = cp->peeraddr; peeraddr.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR peeraddr.ss_len = SOCKLEN(&peeraddr);#endif peer = findexistingpeer(&peeraddr, (struct peer *)0, -1); while (peer != 0) { peer_reset(peer); peer = findexistingpeer(&peeraddr, (struct peer *)peer, -1); } cp = (struct conf_unpeer *)((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); } req_ack(srcadr, inter, inpkt, INFO_OKAY);}/* * do_key_reread - reread the encryption key file */static voiddo_key_reread( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ rereadkeys(); req_ack(srcadr, inter, inpkt, INFO_OKAY);}/* * trust_key - make one or more keys trusted */static voidtrust_key( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ do_trustkey(srcadr, inter, inpkt, 1);}/* * untrust_key - make one or more keys untrusted */static voiduntrust_key( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ do_trustkey(srcadr, inter, inpkt, 0);}/* * do_trustkey - make keys either trustable or untrustable */static voiddo_trustkey( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt, u_long trust ){ register u_long *kp; register int items; items = INFO_NITEMS(inpkt->err_nitems); kp = (u_long *)inpkt->data; while (items-- > 0) { authtrust(*kp, trust); kp++; } req_ack(srcadr, inter, inpkt, INFO_OKAY);}/* * get_auth_info - return some stats concerning the authentication module */static voidget_auth_info( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_auth *ia; /* * Importations from the authentication module */ extern u_long authnumkeys; extern int authnumfreekeys; extern u_long authkeylookups; extern u_long authkeynotfound; extern u_long authencryptions; extern u_long authdecryptions; extern u_long authkeyuncached; extern u_long authkeyexpired; ia = (struct info_auth *)prepare_pkt(srcadr, inter, inpkt, sizeof(struct info_auth)); ia->numkeys = htonl((u_int32)authnumkeys); ia->numfreekeys = htonl((u_int32)authnumfreekeys); ia->keylookups = htonl((u_int32)authkeylookups); ia->keynotfound = htonl((u_int32)authkeynotfound); ia->encryptions = htonl((u_int32)authencryptions); ia->decryptions = htonl((u_int32)authdecryptions); ia->keyuncached = htonl((u_int32)authkeyuncached); ia->expired = htonl((u_int32)authkeyexpired); ia->timereset = htonl((u_int32)(current_time - auth_timereset)); (void) more_pkt(); flush_pkt();}/* * reset_auth_stats - reset the authentication stat counters. Done here * to keep ntp-isms out of the authentication module */static voidreset_auth_stats(void){ /* * Importations from the authentication module */ extern u_long authkeylookups; extern u_long authkeynotfound; extern u_long authencryptions; extern u_long authdecryptions; extern u_long authkeyuncached; authkeylookups = 0; authkeynotfound = 0; authencryptions = 0; authdecryptions = 0; authkeyuncached = 0; auth_timereset = current_time;}/* * req_get_traps - return information about current trap holders */static voidreq_get_traps( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_trap *it; register struct ctl_trap *tr; register int i; /* * Imported from the control module */ extern struct ctl_trap ctl_trap[]; extern int num_ctl_traps; if (num_ctl_traps == 0) { req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); return; } it = (struct info_trap *)prepare_pkt(srcadr, inter, inpkt, v6sizeof(struct info_trap)); for (i = 0, tr = ctl_trap; i < CTL_MAXTRAPS; i++, tr++) { if (tr->tr_flags & TRAP_INUSE) { if (tr->tr_addr.ss_family == AF_INET) { if (tr->tr_localaddr == any_interface) it->local_address = 0; else it->local_address = GET_INADDR(tr->tr_localaddr->sin); it->trap_address = GET_INADDR(tr->tr_addr); if (client_v6_capable) it->v6_flag = 0; } else { if (!client_v6_capable) continue; it->local_address6 = GET_INADDR6(tr->tr_localaddr->sin); it->trap_address6 = GET_INADDR6(tr->tr_addr); it->v6_flag = 1; } it->trap_port = NSRCPORT(&tr->tr_addr); it->sequence = htons(tr->tr_sequence); it->settime = htonl((u_int32)(current_time - tr->tr_settime)); it->origtime = htonl((u_int32)(current_time - tr->tr_origtime)); it->resets = htonl((u_int32)tr->tr_resets); it->flags = htonl((u_int32)tr->tr_flags); it = (struct info_trap *)more_pkt(); } } flush_pkt();}/* * req_set_trap - configure a trap */static voidreq_set_trap( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ do_setclr_trap(srcadr, inter, inpkt, 1);}/* * req_clr_trap - unconfigure a trap */static voidreq_clr_trap( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ do_setclr_trap(srcadr, inter, inpkt, 0);}/* * do_setclr_trap - do the grunge work of (un)configuring a trap */static voiddo_setclr_trap( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt, int set ){ register struct conf_trap *ct; register struct interface *linter; int res; struct sockaddr_storage laddr; /* * Prepare sockaddr_storage structure */ memset((char *)&laddr, 0, sizeof laddr); laddr.ss_family = srcadr->ss_family; NSRCPORT(&laddr) = ntohs(NTP_PORT); /* * Restrict ourselves to one item only. This eliminates * the error reporting problem. */ if (INFO_NITEMS(inpkt->err_nitems) > 1) { msyslog(LOG_ERR, "do_setclr_trap: err_nitems > 1"); req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); return; } ct = (struct conf_trap *)inpkt->data; /* * Look for the local interface. If none, use the default. */ if (ct->local_address == 0) { linter = any_interface; } else { if (laddr.ss_family == AF_INET) GET_INADDR(laddr) = ct->local_address; else GET_INADDR6(laddr) = ct->local_address6; linter = findinterface(&laddr); if (linter == NULL) { req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); return; } } if (laddr.ss_family == AF_INET) GET_INADDR(laddr) = ct->trap_address; else GET_INADDR6(laddr) = ct->trap_address6; if (ct->trap_port != 0) NSRCPORT(&laddr) = ct->trap_port; else NSRCPORT(&laddr) = htons(TRAPPORT); if (set) { res = ctlsettrap(&laddr, linter, 0, INFO_VERSION(inpkt->rm_vn_mode)); } else { res = ctlclrtrap(&laddr, linter, 0); } if (!res) { req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); } else { req_ack(srcadr, inter, inpkt, INFO_OKAY); } return;}/* * set_request_keyid - set the keyid used to authenticate requests */static voidset_request_keyid( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ keyid_t keyid; /* * Restrict ourselves to one item only. */ if (INFO_NITEMS(inpkt->err_nitems) > 1) { msyslog(LOG_ERR, "set_request_keyid: err_nitems > 1"); req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); return; } keyid = ntohl(*((u_int32 *)(inpkt->data))); info_auth_keyid = keyid; req_ack(srcadr, inter, inpkt, INFO_OKAY);}/* * set_control_keyid - set the keyid used to authenticate requests */static voidset_control_keyid( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ keyid_t keyid; extern keyid_t ctl_auth_keyid; /* * Restrict ourselves to one item only. */ if (INFO_NITEMS(inpkt->err_nitems) > 1) { msyslog(LOG_ERR, "set_control_keyid: err_nitems > 1"); req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); return; } keyid = ntohl(*((u_int32 *)(inpkt->data))); ctl_auth_keyid = keyid; req_ack(srcadr, inter, inpkt, INFO_OKAY);}/* * get_ctl_stats - return some stats concerning the control message module */static voidget_ctl_stats( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_control *ic; /* * Importations from the control module */ extern u_long ctltimereset; extern u_long numctlreq; extern u_long numctlbadpkts; extern u_long numctlresponses; extern u_long numctlfrags; extern u_long numctlerrors; extern u_long numctltooshort; extern u_long numctlinputresp; extern u_long numctlinputfrag; extern u_long numctlinputerr; extern u_long numctlbadoffset; extern u_long numctlbadversion; extern u_long numctldatatooshort; extern u_long numctlbadop; extern u_long numasyncmsgs; ic = (struct info_control *)prepare_pkt(srcadr, inter, inpkt, sizeof(struct info_control)); ic->ctltimereset = htonl((u_int32)(current_time - ctltimereset)); ic->numctlreq = htonl((u_int32)numctlreq); ic->numctlbadpkts = htonl((u_int32)numctlbadpkts); ic->numctlresponses = htonl((u_int32)numctlresponses); ic->numctlfrags = htonl((u_int32)numctlfrags); ic->numctlerrors = htonl((u_int32)numctlerrors); ic->numctltooshort = htonl((u_int32)numctltooshort); ic->numctlinputresp = htonl((u_int32)numctlinputresp); ic->numctlinputfrag = htonl((u_int32)numctlinputfrag); ic->numctlinputerr = htonl((u_int32)numctlinputerr); ic->numctlbadoffset = htonl((u_int32)numctlbadoffset); ic->numctlbadversion = htonl((u_int32)numctlbadversion); ic->numctldatatooshort = htonl((u_int32)numctldatatooshort); ic->numctlbadop = htonl((u_int32)numctlbadop); ic->numasyncmsgs = htonl((u_int32)numasyncmsgs); (void) more_pkt(); flush_pkt();}#ifdef KERNEL_PLL/* * get_kernel_info - get kernel pll/pps information */static voidget_kernel_info( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_kernel *ik; struct timex ntx; if (!pll_control) { req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -