ntpd.c

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

C
1,502
字号
	       (pkt->status & LEAPMASK) >> 6, (pkt->status & VERSIONMASK) >> 3,	       pkt->status & MODEMASK, pkt->ppoll, pkt->precision,	       pkt->stratum);	switch (pkt->stratum) {	case 0:	case 1:		printf(" (%.4s)\n", (char *)&pkt->refid);		break;	default:		clock_host.s_addr = (u_long) pkt->refid;		printf(" [%s]\n", inet_ntoa(clock_host));		break;	}	printf("Synch Dist is %04X.%04X  Synch Dispersion is %04X.%04X\n",	       ntohs((u_short) pkt->distance.int_part),	       ntohs((u_short) pkt->distance.fraction),	       ntohs((u_short) pkt->dispersion.int_part),	       ntohs((u_short) pkt->dispersion.fraction));	printf("Reference Timestamp is %08lx.%08lx\n",	       ntohl(pkt->reftime.int_part),	       ntohl(pkt->reftime.fraction));	printf("Originate Timestamp is %08lx.%08lx\n",	       ntohl(pkt->org.int_part),	       ntohl(pkt->org.fraction));	printf("Receive Timestamp is   %08lx.%08lx\n",	       ntohl(pkt->rec.int_part),	       ntohl(pkt->rec.fraction));	printf("Transmit Timestamp is  %08lx.%08lx\n",	       ntohl(pkt->xmt.int_part),	       ntohl(pkt->xmt.fraction));	if(peer != NULL)		printf("Input Timestamp is     %08lx.%08lx\n",		       ntohl(peer->rec.int_part),		       ntohl(peer->rec.fraction));	putchar('\n');}#endifvoidmake_new_peer(peer)	struct ntp_peer *peer;{	int i;	/*	 * initialize peer data fields 	 */	peer->src.sin_family = AF_INET;	peer->src.sin_port = 0;	peer->src.sin_addr.s_addr = 0;	peer->hmode = MODE_SYM_PAS;	/* default: symmetric passive mode */	peer->flags = 0;	peer->timer = 1 << NTP_MINPOLL;	peer->stopwatch = 0;	peer->hpoll = NTP_MINPOLL;	double_to_s_fixed(&peer->dispersion, PEER_MAXDISP);	peer->reach = 0;	peer->estoffset = 0.0;	peer->estdelay = 0.0;	peer->org.int_part = peer->org.fraction = 0;	peer->rec.int_part = peer->rec.fraction = 0;	peer->filter.samples = 0;	for (i = 0; i < NTP_WINDOW; i++) {		peer->filter.offset[i] = 0.0;		peer->filter.delay[i] = 0.0;	}	peer->pkt_sent = 0;	peer->pkt_rcvd = 0;	peer->pkt_dropped = 0;}/* *  This procedure is called to delete a peer from our list of peers. */voiddemobilize(l, peer)	struct list *l;	struct ntp_peer *peer;{	extern struct ntp_peer dummy_peer;	if (peer == &dummy_peer)#ifdef	DEBUG		abort();#else		return;#endif#ifdef	DEBUG	if ((peer->next == NULL && peer->prev == NULL) ||	    l->tail == NULL || l->head == NULL)		abort();#endif	/* delete only peer in list? */	if (l->head == l->tail) {#ifdef	DEBUG		if (l->head != peer) abort();#endif		l->head = l->tail = NULL;		goto dropit;	}	/* delete first peer? */	if (l->head == peer) {		l->head = peer->next;		l->head->prev = NULL;		goto dropit;	}	/* delete last peer? */	if (l->tail == peer) {		l->tail = peer->prev;		l->tail->next = NULL;		goto dropit;	}	/* drop peer in middle */	peer->prev->next = peer->next;	peer->next->prev = peer->prev; dropit:#ifdef	DEBUG	/* just some sanity checking */	if ((l->members < 0) || 	    (l->members && l->tail == NULL) ||	    (l->members == 0 && l->tail != NULL)) {		syslog(LOG_ERR, "List hosed (demobilize)");		abort();	}	peer->next = peer->prev = NULL;#endif	free((char *) peer);	l->members--;	return;}enqueue(l, peer)	register struct list *l;	struct ntp_peer *peer;{	l->members++;	if (l->tail == NULL) {		/* insertion into empty list */		l->tail = l->head = peer;		peer->next = peer->prev = NULL;		return;	}	/* insert at end of list */	l->tail->next = peer;	peer->next = NULL;	peer->prev = l->tail;	l->tail = peer;}/* XXX *//* *  Trivial signal handler.  Assumes you have Berkeley flavored signals which *  re-enable themselves. */void tock() {	ticked = 1;}voidtimeout(){	static int periodic = 0;	register struct ntp_peer *peer = peer_list.head, *next;#ifndef	XADJTIME2	extern void adj_host_clock();	adj_host_clock();#endif	/*	 * Count down sys.hold if necessary.	 */	if (sys.hold) {		if (sys.hold <= (1<<CLOCK_ADJ))			sys.hold = 0;		else			sys.hold -= (1<<CLOCK_ADJ);	}	/*	 * If interval has expired blast off an NTP to that host.	 */	while (peer != NULL) {#ifdef	DEBUG		if (peer->next == NULL && peer != peer_list.tail) {			printf("Broken peer list\n");			syslog(LOG_ERR, "Broken peer list");			abort();		}#endif		next = peer->next;		if (peer->reach != 0 || peer->hmode != MODE_SERVER) {			peer->stopwatch +=(1<<CLOCK_ADJ);			if (peer->timer <= peer->stopwatch) {				transmit(peer);				peer->stopwatch = 0;			}		}		peer = next;	}	periodic += (1<<CLOCK_ADJ);	if (periodic >= 60*60) {		periodic = 0;		hourly();	}	clock_watchdog += (1 << CLOCK_ADJ);	if (clock_watchdog >= NTP_MAXAGE) {		/* woof, woof - barking dogs bite! */		sys.leap = ALARM;		if (clock_watchdog < NTP_MAXAGE + (1 << CLOCK_ADJ)) {			syslog(LOG_ERR,			       "logical clock adjust timeout (%d seconds)",			       NTP_MAXAGE);#ifdef	DEBUG			if (debug)			 printf("logical clock adjust timeout (%d seconds)\n",				NTP_MAXAGE);#endif		}	}#ifdef	DEBUG	if (debug)		(void) fflush(stdout);#endif}/* * init_ntp() reads NTP daemon configuration information from disk file. */voidinit_ntp(config)	char *config;{	struct sockaddr_in sin;	char ref_clock[5];	char name[81];	FILE *fp;	int error = FALSE, c;	struct ntp_peer *peer;	int precision;	int stratum;	int i;	int debuglevel;	int stagger = 0;	double j;	extern double drift_comp;	bzero((char *) &sin, sizeof(sin));	fp = fopen(config, "r");	if (fp == NULL) {		fprintf(stderr,"Problem opening NTP initialization file %s\n",			config);		syslog(LOG_ERR,"Problem opening NTP initialization file %s",			config);		exit(1);	}	while (fscanf(fp, "%s", name) != EOF) {	/* read first word of line						 * and compare to key words */		if (strcmp(name, "maxpeers") == 0) {			if (fscanf(fp, "%d", &sys.maxpeers) != 1)				error = TRUE;		} else if (strcmp(name, "trusting") == 0) {			if (fscanf(fp, "%s", name) != 1)				error = TRUE;			else {				if (*name == 'Y' || *name == 'y') {					trusting = 1;				} else if (*name == 'N' || *name == 'n') {					trusting = 0;				} else					trusting = atoi(name);			}		} else if (strcmp(name, "logclock") == 0) {			if (fscanf(fp, "%s", name) != 1)				error = TRUE;			else {				if (*name == 'Y' || *name == 'y') {					logstats = 1;				} else if (*name == 'N' || *name == 'n') {					logstats = 0;				} else					logstats = atoi(name);			}		} else if (strcmp(name, "driftfile") == 0) {			if (fscanf(fp, "%s", name) != 1)				error = TRUE;			else {				if (driftcomp_file = malloc(strlen(name)+1))					strcpy(driftcomp_file, name);			}		} else if (strcmp(name, "waytoobig") == 0 ||			   strcmp(name, "setthreshold") == 0) {			if (fscanf(fp, "%s", name) != 1)				error = TRUE;			else {				if (strcmp(name, "any") == 0)					WayTooBig = 10e15;				else					WayTooBig = atof(name);			}		} else if (strncmp(name, "debuglevel", 5) == 0) {			if (fscanf(fp, "%d", &debuglevel) != 1)				error = TRUE;#ifdef	DEBUG			else debug += debuglevel;#endif		} else if (strcmp(name, "stratum") == 0) {			fprintf(stderr, "Obsolete command 'stratum'\n");			error = TRUE;		} else if (strcmp(name, "precision") == 0) {			if (fscanf(fp, "%d", &precision) != 1)				error = TRUE;			else sys.precision = (char) precision;#ifdef	SETTICKADJ		} else if (strcmp(name, "tickadj") == 0) {			if (fscanf(fp, "%d", &i) != 1)				error = TRUE;			else tickadj = i;		} else if (strcmp(name, "settickadj") == 0) {			if (fscanf(fp, "%s", name) != 1)				error = TRUE;			else {				if (*name == 'Y' || *name == 'y') {					dotickadj = 1;				} else if (*name == 'N' || *name == 'n') {					dotickadj = 0;				} else					dotickadj = atoi(name);			}#endif#ifdef	NOSWAP		} else if (strcmp(name, "noswap") == 0) {			noswap = 1;#endif#ifdef	BROADCAST_NTP		} else if (strcmp(name, "broadcast") == 0) {			if (fscanf(fp, "%s", name) != 1) {				error = TRUE;				goto skipit;			}			for (i = 0; i < nintf; i++)				if (strcmp(addrs[i].name, name) == 0)					break;			if (i == nintf) {				syslog(LOG_ERR, "config file: %s not a known interface");				error = TRUE;				goto skipit;			}			if ((addrs[i].if_flags & IFF_BROADCAST) == 0) {				syslog(LOG_ERR, "config file: %s doesn't support broadcast", name);				error = TRUE;				goto skipit;			}			if (peer = check_peer(&addrs[i].bcast, -1)) {				syslog(LOG_ERR, "config file: duplicate broadcast for %s",				       name);				error = TRUE;				goto skipit;			}			peer = (struct ntp_peer *) malloc(sizeof(struct ntp_peer));			if (peer == NULL) {				error = TRUE;				syslog(LOG_ERR, "No memory");				goto skipit;			}			make_new_peer(peer);			peer->flags = PEER_FL_BCAST;			peer->hmode = MODE_BROADCAST;			peer->src = addrs[i].bcast;			peer->sock = i;#endif	/* BROADCAST_NTP */		} else if ((strcmp(name, "peer") == 0) || 			   (strcmp(name, "passive") == 0) ||			   (strcmp(name, "server") == 0)) {			int mode = 0;			if (strcmp(name, "peer") == 0) {				mode = MODE_SYM_ACT;			} else if (strcmp(name, "server") == 0) {				mode = MODE_CLIENT;			} else if (strcmp(name, "passive") == 0) {				mode = MODE_SYM_PAS;			} else {				printf("can't happen\n");				abort();			}			if (fscanf(fp, "%s", name) != 1)				error = TRUE;#ifdef REFCLOCK			else if (name[0] == '/') {				int stratum, precision;				char clk_type[20];				if (fscanf(fp, "%4s", ref_clock) != 1) {					error = TRUE;					syslog(LOG_ERR, "reference id missing");					goto skipit;				}				if (fscanf(fp, "%4d", &stratum) != 1) {					error = TRUE;					syslog(LOG_ERR, "reference stratum missing");					goto skipit;				}				if (fscanf(fp, "%4d", &precision) != 1) {					error = TRUE;					syslog(LOG_ERR, "reference precision missing");					goto skipit;				}				if (fscanf(fp, "%19s", clk_type) != 1) {					error = TRUE;					syslog(LOG_ERR, "reference type missing");					goto skipit;				}				if((i = init_clock(name, clk_type)) < 0) {					/* If we could not initialize clock line */#ifdef DEBUG					if (debug)						printf("Could not init reference source %s (type %s)\n",							name, clk_type);					else#endif DEBUG						syslog(LOG_ERR, "Could not init reference source %s (type %s)",							name, clk_type);					error = TRUE;					goto skipit;				}				peer = (struct ntp_peer *)					malloc(sizeof(struct ntp_peer));				if (peer == NULL) {					close(i);					error = TRUE;					goto skipit;				}				make_new_peer(peer);				ref_clock[4] = 0;				(void) strncpy((char *) &peer->refid,						ref_clock, 4);				peer->flags = PEER_FL_CONFIG|PEER_FL_REFCLOCK;				peer->hmode = MODE_SYM_ACT;				peer->stopwatch = stagger;				stagger += (1<<CLOCK_ADJ);				peer->flags |= PEER_FL_SYNC;				peer->sock = i;				peer->stratum = stratum;				peer->precision = precision;				clear(peer);				enqueue(&peer_list, peer);				if (debug > 1)					printf("Peer %s mode %d refid %.4s stratum %d precision %d\n",					       name,					       peer->hmode,					       (char *)&peer->refid,					       stratum, precision);				transmit(peer);	/* head start for REFCLOCK */			}#endif REFCLOCK			else if (GetHostName(name, &sin) == 0)				syslog(LOG_ERR, "%s: unknown host", name);			else {				for (i=0; i<nintf; i++)					if (addrs[i].sin.sin_addr.s_addr ==					    sin.sin_addr.s_addr)						goto skipit;				if (servp)					sin.sin_port = servp->s_port;				else					sin.sin_port = htons(NTP_PORT);				peer = check_peer(&sin, -1);				if (peer == NULL) {					peer = (struct ntp_peer *)						malloc(sizeof(struct ntp_peer));					if (peer == NULL)						error = TRUE;					else {						make_new_peer(peer);						peer->flags = PEER_FL_CONFIG;						switch (mode) {						case MODE_SYM_ACT:	/* "peer" */							peer->hmode = MODE_SYM_ACT;							peer->stopwatch = stagger;							stagger += (1<<CLOCK_ADJ);							peer->flags |= PEER_FL_SYNC;							break;						case MODE_CLIENT:	/* "server" */							peer->hmode = MODE_CLIENT;							peer->stopwatch = stagger;

⌨️ 快捷键说明

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