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

📄 ntpd.c

📁 ftam等标准协议服务器和客户端的源代码。
💻 C
📖 第 1 页 / 共 3 页
字号:
static void timeout(n)int	n;{	static int periodic = 0;	register struct ntp_peer *peer;#ifndef	XADJTIME2	extern void adj_host_clock();	adj_host_clock(n);#endif	TRACE (7, ("timeout (%d)", n));	/*	 * Count down sys.hold if necessary.	 */	if (sys.hold) {		if (sys.hold <= n)			sys.hold = 0;		else			sys.hold -= n;	}	/*	 * If interval has expired blast off an NTP to that host.	 */	for (peer = peer_list.head; peer != NULL; peer = peer->next) {#ifdef	DEBUG		if (peer->next == NULL && peer != peer_list.tail) {			advise (LLOG_EXCEPTIONS, NULLCP, "Broken peer list");			abort();		}#endif		if (peer -> flags & PEER_FL_SNOOZE)			continue;		if (peer -> mode == PEERMODE_QUERY)			continue;		if (peer->reach != 0 || peer->hmode != MODE_SERVER) {			peer->stopwatch += n;			if (peer->timer <= peer->stopwatch)				do_peer (peer);		}	}	periodic += n;	if (periodic >= 60*60) {		periodic = 0;		hourly();	}	clock_watchdog += n;	if (clock_watchdog >= NTP_MAXAGE) {		/* woof, woof - barking dogs bite! */		sys.leap = ALARM;		if (clock_watchdog < NTP_MAXAGE + n) {			advise (LLOG_EXCEPTIONS, NULLCP, 			       "logical clock adjust timeout (%d seconds)",			       NTP_MAXAGE);		}	}#ifdef	DEBUG	if (debug)		(void) fflush(stdout);#endif}static void do_peer (peer)struct ntp_peer *peer;{	if (peer -> flags & PEER_FL_SNOOZE)		return;	peer->stopwatch = 0;	if (peer->flags & PEER_FL_CONREQ) {		switch (peer -> flags & PEER_FL_CONNSTATE) {		    case 0:			peer -> timer = 1 << (MAX(MIN((int)peer->ppoll,						      MIN((int)peer->hpoll,							  NTP_MAXPOLL)),						  NTP_MINPOLL));			if (peer->backoff == 0)				peer -> backoff = BACKOFF_COUNT;			else {				if (peer -> backoff == 1)					poll_update (peer, (int)peer->hpoll +1);				peer -> backoff --;			}			if (make_osi_conn (peer, osiaddress) == NOTOK)				return;			break;		    case PEER_FL_CONNECTED:			break;		    case PEER_FL_CONINP1:		    case PEER_FL_CONINP2:			return;		    default:			advise (LLOG_EXCEPTIONS, NULLCP,				"Bad state flags %d",				peer -> flags & PEER_FL_CONNSTATE);			return;		}	}	transmit (peer);}/* * init_ntp() reads NTP daemon configuration information from disk file. */int precision;static void init_ntp(config)char *config;{	struct Naddr addr;	char buffer[BUFSIZ];	FILE *fp;	double j;	int	argc;#define MAXARGS	10	char	*argv[MAXARGS];	extern double drift_comp;	bzero((char *) &addr, sizeof(addr));	fp = fopen(config, "r");	if (fp == NULL)		adios (config, "Problem opening NTP initialization file");	while (fgets (buffer, sizeof buffer, fp)) { /* read line and parse */		if (buffer[0] == '#' || buffer[0] == '\n')			continue;		if ((argc = sstr2arg (buffer, MAXARGS, argv, " \t\n")) <= 0)			continue;		if (config_line (argv, argc) != OK)			TRACE (1, ("Ignoring line %s ...", argv[0]));	}	/*	 *  Read saved drift compensation register value.	 */	if ((fp = fopen(driftcomp_file, "r")) != NULL) {		if (fscanf(fp, "%lf", &j) == 1 && j > -1.0 && j < 1.0) {			drift_comp = j;			advise (LLOG_NOTICE, NULLCP,			       "Drift compensation value initialized to %f", j);		} else {			advise (LLOG_EXCEPTIONS, NULLCP,			       "init_ntp: bad drift compensation value");		}		(void) fclose(fp);	}}#include "cmd_srch.h"CMD_TABLE	config_tbl[] = {#define	TBL_MAXPEERS	1	"maxpeers",	TBL_MAXPEERS,#define	TBL_TRUSTING	2	"trusting",	TBL_TRUSTING,#define	TBL_OSILISTEN	3	"osilisten",	TBL_OSILISTEN,#define	TBL_LOGCLOCK	4	"logclock",	TBL_LOGCLOCK,#define	TBL_DRIFTFILE	5	"driftfile",	TBL_DRIFTFILE,#define	TBL_WAYTOOBIG	6	"waytoobig",	TBL_WAYTOOBIG,	"setthreshold",	TBL_WAYTOOBIG,#define	TBL_DEBUGLEVEL	7	"debuglevel",	TBL_DEBUGLEVEL,#define	TBL_TICKADJ	8	"tickadj",	TBL_TICKADJ,#define	TBL_SETTICKADJ	9	"settickadj",	TBL_SETTICKADJ,#define	TBL_NOSWAP	10	"noswap",	TBL_NOSWAP,#define	TBL_BROADCAST	11	"broadcast",	TBL_BROADCAST,#define	TBL_PEER	12	"peer",		TBL_PEER,#define	TBL_PASSIVE	13	"passive",	TBL_PASSIVE,#define	TBL_SERVER	14	"server",	TBL_SERVER,#define	TBL_REFCLOCK	15	"refclock",	TBL_REFCLOCK,#define TBL_STRATUM	16	"stratum",	TBL_STRATUM,#define TBL_PRECISION	17	"precision",	TBL_PRECISION,#define TBL_LOGFILE	18	"logfile",	TBL_LOGFILE,#define TBL_PRIORITY	19	"priority",	TBL_PRIORITY,#define TBL_KEEPALLPEERS 20	"keepallpeers", TBL_KEEPALLPEERS,	"",	-1};config_line (argv, argc)char	*argv[];int	argc;{	int	result;	struct Naddr addr;	int	i;	struct ntp_peer *peer;	switch (result = cmd_srch (argv[0], config_tbl)) {	    case TBL_PRIORITY:		if (argc > 1)			priority = atoi (argv[1]);		else	return NOTOK;		break;	    case TBL_MAXPEERS:		if (argc > 1)			sys.maxpeers = atoi (argv[1]);		else	return NOTOK;		break;	    case TBL_TRUSTING:		if (argc < 2)			return NOTOK;		trusting = ynorint (argv[1]);		break;	    case TBL_OSILISTEN:		if (argc < 2)			return NOTOK;		osiaddress = strdup (argv[1]);		break;	    case TBL_LOGCLOCK:		if (argc < 2)			return NOTOK;		logstats = ynorint (argv[1]);		break;	    case TBL_LOGFILE:		if (argc < 2)			return NOTOK;		pgm_log -> ll_file = strdup (argv[1]);		break;	    case TBL_DRIFTFILE:		if (argc < 2)			return NOTOK;		driftcomp_file = strdup (argv[1]);		break;	    case TBL_WAYTOOBIG:		if (argc < 2)			return NOTOK;		if (lexequ (argv[1], "any") == 0)			WayTooBig = 10e15;		else	WayTooBig = atof (argv[1]);		break;	    case TBL_DEBUGLEVEL:		if (argc < 2)			return NOTOK;#ifdef DEBUG		debug += atoi (argv[1]);#endif		break;	    case TBL_STRATUM:		advise (LLOG_NOTICE, NULLCP,			"Obsolete command 'stratum'");		break;	    case TBL_PRECISION:		if (argc < 2)			return NOTOK;		sys.precision = atoi (argv[1]);		break;			    case TBL_TICKADJ:		if (argc < 2)			return NOTOK;#ifdef	SETTICKADJ		tickadj = atoi (argv[1]);#endif		break;	    case TBL_SETTICKADJ:		if (argc < 2)			return NOTOK;#ifdef SETTICKADJ		dotickadj = ynorint (argv[1]);#endif		break;	    case TBL_NOSWAP:#ifdef NOSWAP		noswap = 1;#endif		break;	    case TBL_BROADCAST:		if (argc < 2)			return NOTOK;#ifdef BROADCAST_NTP		for (i = 0; i < nintf; i++)			if (strcmp(addrs[i].name, argv[1]) == 0)				break;		if (i == nintf) {			advise (LLOG_EXCEPTIONS, NULLCP,				"config: %s not a known interface", argv[1]);			return NOTOK;		}		if ((addrs[i].if_flags & IFF_BROADCAST) == 0) {			advise (LLOG_EXCEPTIONS, NULLCP,				"config: %s doesn't support broadcast",				argv[1]);			return NOTOK;		}		if (peer = check_peer(&addrs[i].bcast, -1)) {			advise (LLOG_EXCEPTIONS, NULLCP,				"config file: duplicate broadcast for %s",				argv[1]);			return NOTOK;		}		peer = (struct ntp_peer *) malloc(sizeof(struct ntp_peer));		if (peer == NULL)			adios ("malloc", "peer");		make_new_peer(peer);		peer->flags = PEER_FL_BCAST;		peer->hmode = MODE_BROADCAST;		peer->src = addrs[i].bcast;		peer->sock = i;#endif				/* BROADCAST_NTP */		break;	    case TBL_PEER:	    case TBL_PASSIVE:	    case TBL_SERVER:		if (argc < 2)			return NOTOK;		if (GetHostName(argv[1], &addr) == NOTOK) {			advise (LLOG_EXCEPTIONS, NULLCP,				"%s: unknown host", argv[1]);			return NOTOK;		}		for (i=0; i<nintf; i++)			if (addr_compare (&addrs[i].addr, &addr))				return NOTOK;		peer = check_peer(&addr, -1);		if (peer != NULL) {			advise (LLOG_NOTICE, NULLCP,				"Duplicate peer %s in in config file",				paddr (&addr));			return NOTOK;		}		peer = (struct ntp_peer *)			malloc(sizeof(struct ntp_peer));		if (peer == NULL)			adios ("failed", "malloc");		make_new_peer(peer);		peer->flags = PEER_FL_CONFIG;		switch (result) {		    case TBL_PEER: /* "peer" */			peer->hmode = MODE_SYM_ACT;			peer->stopwatch = random () % (1 << NTP_MINPOLL);			peer->flags |= PEER_FL_SYNC;			break;		    case TBL_SERVER: /* "server" */			peer->hmode = MODE_CLIENT;			peer->stopwatch = random () % (1 << NTP_MINPOLL);			peer->flags |= PEER_FL_SYNC;			break;		    case TBL_PASSIVE: /* "passive" */			peer->hmode = MODE_SYM_PAS;			peer->flags |= PEER_FL_SYNC;			break;		    default:			(void) printf("can't happen\n");			abort();		}		peer->src = addr;		if (addr.type == AF_OSI)			peer -> flags |= PEER_FL_CONREQ;		peer->sock = -1;		clear(peer);		other_peer_fields (peer, argv + 2, argc - 2);		enqueue(&peer_list, peer);		TRACE (2, ("Peer %s mode %d",			   paddr(&peer->src),			   peer->hmode));		break;	    case TBL_REFCLOCK:		if (argc < 6)			return NOTOK;#ifdef REFCLOCK		else {			int stratum, prec;			char	*ref_clock;			char *clk_type;			ref_clock = argv[2];			stratum = atoi (argv[3]);			prec = atoi (argv[4]);			clk_type = argv[5];			if((i = init_clock(argv[1], clk_type)) < 0) {				/* If we could not initialize clock line */				advise (LLOG_EXCEPTIONS, NULLCP,					"Could not init reference source %s (type %s)",					argv[1], clk_type);				return NOTOK;			}			peer = (struct ntp_peer *)				calloc(1, sizeof(struct ntp_peer));			if (peer == NULL) {				(void) close(i);				return NOTOK;			}			make_new_peer(peer);			(void) strncpy(peer->refid.rid_string,				       ref_clock, 4);			peer->refid.rid_string[4] = 0;			peer->refid.rid_type = RID_STRING;			peer->flags = PEER_FL_CONFIG|PEER_FL_REFCLOCK;			peer->hmode = MODE_SYM_ACT;			peer->stopwatch = random () % (1 << NTP_MINPOLL);			peer->flags |= PEER_FL_SYNC;			peer->sock = i;			peer->stratum = stratum;			peer->precision = prec;			clear(peer);			enqueue(&peer_list, peer);			TRACE (2, ("Refclock %s mode %d refid %.4s stratum %d precision %d",				   argv[1], peer->hmode,				   peer->refid.rid_string,				   stratum, prec));			transmit(peer);	/* head start for REFCLOCK */		}#endif REFCLOCK		break;	    case TBL_KEEPALLPEERS:		if (argc < 2)			return NOTOK;		keepallpeers = ynorint (argv[1]);		break;	    default:		return NOTOK;	}	return OK;}CMD_TABLE tbl_peer_flags[] = {#define TBLPEER_VERSION	1	"version",	TBLPEER_VERSION,#define TBLPEER_AUTH	2	"auth",		TBLPEER_AUTH,	NULLCP,		-1	};	other_peer_fields (peer, argv, argc)struct ntp_peer *peer;char	**argv;int	argc;{	while (argc > 0) {		switch (cmd_srch (argv[0], tbl_peer_flags)) {		    case TBLPEER_VERSION:			peer -> vers = atoi(argv[1]);			if (peer -> vers < 1 || peer -> vers > 2)				adios (NULLCP, "Bad version %d",				       peer -> vers);			break;		    case TBLPEER_AUTH:			advise (LLOG_NOTICE, "auth code not done yet");			break;		}		argc -= 2;		argv += 2;	}}ynorint (s)char	*s;{	if (*s == 'y' || *s == 'Y')		return 1;	if (*s == 'n' || *s == 'N')		return 0;	return atoi (s);}/*  */int kern_tickadj;static int kern_hz, kern_tick;#ifdef NeXT#define n_name n_un.n_name#endifstatic voidinit_kern_vars() {	int kmem;	static char	*memory = "/dev/kmem";	static struct nlist nl[4];

⌨️ 快捷键说明

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