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 = 0; /* number of samples/server, will be modified later */ 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 print_server (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 /* 441 * If number of Samples (-p) not specified by user: 442 * - if a simple_query (-q) just ONE will do 443 * - otherwise the normal is DEFSAMPLES 444 */ 445 if (sys_samples == 0) 446 sys_samples = (simple_query ? 1 : DEFSAMPLES); 447 448 if (debug || simple_query) { 449 #ifdef HAVE_SETVBUF 450 static char buf[BUFSIZ]; 451 setvbuf(stdout, buf, _IOLBF, BUFSIZ); 452 #else 453 setlinebuf(stdout); 454 #endif 455 } 456 457 /* 458 * Logging. Open the syslog if we have to 459 */ 460 if (syslogit) { 461 #if !defined (SYS_WINNT) && !defined (SYS_VXWORKS) && !defined SYS_CYGWIN32 462 # ifndef LOG_DAEMON 463 openlog("ntpdate", LOG_PID); 464 # else 465 466 # ifndef LOG_NTP 467 # define LOG_NTP LOG_DAEMON 468 # endif 469 openlog("ntpdate", LOG_PID | LOG_NDELAY, LOG_NTP); 470 if (debug) 471 setlogmask(LOG_UPTO(LOG_DEBUG)); 472 else 473 setlogmask(LOG_UPTO(LOG_INFO)); 474 # endif /* LOG_DAEMON */ 475 #endif /* SYS_WINNT */ 476 } 477 478 if (debug || verbose) 479 msyslog(LOG_NOTICE, "%s", Version); 480 481 /* 482 * Add servers we are going to be polling 483 */ 484 #ifdef HAVE_NETINFO 485 netinfoservers = getnetinfoservers(); 486 #endif 487 488 for ( ; ntp_optind < argc; ntp_optind++) 489 addserver(argv[ntp_optind]); 490 491 #ifdef HAVE_NETINFO 492 if (netinfoservers) { 493 if ( netinfoservers->ni_namelist_len && 494 *netinfoservers->ni_namelist_val ) { 495 u_int servercount = 0; 496 while (servercount < netinfoservers->ni_namelist_len) { 497 if (debug) msyslog(LOG_DEBUG, 498 "Adding time server %s from NetInfo configuration.", 499 netinfoservers->ni_namelist_val[servercount]); 500 addserver(netinfoservers->ni_namelist_val[servercount++]); 501 } 502 } 503 ni_namelist_free(netinfoservers); 504 free(netinfoservers); 505 } 506 #endif 507 508 if (sys_numservers == 0) { 509 msyslog(LOG_ERR, "no servers can be used, exiting"); 510 exit(1); 511 } 512 513 /* 514 * Initialize the time of day routines and the I/O subsystem 515 */ 516 if (sys_authenticate) { 517 init_auth(); 518 if (!authreadkeys(key_file)) { 519 msyslog(LOG_ERR, "no key file <%s>, exiting", key_file); 520 exit(1); 521 } 522 authtrust(sys_authkey, 1); 523 if (!authistrusted(sys_authkey)) { 524 msyslog(LOG_ERR, "authentication key %lu unknown", 525 (unsigned long) sys_authkey); 526 exit(1); 527 } 528 } 529 init_io(); 530 init_alarm(); 531 532 /* 533 * Set the priority. 534 */ 535 #ifdef SYS_VXWORKS 536 taskPrioritySet( taskIdSelf(), NTPDATE_PRIO); 537 #endif 538 #if defined(HAVE_ATT_NICE) 539 nice (NTPDATE_PRIO); 540 #endif 541 #if defined(HAVE_BSD_NICE) 542 (void) setpriority(PRIO_PROCESS, 0, NTPDATE_PRIO); 543 #endif 544 545 546 initializing = 0; 547 was_alarmed = 0; 548 549 while (complete_servers < sys_numservers) { 550 #ifdef HAVE_POLL_H 551 struct pollfd* rdfdes; 552 rdfdes = fdmask; 553 #else 554 fd_set rdfdes; 555 rdfdes = fdmask; 556 #endif 557 558 if (alarm_flag) { /* alarmed? */ 559 was_alarmed = 1; 560 alarm_flag = 0; 561 } 562 tot_recvbufs = full_recvbuffs(); /* get received buffers */ 563 564 if (!was_alarmed && tot_recvbufs == 0) { 565 /* 566 * Nothing to do. Wait for something. 567 */ 568 #ifdef HAVE_POLL_H 569 nfound = poll(rdfdes, (unsigned int)nbsock, timeout.tv_sec * 1000); 570 571 #else 572 nfound = select(maxfd, &rdfdes, NULL, NULL, 573 &timeout); 574 #endif 575 if (nfound > 0) 576 input_handler(); 577 else if (nfound == SOCKET_ERROR) 578 { 579 #ifndef SYS_WINNT 580 if (errno != EINTR) 581 #else 582 if (WSAGetLastError() != WSAEINTR) 583 #endif 584 msyslog(LOG_ERR, 585 #ifdef HAVE_POLL_H 586 "poll() error: %m" 587 #else 588 "select() error: %m" 589 #endif 590 ); 591 } else if (errno != 0) { 592 #ifndef SYS_VXWORKS 593 msyslog(LOG_DEBUG, 594 #ifdef HAVE_POLL_H 595 "poll(): nfound = %d, error: %m", 596 #else 597 "select(): nfound = %d, error: %m", 598 #endif 599 nfound); 600 #endif 601 } 602 if (alarm_flag) { /* alarmed? */ 603 was_alarmed = 1; 604 alarm_flag = 0; 605 } 606 tot_recvbufs = full_recvbuffs(); /* get received buffers */ 607 } 608 609 /* 610 * Out here, signals are unblocked. Call receive 611 * procedure for each incoming packet. 612 */ 613 rbuf = get_full_recv_buffer(); 614 while (rbuf != NULL) 615 { 616 receive(rbuf); 617 freerecvbuf(rbuf); 618 rbuf = get_full_recv_buffer(); 619 } 620 621 /* 622 * Call timer to process any timeouts 623 */ 624 if (was_alarmed) { 625 timer(); 626 was_alarmed = 0; 627 } 628 629 /* 630 * Go around again 631 */ 632 } 633 634 /* 635 * When we get here we've completed the polling of all servers. 636 * Adjust the clock, then exit. 637 */ 638 #ifdef SYS_WINNT 639 WSACleanup(); 640 #endif 641 #ifdef SYS_VXWORKS 642 close (fd); 643 timer_delete(ntpdate_timerid); 644 #endif 645 646 return clock_adjust(); 647 } 648 649 650 /* 651 * transmit - transmit a packet to the given server, or mark it completed. 652 * This is called by the timeout routine and by the receive 653 * procedure. 654 */ 655 static void 656 transmit( 657 register struct server *server 658 ) 659 { 660 struct pkt xpkt; 661 662 if (server->filter_nextpt < server->xmtcnt) { 663 l_fp ts; 664 /* 665 * Last message to this server timed out. Shift 666 * zeros into the filter. 667 */ 668 L_CLR(&ts); 669 server_data(server, 0, &ts, 0); 670 } 671 672 if ((int)server->filter_nextpt >= sys_samples) { 673 /* 674 * Got all the data we need. Mark this guy 675 * completed and return. 676 */ 677 server->event_time = 0; 678 complete_servers++; 679 return; 680 } 681 682 if (debug) 683 printf("transmit(%s)\n", stoa(&server->srcadr)); 684 685 /* 686 * If we're here, send another message to the server. Fill in 687 * the packet and let 'er rip. 688 */ 689 xpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC, 690 sys_version, MODE_CLIENT); 691 xpkt.stratum = STRATUM_TO_PKT(STRATUM_UNSPEC); 692 xpkt.ppoll = NTP_MINPOLL; 693 xpkt.precision = NTPDATE_PRECISION; 694 xpkt.rootdelay = htonl(NTPDATE_DISTANCE); 695 xpkt.rootdisp = htonl(NTPDATE_DISP); 696 xpkt.refid = htonl(NTPDATE_REFID); 697 L_CLR(&xpkt.reftime); 698 L_CLR(&xpkt.org); 699 L_CLR(&xpkt.rec); 700 701 /* 702 * Determine whether to authenticate or not. If so, 703 * fill in the extended part of the packet and do it. 704 * If not, just timestamp it and send it away. 705 */ 706 if (sys_authenticate) { 707 size_t len; 708 709 xpkt.exten[0] = htonl(sys_authkey); 710 get_systime(&server->xmt); 711 L_ADDUF(&server->xmt, sys_authdelay); 712 HTONL_FP(&server->xmt, &xpkt.xmt); 713 len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC); 714 sendpkt(&server->srcadr, &xpkt, (int)(LEN_PKT_NOMAC + len)); 715 716 if (debug > 1) 717 printf("transmit auth to %s\n", 718 stoa(&server->srcadr)); 719 } else { 720 get_systime(&(server->xmt)); 721 HTONL_FP(&server->xmt, &xpkt.xmt); 722 sendpkt(&server->srcadr, &xpkt, LEN_PKT_NOMAC); 723 724 if (debug > 1) 725 printf("transmit to %s\n", stoa(&server->srcadr)); 726 } 727 728 /* 729 * Update the server timeout and transmit count 730 */ 731 server->event_time = current_time + sys_timeout; 732 server->xmtcnt++; 733 } 734 735 736 /* 737 * receive - receive and process an incoming frame 738 */ 739 static void 740 receive( 741 struct recvbuf *rbufp 742 ) 743 { 744 register struct pkt *rpkt; 745 register struct server *server; 746 register s_fp di; 747 l_fp t10, t23, tmp; 748 l_fp org; 749 l_fp rec; 750 l_fp ci; 751 int has_mac; 752 int is_authentic; 753 754 if (debug) 755 printf("receive(%s)\n", stoa(&rbufp->recv_srcadr)); 756 /* 757 * Check to see if the packet basically looks like something 758 * intended for us. 759 */ 760 if (rbufp->recv_length == LEN_PKT_NOMAC) 761 has_mac = 0; 762 else if (rbufp->recv_length >= (int)LEN_PKT_NOMAC) 763 has_mac = 1; 764 else { 765 if (debug) 766 printf("receive: packet length %d\n", 767 rbufp->recv_length); 768 return; /* funny length packet */ 769 } 770 771 rpkt = &(rbufp->recv_pkt); 772 if (PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION || 773 PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) { 774 return; 775 } 776 777 if ((PKT_MODE(rpkt->li_vn_mode) != MODE_SERVER 778 && PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) 779 || rpkt->stratum >= STRATUM_UNSPEC) { 780 if (debug) 781 printf("receive: mode %d stratum %d\n", 782 PKT_MODE(rpkt->li_vn_mode), rpkt->stratum); 783 return; 784 } 785 786 /* 787 * So far, so good. See if this is from a server we know. 788 */ 789 server = findserver(&(rbufp->recv_srcadr)); 790 if (server == NULL) { 791 if (debug) 792 printf("receive: server not found\n"); 793 return; 794 } 795 796 /* 797 * Decode the org timestamp and make sure we're getting a response 798 * to our last request. 799 */ 800 NTOHL_FP(&rpkt->org, &org); 801 if (!L_ISEQU(&org, &server->xmt)) { 802 if (debug) 803 printf("receive: pkt.org and peer.xmt differ\n"); 804 return; 805 } 806 807 /* 808 * Check out the authenticity if we're doing that. 809 */ 810 if (!sys_authenticate) 811 is_authentic = 1; 812 else { 813 is_authentic = 0; 814 815 if (debug > 3) 816 printf("receive: rpkt keyid=%ld sys_authkey=%ld decrypt=%ld\n", 817 (long int)ntohl(rpkt->exten[0]), (long int)sys_authkey, 818 (long int)authdecrypt(sys_authkey, (u_int32 *)rpkt, 819 LEN_PKT_NOMAC, (size_t)(rbufp->recv_length - LEN_PKT_NOMAC))); 820 821 if (has_mac && ntohl(rpkt->exten[0]) == sys_authkey && 822 authdecrypt(sys_authkey, (u_int32 *)rpkt, LEN_PKT_NOMAC, 823 (size_t)(rbufp->recv_length - LEN_PKT_NOMAC))) 824 is_authentic = 1; 825 if (debug) 826 printf("receive: authentication %s\n", 827 is_authentic ? "passed" : "failed"); 828 } 829 server->trust <<= 1; 830 if (!is_authentic) 831 server->trust |= 1; 832 833 /* 834 * Check for a KoD (rate limiting) response, cease and decist. 835 */ 836 if (LEAP_NOTINSYNC == PKT_LEAP(rpkt->li_vn_mode) && 837 STRATUM_PKT_UNSPEC == rpkt->stratum && 838 !memcmp("RATE", &rpkt->refid, 4)) { 839 msyslog(LOG_ERR, "%s rate limit response from server.", 840 stoa(&rbufp->recv_srcadr)); 841 server->event_time = 0; 842 complete_servers++; 843 return; 844 } 845 846 /* 847 * Looks good. Record info from the packet. 848 */ 849 server->leap = PKT_LEAP(rpkt->li_vn_mode); 850 server->stratum = PKT_TO_STRATUM(rpkt->stratum); 851 server->precision = rpkt->precision; 852 server->rootdelay = ntohl(rpkt->rootdelay); 853 server->rootdisp = ntohl(rpkt->rootdisp); 854 server->refid = rpkt->refid; 855 NTOHL_FP(&rpkt->reftime, &server->reftime); 856 NTOHL_FP(&rpkt->rec, &rec); 857 NTOHL_FP(&rpkt->xmt, &server->org); 858 859 /* 860 * Make sure the server is at least somewhat sane. If not, try 861 * again. 862 */ 863 if (L_ISZERO(&rec) || !L_ISHIS(&server->org, &rec)) { 864 server->event_time = current_time + sys_timeout; 865 return; 866 } 867 868 /* 869 * Calculate the round trip delay (di) and the clock offset (ci). 870 * We use the equations (reordered from those in the spec): 871 * 872 * d = (t2 - t3) - (t1 - t0) 873 * c = ((t2 - t3) + (t1 - t0)) / 2 874 */ 875 t10 = server->org; /* pkt.xmt == t1 */ 876 L_SUB(&t10, &rbufp->recv_time); /* recv_time == t0*/ 877 878 t23 = rec; /* pkt.rec == t2 */ 879 L_SUB(&t23, &org); /* pkt->org == t3 */ 880 881 /* now have (t2 - t3) and (t0 - t1). Calculate (ci) and (di) */ 882 /* 883 * Calculate (ci) = ((t1 - t0) / 2) + ((t2 - t3) / 2) 884 * For large offsets this may prevent an overflow on '+' 885 */ 886 ci = t10; 887 L_RSHIFT(&ci); 888 tmp = t23; 889 L_RSHIFT(&tmp); 890 L_ADD(&ci, &tmp); 891 892 /* 893 * Calculate di in t23 in full precision, then truncate 894 * to an s_fp. 895 */ 896 L_SUB(&t23, &t10); 897 di = LFPTOFP(&t23); 898 899 if (debug > 3) 900 printf("offset: %s, delay %s\n", lfptoa(&ci, 6), fptoa(di, 5)); 901 902 di += (FP_SECOND >> (-(int)NTPDATE_PRECISION)) 903 + (FP_SECOND >> (-(int)server->precision)) + NTP_MAXSKW; 904 905 if (di <= 0) { /* value still too raunchy to use? */ 906 L_CLR(&ci); 907 di = 0; 908 } else { 909 di = max(di, NTP_MINDIST); 910 } 911 912 /* 913 * Shift this data in, then schedule another transmit. 914 */ 915 server_data(server, (s_fp) di, &ci, 0); 916 917 if ((int)server->filter_nextpt >= sys_samples) { 918 /* 919 * Got all the data we need. Mark this guy 920 * completed and return. 921 */ 922 server->event_time = 0; 923 complete_servers++; 924 return; 925 } 926 927 server->event_time = current_time + sys_timeout; 928 } 929 930 931 /* 932 * server_data - add a sample to the server's filter registers 933 */ 934 static void 935 server_data( 936 register struct server *server, 937 s_fp d, 938 l_fp *c, 939 u_fp e 940 ) 941 { 942 u_short i; 943 944 i = server->filter_nextpt; 945 if (i < NTP_SHIFT) { 946 server->filter_delay[i] = d; 947 server->filter_offset[i] = *c; 948 server->filter_soffset[i] = LFPTOFP(c); 949 server->filter_error[i] = e; 950 server->filter_nextpt = (u_short)(i + 1); 951 } 952 } 953 954 955 /* 956 * clock_filter - determine a server's delay, dispersion and offset 957 */ 958 static void 959 clock_filter( 960 register struct server *server 961 ) 962 { 963 register int i, j; 964 int ord[NTP_SHIFT]; 965 966 INSIST((0 < sys_samples) && (sys_samples <= NTP_SHIFT)); 967 968 /* 969 * Sort indices into increasing delay order 970 */ 971 for (i = 0; i < sys_samples; i++) 972 ord[i] = i; 973 974 for (i = 0; i < (sys_samples-1); i++) { 975 for (j = i+1; j < sys_samples; j++) { 976 if (server->filter_delay[ord[j]] == 0) 977 continue; 978 if (server->filter_delay[ord[i]] == 0 979 || (server->filter_delay[ord[i]] 980 > server->filter_delay[ord[j]])) { 981 register int tmp; 982 983 tmp = ord[i]; 984 ord[i] = ord[j]; 985 ord[j] = tmp; 986 } 987 } 988 } 989 990 /* 991 * Now compute the dispersion, and assign values to delay and 992 * offset. If there are no samples in the register, delay and 993 * offset go to zero and dispersion is set to the maximum. 994 */ 995 if (server->filter_delay[ord[0]] == 0) { 996 server->delay = 0; 997 L_CLR(&server->offset); 998 server->soffset = 0; 999 server->dispersion = PEER_MAXDISP; 1000 } else { 1001 register s_fp d; 1002 1003 server->delay = server->filter_delay[ord[0]]; 1004 server->offset = server->filter_offset[ord[0]]; 1005 server->soffset = LFPTOFP(&server->offset); 1006 server->dispersion = 0; 1007 for (i = 1; i < sys_samples; i++) { 1008 if (server->filter_delay[ord[i]] == 0) 1009 d = PEER_MAXDISP; 1010 else { 1011 d = server->filter_soffset[ord[i]] 1012 - server->filter_soffset[ord[0]]; 1013 if (d < 0) 1014 d = -d; 1015 if (d > PEER_MAXDISP) 1016 d = PEER_MAXDISP; 1017 } 1018 /* 1019 * XXX This *knows* PEER_FILTER is 1/2 1020 */ 1021 server->dispersion += (u_fp)(d) >> i; 1022 } 1023 } 1024 /* 1025 * We're done 1026 */ 1027 } 1028 1029 1030 /* 1031 * clock_select - select the pick-of-the-litter clock from the samples 1032 * we've got. 1033 */ 1034 static struct server * 1035 clock_select(void) 1036 { 1037 struct server *server; 1038 u_int nlist; 1039 s_fp d; 1040 u_int count; 1041 u_int i; 1042 u_int j; 1043 u_int k; 1044 int n; 1045 s_fp local_threshold; 1046 struct server *server_list[NTP_MAXCLOCK]; 1047 u_fp server_badness[NTP_MAXCLOCK]; 1048 struct server *sys_server; 1049 1050 /* 1051 * This first chunk of code is supposed to go through all 1052 * servers we know about to find the NTP_MAXLIST servers which 1053 * are most likely to succeed. We run through the list 1054 * doing the sanity checks and trying to insert anyone who 1055 * looks okay. We are at all times aware that we should 1056 * only keep samples from the top two strata and we only need 1057 * NTP_MAXLIST of them. 1058 */ 1059 nlist = 0; /* none yet */ 1060 for (server = sys_servers; server != NULL; server = server->next_server) { 1061 if (server->stratum == 0) { 1062 if (debug) 1063 printf("%s: Server dropped: no data\n", ntoa(&server->srcadr)); 1064 continue; /* no data */ 1065 } 1066 if (server->stratum > NTP_INFIN) { 1067 if (debug) 1068 printf("%s: Server dropped: strata too high\n", ntoa(&server->srcadr)); 1069 continue; /* stratum no good */ 1070 } 1071 if (server->delay > NTP_MAXWGT) { 1072 if (debug) 1073 printf("%s: Server dropped: server too far away\n", 1074 ntoa(&server->srcadr)); 1075 continue; /* too far away */ 1076 } 1077 if (server->leap == LEAP_NOTINSYNC) { 1078 if (debug) 1079 printf("%s: Server dropped: leap not in sync\n", ntoa(&server->srcadr)); 1080 continue; /* he's in trouble */ 1081 } 1082 if (!L_ISHIS(&server->org, &server->reftime)) { 1083 if (debug) 1084 printf("%s: Server dropped: server is very broken\n", 1085 ntoa(&server->srcadr)); 1086 continue; /* very broken host */ 1087 } 1088 if ((server->org.l_ui - server->reftime.l_ui) 1089 >= NTP_MAXAGE) { 1090 if (debug) 1091 printf("%s: Server dropped: server has gone too long without sync\n", 1092 ntoa(&server->srcadr)); 1093 continue; /* too long without sync */ 1094 } 1095 if (server->trust != 0) { 1096 if (debug) 1097 printf("%s: Server dropped: Server is untrusted\n", 1098 ntoa(&server->srcadr)); 1099 continue; 1100 } 1101 1102 /* 1103 * This one seems sane. Find where he belongs 1104 * on the list. 1105 */ 1106 d = server->dispersion + server->dispersion; 1107 for (i = 0; i < nlist; i++) 1108 if (server->stratum <= server_list[i]->stratum) 1109 break; 1110 for ( ; i < nlist; i++) { 1111 if (server->stratum < server_list[i]->stratum) 1112 break; 1113 if (d < (s_fp) server_badness[i]) 1114 break; 1115 } 1116 1117 /* 1118 * If i points past the end of the list, this 1119 * guy is a loser, else stick him in. 1120 */ 1121 if (i >= NTP_MAXLIST) 1122 continue; 1123 for (j = nlist; j > i; j--) 1124 if (j < NTP_MAXLIST) { 1125 server_list[j] = server_list[j-1]; 1126 server_badness[j] 1127 = server_badness[j-1]; 1128 } 1129 1130 server_list[i] = server; 1131 server_badness[i] = d; 1132 if (nlist < NTP_MAXLIST) 1133 nlist++; 1134 } 1135 1136 /* 1137 * Got the five-or-less best. Cut the list where the number of 1138 * strata exceeds two. 1139 */ 1140 count = 0; 1141 for (i = 1; i < nlist; i++) 1142 if (server_list[i]->stratum > server_list[i-1]->stratum) { 1143 count++; 1144 if (2 == count) { 1145 nlist = i; 1146 break; 1147 } 1148 } 1149 1150 /* 1151 * Whew! What we should have by now is 0 to 5 candidates for 1152 * the job of syncing us. If we have none, we're out of luck. 1153 * If we have one, he's a winner. If we have more, do falseticker 1154 * detection. 1155 */ 1156 1157 if (0 == nlist) 1158 sys_server = NULL; 1159 else if (1 == nlist) { 1160 sys_server = server_list[0]; 1161 } else { 1162 /* 1163 * Re-sort by stratum, bdelay estimate quality and 1164 * server.delay. 1165 */ 1166 for (i = 0; i < nlist-1; i++) 1167 for (j = i+1; j < nlist; j++) { 1168 if (server_list[i]->stratum < 1169 server_list[j]->stratum) 1170 /* already sorted by stratum */ 1171 break; 1172 if (server_list[i]->delay < 1173 server_list[j]->delay) 1174 continue; 1175 server = server_list[i]; 1176 server_list[i] = server_list[j]; 1177 server_list[j] = server; 1178 } 1179 1180 /* 1181 * Calculate the fixed part of the dispersion limit 1182 */ 1183 local_threshold = (FP_SECOND >> (-(int)NTPDATE_PRECISION)) 1184 + NTP_MAXSKW; 1185 1186 /* 1187 * Now drop samples until we're down to one. 1188 */ 1189 while (nlist > 1) { 1190 for (k = 0; k < nlist; k++) { 1191 server_badness[k] = 0; 1192 for (j = 0; j < nlist; j++) { 1193 if (j == k) /* with self? */ 1194 continue; 1195 d = server_list[j]->soffset - 1196 server_list[k]->soffset; 1197 if (d < 0) /* abs value */ 1198 d = -d; 1199 /* 1200 * XXX This code *knows* that 1201 * NTP_SELECT is 3/4 1202 */ 1203 for (i = 0; i < j; i++) 1204 d = (d>>1) + (d>>2); 1205 server_badness[k] += d; 1206 } 1207 } 1208 1209 /* 1210 * We now have an array of nlist badness 1211 * coefficients. Find the badest. Find 1212 * the minimum precision while we're at 1213 * it. 1214 */ 1215 i = 0; 1216 n = server_list[0]->precision;; 1217 for (j = 1; j < nlist; j++) { 1218 if (server_badness[j] >= server_badness[i]) 1219 i = j; 1220 if (n > server_list[j]->precision) 1221 n = server_list[j]->precision; 1222 } 1223 1224 /* 1225 * i is the index of the server with the worst 1226 * dispersion. If his dispersion is less than 1227 * the threshold, stop now, else delete him and 1228 * continue around again. 1229 */ 1230 if ( (s_fp) server_badness[i] < (local_threshold 1231 + (FP_SECOND >> (-n)))) 1232 break; 1233 for (j = i + 1; j < nlist; j++) 1234 server_list[j-1] = server_list[j]; 1235 nlist--; 1236 } 1237 1238 /* 1239 * What remains is a list of less than 5 servers. Take 1240 * the best. 1241 */ 1242 sys_server = server_list[0]; 1243 } 1244 1245 /* 1246 * That's it. Return our server. 1247 */ 1248 return sys_server; 1249 } 1250 1251 1252 /* 1253 * clock_adjust - process what we've received, and adjust the time 1254 * if we got anything decent. 1255 */ 1256 static int 1257 clock_adjust(void) 1258 { 1259 register struct server *sp, *server; 1260 int dostep; 1261 1262 for (sp = sys_servers; sp != NULL; sp = sp->next_server) 1263 clock_filter(sp); 1264 server = clock_select(); 1265 1266 if (debug || simple_query) { 1267 if (debug) 1268 printf ("\n"); 1269 for (sp = sys_servers; sp != NULL; sp = sp->next_server) 1270 print_server(sp, stdout); 1271 } 1272 1273 if (server == 0) { 1274 msyslog(LOG_ERR, 1275 "no server suitable for synchronization found"); 1276 return(1); 1277 } 1278 1279 if (always_step) { 1280 dostep = 1; 1281 } else if (never_step) { 1282 dostep = 0; 1283 } else { 1284 /* [Bug 3023] get absolute difference, avoiding signed 1285 * integer overflow like hell. 1286 */ 1287 u_fp absoffset; 1288 if (server->soffset < 0) 1289 absoffset = 1u + (u_fp)(-(server->soffset + 1)); 1290 else 1291 absoffset = (u_fp)server->soffset; 1292 dostep = (absoffset >= NTPDATE_THRESHOLD); 1293 } 1294 1295 if (dostep) { 1296 if (simple_query || l_step_systime(&server->offset)){ 1297 msyslog(LOG_NOTICE, "step time server %s offset %s sec", 1298 stoa(&server->srcadr), 1299 lfptoa(&server->offset, 6)); 1300 } 1301 } else { 1302 if (simple_query || l_adj_systime(&server->offset)) { 1303 msyslog(LOG_NOTICE, "adjust time server %s offset %s sec", 1304 stoa(&server->srcadr), 1305 lfptoa(&server->offset, 6)); 1306 } 1307 } 1308 return(0); 1309 } 1310 1311 1312 /* 1313 * is_unreachable - check to see if we have a route to given destination 1314 * (non-blocking). 1315 */ 1316 static int 1317 is_reachable (sockaddr_u *dst) 1318 { 1319 SOCKET sockfd; 1320 1321 sockfd = socket(AF(dst), SOCK_DGRAM, 0); 1322 if (sockfd == -1) { 1323 return 0; 1324 } 1325 1326 if (connect(sockfd, &dst->sa, SOCKLEN(dst))) { 1327 closesocket(sockfd); 1328 return 0; 1329 } 1330 closesocket(sockfd); 1331 return 1; 1332 } 1333 1334 1335 1336 /* XXX ELIMINATE: merge BIG slew into adj_systime in lib/systime.c */ 1337 /* 1338 * addserver - determine a server's address and allocate a new structure 1339 * for it. 1340 */ 1341 static void 1342 addserver( 1343 char *serv 1344 ) 1345 { 1346 register struct server *server; 1347 /* Address infos structure to store result of getaddrinfo */ 1348 struct addrinfo *addrResult, *ptr; 1349 /* Address infos structure to store hints for getaddrinfo */ 1350 struct addrinfo hints; 1351 /* Error variable for getaddrinfo */ 1352 int error; 1353 /* Service name */ 1354 char service[5]; 1355 sockaddr_u addr; 1356 1357 strlcpy(service, "ntp", sizeof(service)); 1358 1359 /* Get host address. Looking for UDP datagram connection. */ 1360 ZERO(hints); 1361 hints.ai_family = ai_fam_templ; 1362 hints.ai_socktype = SOCK_DGRAM; 1363 1364 #ifdef DEBUG 1365 if (debug) 1366 printf("Looking for host %s and service %s\n", serv, service); 1367 #endif 1368 1369 error = getaddrinfo(serv, service, &hints, &addrResult); 1370 if (error != 0) { 1371 /* Conduct more refined error analysis */ 1372 if (error == EAI_FAIL || error == EAI_AGAIN){ 1373 /* Name server is unusable. Exit after failing on the 1374 first server, in order to shorten the timeout caused 1375 by waiting for resolution of several servers */ 1376 fprintf(stderr, "Exiting, name server cannot be used: %s (%d)", 1377 gai_strerror(error), error); 1378 msyslog(LOG_ERR, "name server cannot be used: %s (%d)", 1379 gai_strerror(error), error); 1380 exit(1); 1381 } 1382 fprintf(stderr, "Error resolving %s: %s (%d)\n", serv, 1383 gai_strerror(error), error); 1384 msyslog(LOG_ERR, "Can't find host %s: %s (%d)", serv, 1385 gai_strerror(error), error); 1386 return; 1387 } 1388 #ifdef DEBUG 1389 if (debug) { 1390 ZERO(addr); 1391 INSIST(addrResult->ai_addrlen <= sizeof(addr)); 1392 memcpy(&addr, addrResult->ai_addr, addrResult->ai_addrlen); 1393 fprintf(stderr, "host found : %s\n", stohost(&addr)); 1394 } 1395 #endif 1396 1397 /* We must get all returned server in case the first one fails */ 1398 for (ptr = addrResult; ptr != NULL; ptr = ptr->ai_next) { 1399 ZERO(addr); 1400 INSIST(ptr->ai_addrlen <= sizeof(addr)); 1401 memcpy(&addr, ptr->ai_addr, ptr->ai_addrlen); 1402 if (is_reachable(&addr)) { 1403 server = emalloc_zero(sizeof(*server)); 1404 memcpy(&server->srcadr, ptr->ai_addr, ptr->ai_addrlen); 1405 server->event_time = ++sys_numservers; 1406 if (sys_servers == NULL) 1407 sys_servers = server; 1408 else { 1409 struct server *sp; 1410 1411 for (sp = sys_servers; sp->next_server != NULL; 1412 sp = sp->next_server) 1413 /* empty */; 1414 sp->next_server = server; 1415 } 1416 } 1417 } 1418 1419 freeaddrinfo(addrResult); 1420 } 1421 1422 1423 /* 1424 * findserver - find a server in the list given its address 1425 * ***(For now it isn't totally AF-Independant, to check later..) 1426 */ 1427 static struct server * 1428 findserver( 1429 sockaddr_u *addr 1430 ) 1431 { 1432 struct server *server; 1433 struct server *mc_server; 1434 1435 mc_server = NULL; 1436 if (SRCPORT(addr) != NTP_PORT) 1437 return 0; 1438 1439 for (server = sys_servers; server != NULL; 1440 server = server->next_server) { 1441 if (SOCK_EQ(addr, &server->srcadr)) 1442 return server; 1443 1444 if (AF(addr) == AF(&server->srcadr)) { 1445 if (IS_MCAST(&server->srcadr)) 1446 mc_server = server; 1447 } 1448 } 1449 1450 if (mc_server != NULL) { 1451 1452 struct server *sp; 1453 1454 if (mc_server->event_time != 0) { 1455 mc_server->event_time = 0; 1456 complete_servers++; 1457 } 1458 1459 server = emalloc_zero(sizeof(*server)); 1460 1461 server->srcadr = *addr; 1462 1463 server->event_time = ++sys_numservers; 1464 1465 for (sp = sys_servers; sp->next_server != NULL; 1466 sp = sp->next_server) 1467 /* empty */; 1468 sp->next_server = server; 1469 transmit(server); 1470 } 1471 return NULL; 1472 } 1473 1474 1475 /* 1476 * timer - process a timer interrupt 1477 */ 1478 void 1479 timer(void) 1480 { 1481 struct server *server; 1482 1483 /* 1484 * Bump the current idea of the time 1485 */ 1486 current_time++; 1487 1488 /* 1489 * Search through the server list looking for guys 1490 * who's event timers have expired. Give these to 1491 * the transmit routine. 1492 */ 1493 for (server = sys_servers; server != NULL; 1494 server = server->next_server) { 1495 if (server->event_time != 0 1496 && server->event_time <= current_time) 1497 transmit(server); 1498 } 1499 } 1500 1501 1502 /* 1503 * The code duplication in the following subroutine sucks, but 1504 * we need to appease ansi2knr. 1505 */ 1506 1507 #ifndef SYS_WINNT 1508 /* 1509 * alarming - record the occurance of an alarm interrupt 1510 */ 1511 static RETSIGTYPE 1512 alarming( 1513 int sig 1514 ) 1515 { 1516 alarm_flag++; 1517 } 1518 #else /* SYS_WINNT follows */ 1519 void CALLBACK 1520 alarming(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) 1521 { 1522 UNUSED_ARG(uTimerID); UNUSED_ARG(uMsg); UNUSED_ARG(dwUser); 1523 UNUSED_ARG(dw1); UNUSED_ARG(dw2); 1524 1525 alarm_flag++; 1526 } 1527 1528 static void 1529 callTimeEndPeriod(void) 1530 { 1531 timeEndPeriod( wTimerRes ); 1532 wTimerRes = 0; 1533 } 1534 #endif /* SYS_WINNT */ 1535 1536 1537 /* 1538 * init_alarm - set up the timer interrupt 1539 */ 1540 static void 1541 init_alarm(void) 1542 { 1543 #ifndef SYS_WINNT 1544 # ifdef HAVE_TIMER_CREATE 1545 struct itimerspec its; 1546 # else 1547 struct itimerval itv; 1548 # endif 1549 #else /* SYS_WINNT follows */ 1550 TIMECAPS tc; 1551 UINT wTimerID; 1552 HANDLE hToken; 1553 TOKEN_PRIVILEGES tkp; 1554 DWORD dwUser = 0; 1555 #endif /* SYS_WINNT */ 1556 1557 alarm_flag = 0; 1558 1559 #ifndef SYS_WINNT 1560 # ifdef HAVE_TIMER_CREATE 1561 alarm_flag = 0; 1562 /* this code was put in as setitimer() is non existant this us the 1563 * POSIX "equivalents" setup - casey 1564 */ 1565 /* ntpdate_timerid is global - so we can kill timer later */ 1566 if (timer_create (CLOCK_REALTIME, NULL, &ntpdate_timerid) == 1567 # ifdef SYS_VXWORKS 1568 ERROR 1569 # else 1570 -1 1571 # endif 1572 ) 1573 { 1574 fprintf (stderr, "init_alarm(): timer_create (...) FAILED\n"); 1575 return; 1576 } 1577 1578 /* TIMER_HZ = (5) 1579 * Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ) 1580 * seconds from now and they continue on every 1/TIMER_HZ seconds. 1581 */ 1582 signal_no_reset(SIGALRM, alarming); 1583 its.it_interval.tv_sec = 0; 1584 its.it_value.tv_sec = 0; 1585 its.it_interval.tv_nsec = 1000000000/TIMER_HZ; 1586 its.it_value.tv_nsec = 1000000000/(TIMER_HZ<<1); 1587 timer_settime(ntpdate_timerid, 0 /* !TIMER_ABSTIME */, &its, NULL); 1588 # else /* !HAVE_TIMER_CREATE follows */ 1589 /* 1590 * Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ) 1591 * seconds from now and they continue on every 1/TIMER_HZ seconds. 1592 */ 1593 signal_no_reset(SIGALRM, alarming); 1594 itv.it_interval.tv_sec = 0; 1595 itv.it_value.tv_sec = 0; 1596 itv.it_interval.tv_usec = 1000000/TIMER_HZ; 1597 itv.it_value.tv_usec = 1000000/(TIMER_HZ<<1); 1598 1599 setitimer(ITIMER_REAL, &itv, NULL); 1600 # endif /* !HAVE_TIMER_CREATE */ 1601 #else /* SYS_WINNT follows */ 1602 _tzset(); 1603 1604 if (!simple_query && !debug) { 1605 /* 1606 * Get privileges needed for fiddling with the clock 1607 */ 1608 1609 /* get the current process token handle */ 1610 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { 1611 msyslog(LOG_ERR, "OpenProcessToken failed: %m"); 1612 exit(1); 1613 } 1614 /* get the LUID for system-time privilege. */ 1615 LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, &tkp.Privileges[0].Luid); 1616 tkp.PrivilegeCount = 1; /* one privilege to set */ 1617 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 1618 /* get set-time privilege for this process. */ 1619 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); 1620 /* cannot test return value of AdjustTokenPrivileges. */ 1621 if (GetLastError() != ERROR_SUCCESS) 1622 msyslog(LOG_ERR, "AdjustTokenPrivileges failed: %m"); 1623 } 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 /* 1998 * adj_systime - do a big long slew of the system time 1999 */ 2000 static int 2001 l_adj_systime( 2002 l_fp *ts 2003 ) 2004 { 2005 struct timeval adjtv, oadjtv; 2006 int isneg = 0; 2007 l_fp offset; 2008 #ifndef STEP_SLEW 2009 l_fp overshoot; 2010 #endif 2011 2012 /* 2013 * Take the absolute value of the offset 2014 */ 2015 offset = *ts; 2016 if (L_ISNEG(&offset)) { 2017 isneg = 1; 2018 L_NEG(&offset); 2019 } 2020 2021 #ifndef STEP_SLEW 2022 /* 2023 * Calculate the overshoot. XXX N.B. This code *knows* 2024 * ADJ_OVERSHOOT is 1/2. 2025 */ 2026 overshoot = offset; 2027 L_RSHIFTU(&overshoot); 2028 if (overshoot.l_ui != 0 || (overshoot.l_uf > ADJ_MAXOVERSHOOT)) { 2029 overshoot.l_ui = 0; 2030 overshoot.l_uf = ADJ_MAXOVERSHOOT; 2031 } 2032 L_ADD(&offset, &overshoot); 2033 #endif 2034 TSTOTV(&offset, &adjtv); 2035 2036 if (isneg) { 2037 adjtv.tv_sec = -adjtv.tv_sec; 2038 adjtv.tv_usec = -adjtv.tv_usec; 2039 } 2040 2041 if (!debug && (adjtv.tv_usec != 0)) { 2042 /* A time correction needs to be applied. */ 2043 #if !defined SYS_WINNT && !defined SYS_CYGWIN32 2044 /* Slew the time on systems that support this. */ 2045 if (adjtime(&adjtv, &oadjtv) < 0) { 2046 msyslog(LOG_ERR, "Can't adjust the time of day: %m"); 2047 exit(1); 2048 } 2049 #else /* SYS_WINNT or SYS_CYGWIN32 is defined */ 2050 /* 2051 * The NT SetSystemTimeAdjustment() call achieves slewing by 2052 * changing the clock frequency. This means that we cannot specify 2053 * it to slew the clock by a definite amount and then stop like 2054 * the Unix adjtime() routine. We can technically adjust the clock 2055 * frequency, have ntpdate sleep for a while, and then wake 2056 * up and reset the clock frequency, but this might cause some 2057 * grief if the user attempts to run ntpd immediately after 2058 * ntpdate and the socket is in use. 2059 */ 2060 printf("\nSlewing the system time is not supported on Windows. Use the -b option to step the time.\n"); 2061 #endif /* defined SYS_WINNT || defined SYS_CYGWIN32 */ 2062 } 2063 return 1; 2064 } 2065 2066 2067 /* 2068 * This fuction is not the same as lib/systime step_systime!!! 2069 */ 2070 static int 2071 l_step_systime( 2072 l_fp *ts 2073 ) 2074 { 2075 double dtemp; 2076 2077 #ifdef SLEWALWAYS 2078 #ifdef STEP_SLEW 2079 l_fp ftmp; 2080 int isneg; 2081 int n; 2082 2083 if (debug) 2084 return 1; 2085 2086 /* 2087 * Take the absolute value of the offset 2088 */ 2089 ftmp = *ts; 2090 2091 if (L_ISNEG(&ftmp)) { 2092 L_NEG(&ftmp); 2093 isneg = 1; 2094 } else 2095 isneg = 0; 2096 2097 if (ftmp.l_ui >= 3) { /* Step it and slew - we might win */ 2098 LFPTOD(ts, dtemp); 2099 n = step_systime(dtemp); 2100 if (n == 0) 2101 return 0; 2102 if (isneg) /* WTF! */ 2103 ts->l_ui = ~0; 2104 else 2105 ts->l_ui = ~0; 2106 } 2107 /* 2108 * Just add adjustment into the current offset. The update 2109 * routine will take care of bringing the system clock into 2110 * line. 2111 */ 2112 #endif 2113 if (debug) 2114 return 1; 2115 #ifdef FORCE_NTPDATE_STEP 2116 LFPTOD(ts, dtemp); 2117 return step_systime(dtemp); 2118 #else 2119 l_adj_systime(ts); 2120 return 1; 2121 #endif 2122 #else /* SLEWALWAYS */ 2123 if (debug) 2124 return 1; 2125 LFPTOD(ts, dtemp); 2126 return step_systime(dtemp); 2127 #endif /* SLEWALWAYS */ 2128 } 2129 2130 2131 /* XXX ELIMINATE print_server similar in ntptrace.c, ntpdate.c */ 2132 /* 2133 * print_server - print detail information for a server 2134 */ 2135 static void 2136 print_server( 2137 register struct server *pp, 2138 FILE *fp 2139 ) 2140 { 2141 register int i; 2142 char junk[5]; 2143 const char *str; 2144 2145 if (pp->stratum == 0) /* Nothing received => nothing to print */ 2146 return; 2147 2148 if (!debug) { 2149 (void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n", 2150 stoa(&pp->srcadr), pp->stratum, 2151 lfptoa(&pp->offset, 6), fptoa((s_fp)pp->delay, 5)); 2152 return; 2153 } 2154 2155 (void) fprintf(fp, "server %s, port %d\n", 2156 stoa(&pp->srcadr), ntohs(((struct sockaddr_in*)&(pp->srcadr))->sin_port)); 2157 2158 (void) fprintf(fp, "stratum %d, precision %d, leap %c%c, trust %03o\n", 2159 pp->stratum, pp->precision, 2160 pp->leap & 0x2 ? '1' : '0', 2161 pp->leap & 0x1 ? '1' : '0', 2162 pp->trust); 2163 2164 if (REFID_ISTEXT(pp->stratum)) { 2165 str = (char *) &pp->refid; 2166 for (i=0; i<4 && str[i]; i++) { 2167 junk[i] = (isprint(str[i]) ? str[i] : '.'); 2168 } 2169 junk[i] = 0; // force terminating 0 2170 str = junk; 2171 } else { 2172 str = numtoa(pp->refid); 2173 } 2174 (void) fprintf(fp, 2175 "refid [%s], root delay %s, root dispersion %s\n", 2176 str, fptoa((s_fp)pp->rootdelay, 6), 2177 ufptoa(pp->rootdisp, 6)); 2178 2179 (void) fprintf(fp, "transmitted %d, in filter %d\n", 2180 pp->xmtcnt, pp->filter_nextpt); 2181 2182 (void) fprintf(fp, "reference time: %s\n", 2183 prettydate(&pp->reftime)); 2184 (void) fprintf(fp, "originate timestamp: %s\n", 2185 prettydate(&pp->org)); 2186 (void) fprintf(fp, "transmit timestamp: %s\n", 2187 prettydate(&pp->xmt)); 2188 2189 if (sys_samples > 1) { 2190 (void) fprintf(fp, "filter delay: "); 2191 for (i = 0; i < NTP_SHIFT; i++) { 2192 (void) fprintf(fp, " %-8.8s", fptoa(pp->filter_delay[i], 5)); 2193 if (i == (NTP_SHIFT>>1)-1) 2194 (void) fprintf(fp, "\n "); 2195 } 2196 (void) fprintf(fp, "\n"); 2197 2198 (void) fprintf(fp, "filter offset:"); 2199 for (i = 0; i < PEER_SHIFT; i++) { 2200 (void) fprintf(fp, " %-8.8s", lfptoa(&pp->filter_offset[i], 6)); 2201 if (i == (PEER_SHIFT>>1)-1) 2202 (void) fprintf(fp, "\n "); 2203 } 2204 (void) fprintf(fp, "\n"); 2205 } 2206 2207 (void) fprintf(fp, "delay %s, dispersion %s\n", 2208 fptoa((s_fp)pp->delay, 5), ufptoa(pp->dispersion, 5)); 2209 2210 (void) fprintf(fp, "offset %s\n\n", 2211 lfptoa(&pp->offset, 6)); 2212 } 2213 2214 2215 #ifdef HAVE_NETINFO 2216 static ni_namelist * 2217 getnetinfoservers(void) 2218 { 2219 ni_status status; 2220 void *domain; 2221 ni_id confdir; 2222 ni_namelist *namelist = emalloc(sizeof(ni_namelist)); 2223 2224 /* Find a time server in NetInfo */ 2225 if ((status = ni_open(NULL, ".", &domain)) != NI_OK) return NULL; 2226 2227 while (status = ni_pathsearch(domain, &confdir, NETINFO_CONFIG_DIR) == NI_NODIR) { 2228 void *next_domain; 2229 if (ni_open(domain, "..", &next_domain) != NI_OK) break; 2230 ni_free(domain); 2231 domain = next_domain; 2232 } 2233 if (status != NI_OK) return NULL; 2234 2235 NI_INIT(namelist); 2236 if (ni_lookupprop(domain, &confdir, "server", namelist) != NI_OK) { 2237 ni_namelist_free(namelist); 2238 free(namelist); 2239 return NULL; 2240 } 2241 2242 return(namelist); 2243 } 2244 #endif 2245 2246 #ifdef SYS_WINNT 2247 isc_boolean_t ntp_port_inuse(int af, u_short port) 2248 { 2249 /* 2250 * Check if NTP socket is already in use on this system 2251 * This is only for Windows Systems, as they tend not to fail on the real bind() below 2252 */ 2253 2254 SOCKET checksocket; 2255 struct sockaddr_in checkservice; 2256 checksocket = socket(af, SOCK_DGRAM, 0); 2257 if (checksocket == INVALID_SOCKET) { 2258 return (ISC_TRUE); 2259 } 2260 2261 checkservice.sin_family = (short) AF_INET; 2262 checkservice.sin_addr.s_addr = INADDR_LOOPBACK; 2263 checkservice.sin_port = htons(port); 2264 2265 if (bind(checksocket, (struct sockaddr *)&checkservice, 2266 sizeof(checkservice)) == SOCKET_ERROR) { 2267 if ( WSAGetLastError() == WSAEADDRINUSE ){ 2268 closesocket(checksocket); 2269 return (ISC_TRUE); 2270 } 2271 } 2272 closesocket(checksocket); 2273 return (ISC_FALSE); 2274 } 2275 #endif 2276