cmds.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 690 行 · 第 1/2 页

C
690
字号
		bytehostorder(&msg);		if (msg.tsp_type == TSP_ACK)			if (onflag)				printf("timed tracing enabled\n");			else				printf("timed tracing disabled\n");		else			printf("wrong ack received: %s\n", 						tsptype[msg.tsp_type]);	} else		printf("communication error\n");}priv_resources(){	int port;	struct sockaddr_in sin;	sock = socket(AF_INET, SOCK_DGRAM, 0);	if (sock < 0) {		perror("opening socket");		return(-1);	}	sin.sin_family = AF_INET;	sin.sin_addr.s_addr = 0;	for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) {		sin.sin_port = htons((u_short)port);		if (bind(sock, (struct sockaddr *)&sin, sizeof (sin)) >= 0)			break;		if (errno != EADDRINUSE && errno != EADDRNOTAVAIL) {			perror("bind");			(void) close(sock);			return(-1);		}	}	if (port == IPPORT_RESERVED / 2) {		fprintf(stderr, "all reserved ports in use\n");		(void) close(sock);		return(-1);	}	sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 	if (sock_raw < 0)  {		perror("opening raw socket");		(void) close(sock_raw);		return(-1);	}	return(1);}#define	INCR	1#define	DECR	0incr(argc, argv)int argc;char *argv[];{	adjusttime(argc, argv, INCR);}decr(argc, argv)int argc;char *argv[];{	adjusttime(argc, argv, DECR);}adjusttime(argc, argv, inc)int argc;char *argv[];int	inc;{	int dflag = 1, cflag = 0, gflag = 0;	struct timeval	tv;	struct timezone	tz;	struct timeval	timeskew;	argv++; argc--;	if(argc > 0 && argv[0][0] == '-') {		switch ((int)argv[0][1]) {		case 'd':			break;		case 'c':			cflag++;			dflag--;			break;		case 'g':			gflag++;			dflag--;			break;		 default:			printf("Usage: incr/decr [-dc] [minutes:][seconds][.micro_seconds]\n");			return;		}		argc--;		argv++;	}	if(!parse_adj(argv[0], &timeskew)) {		printf("Usage: incr/decr [-dc] [minutes:][seconds][.micro_seconds]\n");		return;	}	else {		argc--; argv++;	}	if(argc > 0) {			printf("Usage: incr/decr [-dc] [minutes:][seconds][.micro_seconds]\n");		return;	}	if(!inc) {		timeskew.tv_sec = -timeskew.tv_sec;		timeskew.tv_usec = -timeskew.tv_usec;		}	if (dflag) {		(void) gettimeofday(&tv, (struct timezone *)0);		tv.tv_sec += timeskew.tv_sec;		tv.tv_usec += timeskew.tv_usec;			if (settimeofday(&tv, (struct timezone *)0) < 0) {			perror("settimeofday");		}	}	else if(gflag) {		settime(timeskew);	}	else {		if(adjtime(&timeskew, (struct timeval *)0) < 0) {			perror("adjtime:");		}	}}parse_adj(adj_str, time_skew)	char	*adj_str;	struct timeval	*time_skew;{	char	minstr[20];	char	secstr[20];	char	usecstr[20];	int	min_sec = 0;	int	num_args = 0;	if(adj_str == NULL)		return(0);	usecstr[0] = '\0';	if((num_args = sscanf(adj_str, "%[0-9]:%[0-9].%[0-9]",			minstr, secstr, usecstr)) < 3) {		minstr[0] = '\0';		secstr[0] = '\0';		if((num_args = sscanf(adj_str, "%[0-9]:%[0-9]",				minstr, secstr)) < 2) {			minstr[0] = '\0';			if((num_args = sscanf(adj_str, "%[0-9].%[0-9]",					secstr, usecstr)) < 2) {				secstr[0] = '\0';				if(sscanf(adj_str, "%[0-9]", usecstr) == 0) {					return(0);				}			}		} else			min_sec = 1;	}			if(num_args == 1)		if(strlen(usecstr) != strlen(adj_str))			return(0);	else if(num_args == 2)		if(min_sec == 1 &&			(strlen(minstr) + strlen(secstr)) != strlen(adj_str))				return(0);		else if(min_sec == 0 &&			(strlen(secstr) + strlen(usecstr)) != strlen(adj_str))				return(0);	else if(num_args == 3 &&			(strlen(minstr) + strlen(secstr) + strlen(usecstr))				!= strlen(adj_str))		return(0);/*	if( (strlen(minstr) + strlen(secstr) + strlen(usecstr))	   		!= strlen(adj_str)) {		return(0);	}*/	time_skew->tv_usec = atol(usecstr);	time_skew->tv_sec = (60 * atol(minstr)) + atol(secstr);	return(1);}#define WAITACK		2	/* seconds */#define WAITDATEACK	5	/* seconds *//* * Set the date in the machines controlled by timedaemons * by communicating the new date to the local timedaemon.  * If the timedaemon is in the master state, it performs the * correction on all slaves.  If it is in the slave state, it * notifies the master that a correction is needed. * Returns 1 on success, 0 on failure. */settime(timeskew)	struct timeval timeskew;{	struct timeval tv;	int s, length, port, timed_ack, found, err;	long waittime;	fd_set ready;	char hostname[MAXHOSTNAMELEN];	struct timeval tout;	struct servent *sp;	struct tsp msg;	struct sockaddr_in sin, dest, from;	sp = getservbyname("timed", "udp");	if (sp == 0) {		fprintf(stderr, "udp/timed: unknown service\n");		return (0);	}		dest.sin_port = sp->s_port;	dest.sin_family = AF_INET;	dest.sin_addr.s_addr = htonl((u_long)INADDR_ANY);	s = socket(AF_INET, SOCK_DGRAM, 0);	if (s < 0) {		if (errno != EPROTONOSUPPORT)			perror("date: socket");		goto bad;	}	bzero((char *)&sin, sizeof (sin));	sin.sin_family = AF_INET;	for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) {		sin.sin_port = htons((u_short)port);		if (bind(s, (struct sockaddr *)&sin, sizeof (sin)) >= 0)			break;		if (errno != EADDRINUSE) {			if (errno != EADDRNOTAVAIL)				perror("date: bind");			goto bad;		}	}	if (port == IPPORT_RESERVED / 2) {		fprintf(stderr, "date: All ports in use\n");		goto bad;	}	msg.tsp_type = TSP_SETDATE;	msg.tsp_vers = TSPVERSION;	(void) gethostname(hostname, sizeof (hostname));	(void) strncpy(msg.tsp_name, hostname, sizeof (hostname));	msg.tsp_seq = htons((u_short)0);/*	msg.tsp_time.tv_sec = htonl((u_long)tv.tv_sec);	msg.tsp_time.tv_usec = htonl((u_long)tv.tv_usec);*/	length = sizeof (struct sockaddr_in);	if (connect(s, &dest, length) < 0) {		perror("date: connect");		goto bad;	}	(void) gettimeofday(&tv, (struct timezone *)0);	tv.tv_sec += timeskew.tv_sec;	tv.tv_usec += timeskew.tv_usec;	msg.tsp_time.tv_sec = htonl((u_long)tv.tv_sec);	msg.tsp_time.tv_usec = htonl((u_long)tv.tv_usec);	if (send(s, (char *)&msg, sizeof (struct tsp), 0) < 0) {		if (errno != ECONNREFUSED)			perror("date: send");		goto bad;	}	timed_ack = -1;	waittime = WAITACK;loop:	tout.tv_sec = waittime;	tout.tv_usec = 0;	FD_ZERO(&ready);	FD_SET(s, &ready);	found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout);	length = sizeof(err);	if (getsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&err, &length) == 0	    && err) {		errno = err;		if (errno != ECONNREFUSED)			perror("date: send (delayed error)");		goto bad;	}	if (found > 0 && FD_ISSET(s, &ready)) {		length = sizeof (struct sockaddr_in);		if (recvfrom(s, (char *)&msg, sizeof (struct tsp), 0, &from,		    &length) < 0) {			if (errno != ECONNREFUSED)				perror("date: recvfrom");			goto bad;		}		msg.tsp_seq = ntohs(msg.tsp_seq);		msg.tsp_time.tv_sec = ntohl(msg.tsp_time.tv_sec);		msg.tsp_time.tv_usec = ntohl(msg.tsp_time.tv_usec);		switch (msg.tsp_type) {		case TSP_ACK:			timed_ack = TSP_ACK;			waittime = WAITDATEACK;			goto loop;		case TSP_DATEACK:			(void)close(s);			return (1);		default:			fprintf(stderr,			    "date: Wrong ack received from timed: %s\n", 			    tsptype[msg.tsp_type]);			timed_ack = -1;			break;		}	}	if (timed_ack == -1)		fprintf(stderr,		    "date: Can't reach time daemon, time set locally.\n");bad:	(void)close(s);	return (0);}

⌨️ 快捷键说明

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