]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/ntpdate/ntpdate.c
Fix ntp multiple vulnerabilities.
[FreeBSD/releng/10.2.git] / contrib / ntp / ntpdate / ntpdate.c
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