xref: /freebsd/contrib/ntp/ntpdate/ntpdate.c (revision 3fc36ee018bb836bd1796067cf4ef8683f166ebc)
1 /*
2  * ntpdate - set the time of day by polling one or more NTP servers
3  */
4 
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif
8 
9 #ifdef HAVE_NETINFO
10 #include <netinfo/ni.h>
11 #endif
12 
13 #include "ntp_machine.h"
14 #include "ntp_fp.h"
15 #include "ntp.h"
16 #include "ntp_io.h"
17 #include "timevalops.h"
18 #include "ntpdate.h"
19 #include "ntp_string.h"
20 #include "ntp_syslog.h"
21 #include "ntp_select.h"
22 #include "ntp_stdlib.h"
23 #include <ssl_applink.c>
24 
25 #include "isc/net.h"
26 #include "isc/result.h"
27 #include "isc/sockaddr.h"
28 
29 #ifdef HAVE_UNISTD_H
30 # include <unistd.h>
31 #endif
32 
33 #include <stdio.h>
34 #include <signal.h>
35 #include <ctype.h>
36 #ifdef HAVE_POLL_H
37 # include <poll.h>
38 #endif
39 #ifdef HAVE_SYS_SIGNAL_H
40 # include <sys/signal.h>
41 #endif
42 #ifdef HAVE_SYS_IOCTL_H
43 # include <sys/ioctl.h>
44 #endif
45 #ifdef HAVE_SYS_RESOURCE_H
46 # include <sys/resource.h>
47 #endif
48 
49 #include <arpa/inet.h>
50 
51 #ifdef SYS_VXWORKS
52 # include "ioLib.h"
53 # include "sockLib.h"
54 # include "timers.h"
55 
56 /* select wants a zero structure ... */
57 struct timeval timeout = {0,0};
58 #elif defined(SYS_WINNT)
59 /*
60  * Windows does not abort a select select call if SIGALRM goes off
61  * so a 200 ms timeout is needed (TIMER_HZ is 5).
62  */
63 struct sock_timeval timeout = {0,1000000/TIMER_HZ};
64 #else
65 struct timeval timeout = {60,0};
66 #endif
67 
68 #ifdef HAVE_NETINFO
69 #include <netinfo/ni.h>
70 #endif
71 
72 #include "recvbuff.h"
73 
74 #ifdef SYS_WINNT
75 #define TARGET_RESOLUTION 1  /* Try for 1-millisecond accuracy
76 				on Windows NT timers. */
77 #pragma comment(lib, "winmm")
78 isc_boolean_t ntp_port_inuse(int af, u_short port);
79 UINT wTimerRes;
80 #endif /* SYS_WINNT */
81 
82 /*
83  * Scheduling priority we run at
84  */
85 #ifndef SYS_VXWORKS
86 # define	NTPDATE_PRIO	(-12)
87 #else
88 # define	NTPDATE_PRIO	(100)
89 #endif
90 
91 #ifdef HAVE_TIMER_CREATE
92 /* POSIX TIMERS - vxWorks doesn't have itimer - casey */
93 static timer_t ntpdate_timerid;
94 #endif
95 
96 /*
97  * Compatibility stuff for Version 2
98  */
99 #define NTP_MAXSKW	0x28f	/* 0.01 sec in fp format */
100 #define NTP_MINDIST	0x51f	/* 0.02 sec in fp format */
101 #define PEER_MAXDISP	(64*FP_SECOND)	/* maximum dispersion (fp 64) */
102 #define NTP_INFIN	15	/* max stratum, infinity a la Bellman-Ford */
103 #define NTP_MAXWGT	(8*FP_SECOND)	/* maximum select weight 8 seconds */
104 #define NTP_MAXLIST	5	/* maximum select list size */
105 #define PEER_SHIFT	8	/* 8 suitable for crystal time base */
106 
107 /*
108  * for get_systime()
109  */
110 s_char	sys_precision;		/* local clock precision (log2 s) */
111 
112 /*
113  * File descriptor masks etc. for call to select
114  */
115 
116 int ai_fam_templ;
117 int nbsock;			/* the number of sockets used */
118 SOCKET fd[MAX_AF];
119 int fd_family[MAX_AF];		/* to remember the socket family */
120 #ifdef HAVE_POLL_H
121 struct pollfd fdmask[MAX_AF];
122 #else
123 fd_set fdmask;
124 SOCKET maxfd;
125 #endif
126 int polltest = 0;
127 
128 /*
129  * Initializing flag.  All async routines watch this and only do their
130  * thing when it is clear.
131  */
132 int initializing = 1;
133 
134 /*
135  * Alarm flag.	Set when an alarm occurs
136  */
137 volatile int alarm_flag = 0;
138 
139 /*
140  * Simple query flag.
141  */
142 int simple_query = 0;
143 
144 /*
145  * Unprivileged port flag.
146  */
147 int unpriv_port = 0;
148 
149 /*
150  * Program name.
151  */
152 char const *progname;
153 
154 /*
155  * Systemwide parameters and flags
156  */
157 int sys_samples = DEFSAMPLES;	/* number of samples/server */
158 u_long sys_timeout = DEFTIMEOUT; /* timeout time, in TIMER_HZ units */
159 struct server *sys_servers;	/* the server list */
160 int sys_numservers = 0; 	/* number of servers to poll */
161 int sys_authenticate = 0;	/* true when authenticating */
162 u_int32 sys_authkey = 0;	/* set to authentication key in use */
163 u_long sys_authdelay = 0;	/* authentication delay */
164 int sys_version = NTP_VERSION;	/* version to poll with */
165 
166 /*
167  * The current internal time
168  */
169 u_long current_time = 0;
170 
171 /*
172  * Counter for keeping track of completed servers
173  */
174 int complete_servers = 0;
175 
176 /*
177  * File of encryption keys
178  */
179 
180 #ifndef KEYFILE
181 # ifndef SYS_WINNT
182 #define KEYFILE 	"/etc/ntp.keys"
183 # else
184 #define KEYFILE 	"%windir%\\ntp.keys"
185 # endif /* SYS_WINNT */
186 #endif /* KEYFILE */
187 
188 #ifndef SYS_WINNT
189 const char *key_file = KEYFILE;
190 #else
191 char key_file_storage[MAX_PATH+1], *key_file ;
192 #endif	 /* SYS_WINNT */
193 
194 /*
195  * Miscellaneous flags
196  */
197 int verbose = 0;
198 int always_step = 0;
199 int never_step = 0;
200 
201 int 	ntpdatemain (int, char **);
202 
203 static	void	transmit	(struct server *);
204 static	void	receive 	(struct recvbuf *);
205 static	void	server_data (struct server *, s_fp, l_fp *, u_fp);
206 static	void	clock_filter	(struct server *);
207 static	struct server *clock_select (void);
208 static	int clock_adjust	(void);
209 static	void	addserver	(char *);
210 static	struct server *findserver (sockaddr_u *);
211 		void	timer		(void);
212 static	void	init_alarm	(void);
213 #ifndef SYS_WINNT
214 static	RETSIGTYPE alarming (int);
215 #endif /* SYS_WINNT */
216 static	void	init_io 	(void);
217 static	void	sendpkt 	(sockaddr_u *, struct pkt *, int);
218 void	input_handler	(void);
219 
220 static	int l_adj_systime	(l_fp *);
221 static	int l_step_systime	(l_fp *);
222 
223 static	void	printserver (struct server *, FILE *);
224 
225 #ifdef SYS_WINNT
226 int 	on = 1;
227 WORD	wVersionRequested;
228 WSADATA	wsaData;
229 #endif /* SYS_WINNT */
230 
231 #ifdef NO_MAIN_ALLOWED
232 CALL(ntpdate,"ntpdate",ntpdatemain);
233 
234 void clear_globals()
235 {
236   /*
237    * Debugging flag
238    */
239   debug = 0;
240 
241   ntp_optind = 0;
242   /*
243    * Initializing flag.  All async routines watch this and only do their
244    * thing when it is clear.
245    */
246   initializing = 1;
247 
248   /*
249    * Alarm flag.  Set when an alarm occurs
250    */
251   alarm_flag = 0;
252 
253   /*
254    * Simple query flag.
255    */
256   simple_query = 0;
257 
258   /*
259    * Unprivileged port flag.
260    */
261   unpriv_port = 0;
262 
263   /*
264    * Systemwide parameters and flags
265    */
266   sys_numservers = 0;	  /* number of servers to poll */
267   sys_authenticate = 0;   /* true when authenticating */
268   sys_authkey = 0;	   /* set to authentication key in use */
269   sys_authdelay = 0;   /* authentication delay */
270   sys_version = NTP_VERSION;  /* version to poll with */
271 
272   /*
273    * The current internal time
274    */
275   current_time = 0;
276 
277   /*
278    * Counter for keeping track of completed servers
279    */
280   complete_servers = 0;
281   verbose = 0;
282   always_step = 0;
283   never_step = 0;
284 }
285 #endif
286 
287 #ifdef HAVE_NETINFO
288 static ni_namelist *getnetinfoservers (void);
289 #endif
290 
291 /*
292  * Main program.  Initialize us and loop waiting for I/O and/or
293  * timer expiries.
294  */
295 #ifndef NO_MAIN_ALLOWED
296 int
297 main(
298 	int argc,
299 	char *argv[]
300 	)
301 {
302 	return ntpdatemain (argc, argv);
303 }
304 #endif /* NO_MAIN_ALLOWED */
305 
306 int
307 ntpdatemain (
308 	int argc,
309 	char *argv[]
310 	)
311 {
312 	int was_alarmed;
313 	int tot_recvbufs;
314 	struct recvbuf *rbuf;
315 	l_fp tmp;
316 	int errflg;
317 	int c;
318 	int nfound;
319 
320 #ifdef HAVE_NETINFO
321 	ni_namelist *netinfoservers;
322 #endif
323 #ifdef SYS_WINNT
324 	key_file = key_file_storage;
325 
326 	if (!ExpandEnvironmentStrings(KEYFILE, key_file, MAX_PATH))
327 		msyslog(LOG_ERR, "ExpandEnvironmentStrings(KEYFILE) failed: %m");
328 
329 	ssl_applink();
330 #endif /* SYS_WINNT */
331 
332 #ifdef NO_MAIN_ALLOWED
333 	clear_globals();
334 #endif
335 
336 	init_lib();	/* sets up ipv4_works, ipv6_works */
337 
338 	/* Check to see if we have IPv6. Otherwise default to IPv4 */
339 	if (!ipv6_works)
340 		ai_fam_templ = AF_INET;
341 
342 	errflg = 0;
343 	progname = argv[0];
344 	syslogit = 0;
345 
346 	/*
347 	 * Decode argument list
348 	 */
349 	while ((c = ntp_getopt(argc, argv, "46a:bBde:k:o:p:qst:uv")) != EOF)
350 		switch (c)
351 		{
352 		case '4':
353 			ai_fam_templ = AF_INET;
354 			break;
355 		case '6':
356 			ai_fam_templ = AF_INET6;
357 			break;
358 		case 'a':
359 			c = atoi(ntp_optarg);
360 			sys_authenticate = 1;
361 			sys_authkey = c;
362 			break;
363 		case 'b':
364 			always_step++;
365 			never_step = 0;
366 			break;
367 		case 'B':
368 			never_step++;
369 			always_step = 0;
370 			break;
371 		case 'd':
372 			++debug;
373 			break;
374 		case 'e':
375 			if (!atolfp(ntp_optarg, &tmp)
376 			|| tmp.l_ui != 0) {
377 				(void) fprintf(stderr,
378 					   "%s: encryption delay %s is unlikely\n",
379 					   progname, ntp_optarg);
380 				errflg++;
381 			} else {
382 				sys_authdelay = tmp.l_uf;
383 			}
384 			break;
385 		case 'k':
386 			key_file = ntp_optarg;
387 			break;
388 		case 'o':
389 			sys_version = atoi(ntp_optarg);
390 			break;
391 		case 'p':
392 			c = atoi(ntp_optarg);
393 			if (c <= 0 || c > NTP_SHIFT) {
394 				(void) fprintf(stderr,
395 					   "%s: number of samples (%d) is invalid\n",
396 					   progname, c);
397 				errflg++;
398 			} else {
399 				sys_samples = c;
400 			}
401 			break;
402 		case 'q':
403 			simple_query = 1;
404 			break;
405 		case 's':
406 			syslogit = 1;
407 			break;
408 		case 't':
409 			if (!atolfp(ntp_optarg, &tmp)) {
410 				(void) fprintf(stderr,
411 					   "%s: timeout %s is undecodeable\n",
412 					   progname, ntp_optarg);
413 				errflg++;
414 			} else {
415 				sys_timeout = ((LFPTOFP(&tmp) * TIMER_HZ)
416 					   + 0x8000) >> 16;
417 				sys_timeout = max(sys_timeout, MINTIMEOUT);
418 			}
419 			break;
420 		case 'v':
421 			verbose = 1;
422 			break;
423 		case 'u':
424 			unpriv_port = 1;
425 			break;
426 		case '?':
427 			++errflg;
428 			break;
429 		default:
430 			break;
431 	    }
432 
433 	if (errflg) {
434 		(void) fprintf(stderr,
435 		    "usage: %s [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-t timeo] server ...\n",
436 		    progname);
437 		exit(2);
438 	}
439 
440 	if (debug || simple_query) {
441 #ifdef HAVE_SETVBUF
442 		static char buf[BUFSIZ];
443 		setvbuf(stdout, buf, _IOLBF, BUFSIZ);
444 #else
445 		setlinebuf(stdout);
446 #endif
447 	}
448 
449 	/*
450 	 * Logging.  Open the syslog if we have to
451 	 */
452 	if (syslogit) {
453 #if !defined (SYS_WINNT) && !defined (SYS_VXWORKS) && !defined SYS_CYGWIN32
454 # ifndef	LOG_DAEMON
455 		openlog("ntpdate", LOG_PID);
456 # else
457 
458 #  ifndef	LOG_NTP
459 #	define	LOG_NTP LOG_DAEMON
460 #  endif
461 		openlog("ntpdate", LOG_PID | LOG_NDELAY, LOG_NTP);
462 		if (debug)
463 			setlogmask(LOG_UPTO(LOG_DEBUG));
464 		else
465 			setlogmask(LOG_UPTO(LOG_INFO));
466 # endif /* LOG_DAEMON */
467 #endif	/* SYS_WINNT */
468 	}
469 
470 	if (debug || verbose)
471 		msyslog(LOG_NOTICE, "%s", Version);
472 
473 	/*
474 	 * Add servers we are going to be polling
475 	 */
476 #ifdef HAVE_NETINFO
477 	netinfoservers = getnetinfoservers();
478 #endif
479 
480 	for ( ; ntp_optind < argc; ntp_optind++)
481 		addserver(argv[ntp_optind]);
482 
483 #ifdef HAVE_NETINFO
484 	if (netinfoservers) {
485 		if ( netinfoservers->ni_namelist_len &&
486 		    *netinfoservers->ni_namelist_val ) {
487 			u_int servercount = 0;
488 			while (servercount < netinfoservers->ni_namelist_len) {
489 				if (debug) msyslog(LOG_DEBUG,
490 						   "Adding time server %s from NetInfo configuration.",
491 						   netinfoservers->ni_namelist_val[servercount]);
492 				addserver(netinfoservers->ni_namelist_val[servercount++]);
493 			}
494 		}
495 		ni_namelist_free(netinfoservers);
496 		free(netinfoservers);
497 	}
498 #endif
499 
500 	if (sys_numservers == 0) {
501 		msyslog(LOG_ERR, "no servers can be used, exiting");
502 		exit(1);
503 	}
504 
505 	/*
506 	 * Initialize the time of day routines and the I/O subsystem
507 	 */
508 	if (sys_authenticate) {
509 		init_auth();
510 		if (!authreadkeys(key_file)) {
511 			msyslog(LOG_ERR, "no key file <%s>, exiting", key_file);
512 			exit(1);
513 		}
514 		authtrust(sys_authkey, 1);
515 		if (!authistrusted(sys_authkey)) {
516 			msyslog(LOG_ERR, "authentication key %lu unknown",
517 				(unsigned long) sys_authkey);
518 			exit(1);
519 		}
520 	}
521 	init_io();
522 	init_alarm();
523 
524 	/*
525 	 * Set the priority.
526 	 */
527 #ifdef SYS_VXWORKS
528 	taskPrioritySet( taskIdSelf(), NTPDATE_PRIO);
529 #endif
530 #if defined(HAVE_ATT_NICE)
531 	nice (NTPDATE_PRIO);
532 #endif
533 #if defined(HAVE_BSD_NICE)
534 	(void) setpriority(PRIO_PROCESS, 0, NTPDATE_PRIO);
535 #endif
536 
537 
538 	initializing = 0;
539 	was_alarmed = 0;
540 
541 	while (complete_servers < sys_numservers) {
542 #ifdef HAVE_POLL_H
543 		struct pollfd* rdfdes;
544 		rdfdes = fdmask;
545 #else
546 		fd_set rdfdes;
547 		rdfdes = fdmask;
548 #endif
549 
550 		if (alarm_flag) {		/* alarmed? */
551 			was_alarmed = 1;
552 			alarm_flag = 0;
553 		}
554 		tot_recvbufs = full_recvbuffs();	/* get received buffers */
555 
556 		if (!was_alarmed && tot_recvbufs == 0) {
557 			/*
558 			 * Nothing to do.	 Wait for something.
559 			 */
560 #ifdef HAVE_POLL_H
561 			nfound = poll(rdfdes, (unsigned int)nbsock, timeout.tv_sec * 1000);
562 
563 #else
564 			nfound = select(maxfd, &rdfdes, NULL, NULL,
565 					&timeout);
566 #endif
567 			if (nfound > 0)
568 				input_handler();
569 			else if (nfound == SOCKET_ERROR)
570 			{
571 #ifndef SYS_WINNT
572 				if (errno != EINTR)
573 #else
574 				if (WSAGetLastError() != WSAEINTR)
575 #endif
576 					msyslog(LOG_ERR,
577 #ifdef HAVE_POLL_H
578 						"poll() error: %m"
579 #else
580 						"select() error: %m"
581 #endif
582 						);
583 			} else if (errno != 0) {
584 #ifndef SYS_VXWORKS
585 				msyslog(LOG_DEBUG,
586 #ifdef HAVE_POLL_H
587 					"poll(): nfound = %d, error: %m",
588 #else
589 					"select(): nfound = %d, error: %m",
590 #endif
591 					nfound);
592 #endif
593 			}
594 			if (alarm_flag) {		/* alarmed? */
595 				was_alarmed = 1;
596 				alarm_flag = 0;
597 			}
598 			tot_recvbufs = full_recvbuffs();	/* get received buffers */
599 		}
600 
601 		/*
602 		 * Out here, signals are unblocked.  Call receive
603 		 * procedure for each incoming packet.
604 		 */
605 		rbuf = get_full_recv_buffer();
606 		while (rbuf != NULL)
607 		{
608 			receive(rbuf);
609 			freerecvbuf(rbuf);
610 			rbuf = get_full_recv_buffer();
611 		}
612 
613 		/*
614 		 * Call timer to process any timeouts
615 		 */
616 		if (was_alarmed) {
617 			timer();
618 			was_alarmed = 0;
619 		}
620 
621 		/*
622 		 * Go around again
623 		 */
624 	}
625 
626 	/*
627 	 * When we get here we've completed the polling of all servers.
628 	 * Adjust the clock, then exit.
629 	 */
630 #ifdef SYS_WINNT
631 	WSACleanup();
632 #endif
633 #ifdef SYS_VXWORKS
634 	close (fd);
635 	timer_delete(ntpdate_timerid);
636 #endif
637 
638 	return clock_adjust();
639 }
640 
641 
642 /*
643  * transmit - transmit a packet to the given server, or mark it completed.
644  *		This is called by the timeout routine and by the receive
645  *		procedure.
646  */
647 static void
648 transmit(
649 	register struct server *server
650 	)
651 {
652 	struct pkt xpkt;
653 
654 	if (debug)
655 		printf("transmit(%s)\n", stoa(&server->srcadr));
656 
657 	if (server->filter_nextpt < server->xmtcnt) {
658 		l_fp ts;
659 		/*
660 		 * Last message to this server timed out.  Shift
661 		 * zeros into the filter.
662 		 */
663 		L_CLR(&ts);
664 		server_data(server, 0, &ts, 0);
665 	}
666 
667 	if ((int)server->filter_nextpt >= sys_samples) {
668 		/*
669 		 * Got all the data we need.  Mark this guy
670 		 * completed and return.
671 		 */
672 		server->event_time = 0;
673 		complete_servers++;
674 		return;
675 	}
676 
677 	/*
678 	 * If we're here, send another message to the server.  Fill in
679 	 * the packet and let 'er rip.
680 	 */
681 	xpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC,
682 					 sys_version, MODE_CLIENT);
683 	xpkt.stratum = STRATUM_TO_PKT(STRATUM_UNSPEC);
684 	xpkt.ppoll = NTP_MINPOLL;
685 	xpkt.precision = NTPDATE_PRECISION;
686 	xpkt.rootdelay = htonl(NTPDATE_DISTANCE);
687 	xpkt.rootdisp = htonl(NTPDATE_DISP);
688 	xpkt.refid = htonl(NTPDATE_REFID);
689 	L_CLR(&xpkt.reftime);
690 	L_CLR(&xpkt.org);
691 	L_CLR(&xpkt.rec);
692 
693 	/*
694 	 * Determine whether to authenticate or not.	If so,
695 	 * fill in the extended part of the packet and do it.
696 	 * If not, just timestamp it and send it away.
697 	 */
698 	if (sys_authenticate) {
699 		size_t len;
700 
701 		xpkt.exten[0] = htonl(sys_authkey);
702 		get_systime(&server->xmt);
703 		L_ADDUF(&server->xmt, sys_authdelay);
704 		HTONL_FP(&server->xmt, &xpkt.xmt);
705 		len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC);
706 		sendpkt(&server->srcadr, &xpkt, (int)(LEN_PKT_NOMAC + len));
707 
708 		if (debug > 1)
709 			printf("transmit auth to %s\n",
710 			   stoa(&server->srcadr));
711 	} else {
712 		get_systime(&(server->xmt));
713 		HTONL_FP(&server->xmt, &xpkt.xmt);
714 		sendpkt(&server->srcadr, &xpkt, LEN_PKT_NOMAC);
715 
716 		if (debug > 1)
717 			printf("transmit to %s\n", stoa(&server->srcadr));
718 	}
719 
720 	/*
721 	 * Update the server timeout and transmit count
722 	 */
723 	server->event_time = current_time + sys_timeout;
724 	server->xmtcnt++;
725 }
726 
727 
728 /*
729  * receive - receive and process an incoming frame
730  */
731 static void
732 receive(
733 	struct recvbuf *rbufp
734 	)
735 {
736 	register struct pkt *rpkt;
737 	register struct server *server;
738 	register s_fp di;
739 	l_fp t10, t23, tmp;
740 	l_fp org;
741 	l_fp rec;
742 	l_fp ci;
743 	int has_mac;
744 	int is_authentic;
745 
746 	if (debug)
747 		printf("receive(%s)\n", stoa(&rbufp->recv_srcadr));
748 	/*
749 	 * Check to see if the packet basically looks like something
750 	 * intended for us.
751 	 */
752 	if (rbufp->recv_length == LEN_PKT_NOMAC)
753 		has_mac = 0;
754 	else if (rbufp->recv_length >= (int)LEN_PKT_NOMAC)
755 		has_mac = 1;
756 	else {
757 		if (debug)
758 			printf("receive: packet length %d\n",
759 			   rbufp->recv_length);
760 		return; 		/* funny length packet */
761 	}
762 
763 	rpkt = &(rbufp->recv_pkt);
764 	if (PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
765 		PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) {
766 		return;
767 	}
768 
769 	if ((PKT_MODE(rpkt->li_vn_mode) != MODE_SERVER
770 		 && PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE)
771 		|| rpkt->stratum >= STRATUM_UNSPEC) {
772 		if (debug)
773 			printf("receive: mode %d stratum %d\n",
774 			   PKT_MODE(rpkt->li_vn_mode), rpkt->stratum);
775 		return;
776 	}
777 
778 	/*
779 	 * So far, so good.  See if this is from a server we know.
780 	 */
781 	server = findserver(&(rbufp->recv_srcadr));
782 	if (server == NULL) {
783 		if (debug)
784 			printf("receive: server not found\n");
785 		return;
786 	}
787 
788 	/*
789 	 * Decode the org timestamp and make sure we're getting a response
790 	 * to our last request.
791 	 */
792 	NTOHL_FP(&rpkt->org, &org);
793 	if (!L_ISEQU(&org, &server->xmt)) {
794 		if (debug)
795 			printf("receive: pkt.org and peer.xmt differ\n");
796 		return;
797 	}
798 
799 	/*
800 	 * Check out the authenticity if we're doing that.
801 	 */
802 	if (!sys_authenticate)
803 		is_authentic = 1;
804 	else {
805 		is_authentic = 0;
806 
807 		if (debug > 3)
808 			printf("receive: rpkt keyid=%ld sys_authkey=%ld decrypt=%ld\n",
809 			   (long int)ntohl(rpkt->exten[0]), (long int)sys_authkey,
810 			   (long int)authdecrypt(sys_authkey, (u_int32 *)rpkt,
811 				LEN_PKT_NOMAC, (size_t)(rbufp->recv_length - LEN_PKT_NOMAC)));
812 
813 		if (has_mac && ntohl(rpkt->exten[0]) == sys_authkey &&
814 			authdecrypt(sys_authkey, (u_int32 *)rpkt, LEN_PKT_NOMAC,
815 			(size_t)(rbufp->recv_length - LEN_PKT_NOMAC)))
816 			is_authentic = 1;
817 		if (debug)
818 			printf("receive: authentication %s\n",
819 			   is_authentic ? "passed" : "failed");
820 	}
821 	server->trust <<= 1;
822 	if (!is_authentic)
823 		server->trust |= 1;
824 
825 	/*
826 	 * Check for a KoD (rate limiting) response, cease and decist.
827 	 */
828 	if (LEAP_NOTINSYNC == PKT_LEAP(rpkt->li_vn_mode) &&
829 	    STRATUM_PKT_UNSPEC == rpkt->stratum &&
830 	    !memcmp("RATE", &rpkt->refid, 4)) {
831 		msyslog(LOG_ERR, "%s rate limit response from server.",
832 			stoa(&rbufp->recv_srcadr));
833 		server->event_time = 0;
834 		complete_servers++;
835 		return;
836 	}
837 
838 	/*
839 	 * Looks good.	Record info from the packet.
840 	 */
841 	server->leap = PKT_LEAP(rpkt->li_vn_mode);
842 	server->stratum = PKT_TO_STRATUM(rpkt->stratum);
843 	server->precision = rpkt->precision;
844 	server->rootdelay = ntohl(rpkt->rootdelay);
845 	server->rootdisp = ntohl(rpkt->rootdisp);
846 	server->refid = rpkt->refid;
847 	NTOHL_FP(&rpkt->reftime, &server->reftime);
848 	NTOHL_FP(&rpkt->rec, &rec);
849 	NTOHL_FP(&rpkt->xmt, &server->org);
850 
851 	/*
852 	 * Make sure the server is at least somewhat sane.	If not, try
853 	 * again.
854 	 */
855 	if (L_ISZERO(&rec) || !L_ISHIS(&server->org, &rec)) {
856 		server->event_time = current_time + sys_timeout;
857 		return;
858 	}
859 
860 	/*
861 	 * Calculate the round trip delay (di) and the clock offset (ci).
862 	 * We use the equations (reordered from those in the spec):
863 	 *
864 	 * d = (t2 - t3) - (t1 - t0)
865 	 * c = ((t2 - t3) + (t1 - t0)) / 2
866 	 */
867 	t10 = server->org;		/* pkt.xmt == t1 */
868 	L_SUB(&t10, &rbufp->recv_time); /* recv_time == t0*/
869 
870 	t23 = rec;			/* pkt.rec == t2 */
871 	L_SUB(&t23, &org);		/* pkt->org == t3 */
872 
873 	/* now have (t2 - t3) and (t0 - t1).	Calculate (ci) and (di) */
874 	/*
875 	 * Calculate (ci) = ((t1 - t0) / 2) + ((t2 - t3) / 2)
876 	 * For large offsets this may prevent an overflow on '+'
877 	 */
878 	ci = t10;
879 	L_RSHIFT(&ci);
880 	tmp = t23;
881 	L_RSHIFT(&tmp);
882 	L_ADD(&ci, &tmp);
883 
884 	/*
885 	 * Calculate di in t23 in full precision, then truncate
886 	 * to an s_fp.
887 	 */
888 	L_SUB(&t23, &t10);
889 	di = LFPTOFP(&t23);
890 
891 	if (debug > 3)
892 		printf("offset: %s, delay %s\n", lfptoa(&ci, 6), fptoa(di, 5));
893 
894 	di += (FP_SECOND >> (-(int)NTPDATE_PRECISION))
895 		+ (FP_SECOND >> (-(int)server->precision)) + NTP_MAXSKW;
896 
897 	if (di <= 0) {		/* value still too raunchy to use? */
898 		L_CLR(&ci);
899 		di = 0;
900 	} else {
901 		di = max(di, NTP_MINDIST);
902 	}
903 
904 	/*
905 	 * Shift this data in, then schedule another transmit.
906 	 */
907 	server_data(server, (s_fp) di, &ci, 0);
908 
909 	if ((int)server->filter_nextpt >= sys_samples) {
910 		/*
911 		 * Got all the data we need.  Mark this guy
912 		 * completed and return.
913 		 */
914 		server->event_time = 0;
915 		complete_servers++;
916 		return;
917 	}
918 
919 	server->event_time = current_time + sys_timeout;
920 }
921 
922 
923 /*
924  * server_data - add a sample to the server's filter registers
925  */
926 static void
927 server_data(
928 	register struct server *server,
929 	s_fp d,
930 	l_fp *c,
931 	u_fp e
932 	)
933 {
934 	u_short i;
935 
936 	i = server->filter_nextpt;
937 	if (i < NTP_SHIFT) {
938 		server->filter_delay[i] = d;
939 		server->filter_offset[i] = *c;
940 		server->filter_soffset[i] = LFPTOFP(c);
941 		server->filter_error[i] = e;
942 		server->filter_nextpt = (u_short)(i + 1);
943 	}
944 }
945 
946 
947 /*
948  * clock_filter - determine a server's delay, dispersion and offset
949  */
950 static void
951 clock_filter(
952 	register struct server *server
953 	)
954 {
955 	register int i, j;
956 	int ord[NTP_SHIFT];
957 
958 	/*
959 	 * Sort indices into increasing delay order
960 	 */
961 	for (i = 0; i < sys_samples; i++)
962 		ord[i] = i;
963 
964 	for (i = 0; i < (sys_samples-1); i++) {
965 		for (j = i+1; j < sys_samples; j++) {
966 			if (server->filter_delay[ord[j]] == 0)
967 				continue;
968 			if (server->filter_delay[ord[i]] == 0
969 				|| (server->filter_delay[ord[i]]
970 				> server->filter_delay[ord[j]])) {
971 				register int tmp;
972 
973 				tmp = ord[i];
974 				ord[i] = ord[j];
975 				ord[j] = tmp;
976 			}
977 		}
978 	}
979 
980 	/*
981 	 * Now compute the dispersion, and assign values to delay and
982 	 * offset.	If there are no samples in the register, delay and
983 	 * offset go to zero and dispersion is set to the maximum.
984 	 */
985 	if (server->filter_delay[ord[0]] == 0) {
986 		server->delay = 0;
987 		L_CLR(&server->offset);
988 		server->soffset = 0;
989 		server->dispersion = PEER_MAXDISP;
990 	} else {
991 		register s_fp d;
992 
993 		server->delay = server->filter_delay[ord[0]];
994 		server->offset = server->filter_offset[ord[0]];
995 		server->soffset = LFPTOFP(&server->offset);
996 		server->dispersion = 0;
997 		for (i = 1; i < sys_samples; i++) {
998 			if (server->filter_delay[ord[i]] == 0)
999 				d = PEER_MAXDISP;
1000 			else {
1001 				d = server->filter_soffset[ord[i]]
1002 					- server->filter_soffset[ord[0]];
1003 				if (d < 0)
1004 					d = -d;
1005 				if (d > PEER_MAXDISP)
1006 					d = PEER_MAXDISP;
1007 			}
1008 			/*
1009 			 * XXX This *knows* PEER_FILTER is 1/2
1010 			 */
1011 			server->dispersion += (u_fp)(d) >> i;
1012 		}
1013 	}
1014 	/*
1015 	 * We're done
1016 	 */
1017 }
1018 
1019 
1020 /*
1021  * clock_select - select the pick-of-the-litter clock from the samples
1022  *		  we've got.
1023  */
1024 static struct server *
1025 clock_select(void)
1026 {
1027 	struct server *server;
1028 	u_int nlist;
1029 	s_fp d;
1030 	u_int count;
1031 	u_int i;
1032 	u_int j;
1033 	u_int k;
1034 	int n;
1035 	s_fp local_threshold;
1036 	struct server *server_list[NTP_MAXCLOCK];
1037 	u_fp server_badness[NTP_MAXCLOCK];
1038 	struct server *sys_server;
1039 
1040 	/*
1041 	 * This first chunk of code is supposed to go through all
1042 	 * servers we know about to find the NTP_MAXLIST servers which
1043 	 * are most likely to succeed.	We run through the list
1044 	 * doing the sanity checks and trying to insert anyone who
1045 	 * looks okay.	We are at all times aware that we should
1046 	 * only keep samples from the top two strata and we only need
1047 	 * NTP_MAXLIST of them.
1048 	 */
1049 	nlist = 0;	/* none yet */
1050 	for (server = sys_servers; server != NULL; server = server->next_server) {
1051 		if (server->delay == 0) {
1052 			if (debug)
1053 				printf("%s: Server dropped: no data\n", ntoa(&server->srcadr));
1054 			continue;	/* no data */
1055 		}
1056 		if (server->stratum > NTP_INFIN) {
1057 			if (debug)
1058 				printf("%s: Server dropped: strata too high\n", ntoa(&server->srcadr));
1059 			continue;	/* stratum no good */
1060 		}
1061 		if (server->delay > NTP_MAXWGT) {
1062 			if (debug)
1063 				printf("%s: Server dropped: server too far away\n",
1064 					ntoa(&server->srcadr));
1065 			continue;	/* too far away */
1066 		}
1067 		if (server->leap == LEAP_NOTINSYNC) {
1068 			if (debug)
1069 				printf("%s: Server dropped: Leap not in sync\n", ntoa(&server->srcadr));
1070 			continue;	/* he's in trouble */
1071 		}
1072 		if (!L_ISHIS(&server->org, &server->reftime)) {
1073 			if (debug)
1074 				printf("%s: Server dropped: server is very broken\n",
1075 				       ntoa(&server->srcadr));
1076 			continue;	/* very broken host */
1077 		}
1078 		if ((server->org.l_ui - server->reftime.l_ui)
1079 		    >= NTP_MAXAGE) {
1080 			if (debug)
1081 				printf("%s: Server dropped: Server has gone too long without sync\n",
1082 				       ntoa(&server->srcadr));
1083 			continue;	/* too long without sync */
1084 		}
1085 		if (server->trust != 0) {
1086 			if (debug)
1087 				printf("%s: Server dropped: Server is untrusted\n",
1088 				       ntoa(&server->srcadr));
1089 			continue;
1090 		}
1091 
1092 		/*
1093 		 * This one seems sane.  Find where he belongs
1094 		 * on the list.
1095 		 */
1096 		d = server->dispersion + server->dispersion;
1097 		for (i = 0; i < nlist; i++)
1098 			if (server->stratum <= server_list[i]->stratum)
1099 			break;
1100 		for ( ; i < nlist; i++) {
1101 			if (server->stratum < server_list[i]->stratum)
1102 				break;
1103 			if (d < (s_fp) server_badness[i])
1104 				break;
1105 		}
1106 
1107 		/*
1108 		 * If i points past the end of the list, this
1109 		 * guy is a loser, else stick him in.
1110 		 */
1111 		if (i >= NTP_MAXLIST)
1112 			continue;
1113 		for (j = nlist; j > i; j--)
1114 			if (j < NTP_MAXLIST) {
1115 				server_list[j] = server_list[j-1];
1116 				server_badness[j]
1117 					= server_badness[j-1];
1118 			}
1119 
1120 		server_list[i] = server;
1121 		server_badness[i] = d;
1122 		if (nlist < NTP_MAXLIST)
1123 			nlist++;
1124 	}
1125 
1126 	/*
1127 	 * Got the five-or-less best.	 Cut the list where the number of
1128 	 * strata exceeds two.
1129 	 */
1130 	count = 0;
1131 	for (i = 1; i < nlist; i++)
1132 		if (server_list[i]->stratum > server_list[i-1]->stratum) {
1133 			count++;
1134 			if (2 == count) {
1135 				nlist = i;
1136 				break;
1137 			}
1138 		}
1139 
1140 	/*
1141 	 * Whew!  What we should have by now is 0 to 5 candidates for
1142 	 * the job of syncing us.  If we have none, we're out of luck.
1143 	 * If we have one, he's a winner.  If we have more, do falseticker
1144 	 * detection.
1145 	 */
1146 
1147 	if (0 == nlist)
1148 		sys_server = NULL;
1149 	else if (1 == nlist) {
1150 		sys_server = server_list[0];
1151 	} else {
1152 		/*
1153 		 * Re-sort by stratum, bdelay estimate quality and
1154 		 * server.delay.
1155 		 */
1156 		for (i = 0; i < nlist-1; i++)
1157 			for (j = i+1; j < nlist; j++) {
1158 				if (server_list[i]->stratum <
1159 				    server_list[j]->stratum)
1160 					/* already sorted by stratum */
1161 					break;
1162 				if (server_list[i]->delay <
1163 				    server_list[j]->delay)
1164 					continue;
1165 				server = server_list[i];
1166 				server_list[i] = server_list[j];
1167 				server_list[j] = server;
1168 			}
1169 
1170 		/*
1171 		 * Calculate the fixed part of the dispersion limit
1172 		 */
1173 		local_threshold = (FP_SECOND >> (-(int)NTPDATE_PRECISION))
1174 			+ NTP_MAXSKW;
1175 
1176 		/*
1177 		 * Now drop samples until we're down to one.
1178 		 */
1179 		while (nlist > 1) {
1180 			for (k = 0; k < nlist; k++) {
1181 				server_badness[k] = 0;
1182 				for (j = 0; j < nlist; j++) {
1183 					if (j == k) /* with self? */
1184 						continue;
1185 					d = server_list[j]->soffset -
1186 					    server_list[k]->soffset;
1187 					if (d < 0)	/* abs value */
1188 						d = -d;
1189 					/*
1190 					 * XXX This code *knows* that
1191 					 * NTP_SELECT is 3/4
1192 					 */
1193 					for (i = 0; i < j; i++)
1194 						d = (d>>1) + (d>>2);
1195 					server_badness[k] += d;
1196 				}
1197 			}
1198 
1199 			/*
1200 			 * We now have an array of nlist badness
1201 			 * coefficients.	Find the badest.  Find
1202 			 * the minimum precision while we're at
1203 			 * it.
1204 			 */
1205 			i = 0;
1206 			n = server_list[0]->precision;;
1207 			for (j = 1; j < nlist; j++) {
1208 				if (server_badness[j] >= server_badness[i])
1209 					i = j;
1210 				if (n > server_list[j]->precision)
1211 					n = server_list[j]->precision;
1212 			}
1213 
1214 			/*
1215 			 * i is the index of the server with the worst
1216 			 * dispersion.	If his dispersion is less than
1217 			 * the threshold, stop now, else delete him and
1218 			 * continue around again.
1219 			 */
1220 			if ( (s_fp) server_badness[i] < (local_threshold
1221 							 + (FP_SECOND >> (-n))))
1222 				break;
1223 			for (j = i + 1; j < nlist; j++)
1224 				server_list[j-1] = server_list[j];
1225 			nlist--;
1226 		}
1227 
1228 		/*
1229 		 * What remains is a list of less than 5 servers.  Take
1230 		 * the best.
1231 		 */
1232 		sys_server = server_list[0];
1233 	}
1234 
1235 	/*
1236 	 * That's it.  Return our server.
1237 	 */
1238 	return sys_server;
1239 }
1240 
1241 
1242 /*
1243  * clock_adjust - process what we've received, and adjust the time
1244  *		 if we got anything decent.
1245  */
1246 static int
1247 clock_adjust(void)
1248 {
1249 	register struct server *sp, *server;
1250 	int dostep;
1251 
1252 	for (sp = sys_servers; sp != NULL; sp = sp->next_server)
1253 		clock_filter(sp);
1254 	server = clock_select();
1255 
1256 	if (debug || simple_query) {
1257 		for (sp = sys_servers; sp != NULL; sp = sp->next_server)
1258 			printserver(sp, stdout);
1259 	}
1260 
1261 	if (server == 0) {
1262 		msyslog(LOG_ERR,
1263 			"no server suitable for synchronization found");
1264 		return(1);
1265 	}
1266 
1267 	if (always_step) {
1268 		dostep = 1;
1269 	} else if (never_step) {
1270 		dostep = 0;
1271 	} else {
1272 		/* [Bug 3023] get absolute difference, avoiding signed
1273 		 * integer overflow like hell.
1274 		 */
1275 		u_fp absoffset;
1276 		if (server->soffset < 0)
1277 			absoffset = 1u + (u_fp)(-(server->soffset + 1));
1278 		else
1279 			absoffset = (u_fp)server->soffset;
1280 		dostep = (absoffset >= NTPDATE_THRESHOLD);
1281 	}
1282 
1283 	if (dostep) {
1284 		if (simple_query || debug || l_step_systime(&server->offset)){
1285 			msyslog(LOG_NOTICE, "step time server %s offset %s sec",
1286 				stoa(&server->srcadr),
1287 				lfptoa(&server->offset, 6));
1288 		}
1289 	} else {
1290 #ifndef SYS_WINNT
1291 		if (simple_query || l_adj_systime(&server->offset)) {
1292 			msyslog(LOG_NOTICE, "adjust time server %s offset %s sec",
1293 				stoa(&server->srcadr),
1294 				lfptoa(&server->offset, 6));
1295 		}
1296 #else
1297 		/* The NT SetSystemTimeAdjustment() call achieves slewing by
1298 		 * changing the clock frequency. This means that we cannot specify
1299 		 * it to slew the clock by a definite amount and then stop like
1300 		 * the Unix adjtime() routine. We can technically adjust the clock
1301 		 * frequency, have ntpdate sleep for a while, and then wake
1302 		 * up and reset the clock frequency, but this might cause some
1303 		 * grief if the user attempts to run ntpd immediately after
1304 		 * ntpdate and the socket is in use.
1305 		 */
1306 		printf("\nThe -b option is required by ntpdate on Windows NT platforms\n");
1307 		exit(1);
1308 #endif /* SYS_WINNT */
1309 	}
1310 	return(0);
1311 }
1312 
1313 
1314 /*
1315  * is_unreachable - check to see if we have a route to given destination
1316  *		    (non-blocking).
1317  */
1318 static int
1319 is_reachable (sockaddr_u *dst)
1320 {
1321 	SOCKET sockfd;
1322 
1323 	sockfd = socket(AF(dst), SOCK_DGRAM, 0);
1324 	if (sockfd == -1) {
1325 		return 0;
1326 	}
1327 
1328 	if (connect(sockfd, &dst->sa, SOCKLEN(dst))) {
1329 		closesocket(sockfd);
1330 		return 0;
1331 	}
1332 	closesocket(sockfd);
1333 	return 1;
1334 }
1335 
1336 
1337 
1338 /* XXX ELIMINATE: merge BIG slew into adj_systime in lib/systime.c */
1339 /*
1340  * addserver - determine a server's address and allocate a new structure
1341  *		for it.
1342  */
1343 static void
1344 addserver(
1345 	char *serv
1346 	)
1347 {
1348 	register struct server *server;
1349 	/* Address infos structure to store result of getaddrinfo */
1350 	struct addrinfo *addrResult, *ptr;
1351 	/* Address infos structure to store hints for getaddrinfo */
1352 	struct addrinfo hints;
1353 	/* Error variable for getaddrinfo */
1354 	int error;
1355 	/* Service name */
1356 	char service[5];
1357 	sockaddr_u addr;
1358 
1359 	strlcpy(service, "ntp", sizeof(service));
1360 
1361 	/* Get host address. Looking for UDP datagram connection. */
1362 	ZERO(hints);
1363 	hints.ai_family = ai_fam_templ;
1364 	hints.ai_socktype = SOCK_DGRAM;
1365 
1366 #ifdef DEBUG
1367 	if (debug)
1368 		printf("Looking for host %s and service %s\n", serv, service);
1369 #endif
1370 
1371 	error = getaddrinfo(serv, service, &hints, &addrResult);
1372 	if (error != 0) {
1373 		/* Conduct more refined error analysis */
1374 		if (error == EAI_FAIL || error == EAI_AGAIN){
1375 			/* Name server is unusable. Exit after failing on the
1376 			   first server, in order to shorten the timeout caused
1377 			   by waiting for resolution of several servers */
1378 			fprintf(stderr, "Exiting, name server cannot be used: %s (%d)",
1379 				gai_strerror(error), error);
1380 			msyslog(LOG_ERR, "name server cannot be used: %s (%d)",
1381 				gai_strerror(error), error);
1382 			exit(1);
1383 		}
1384 		fprintf(stderr, "Error resolving %s: %s (%d)\n", serv,
1385 			gai_strerror(error), error);
1386 		msyslog(LOG_ERR, "Can't find host %s: %s (%d)", serv,
1387 			gai_strerror(error), error);
1388 		return;
1389 	}
1390 #ifdef DEBUG
1391 	if (debug) {
1392 		ZERO(addr);
1393 		INSIST(addrResult->ai_addrlen <= sizeof(addr));
1394 		memcpy(&addr, addrResult->ai_addr, addrResult->ai_addrlen);
1395 		fprintf(stderr, "host found : %s\n", stohost(&addr));
1396 	}
1397 #endif
1398 
1399 	/* We must get all returned server in case the first one fails */
1400 	for (ptr = addrResult; ptr != NULL; ptr = ptr->ai_next) {
1401 		ZERO(addr);
1402 		INSIST(ptr->ai_addrlen <= sizeof(addr));
1403 		memcpy(&addr, ptr->ai_addr, ptr->ai_addrlen);
1404 		if (is_reachable(&addr)) {
1405 			server = emalloc_zero(sizeof(*server));
1406 			memcpy(&server->srcadr, ptr->ai_addr, ptr->ai_addrlen);
1407 			server->event_time = ++sys_numservers;
1408 			if (sys_servers == NULL)
1409 				sys_servers = server;
1410 			else {
1411 				struct server *sp;
1412 
1413 				for (sp = sys_servers; sp->next_server != NULL;
1414 				     sp = sp->next_server)
1415 					/* empty */;
1416 				sp->next_server = server;
1417 			}
1418 		}
1419 	}
1420 
1421 	freeaddrinfo(addrResult);
1422 }
1423 
1424 
1425 /*
1426  * findserver - find a server in the list given its address
1427  * ***(For now it isn't totally AF-Independant, to check later..)
1428  */
1429 static struct server *
1430 findserver(
1431 	sockaddr_u *addr
1432 	)
1433 {
1434 	struct server *server;
1435 	struct server *mc_server;
1436 
1437 	mc_server = NULL;
1438 	if (SRCPORT(addr) != NTP_PORT)
1439 		return 0;
1440 
1441 	for (server = sys_servers; server != NULL;
1442 	     server = server->next_server) {
1443 		if (SOCK_EQ(addr, &server->srcadr))
1444 			return server;
1445 
1446 		if (AF(addr) == AF(&server->srcadr)) {
1447 			if (IS_MCAST(&server->srcadr))
1448 				mc_server = server;
1449 		}
1450 	}
1451 
1452 	if (mc_server != NULL) {
1453 
1454 		struct server *sp;
1455 
1456 		if (mc_server->event_time != 0) {
1457 			mc_server->event_time = 0;
1458 			complete_servers++;
1459 		}
1460 
1461 		server = emalloc_zero(sizeof(*server));
1462 
1463 		server->srcadr = *addr;
1464 
1465 		server->event_time = ++sys_numservers;
1466 
1467 		for (sp = sys_servers; sp->next_server != NULL;
1468 		     sp = sp->next_server)
1469 			/* empty */;
1470 		sp->next_server = server;
1471 		transmit(server);
1472 	}
1473 	return NULL;
1474 }
1475 
1476 
1477 /*
1478  * timer - process a timer interrupt
1479  */
1480 void
1481 timer(void)
1482 {
1483 	struct server *server;
1484 
1485 	/*
1486 	 * Bump the current idea of the time
1487 	 */
1488 	current_time++;
1489 
1490 	/*
1491 	 * Search through the server list looking for guys
1492 	 * who's event timers have expired.  Give these to
1493 	 * the transmit routine.
1494 	 */
1495 	for (server = sys_servers; server != NULL;
1496 	     server = server->next_server) {
1497 		if (server->event_time != 0
1498 		    && server->event_time <= current_time)
1499 			transmit(server);
1500 	}
1501 }
1502 
1503 
1504 /*
1505  * The code duplication in the following subroutine sucks, but
1506  * we need to appease ansi2knr.
1507  */
1508 
1509 #ifndef SYS_WINNT
1510 /*
1511  * alarming - record the occurance of an alarm interrupt
1512  */
1513 static RETSIGTYPE
1514 alarming(
1515 	int sig
1516 	)
1517 {
1518 	alarm_flag++;
1519 }
1520 #else	/* SYS_WINNT follows */
1521 void CALLBACK
1522 alarming(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
1523 {
1524 	UNUSED_ARG(uTimerID); UNUSED_ARG(uMsg); UNUSED_ARG(dwUser);
1525 	UNUSED_ARG(dw1); UNUSED_ARG(dw2);
1526 
1527 	alarm_flag++;
1528 }
1529 
1530 static void
1531 callTimeEndPeriod(void)
1532 {
1533 	timeEndPeriod( wTimerRes );
1534 	wTimerRes = 0;
1535 }
1536 #endif /* SYS_WINNT */
1537 
1538 
1539 /*
1540  * init_alarm - set up the timer interrupt
1541  */
1542 static void
1543 init_alarm(void)
1544 {
1545 #ifndef SYS_WINNT
1546 # ifdef HAVE_TIMER_CREATE
1547 	struct itimerspec its;
1548 # else
1549 	struct itimerval itv;
1550 # endif
1551 #else	/* SYS_WINNT follows */
1552 	TIMECAPS tc;
1553 	UINT wTimerID;
1554 	HANDLE hToken;
1555 	TOKEN_PRIVILEGES tkp;
1556 	DWORD dwUser = 0;
1557 #endif /* SYS_WINNT */
1558 
1559 	alarm_flag = 0;
1560 
1561 #ifndef SYS_WINNT
1562 # ifdef HAVE_TIMER_CREATE
1563 	alarm_flag = 0;
1564 	/* this code was put in as setitimer() is non existant this us the
1565 	 * POSIX "equivalents" setup - casey
1566 	 */
1567 	/* ntpdate_timerid is global - so we can kill timer later */
1568 	if (timer_create (CLOCK_REALTIME, NULL, &ntpdate_timerid) ==
1569 #  ifdef SYS_VXWORKS
1570 		ERROR
1571 #  else
1572 		-1
1573 #  endif
1574 		)
1575 	{
1576 		fprintf (stderr, "init_alarm(): timer_create (...) FAILED\n");
1577 		return;
1578 	}
1579 
1580 	/*	TIMER_HZ = (5)
1581 	 * Set up the alarm interrupt.	The first comes 1/(2*TIMER_HZ)
1582 	 * seconds from now and they continue on every 1/TIMER_HZ seconds.
1583 	 */
1584 	signal_no_reset(SIGALRM, alarming);
1585 	its.it_interval.tv_sec = 0;
1586 	its.it_value.tv_sec = 0;
1587 	its.it_interval.tv_nsec = 1000000000/TIMER_HZ;
1588 	its.it_value.tv_nsec = 1000000000/(TIMER_HZ<<1);
1589 	timer_settime(ntpdate_timerid, 0 /* !TIMER_ABSTIME */, &its, NULL);
1590 # else	/* !HAVE_TIMER_CREATE follows */
1591 	/*
1592 	 * Set up the alarm interrupt.	The first comes 1/(2*TIMER_HZ)
1593 	 * seconds from now and they continue on every 1/TIMER_HZ seconds.
1594 	 */
1595 	signal_no_reset(SIGALRM, alarming);
1596 	itv.it_interval.tv_sec = 0;
1597 	itv.it_value.tv_sec = 0;
1598 	itv.it_interval.tv_usec = 1000000/TIMER_HZ;
1599 	itv.it_value.tv_usec = 1000000/(TIMER_HZ<<1);
1600 
1601 	setitimer(ITIMER_REAL, &itv, NULL);
1602 # endif	/* !HAVE_TIMER_CREATE */
1603 #else	/* SYS_WINNT follows */
1604 	_tzset();
1605 
1606 	/*
1607 	 * Get privileges needed for fiddling with the clock
1608 	 */
1609 
1610 	/* get the current process token handle */
1611 	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
1612 		msyslog(LOG_ERR, "OpenProcessToken failed: %m");
1613 		exit(1);
1614 	}
1615 	/* get the LUID for system-time privilege. */
1616 	LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, &tkp.Privileges[0].Luid);
1617 	tkp.PrivilegeCount = 1;		/* one privilege to set */
1618 	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
1619 	/* get set-time privilege for this process. */
1620 	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
1621 	/* cannot test return value of AdjustTokenPrivileges. */
1622 	if (GetLastError() != ERROR_SUCCESS)
1623 		msyslog(LOG_ERR, "AdjustTokenPrivileges failed: %m");
1624 
1625 	/*
1626 	 * Set up timer interrupts for every 2**EVENT_TIMEOUT seconds
1627 	 * Under Win/NT, expiry of timer interval leads to invocation
1628 	 * of a callback function (on a different thread) rather than
1629 	 * generating an alarm signal
1630 	 */
1631 
1632 	/* determine max and min resolution supported */
1633 	if(timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) {
1634 		msyslog(LOG_ERR, "timeGetDevCaps failed: %m");
1635 		exit(1);
1636 	}
1637 	wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
1638 	/* establish the minimum timer resolution that we'll use */
1639 	timeBeginPeriod(wTimerRes);
1640 	atexit(callTimeEndPeriod);
1641 
1642 	/* start the timer event */
1643 	wTimerID = timeSetEvent(
1644 		(UINT) (1000/TIMER_HZ),		/* Delay */
1645 		wTimerRes,			/* Resolution */
1646 		(LPTIMECALLBACK) alarming,	/* Callback function */
1647 		(DWORD) dwUser,			/* User data */
1648 		TIME_PERIODIC);			/* Event type (periodic) */
1649 	if (wTimerID == 0) {
1650 		msyslog(LOG_ERR, "timeSetEvent failed: %m");
1651 		exit(1);
1652 	}
1653 #endif /* SYS_WINNT */
1654 }
1655 
1656 
1657 
1658 
1659 /*
1660  * We do asynchronous input using the SIGIO facility.  A number of
1661  * recvbuf buffers are preallocated for input.	In the signal
1662  * handler we poll to see if the socket is ready and read the
1663  * packets from it into the recvbuf's along with a time stamp and
1664  * an indication of the source host and the interface it was received
1665  * through.  This allows us to get as accurate receive time stamps
1666  * as possible independent of other processing going on.
1667  *
1668  * We allocate a number of recvbufs equal to the number of servers
1669  * plus 2.	This should be plenty.
1670  */
1671 
1672 
1673 /*
1674  * init_io - initialize I/O data and open socket
1675  */
1676 static void
1677 init_io(void)
1678 {
1679 	struct addrinfo *res, *ressave;
1680 	struct addrinfo hints;
1681 	sockaddr_u addr;
1682 	char service[5];
1683 	int rc;
1684 	int optval = 1;
1685 	int check_ntp_port_in_use = !debug && !simple_query && !unpriv_port;
1686 
1687 	/*
1688 	 * Init buffer free list and stat counters
1689 	 */
1690 	init_recvbuff(sys_numservers + 2);
1691 
1692 	/*
1693 	 * Open the socket
1694 	 */
1695 
1696 	strlcpy(service, "ntp", sizeof(service));
1697 
1698 	/*
1699 	 * Init hints addrinfo structure
1700 	 */
1701 	ZERO(hints);
1702 	hints.ai_family = ai_fam_templ;
1703 	hints.ai_flags = AI_PASSIVE;
1704 	hints.ai_socktype = SOCK_DGRAM;
1705 
1706 	if (getaddrinfo(NULL, service, &hints, &res) != 0) {
1707 		msyslog(LOG_ERR, "getaddrinfo() failed: %m");
1708 		exit(1);
1709 		/*NOTREACHED*/
1710 	}
1711 
1712 #ifdef SYS_WINNT
1713 	if (check_ntp_port_in_use && ntp_port_inuse(AF_INET, NTP_PORT)){
1714 		msyslog(LOG_ERR, "the NTP socket is in use, exiting: %m");
1715 		exit(1);
1716 	}
1717 #endif
1718 
1719 	/* Remember the address of the addrinfo structure chain */
1720 	ressave = res;
1721 
1722 	/*
1723 	 * For each structure returned, open and bind socket
1724 	 */
1725 	for(nbsock = 0; (nbsock < MAX_AF) && res ; res = res->ai_next) {
1726 	/* create a datagram (UDP) socket */
1727 		fd[nbsock] = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
1728 		if (fd[nbsock] == SOCKET_ERROR) {
1729 #ifndef SYS_WINNT
1730 		if (errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT ||
1731 		    errno == EPFNOSUPPORT)
1732 #else
1733 		int err = WSAGetLastError();
1734 		if (err == WSAEPROTONOSUPPORT || err == WSAEAFNOSUPPORT ||
1735 		    err == WSAEPFNOSUPPORT)
1736 #endif
1737 			continue;
1738 		msyslog(LOG_ERR, "socket() failed: %m");
1739 		exit(1);
1740 		/*NOTREACHED*/
1741 		}
1742 		/* set socket to reuse address */
1743 		if (setsockopt(fd[nbsock], SOL_SOCKET, SO_REUSEADDR, (void*) &optval, sizeof(optval)) < 0) {
1744 				msyslog(LOG_ERR, "setsockopt() SO_REUSEADDR failed: %m");
1745 				exit(1);
1746 				/*NOTREACHED*/
1747 		}
1748 #ifdef IPV6_V6ONLY
1749 		/* Restricts AF_INET6 socket to IPv6 communications (see RFC 2553bis-03) */
1750 		if (res->ai_family == AF_INET6)
1751 			if (setsockopt(fd[nbsock], IPPROTO_IPV6, IPV6_V6ONLY, (void*) &optval, sizeof(optval)) < 0) {
1752 				   msyslog(LOG_ERR, "setsockopt() IPV6_V6ONLY failed: %m");
1753 					exit(1);
1754 					/*NOTREACHED*/
1755 		}
1756 #endif
1757 
1758 		/* Remember the socket family in fd_family structure */
1759 		fd_family[nbsock] = res->ai_family;
1760 
1761 		/*
1762 		 * bind the socket to the NTP port
1763 		 */
1764 		if (check_ntp_port_in_use) {
1765 			ZERO(addr);
1766 			INSIST(res->ai_addrlen <= sizeof(addr));
1767 			memcpy(&addr, res->ai_addr, res->ai_addrlen);
1768 			rc = bind(fd[nbsock], &addr.sa, SOCKLEN(&addr));
1769 			if (rc < 0) {
1770 				if (EADDRINUSE == socket_errno())
1771 					msyslog(LOG_ERR, "the NTP socket is in use, exiting");
1772 				else
1773 					msyslog(LOG_ERR, "bind() fails: %m");
1774 				exit(1);
1775 			}
1776 		}
1777 
1778 #ifdef HAVE_POLL_H
1779 		fdmask[nbsock].fd = fd[nbsock];
1780 		fdmask[nbsock].events = POLLIN;
1781 #else
1782 		FD_SET(fd[nbsock], &fdmask);
1783 		if (maxfd < fd[nbsock]+1) {
1784 			maxfd = fd[nbsock]+1;
1785 		}
1786 #endif
1787 
1788 		/*
1789 		 * set non-blocking,
1790 		 */
1791 #ifndef SYS_WINNT
1792 # ifdef SYS_VXWORKS
1793 		{
1794 			int on = TRUE;
1795 
1796 			if (ioctl(fd[nbsock],FIONBIO, &on) == ERROR) {
1797 				msyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m");
1798 				exit(1);
1799 			}
1800 		}
1801 # else /* not SYS_VXWORKS */
1802 #  if defined(O_NONBLOCK)
1803 		if (fcntl(fd[nbsock], F_SETFL, O_NONBLOCK) < 0) {
1804 			msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1805 			exit(1);
1806 			/*NOTREACHED*/
1807 		}
1808 #  else /* not O_NONBLOCK */
1809 #	if defined(FNDELAY)
1810 		if (fcntl(fd[nbsock], F_SETFL, FNDELAY) < 0) {
1811 			msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1812 			exit(1);
1813 			/*NOTREACHED*/
1814 		}
1815 #	else /* FNDELAY */
1816 #	 include "Bletch: Need non blocking I/O"
1817 #	endif /* FNDELAY */
1818 #  endif /* not O_NONBLOCK */
1819 # endif /* SYS_VXWORKS */
1820 #else /* SYS_WINNT */
1821 		if (ioctlsocket(fd[nbsock], FIONBIO, (u_long *) &on) == SOCKET_ERROR) {
1822 			msyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m");
1823 			exit(1);
1824 		}
1825 #endif /* SYS_WINNT */
1826 		nbsock++;
1827 	}
1828 	freeaddrinfo(ressave);
1829 }
1830 
1831 /*
1832  * sendpkt - send a packet to the specified destination
1833  */
1834 static void
1835 sendpkt(
1836 	sockaddr_u *dest,
1837 	struct pkt *pkt,
1838 	int len
1839 	)
1840 {
1841 	int i;
1842 	int cc;
1843 	SOCKET sock = INVALID_SOCKET;
1844 
1845 #ifdef SYS_WINNT
1846 	DWORD err;
1847 #endif /* SYS_WINNT */
1848 
1849 	/* Find a local family compatible socket to send ntp packet to ntp server */
1850 	for(i = 0; (i < MAX_AF); i++) {
1851 		if(AF(dest) == fd_family[i]) {
1852 			sock = fd[i];
1853 		break;
1854 		}
1855 	}
1856 
1857 	if (INVALID_SOCKET == sock) {
1858 		msyslog(LOG_ERR, "cannot find family compatible socket to send ntp packet");
1859 		exit(1);
1860 		/*NOTREACHED*/
1861 	}
1862 
1863 	cc = sendto(sock, (char *)pkt, len, 0, (struct sockaddr *)dest,
1864 			SOCKLEN(dest));
1865 
1866 	if (SOCKET_ERROR == cc) {
1867 #ifndef SYS_WINNT
1868 		if (errno != EWOULDBLOCK && errno != ENOBUFS)
1869 #else
1870 		err = WSAGetLastError();
1871 		if (err != WSAEWOULDBLOCK && err != WSAENOBUFS)
1872 #endif /* SYS_WINNT */
1873 			msyslog(LOG_ERR, "sendto(%s): %m", stohost(dest));
1874 	}
1875 }
1876 
1877 
1878 /*
1879  * input_handler - receive packets asynchronously
1880  */
1881 void
1882 input_handler(void)
1883 {
1884 	register int n;
1885 	register struct recvbuf *rb;
1886 	struct sock_timeval tvzero;
1887 	GETSOCKNAME_SOCKLEN_TYPE fromlen;
1888 	l_fp ts;
1889 	int i;
1890 #ifdef HAVE_POLL_H
1891 	struct pollfd fds[MAX_AF];
1892 #else
1893 	fd_set fds;
1894 #endif
1895 	SOCKET fdc = 0;
1896 
1897 	/*
1898 	 * Do a poll to see if we have data
1899 	 */
1900 	for (;;) {
1901 		tvzero.tv_sec = tvzero.tv_usec = 0;
1902 #ifdef HAVE_POLL_H
1903 		memcpy(fds, fdmask, sizeof(fdmask));
1904 		n = poll(fds, (unsigned int)nbsock, tvzero.tv_sec * 1000);
1905 
1906 		/*
1907 		 * Determine which socket received data
1908 		 */
1909 
1910 		for(i=0; i < nbsock; i++) {
1911 			if(fds[i].revents & POLLIN) {
1912 				fdc = fd[i];
1913 				break;
1914 			}
1915 		}
1916 
1917 #else
1918 		fds = fdmask;
1919 		n = select(maxfd, &fds, NULL, NULL, &tvzero);
1920 
1921 		/*
1922 		 * Determine which socket received data
1923 		 */
1924 
1925 		for(i=0; i < nbsock; i++) {
1926 			if(FD_ISSET(fd[i], &fds)) {
1927 				 fdc = fd[i];
1928 				 break;
1929 			}
1930 		}
1931 
1932 #endif
1933 
1934 		/*
1935 		 * If nothing to do, just return.  If an error occurred,
1936 		 * complain and return.  If we've got some, freeze a
1937 		 * timestamp.
1938 		 */
1939 		if (n == 0)
1940 			return;
1941 		else if (n == -1) {
1942 			if (errno != EINTR)
1943 				msyslog(LOG_ERR,
1944 #ifdef HAVE_POLL_H
1945 					"poll() error: %m"
1946 #else
1947 					"select() error: %m"
1948 #endif
1949 					);
1950 			return;
1951 		}
1952 		get_systime(&ts);
1953 
1954 		/*
1955 		 * Get a buffer and read the frame.  If we
1956 		 * haven't got a buffer, or this is received
1957 		 * on the wild card socket, just dump the packet.
1958 		 */
1959 		if (initializing || free_recvbuffs() == 0) {
1960 			char buf[100];
1961 
1962 
1963 #ifndef SYS_WINNT
1964 			(void) read(fdc, buf, sizeof buf);
1965 #else
1966 			/* NT's _read does not operate on nonblocking sockets
1967 			 * either recvfrom or ReadFile() has to be used here.
1968 			 * ReadFile is used in [ntpd]ntp_intres() and ntpdc,
1969 			 * just to be different use recvfrom() here
1970 			 */
1971 			recvfrom(fdc, buf, sizeof(buf), 0, (struct sockaddr *)0, NULL);
1972 #endif /* SYS_WINNT */
1973 			continue;
1974 		}
1975 
1976 		rb = get_free_recv_buffer();
1977 
1978 		fromlen = sizeof(rb->recv_srcadr);
1979 		rb->recv_length = recvfrom(fdc, (char *)&rb->recv_pkt,
1980 		   sizeof(rb->recv_pkt), 0,
1981 		   (struct sockaddr *)&rb->recv_srcadr, &fromlen);
1982 		if (rb->recv_length == -1) {
1983 			freerecvbuf(rb);
1984 			continue;
1985 		}
1986 
1987 		/*
1988 		 * Got one.  Mark how and when it got here,
1989 		 * put it on the full list.
1990 		 */
1991 		rb->recv_time = ts;
1992 		add_full_recv_buffer(rb);
1993 	}
1994 }
1995 
1996 
1997 #if !defined SYS_WINNT && !defined SYS_CYGWIN32
1998 /*
1999  * adj_systime - do a big long slew of the system time
2000  */
2001 static int
2002 l_adj_systime(
2003 	l_fp *ts
2004 	)
2005 {
2006 	struct timeval adjtv, oadjtv;
2007 	int isneg = 0;
2008 	l_fp offset;
2009 #ifndef STEP_SLEW
2010 	l_fp overshoot;
2011 #endif
2012 
2013 	/*
2014 	 * Take the absolute value of the offset
2015 	 */
2016 	offset = *ts;
2017 	if (L_ISNEG(&offset)) {
2018 		isneg = 1;
2019 		L_NEG(&offset);
2020 	}
2021 
2022 #ifndef STEP_SLEW
2023 	/*
2024 	 * Calculate the overshoot.  XXX N.B. This code *knows*
2025 	 * ADJ_OVERSHOOT is 1/2.
2026 	 */
2027 	overshoot = offset;
2028 	L_RSHIFTU(&overshoot);
2029 	if (overshoot.l_ui != 0 || (overshoot.l_uf > ADJ_MAXOVERSHOOT)) {
2030 		overshoot.l_ui = 0;
2031 		overshoot.l_uf = ADJ_MAXOVERSHOOT;
2032 	}
2033 	L_ADD(&offset, &overshoot);
2034 #endif
2035 	TSTOTV(&offset, &adjtv);
2036 
2037 	if (isneg) {
2038 		adjtv.tv_sec = -adjtv.tv_sec;
2039 		adjtv.tv_usec = -adjtv.tv_usec;
2040 	}
2041 
2042 	if (adjtv.tv_usec != 0 && !debug) {
2043 		if (adjtime(&adjtv, &oadjtv) < 0) {
2044 			msyslog(LOG_ERR, "Can't adjust the time of day: %m");
2045 			exit(1);
2046 		}
2047 	}
2048 	return 1;
2049 }
2050 #endif /* SYS_WINNT */
2051 
2052 
2053 /*
2054  * This fuction is not the same as lib/systime step_systime!!!
2055  */
2056 static int
2057 l_step_systime(
2058 	l_fp *ts
2059 	)
2060 {
2061 	double dtemp;
2062 
2063 #ifdef SLEWALWAYS
2064 #ifdef STEP_SLEW
2065 	l_fp ftmp;
2066 	int isneg;
2067 	int n;
2068 
2069 	if (debug) return 1;
2070 	/*
2071 	 * Take the absolute value of the offset
2072 	 */
2073 	ftmp = *ts;
2074 	if (L_ISNEG(&ftmp)) {
2075 		L_NEG(&ftmp);
2076 		isneg = 1;
2077 	} else
2078 		isneg = 0;
2079 
2080 	if (ftmp.l_ui >= 3) {		/* Step it and slew - we might win */
2081 		LFPTOD(ts, dtemp);
2082 		n = step_systime(dtemp);
2083 		if (!n)
2084 			return n;
2085 		if (isneg)
2086 			ts->l_ui = ~0;
2087 		else
2088 			ts->l_ui = ~0;
2089 	}
2090 	/*
2091 	 * Just add adjustment into the current offset.  The update
2092 	 * routine will take care of bringing the system clock into
2093 	 * line.
2094 	 */
2095 #endif
2096 	if (debug)
2097 		return 1;
2098 #ifdef FORCE_NTPDATE_STEP
2099 	LFPTOD(ts, dtemp);
2100 	return step_systime(dtemp);
2101 #else
2102 	l_adj_systime(ts);
2103 	return 1;
2104 #endif
2105 #else /* SLEWALWAYS */
2106 	if (debug)
2107 		return 1;
2108 	LFPTOD(ts, dtemp);
2109 	return step_systime(dtemp);
2110 #endif	/* SLEWALWAYS */
2111 }
2112 
2113 
2114 /* XXX ELIMINATE printserver similar in ntptrace.c, ntpdate.c */
2115 /*
2116  * printserver - print detail information for a server
2117  */
2118 static void
2119 printserver(
2120 	register struct server *pp,
2121 	FILE *fp
2122 	)
2123 {
2124 	register int i;
2125 	char junk[5];
2126 	const char *str;
2127 
2128 	if (!debug) {
2129 		(void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n",
2130 				   stoa(&pp->srcadr), pp->stratum,
2131 				   lfptoa(&pp->offset, 6), fptoa((s_fp)pp->delay, 5));
2132 		return;
2133 	}
2134 
2135 	(void) fprintf(fp, "server %s, port %d\n",
2136 			   stoa(&pp->srcadr), ntohs(((struct sockaddr_in*)&(pp->srcadr))->sin_port));
2137 
2138 	(void) fprintf(fp, "stratum %d, precision %d, leap %c%c, trust %03o\n",
2139 			   pp->stratum, pp->precision,
2140 			   pp->leap & 0x2 ? '1' : '0',
2141 			   pp->leap & 0x1 ? '1' : '0',
2142 			   pp->trust);
2143 
2144 	if (pp->stratum == 1) {
2145 		junk[4] = 0;
2146 		memmove(junk, (char *)&pp->refid, 4);
2147 		str = junk;
2148 	} else {
2149 		str = stoa(&pp->srcadr);
2150 	}
2151 	(void) fprintf(fp,
2152 			   "refid [%s], delay %s, dispersion %s\n",
2153 			   str, fptoa((s_fp)pp->delay, 5),
2154 			   ufptoa(pp->dispersion, 5));
2155 
2156 	(void) fprintf(fp, "transmitted %d, in filter %d\n",
2157 			   pp->xmtcnt, pp->filter_nextpt);
2158 
2159 	(void) fprintf(fp, "reference time:    %s\n",
2160 			   prettydate(&pp->reftime));
2161 	(void) fprintf(fp, "originate timestamp: %s\n",
2162 			   prettydate(&pp->org));
2163 	(void) fprintf(fp, "transmit timestamp:  %s\n",
2164 			   prettydate(&pp->xmt));
2165 
2166 	(void) fprintf(fp, "filter delay: ");
2167 	for (i = 0; i < NTP_SHIFT; i++) {
2168 		(void) fprintf(fp, " %-8.8s", fptoa(pp->filter_delay[i], 5));
2169 		if (i == (NTP_SHIFT>>1)-1)
2170 			(void) fprintf(fp, "\n        ");
2171 	}
2172 	(void) fprintf(fp, "\n");
2173 
2174 	(void) fprintf(fp, "filter offset:");
2175 	for (i = 0; i < PEER_SHIFT; i++) {
2176 		(void) fprintf(fp, " %-8.8s", lfptoa(&pp->filter_offset[i], 6));
2177 		if (i == (PEER_SHIFT>>1)-1)
2178 			(void) fprintf(fp, "\n        ");
2179 	}
2180 	(void) fprintf(fp, "\n");
2181 
2182 	(void) fprintf(fp, "delay %s, dispersion %s\n",
2183 			   fptoa((s_fp)pp->delay, 5), ufptoa(pp->dispersion, 5));
2184 
2185 	(void) fprintf(fp, "offset %s\n\n",
2186 			   lfptoa(&pp->offset, 6));
2187 }
2188 
2189 
2190 #ifdef HAVE_NETINFO
2191 static ni_namelist *
2192 getnetinfoservers(void)
2193 {
2194 	ni_status status;
2195 	void *domain;
2196 	ni_id confdir;
2197 	ni_namelist *namelist = emalloc(sizeof(ni_namelist));
2198 
2199 	/* Find a time server in NetInfo */
2200 	if ((status = ni_open(NULL, ".", &domain)) != NI_OK) return NULL;
2201 
2202 	while (status = ni_pathsearch(domain, &confdir, NETINFO_CONFIG_DIR) == NI_NODIR) {
2203 		void *next_domain;
2204 		if (ni_open(domain, "..", &next_domain) != NI_OK) break;
2205 		ni_free(domain);
2206 		domain = next_domain;
2207 	}
2208 	if (status != NI_OK) return NULL;
2209 
2210 	NI_INIT(namelist);
2211 	if (ni_lookupprop(domain, &confdir, "server", namelist) != NI_OK) {
2212 		ni_namelist_free(namelist);
2213 		free(namelist);
2214 		return NULL;
2215 	}
2216 
2217 	return(namelist);
2218 }
2219 #endif
2220 
2221 #ifdef SYS_WINNT
2222 isc_boolean_t ntp_port_inuse(int af, u_short port)
2223 {
2224 	/*
2225 	 * Check if NTP socket is already in use on this system
2226 	 * This is only for Windows Systems, as they tend not to fail on the real bind() below
2227 	 */
2228 
2229 	SOCKET checksocket;
2230 	struct sockaddr_in checkservice;
2231 	checksocket = socket(af, SOCK_DGRAM, 0);
2232 	if (checksocket == INVALID_SOCKET) {
2233 		return (ISC_TRUE);
2234 	}
2235 
2236 	checkservice.sin_family = (short) AF_INET;
2237 	checkservice.sin_addr.s_addr = INADDR_LOOPBACK;
2238 	checkservice.sin_port = htons(port);
2239 
2240 	if (bind(checksocket, (struct sockaddr *)&checkservice,
2241 		sizeof(checkservice)) == SOCKET_ERROR) {
2242 		if ( WSAGetLastError() == WSAEADDRINUSE ){
2243 			closesocket(checksocket);
2244 			return (ISC_TRUE);
2245 		}
2246 	}
2247 	closesocket(checksocket);
2248 	return (ISC_FALSE);
2249 }
2250 #endif
2251