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

📄 ntpdc_ops.c

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