⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntp_request.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -