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

📄 ntpq_ops.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 3 页
字号:
		(void) fprintf(fp, "server=%s ", currenthost);	if (dsize == 0) {		(void) fprintf(fp,				   "No information returned for association %u\n",				   associd);		return;	}	(void) fprintf(fp,"assID=%d ",associd);	printvars(dsize, datap, (int)rstatus, TYPE_PEER, fp);}/* * when - print how long its been since his last packet arrived */static longwhen(	l_fp *ts,	l_fp *rec,	l_fp *reftime	){	l_fp *lasttime;	if (rec->l_ui != 0)		lasttime = rec;	else if (reftime->l_ui != 0)		lasttime = reftime;	else		return 0;	return (ts->l_ui - lasttime->l_ui);}/* * Pretty-print an interval into the given buffer, in a human-friendly format. */static char *prettyinterval(	char *buf,	long diff	){	if (diff <= 0) {		buf[0] = '-';		buf[1] = 0;		return buf;	}	if (diff <= 2048) {		(void) sprintf(buf, "%ld", (long int)diff);		return buf;	}	diff = (diff + 29) / 60;	if (diff <= 300) {		(void) sprintf(buf, "%ldm", (long int)diff);		return buf;	}	diff = (diff + 29) / 60;	if (diff <= 96) {		(void) sprintf(buf, "%ldh", (long int)diff);		return buf;	}	diff = (diff + 11) / 24;	(void) sprintf(buf, "%ldd", (long int)diff);	return buf;}static chardecodeaddrtype(	struct sockaddr_storage *sock	){	char ch = '-';	u_int32 dummy;	struct sockaddr_in6 *sin6;	switch(sock->ss_family) {	case AF_INET:		dummy = ((struct sockaddr_in *)sock)->sin_addr.s_addr;		dummy = ntohl(dummy);		ch = (char)(((dummy&0xf0000000)==0xe0000000) ? 'm' :			((dummy&0x000000ff)==0x000000ff) ? 'b' :			((dummy&0xffffffff)==0x7f000001) ? 'l' :			((dummy&0xffffffe0)==0x00000000) ? '-' :			'u');		break;	case AF_INET6:		sin6 = (struct sockaddr_in6 *)sock;		if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))			ch = 'm';		else			ch = 'u';		break;	default:		ch = '-';		break;	}	return ch;}/* * A list of variables required by the peers command */struct varlist opeervarlist[] = {	{ "srcadr", 0 },    /* 0 */	{ "dstadr", 0 },    /* 1 */	{ "stratum",    0 },    /* 2 */	{ "hpoll",  0 },    /* 3 */	{ "ppoll",  0 },    /* 4 */	{ "reach",  0 },    /* 5 */	{ "delay",  0 },    /* 6 */	{ "offset", 0 },    /* 7 */	{ "jitter", 0 },    /* 8 */	{ "dispersion", 0 },    /* 9 */	{ "rec",    0 },    /* 10 */	{ "reftime",    0 },    /* 11 */	{ "srcport",    0 },    /* 12 */	{ 0,		0 }};struct varlist peervarlist[] = {	{ "srcadr", 0 },    /* 0 */	{ "refid",  0 },    /* 1 */	{ "stratum",    0 },    /* 2 */	{ "hpoll",  0 },    /* 3 */	{ "ppoll",  0 },    /* 4 */	{ "reach",  0 },    /* 5 */	{ "delay",  0 },    /* 6 */	{ "offset", 0 },    /* 7 */	{ "jitter", 0 },    /* 8 */	{ "dispersion", 0 },    /* 9 */	{ "rec",    0 },    /* 10 */	{ "reftime",    0 },    /* 11 */	{ "srcport",    0 },    /* 12 */	{ 0,		0 }};#define HAVE_SRCADR 0#define HAVE_DSTADR 1#define HAVE_REFID	1#define HAVE_STRATUM	2#define HAVE_HPOLL	3#define HAVE_PPOLL	4#define HAVE_REACH	5#define HAVE_DELAY	6#define HAVE_OFFSET 7#define HAVE_JITTER 8#define HAVE_DISPERSION 9#define HAVE_REC	10#define HAVE_REFTIME	11#define HAVE_SRCPORT	12#define MAXHAVE 	13/* * Decode an incoming data buffer and print a line in the peer list */static intdoprintpeers(	struct varlist *pvl,	int associd,	int rstatus,	int datalen,	char *data,	FILE *fp,	int af	){	char *name;	char *value = NULL;	int i;	int c;	struct sockaddr_storage srcadr;	struct sockaddr_storage dstadr;	u_long srcport = 0;	char *dstadr_refid = "0.0.0.0";	u_long stratum = 0;	long ppoll = 0;	long hpoll = 0;	u_long reach = 0;	l_fp estoffset;	l_fp estdelay;	l_fp estjitter;	l_fp estdisp;	l_fp reftime;	l_fp rec;	l_fp ts;	u_char havevar[MAXHAVE];	u_long poll_sec;	char type = '?';	char refid_string[10];	char whenbuf[8], pollbuf[8];	char clock_name[LENHOSTNAME];	memset((char *)havevar, 0, sizeof(havevar));	get_systime(&ts);		memset((char *)&srcadr, 0, sizeof(struct sockaddr_storage));	memset((char *)&dstadr, 0, sizeof(struct sockaddr_storage));	/* Initialize by zeroing out estimate variables */	memset((char *)&estoffset, 0, sizeof(l_fp));	memset((char *)&estdelay, 0, sizeof(l_fp));	memset((char *)&estjitter, 0, sizeof(l_fp));	memset((char *)&estdisp, 0, sizeof(l_fp));	while (nextvar(&datalen, &data, &name, &value)) {		struct sockaddr_storage dum_store;		i = findvar(name, peer_var, 1);		if (i == 0)			continue;	/* don't know this one */		switch (i) {			case CP_SRCADR:			if (decodenetnum(value, &srcadr))				havevar[HAVE_SRCADR] = 1;			break;			case CP_DSTADR:			if (decodenetnum(value, &dum_store))				type = decodeaddrtype(&dum_store);			if (pvl == opeervarlist) {				if (decodenetnum(value, &dstadr)) {					havevar[HAVE_DSTADR] = 1;					dstadr_refid = stoa(&dstadr);				}			}			break;			case CP_REFID:			if (pvl == peervarlist) {				havevar[HAVE_REFID] = 1;				if (*value == '\0') {					dstadr_refid = "0.0.0.0";				} else if (decodenetnum(value, &dstadr)) {					if (SOCKNUL(&dstadr))						dstadr_refid = "0.0.0.0";					else if ((dstadr.ss_family == AF_INET)					    && ISREFCLOCKADR(&dstadr))    						dstadr_refid =						    refnumtoa(&dstadr);					else						dstadr_refid =						    stoa(&dstadr);				} else if ((int)strlen(value) <= 4) {					refid_string[0] = '.';					(void) strcpy(&refid_string[1], value);					i = strlen(refid_string);					refid_string[i] = '.';					refid_string[i+1] = '\0';					dstadr_refid = refid_string;				} else {					havevar[HAVE_REFID] = 0;				}			}			break;			case CP_STRATUM:			if (decodeuint(value, &stratum))				havevar[HAVE_STRATUM] = 1;			break;			case CP_HPOLL:			if (decodeint(value, &hpoll)) {				havevar[HAVE_HPOLL] = 1;				if (hpoll < 0)					hpoll = NTP_MINPOLL;			}			break;			case CP_PPOLL:			if (decodeint(value, &ppoll)) {				havevar[HAVE_PPOLL] = 1;				if (ppoll < 0)					ppoll = NTP_MINPOLL;			}			break;			case CP_REACH:			if (decodeuint(value, &reach))				havevar[HAVE_REACH] = 1;			break;			case CP_DELAY:			if (decodetime(value, &estdelay))				havevar[HAVE_DELAY] = 1;			break;			case CP_OFFSET:			if (decodetime(value, &estoffset))				havevar[HAVE_OFFSET] = 1;			break;			case CP_JITTER:			if (decodetime(value, &estjitter))				havevar[HAVE_JITTER] = 1;			break;			case CP_DISPERSION:			if (decodetime(value, &estdisp))				havevar[HAVE_DISPERSION] = 1;			break;			case CP_REC:			if (decodets(value, &rec))				havevar[HAVE_REC] = 1;			break;			case CP_SRCPORT:			if (decodeuint(value, &srcport))				havevar[HAVE_SRCPORT] = 1;			break;			case CP_REFTIME:			havevar[HAVE_REFTIME] = 1;			if (!decodets(value, &reftime))				L_CLR(&reftime);			break;			default:			break;		}	}	/*	 * Check to see if the srcport is NTP's port.  If not this probably	 * isn't a valid peer association.	 */	if (havevar[HAVE_SRCPORT] && srcport != NTP_PORT)		return (1);	/*	 * Got everything, format the line	 */	poll_sec = 1<<max(min3(ppoll, hpoll, NTP_MAXPOLL), NTP_MINPOLL);	if (pktversion > NTP_OLDVERSION)		c = flash3[CTL_PEER_STATVAL(rstatus) & 0x7];	else		c = flash2[CTL_PEER_STATVAL(rstatus) & 0x3];	if (numhosts > 1)		(void) fprintf(fp, "%-*s ", maxhostlen, currenthost);	if (af == 0 || srcadr.ss_family == af){		strcpy(clock_name, nntohost(&srcadr));				(void) fprintf(fp,			"%c%-15.15s %-15.15s %2ld %c %4.4s %4.4s  %3lo  %7.7s %8.7s %7.7s\n",			c, clock_name, dstadr_refid, stratum, type,			prettyinterval(whenbuf, when(&ts, &rec, &reftime)),			prettyinterval(pollbuf, (int)poll_sec), reach,			lfptoms(&estdelay, 3), lfptoms(&estoffset, 3),			havevar[HAVE_JITTER] ? lfptoms(&estjitter, 3) :			lfptoms(&estdisp, 3));		return (1);	}	else		return(1);}#undef	HAVE_SRCADR#undef	HAVE_DSTADR#undef	HAVE_STRATUM#undef	HAVE_PPOLL#undef	HAVE_HPOLL#undef	HAVE_REACH#undef	HAVE_ESTDELAY#undef	HAVE_ESTOFFSET#undef	HAVE_JITTER#undef	HAVE_ESTDISP#undef	HAVE_REFID#undef	HAVE_REC#undef	HAVE_SRCPORT#undef	HAVE_REFTIME#undef	MAXHAVE/* * dogetpeers - given an association ID, read and print the spreadsheet *		peer variables. */static intdogetpeers(	struct varlist *pvl,	int associd,	FILE *fp,	int af	){	char *datap;	int res;	int dsize;	u_short rstatus;#ifdef notdef	res = doquerylist(pvl, CTL_OP_READVAR, associd, 0, &rstatus,			  &dsize, &datap);#else	/*	 * Damn fuzzballs	 */	res = doquery(CTL_OP_READVAR, associd, 0, 0, (char *)0, &rstatus,			  &dsize, &datap);#endif	if (res != 0)		return 0;	if (dsize == 0) {		if (numhosts > 1)			(void) fprintf(stderr, "server=%s ", currenthost);		(void) fprintf(stderr,				   "***No information returned for association %d\n",				   associd);		return 0;	}	return doprintpeers(pvl, associd, (int)rstatus, dsize, datap, fp, af);}/* * peers - print a peer spreadsheet */static voiddopeers(	int showall,	FILE *fp,	int af	){	register int i;	char fullname[LENHOSTNAME];	struct sockaddr_storage netnum;	if (!dogetassoc(fp))		return;	for (i = 0; i < numhosts; ++i) {		if (getnetnum(chosts[i], &netnum, fullname, af))			if ((int)strlen(fullname) > maxhostlen)				maxhostlen = strlen(fullname);	}	if (numhosts > 1)		(void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "server");	(void) fprintf(fp,			   "     remote           refid      st t when poll reach   delay   offset  jitter\n");	if (numhosts > 1)		for (i = 0; i <= maxhostlen; ++i)		(void) fprintf(fp, "=");	(void) fprintf(fp,			   "==============================================================================\n");	for (i = 0; i < numassoc; i++) {		if (!showall &&			!(CTL_PEER_STATVAL(assoc_cache[i].status)			  & (CTL_PST_CONFIG|CTL_PST_REACH)))			continue;		if (!dogetpeers(peervarlist, (int)assoc_cache[i].assid, fp, af)) {			return;		}	}	return;}/* * peers - print a peer spreadsheet *//*ARGSUSED*/static voidpeers(	struct parse *pcmd,	FILE *fp	){	int af = 0;	if (pcmd->nargs == 1) {		if (pcmd->argval->ival == 6)			af = AF_INET6;		else			af = AF_INET;	}	dopeers(0, fp, af);}/* * lpeers - print a peer spreadsheet including all fuzzball peers *//*ARGSUSED*/static voidlpeers(	struct parse *pcmd,	FILE *fp	){	int af = 0;	if (pcmd->nargs == 1) {		if (pcmd->argval->ival == 6)			af = AF_INET6;		else			af = AF_INET;	}	dopeers(1, fp, af);}/* * opeers - print a peer spreadsheet */static voiddoopeers(	int showall,	FILE *fp,	int af	){	register int i;	char fullname[LENHOSTNAME];	struct sockaddr_storage netnum;	if (!dogetassoc(fp))		return;	for (i = 0; i < numhosts; ++i) {		if (getnetnum(chosts[i], &netnum, fullname, af))			if ((int)strlen(fullname) > maxhostlen)				maxhostlen = strlen(fullname);	}	if (numhosts > 1)		(void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "server");	(void) fprintf(fp,			   "     remote           local      st t when poll reach   delay   offset    disp\n");	if (numhosts > 1)		for (i = 0; i <= maxhostlen; ++i)		(void) fprintf(fp, "=");	(void) fprintf(fp,			   "==============================================================================\n");	for (i = 0; i < numassoc; i++) {		if (!showall &&			!(CTL_PEER_STATVAL(assoc_cache[i].status)			  & (CTL_PST_CONFIG|CTL_PST_REACH)))			continue;		if (!dogetpeers(opeervarlist, (int)assoc_cache[i].assid, fp, af)) {			return;		}	}	return;}/* * opeers - print a peer spreadsheet the old way *//*ARGSUSED*/static voidopeers(	struct parse *pcmd,	FILE *fp	){	int af = 0;	if (pcmd->nargs == 1) {		if (pcmd->argval->ival == 6)			af = AF_INET6;		else			af = AF_INET;	}	doopeers(0, fp, af);}/* * lopeers - print a peer spreadsheet including all fuzzball peers *//*ARGSUSED*/static voidlopeers(	struct parse *pcmd,	FILE *fp	){	int af = 0;	if (pcmd->nargs == 1) {		if (pcmd->argval->ival == 6)			af = AF_INET6;		else			af = AF_INET;	}	doopeers(1, fp, af);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -