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

📄 ntpdc_ops.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 5 页
字号:
};static struct resflags resmflags[] = {	{ "ntpport",	RESM_NTPONLY },	{ "interface",	RESM_INTERFACE },	{ "",		0 }};/* * reslist - obtain and print the server's restrict list *//*ARGSUSED*/static voidreslist(	struct parse *pcmd,	FILE *fp	){	struct info_restrict *rl;	struct sockaddr_storage resaddr;	struct sockaddr_storage maskaddr;	int items;	int itemsize;	int res;	int skip;	char *addr;	char *mask;	struct resflags *rf;	u_int32 count;	u_short flags;	u_short mflags;	char flagstr[300];	static const char *comma = ", ";again:	res = doquery(impl_ver, REQ_GET_RESTRICT, 0, 0, 0, (char *)NULL,		      &items, &itemsize, (void *)&rl, 0, 		      sizeof(struct info_restrict));		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_restrict)) &&	    !checkitemsize(itemsize, v4sizeof(struct info_restrict)))	    return;	(void) fprintf(fp,	       "   address          mask            count        flags\n");	(void) fprintf(fp,		       "=====================================================================\n");	while (items > 0) {		memset((char *)&resaddr, 0, sizeof(resaddr));		memset((char *)&maskaddr, 0, sizeof(maskaddr));		if (rl->v6_flag != 0) {			GET_INADDR6(resaddr) = rl->addr6;			GET_INADDR6(maskaddr) = rl->mask6;			resaddr.ss_family = AF_INET6;			maskaddr.ss_family = AF_INET6;#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR			resaddr.ss_len = SOCKLEN(&resaddr);#endif			addr = nntohost(&resaddr);		} else {			GET_INADDR(resaddr) = rl->addr;			GET_INADDR(maskaddr) = rl->mask;			resaddr.ss_family = AF_INET;			maskaddr.ss_family = AF_INET;#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR			resaddr.ss_len = SOCKLEN(&resaddr);#endif			if ((rl->mask == (u_int32)0xffffffff))		    		addr = nntohost(&resaddr);			else				addr = stoa(&resaddr);		}		mask = stoa(&maskaddr);		skip = 1;		if ((pcmd->nargs == 0) ||		    ((pcmd->argval->ival == 6) && (rl->v6_flag != 0)) ||		    ((pcmd->argval->ival == 4) && (rl->v6_flag == 0)))			skip = 0;		count = ntohl(rl->count);		flags = ntohs(rl->flags);		mflags = ntohs(rl->mflags);		flagstr[0] = '\0';		res = 1;		rf = &resmflags[0];		while (rf->bit != 0) {			if (mflags & rf->bit) {				if (!res)				    (void) strcat(flagstr, comma);				res = 0;				(void) strcat(flagstr, rf->str);			}			rf++;		}		rf = (impl_ver == IMPL_XNTPD_OLD)		     ? &resflagsV2[0]		     : &resflagsV3[0]		     ;		while (rf->bit != 0) {			if (flags & rf->bit) {				if (!res)				    (void) strcat(flagstr, comma);				res = 0;				(void) strcat(flagstr, rf->str);			}			rf++;		}		if (flagstr[0] == '\0')		    (void) strcpy(flagstr, "none");		if (!skip)			(void) fprintf(fp, "%-15.15s %-15.15s %9ld  %s\n",					addr, mask, (u_long)count, flagstr);		rl++;		items--;	}}/* * new_restrict - create/add a set of restrictions */static voidnew_restrict(	struct parse *pcmd,	FILE *fp	){	do_restrict(pcmd, fp, REQ_RESADDFLAGS);}/* * unrestrict - remove restriction flags from existing entry */static voidunrestrict(	struct parse *pcmd,	FILE *fp	){	do_restrict(pcmd, fp, REQ_RESSUBFLAGS);}/* * delrestrict - delete an existing restriction */static voiddelrestrict(	struct parse *pcmd,	FILE *fp	){	do_restrict(pcmd, fp, REQ_UNRESTRICT);}/* * do_restrict - decode commandline restrictions and make the request */static voiddo_restrict(	struct parse *pcmd,	FILE *fp,	int req_code	){	struct conf_restrict cres;	int items;	int itemsize;	char *dummy;	u_int32 num;	u_long bit;	int i;	int res;	int err;	int sendsize;	/* Initialize cres */	cres.addr = 0;	cres.mask = 0;	cres.flags = 0;	cres.mflags = 0;	cres.v6_flag = 0;again:	if (impl_ver == IMPL_XNTPD)		sendsize = sizeof(struct conf_restrict);	else		sendsize = v4sizeof(struct conf_restrict);	if (pcmd->argval[0].netnum.ss_family == AF_INET) {		cres.addr = GET_INADDR(pcmd->argval[0].netnum);		cres.mask = GET_INADDR(pcmd->argval[1].netnum);		if (impl_ver == IMPL_XNTPD)			cres.v6_flag = 0;	} else {		if (impl_ver == IMPL_XNTPD_OLD) {			fprintf(stderr,			    "***Server doesn't understand IPv6 addresses\n");			return;		}		cres.addr6 = GET_INADDR6(pcmd->argval[0].netnum);		cres.v6_flag = 1;	}	cres.flags = 0;	cres.mflags = 0;	err = 0;	for (res = 2; res < pcmd->nargs; res++) {		if (STREQ(pcmd->argval[res].string, "ntpport")) {			cres.mflags |= RESM_NTPONLY;		} else {			for (i = 0; resflagsV3[i].bit != 0; i++) {				if (STREQ(pcmd->argval[res].string,					  resflagsV3[i].str))				    break;			}			if (resflagsV3[i].bit != 0) {				cres.flags |= resflagsV3[i].bit;				if (req_code == REQ_UNRESTRICT) {					(void) fprintf(fp,						       "Flag %s inappropriate\n",						       resflagsV3[i].str);					err++;				}			} else {				(void) fprintf(fp, "Unknown flag %s\n",					       pcmd->argval[res].string);				err++;			}		}	}	/*	 * Make sure mask for default address is zero.  Otherwise,	 * make sure mask bits are contiguous.	 */	if (pcmd->argval[0].netnum.ss_family == AF_INET) {		if (cres.addr == 0) {			cres.mask = 0;		} else {			num = ntohl(cres.mask);			for (bit = 0x80000000; bit != 0; bit >>= 1)			    if ((num & bit) == 0)				break;			for ( ; bit != 0; bit >>= 1)			    if ((num & bit) != 0)				break;			if (bit != 0) {				(void) fprintf(fp, "Invalid mask %s\n",					       numtoa(cres.mask));				err++;			}		}	} else {		/* XXX IPv6 sanity checking stuff */	}	if (err)	    return;	res = doquery(impl_ver, req_code, 1, 1,		      sendsize, (char *)&cres, &items,		      &itemsize, &dummy, 0, sizeof(struct conf_restrict));		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;}/* * monlist - obtain and print the server's monitor data *//*ARGSUSED*/static voidmonlist(	struct parse *pcmd,	FILE *fp	){	char *struct_star;	struct sockaddr_storage addr;	struct sockaddr_storage dstadr;	int items;	int itemsize;	int res;	int version = -1;	if (pcmd->nargs > 0) {		version = pcmd->argval[0].ival;	}again:	res = doquery(impl_ver,		      (version == 1 || version == -1) ? REQ_MON_GETLIST_1 :		      REQ_MON_GETLIST, 0, 0, 0, (char *)NULL,		      &items, &itemsize, &struct_star,		      (version < 0) ? (1 << INFO_ERR_REQ) : 0, 		      sizeof(struct info_monitor_1));	if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) {		impl_ver = IMPL_XNTPD_OLD;		goto again;	}	if (res == INFO_ERR_REQ && version < 0) 	    res = doquery(impl_ver, REQ_MON_GETLIST, 0, 0, 0, (char *)NULL,			  &items, &itemsize, &struct_star, 0, 			  sizeof(struct info_monitor));		if (res != 0)	    return;	if (!checkitems(items, fp))	    return;	if (itemsize == sizeof(struct info_monitor_1) ||	    itemsize == v4sizeof(struct info_monitor_1)) {		struct info_monitor_1 *ml = (struct info_monitor_1 *) struct_star;		(void) fprintf(fp,			       "remote address          port local address      count m ver code avgint  lstint\n");		(void) fprintf(fp,			       "===============================================================================\n");		while (items > 0) {			memset((char *)&addr, 0, sizeof(addr));			memset((char *)&dstadr, 0, sizeof(dstadr));			if (ml->v6_flag != 0) {				GET_INADDR6(addr) = ml->addr6;				addr.ss_family = AF_INET6;				GET_INADDR6(dstadr) = ml->daddr6;				dstadr.ss_family = AF_INET6;			} else {				GET_INADDR(addr) = ml->addr;				addr.ss_family = AF_INET;				GET_INADDR(dstadr) = ml->daddr;				dstadr.ss_family = AF_INET;			}#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR			addr.ss_len = SOCKLEN(&addr);			dstadr.ss_len = SOCKLEN(&dstadr);#endif			if ((pcmd->nargs == 0) ||			    ((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) ||			    ((pcmd->argval->ival == 4) && (ml->v6_flag == 0)))				(void) fprintf(fp, 				    "%-22.22s %5d %-15s %8ld %1d %1d %6lx %6lu %7lu\n",				    nntohost(&addr), 				    ntohs(ml->port),				    stoa(&dstadr),				    (u_long)ntohl(ml->count),				    ml->mode,				    ml->version,				    (u_long)ntohl(ml->lastdrop),				    (u_long)ntohl(ml->lasttime),				    (u_long)ntohl(ml->firsttime));			ml++;			items--;		}	} else if (itemsize == sizeof(struct info_monitor) ||	    itemsize == v4sizeof(struct info_monitor)) {		struct info_monitor *ml = (struct info_monitor *) struct_star;		(void) fprintf(fp,			       "     address               port     count mode ver code avgint  lstint\n");		(void) fprintf(fp,			       "===============================================================================\n");		while (items > 0) {			memset((char *)&dstadr, 0, sizeof(dstadr));			if (ml->v6_flag != 0) {				GET_INADDR6(dstadr) = ml->addr6;				dstadr.ss_family = AF_INET6;			} else {				GET_INADDR(dstadr) = ml->addr;				dstadr.ss_family = AF_INET;			}#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR			dstadr.ss_len = SOCKLEN(&dstadr);#endif			if ((pcmd->nargs == 0) ||			    ((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) ||			    ((pcmd->argval->ival == 4) && (ml->v6_flag == 0)))				(void) fprintf(fp,				    "%-25.25s %5d %9ld %4d %2d %9lx %9lu %9lu\n",				    nntohost(&dstadr),				    ntohs(ml->port),				    (u_long)ntohl(ml->count),				    ml->mode,				    ml->version,				    (u_long)ntohl(ml->lastdrop),				    (u_long)ntohl(ml->lasttime),				    (u_long)ntohl(ml->firsttime));			ml++;			items--;		}	} else if (itemsize == sizeof(struct old_info_monitor)) {		struct old_info_monitor *oml = (struct old_info_monitor *)struct_star;		(void) fprintf(fp,			       "     address          port     count  mode version  lasttime firsttime\n");		(void) fprintf(fp,			       "======================================================================\n");		while (items > 0) {			memset((char *)&dstadr, 0, sizeof(dstadr));			if (oml->v6_flag != 0) {				GET_INADDR6(dstadr) = oml->addr6;				dstadr.ss_family = AF_INET6;			} else {				GET_INADDR(dstadr) = oml->addr;				dstadr.ss_family = AF_INET;			}#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR			dstadr.ss_len = SOCKLEN(&dstadr);#endif			(void) fprintf(fp, "%-20.20s %5d %9ld %4d   %3d %9lu %9lu\n",				       nntohost(&dstadr),				       ntohs(oml->port),				       (u_long)ntohl(oml->count),				       oml->mode,				       oml->version,				       (u_long)ntohl(oml->lasttime),				       (u_long)ntohl(oml->firsttime));			oml++;			items--;		}	} else {		/* issue warning according to new info_monitor size */		checkitemsize(itemsize, sizeof(struct info_monitor));	}}/* * Mapping between command line strings and stat reset flags */struct statreset {  const char *str;	int flag;} sreset[] = {	{ "io",		RESET_FLAG_IO },	{ "sys",	RESET_FLAG_SYS },	{ "mem",	RESET_FLAG_MEM },	{ "timer",	RESET_FLAG_TIMER },	{ "auth",	RESET_FLAG_AUTH },	{ "allpeers",	RESET_FLAG_ALLPEERS },	{ "",		0 }};/* * reset - reset statistic counters */static voidreset(	struct parse *pcmd,	FILE *fp	){	struct reset_flags rflags;	int items;	int itemsize;	char *dummy;	int i;	int res;	int err;	err = 0;	rflags.flags = 0;	for (res = 0; res < pcmd->nargs; res++) {		for (i = 0; sreset[i].flag != 0; i++) {			if (STREQ(pcmd->argval[res].string, sreset[i].str))			    break;		}		if (sreset[i].flag == 0) {			(void) fprintf(fp, "Flag %s unknown\n",				       pcmd->argval[res].string);			err++;		} else {			rflags.flags |= sreset[i].flag;		}	}	if (err) {		(void) fprintf(fp, "Not done due to errors\n");		return;	}again:	res = doquery(impl_ver, REQ_RESET_STATS, 1, 1,		      sizeof(struct reset_flags), (char *)&rflags, &items,		      &itemsize, &dummy, 0, sizeof(struct reset_flags));		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;}/* * preset - reset stat counters for particular peers */static void

⌨️ 快捷键说明

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