ntpdate.c (106424) | ntpdate.c (132451) |
---|---|
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 --- 32 unchanged lines hidden (view full) --- 41# ifdef HAVE_SYS_IOCTL_H 42# include <sys/ioctl.h> 43# endif 44#endif /* SYS_WINNT */ 45#ifdef HAVE_SYS_RESOURCE_H 46# include <sys/resource.h> 47#endif /* HAVE_SYS_RESOURCE_H */ 48 | 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 --- 32 unchanged lines hidden (view full) --- 41# ifdef HAVE_SYS_IOCTL_H 42# include <sys/ioctl.h> 43# endif 44#endif /* SYS_WINNT */ 45#ifdef HAVE_SYS_RESOURCE_H 46# include <sys/resource.h> 47#endif /* HAVE_SYS_RESOURCE_H */ 48 |
49#include <arpa/inet.h> 50 51#ifdef __QNXNTO__ 52# include "adjtime.h" 53#endif 54 |
|
49#ifdef SYS_VXWORKS 50# include "ioLib.h" 51# include "sockLib.h" 52# include "timers.h" 53 54/* select wants a zero structure ... */ 55struct timeval timeout = {0,0}; 56#else 57struct timeval timeout = {60,0}; 58#endif 59 | 55#ifdef SYS_VXWORKS 56# include "ioLib.h" 57# include "sockLib.h" 58# include "timers.h" 59 60/* select wants a zero structure ... */ 61struct timeval timeout = {0,0}; 62#else 63struct timeval timeout = {60,0}; 64#endif 65 |
66#ifdef HAVE_NETINFO 67#include <netinfo/ni.h> 68#endif 69 |
|
60#include "recvbuff.h" 61 62#ifdef SYS_WINNT | 70#include "recvbuff.h" 71 72#ifdef SYS_WINNT |
63# define TARGET_RESOLUTION 1 /* Try for 1-millisecond accuracy | 73#define EPROTONOSUPPORT WSAEPROTONOSUPPORT 74#define EAFNOSUPPORT WSAEAFNOSUPPORT 75#define EPFNOSUPPORT WSAEPFNOSUPPORT 76#define TARGET_RESOLUTION 1 /* Try for 1-millisecond accuracy |
64 on Windows NT timers. */ 65#pragma comment(lib, "winmm") 66#endif /* SYS_WINNT */ 67 68/* 69 * Scheduling priority we run at 70 */ 71#ifndef SYS_VXWORKS --- 21 unchanged lines hidden (view full) --- 93/* 94 * Debugging flag 95 */ 96volatile int debug = 0; 97 98/* 99 * File descriptor masks etc. for call to select 100 */ | 77 on Windows NT timers. */ 78#pragma comment(lib, "winmm") 79#endif /* SYS_WINNT */ 80 81/* 82 * Scheduling priority we run at 83 */ 84#ifndef SYS_VXWORKS --- 21 unchanged lines hidden (view full) --- 106/* 107 * Debugging flag 108 */ 109volatile int debug = 0; 110 111/* 112 * File descriptor masks etc. for call to select 113 */ |
101int fd; | 114 115int ai_fam_templ; 116int nbsock; 117SOCKET fd[MAX_AF]; /* support up to 2 sockets */ 118int fd_family[MAX_AF]; /* to remember the socket family */ |
102#ifdef HAVE_POLL_H | 119#ifdef HAVE_POLL_H |
103struct pollfd fdmask; | 120struct pollfd fdmask[MAX_AF]; |
104#else 105fd_set fdmask; | 121#else 122fd_set fdmask; |
123int maxfd; |
|
106#endif | 124#endif |
125int polltest = 0; |
|
107 108/* 109 * Initializing flag. All async routines watch this and only do their 110 * thing when it is clear. 111 */ 112int initializing = 1; 113 114/* --- 64 unchanged lines hidden (view full) --- 179/* 180 * Miscellaneous flags 181 */ 182int verbose = 0; 183int always_step = 0; 184int never_step = 0; 185 186int ntpdatemain P((int, char **)); | 126 127/* 128 * Initializing flag. All async routines watch this and only do their 129 * thing when it is clear. 130 */ 131int initializing = 1; 132 133/* --- 64 unchanged lines hidden (view full) --- 198/* 199 * Miscellaneous flags 200 */ 201int verbose = 0; 202int always_step = 0; 203int never_step = 0; 204 205int ntpdatemain P((int, char **)); |
206 |
|
187static void transmit P((struct server *)); 188static void receive P((struct recvbuf *)); 189static void server_data P((struct server *, s_fp, l_fp *, u_fp)); 190static void clock_filter P((struct server *)); 191static struct server *clock_select P((void)); 192static int clock_adjust P((void)); 193static void addserver P((char *)); | 207static void transmit P((struct server *)); 208static void receive P((struct recvbuf *)); 209static void server_data P((struct server *, s_fp, l_fp *, u_fp)); 210static void clock_filter P((struct server *)); 211static struct server *clock_select P((void)); 212static int clock_adjust P((void)); 213static void addserver P((char *)); |
194static struct server *findserver P((struct sockaddr_in *)); | 214static struct server *findserver P((struct sockaddr_storage *)); |
195 void timer P((void)); 196static void init_alarm P((void)); 197#ifndef SYS_WINNT 198static RETSIGTYPE alarming P((int)); 199#endif /* SYS_WINNT */ 200static void init_io P((void)); | 215 void timer P((void)); 216static void init_alarm P((void)); 217#ifndef SYS_WINNT 218static RETSIGTYPE alarming P((int)); 219#endif /* SYS_WINNT */ 220static void init_io P((void)); |
201static void sendpkt P((struct sockaddr_in *, struct pkt *, int)); | 221static void sendpkt P((struct sockaddr_storage *, struct pkt *, int)); |
202void input_handler P((void)); 203 204static int l_adj_systime P((l_fp *)); 205static int l_step_systime P((l_fp *)); 206 | 222void input_handler P((void)); 223 224static int l_adj_systime P((l_fp *)); 225static int l_step_systime P((l_fp *)); 226 |
207static int getnetnum P((const char *, u_int32 *)); | |
208static void printserver P((struct server *, FILE *)); 209 210#ifdef SYS_WINNT 211int on = 1; 212WORD wVersionRequested; 213WSADATA wsaData; 214HANDLE TimerThreadHandle = NULL; 215#endif /* SYS_WINNT */ --- 84 unchanged lines hidden (view full) --- 300 ) 301{ 302 int was_alarmed; 303 struct recvbuf *rbuflist; 304 struct recvbuf *rbuf; 305 l_fp tmp; 306 int errflg; 307 int c; | 227static void printserver P((struct server *, FILE *)); 228 229#ifdef SYS_WINNT 230int on = 1; 231WORD wVersionRequested; 232WSADATA wsaData; 233HANDLE TimerThreadHandle = NULL; 234#endif /* SYS_WINNT */ --- 84 unchanged lines hidden (view full) --- 319 ) 320{ 321 int was_alarmed; 322 struct recvbuf *rbuflist; 323 struct recvbuf *rbuf; 324 l_fp tmp; 325 int errflg; 326 int c; |
327 int nfound; 328 |
|
308#ifdef HAVE_NETINFO 309 ni_namelist *netinfoservers; 310#endif 311#ifdef SYS_WINNT 312 HANDLE process_handle; 313 314 wVersionRequested = MAKEWORD(1,1); 315 if (WSAStartup(wVersionRequested, &wsaData)) { | 329#ifdef HAVE_NETINFO 330 ni_namelist *netinfoservers; 331#endif 332#ifdef SYS_WINNT 333 HANDLE process_handle; 334 335 wVersionRequested = MAKEWORD(1,1); 336 if (WSAStartup(wVersionRequested, &wsaData)) { |
316 msyslog(LOG_ERR, "No useable winsock.dll: %m"); | 337 netsyslog(LOG_ERR, "No useable winsock.dll: %m"); |
317 exit(1); 318 } 319 320 key_file = key_file_storage; 321 322 if (!ExpandEnvironmentStrings(KEYFILE, key_file, MAX_PATH)) 323 { 324 msyslog(LOG_ERR, "ExpandEnvironmentStrings(KEYFILE) failed: %m\n"); --- 6 unchanged lines hidden (view full) --- 331 332 errflg = 0; 333 progname = argv[0]; 334 syslogit = 0; 335 336 /* 337 * Decode argument list 338 */ | 338 exit(1); 339 } 340 341 key_file = key_file_storage; 342 343 if (!ExpandEnvironmentStrings(KEYFILE, key_file, MAX_PATH)) 344 { 345 msyslog(LOG_ERR, "ExpandEnvironmentStrings(KEYFILE) failed: %m\n"); --- 6 unchanged lines hidden (view full) --- 352 353 errflg = 0; 354 progname = argv[0]; 355 syslogit = 0; 356 357 /* 358 * Decode argument list 359 */ |
339 while ((c = ntp_getopt(argc, argv, "a:bBde:k:o:p:qr:st:uv")) != EOF) | 360 while ((c = ntp_getopt(argc, argv, "46a:bBde:k:o:p:qr:st:uv")) != EOF) |
340 switch (c) 341 { | 361 switch (c) 362 { |
363 case '4': 364 ai_fam_templ = AF_INET; 365 break; 366 case '6': 367 ai_fam_templ = AF_INET6; 368 break; |
|
342 case 'a': 343 c = atoi(ntp_optarg); 344 sys_authenticate = 1; 345 sys_authkey = c; 346 break; 347 case 'b': 348 always_step++; 349 never_step = 0; --- 73 unchanged lines hidden (view full) --- 423 ++errflg; 424 break; 425 default: 426 break; 427 } 428 429 if (errflg) { 430 (void) fprintf(stderr, | 369 case 'a': 370 c = atoi(ntp_optarg); 371 sys_authenticate = 1; 372 sys_authkey = c; 373 break; 374 case 'b': 375 always_step++; 376 never_step = 0; --- 73 unchanged lines hidden (view full) --- 450 ++errflg; 451 break; 452 default: 453 break; 454 } 455 456 if (errflg) { 457 (void) fprintf(stderr, |
431 "usage: %s [-bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-r rate] [-t timeo] server ...\n", 432 progname); | 458 "usage: %s [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-r rate] [-t timeo] server ...\n", 459 progname); |
433 exit(2); 434 } 435 436 if (debug || simple_query) { 437#ifdef HAVE_SETVBUF 438 static char buf[BUFSIZ]; 439 setvbuf(stdout, buf, _IOLBF, BUFSIZ); 440#else --- 92 unchanged lines hidden (view full) --- 533#endif 534#ifdef SYS_WINNT 535 process_handle = GetCurrentProcess(); 536 if (!SetPriorityClass(process_handle, (DWORD) REALTIME_PRIORITY_CLASS)) { 537 msyslog(LOG_ERR, "SetPriorityClass failed: %m"); 538 } 539#endif /* SYS_WINNT */ 540 | 460 exit(2); 461 } 462 463 if (debug || simple_query) { 464#ifdef HAVE_SETVBUF 465 static char buf[BUFSIZ]; 466 setvbuf(stdout, buf, _IOLBF, BUFSIZ); 467#else --- 92 unchanged lines hidden (view full) --- 560#endif 561#ifdef SYS_WINNT 562 process_handle = GetCurrentProcess(); 563 if (!SetPriorityClass(process_handle, (DWORD) REALTIME_PRIORITY_CLASS)) { 564 msyslog(LOG_ERR, "SetPriorityClass failed: %m"); 565 } 566#endif /* SYS_WINNT */ 567 |
541 initializing = 0; | |
542 | 568 |
569 570 initializing = 0; |
|
543 was_alarmed = 0; 544 rbuflist = (struct recvbuf *)0; | 571 was_alarmed = 0; 572 rbuflist = (struct recvbuf *)0; |
573 |
|
545 while (complete_servers < sys_numservers) { 546#ifdef HAVE_POLL_H | 574 while (complete_servers < sys_numservers) { 575#ifdef HAVE_POLL_H |
547 struct pollfd rdfdes; | 576 struct pollfd* rdfdes; 577 rdfdes = fdmask; |
548#else 549 fd_set rdfdes; | 578#else 579 fd_set rdfdes; |
580 rdfdes = fdmask; |
|
550#endif | 581#endif |
551 int nfound; | |
552 553 if (alarm_flag) { /* alarmed? */ 554 was_alarmed = 1; 555 alarm_flag = 0; 556 } 557 rbuflist = getrecvbufs(); /* get received buffers */ 558 559 if (!was_alarmed && rbuflist == (struct recvbuf *)0) { 560 /* 561 * Nothing to do. Wait for something. 562 */ | 582 583 if (alarm_flag) { /* alarmed? */ 584 was_alarmed = 1; 585 alarm_flag = 0; 586 } 587 rbuflist = getrecvbufs(); /* get received buffers */ 588 589 if (!was_alarmed && rbuflist == (struct recvbuf *)0) { 590 /* 591 * Nothing to do. Wait for something. 592 */ |
563 rdfdes = fdmask; | |
564#ifdef HAVE_POLL_H | 593#ifdef HAVE_POLL_H |
565 nfound = poll(&rdfdes, 1, timeout.tv_sec * 1000); | 594 nfound = poll(rdfdes, (unsigned int)nbsock, timeout.tv_sec * 1000); 595 |
566#else | 596#else |
567 nfound = select(fd+1, &rdfdes, (fd_set *)0, | 597 nfound = select(maxfd, &rdfdes, (fd_set *)0, |
568 (fd_set *)0, &timeout); 569#endif 570 if (nfound > 0) 571 input_handler(); 572 else if ( 573#ifndef SYS_WINNT 574 nfound == -1 575#else 576 nfound == SOCKET_ERROR 577#endif /* SYS_WINNT */ 578 ) { 579#ifndef SYS_WINNT 580 if (errno != EINTR) 581#endif | 598 (fd_set *)0, &timeout); 599#endif 600 if (nfound > 0) 601 input_handler(); 602 else if ( 603#ifndef SYS_WINNT 604 nfound == -1 605#else 606 nfound == SOCKET_ERROR 607#endif /* SYS_WINNT */ 608 ) { 609#ifndef SYS_WINNT 610 if (errno != EINTR) 611#endif |
582 msyslog(LOG_ERR, | 612 netsyslog(LOG_ERR, |
583#ifdef HAVE_POLL_H 584 "poll() error: %m" 585#else 586 "select() error: %m" 587#endif 588 ); 589 } else { 590#ifndef SYS_VXWORKS | 613#ifdef HAVE_POLL_H 614 "poll() error: %m" 615#else 616 "select() error: %m" 617#endif 618 ); 619 } else { 620#ifndef SYS_VXWORKS |
591 msyslog(LOG_DEBUG, | 621 netsyslog(LOG_DEBUG, |
592#ifdef HAVE_POLL_H 593 "poll(): nfound = %d, error: %m", 594#else 595 "select(): nfound = %d, error: %m", 596#endif 597 nfound); 598#endif 599 } --- 34 unchanged lines hidden (view full) --- 634 */ 635#ifdef SYS_WINNT 636 WSACleanup(); 637#endif 638#ifdef SYS_VXWORKS 639 close (fd); 640 timer_delete(ntpdate_timerid); 641#endif | 622#ifdef HAVE_POLL_H 623 "poll(): nfound = %d, error: %m", 624#else 625 "select(): nfound = %d, error: %m", 626#endif 627 nfound); 628#endif 629 } --- 34 unchanged lines hidden (view full) --- 664 */ 665#ifdef SYS_WINNT 666 WSACleanup(); 667#endif 668#ifdef SYS_VXWORKS 669 close (fd); 670 timer_delete(ntpdate_timerid); 671#endif |
672 |
|
642 return clock_adjust(); 643} 644 645 646/* 647 * transmit - transmit a packet to the given server, or mark it completed. 648 * This is called by the timeout routine and by the receive 649 * procedure. 650 */ 651static void 652transmit( 653 register struct server *server 654 ) 655{ 656 struct pkt xpkt; 657 658 if (debug) | 673 return clock_adjust(); 674} 675 676 677/* 678 * transmit - transmit a packet to the given server, or mark it completed. 679 * This is called by the timeout routine and by the receive 680 * procedure. 681 */ 682static void 683transmit( 684 register struct server *server 685 ) 686{ 687 struct pkt xpkt; 688 689 if (debug) |
659 printf("transmit(%s)\n", ntoa(&server->srcadr)); | 690 printf("transmit(%s)\n", stoa(&(server->srcadr))); |
660 661 if (server->filter_nextpt < server->xmtcnt) { 662 l_fp ts; 663 /* 664 * Last message to this server timed out. Shift 665 * zeros into the filter. 666 */ 667 L_CLR(&ts); --- 38 unchanged lines hidden (view full) --- 706 get_systime(&server->xmt); 707 L_ADDUF(&server->xmt, sys_authdelay); 708 HTONL_FP(&server->xmt, &xpkt.xmt); 709 len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC); 710 sendpkt(&(server->srcadr), &xpkt, (int)(LEN_PKT_NOMAC + len)); 711 712 if (debug > 1) 713 printf("transmit auth to %s\n", | 691 692 if (server->filter_nextpt < server->xmtcnt) { 693 l_fp ts; 694 /* 695 * Last message to this server timed out. Shift 696 * zeros into the filter. 697 */ 698 L_CLR(&ts); --- 38 unchanged lines hidden (view full) --- 737 get_systime(&server->xmt); 738 L_ADDUF(&server->xmt, sys_authdelay); 739 HTONL_FP(&server->xmt, &xpkt.xmt); 740 len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC); 741 sendpkt(&(server->srcadr), &xpkt, (int)(LEN_PKT_NOMAC + len)); 742 743 if (debug > 1) 744 printf("transmit auth to %s\n", |
714 ntoa(&(server->srcadr))); | 745 stoa(&(server->srcadr))); |
715 } else { 716 get_systime(&(server->xmt)); 717 HTONL_FP(&server->xmt, &xpkt.xmt); 718 sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC); 719 720 if (debug > 1) | 746 } else { 747 get_systime(&(server->xmt)); 748 HTONL_FP(&server->xmt, &xpkt.xmt); 749 sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC); 750 751 if (debug > 1) |
721 printf("transmit to %s\n", ntoa(&(server->srcadr))); | 752 printf("transmit to %s\n", stoa(&(server->srcadr))); |
722 } 723 724 /* 725 * Update the server timeout and transmit count 726 */ 727 server->event_time = current_time + sys_timeout; 728 server->xmtcnt++; 729} --- 13 unchanged lines hidden (view full) --- 743 l_fp t10, t23, tmp; 744 l_fp org; 745 l_fp rec; 746 l_fp ci; 747 int has_mac; 748 int is_authentic; 749 750 if (debug) | 753 } 754 755 /* 756 * Update the server timeout and transmit count 757 */ 758 server->event_time = current_time + sys_timeout; 759 server->xmtcnt++; 760} --- 13 unchanged lines hidden (view full) --- 774 l_fp t10, t23, tmp; 775 l_fp org; 776 l_fp rec; 777 l_fp ci; 778 int has_mac; 779 int is_authentic; 780 781 if (debug) |
751 printf("receive(%s)\n", ntoa(&rbufp->recv_srcadr)); | 782 printf("receive(%s)\n", stoa(&rbufp->recv_srcadr)); |
752 /* 753 * Check to see if the packet basically looks like something 754 * intended for us. 755 */ 756 if (rbufp->recv_length == LEN_PKT_NOMAC) 757 has_mac = 0; 758 else if (rbufp->recv_length >= LEN_PKT_NOMAC) 759 has_mac = 1; --- 146 unchanged lines hidden (view full) --- 906static void 907server_data( 908 register struct server *server, 909 s_fp d, 910 l_fp *c, 911 u_fp e 912 ) 913{ | 783 /* 784 * Check to see if the packet basically looks like something 785 * intended for us. 786 */ 787 if (rbufp->recv_length == LEN_PKT_NOMAC) 788 has_mac = 0; 789 else if (rbufp->recv_length >= LEN_PKT_NOMAC) 790 has_mac = 1; --- 146 unchanged lines hidden (view full) --- 937static void 938server_data( 939 register struct server *server, 940 s_fp d, 941 l_fp *c, 942 u_fp e 943 ) 944{ |
914 register int i; | 945 u_short i; |
915 916 i = server->filter_nextpt; 917 if (i < NTP_SHIFT) { 918 server->filter_delay[i] = d; 919 server->filter_offset[i] = *c; 920 server->filter_soffset[i] = LFPTOFP(c); 921 server->filter_error[i] = e; | 946 947 i = server->filter_nextpt; 948 if (i < NTP_SHIFT) { 949 server->filter_delay[i] = d; 950 server->filter_offset[i] = *c; 951 server->filter_soffset[i] = LFPTOFP(c); 952 server->filter_error[i] = e; |
922 server->filter_nextpt = i + 1; | 953 server->filter_nextpt = (u_short)(i + 1); |
923 } 924} 925 926 927/* 928 * clock_filter - determine a server's delay, dispersion and offset 929 */ 930static void --- 318 unchanged lines hidden (view full) --- 1249 if (absoffset < 0) 1250 absoffset = -absoffset; 1251 dostep = (absoffset >= NTPDATE_THRESHOLD || absoffset < 0); 1252 } 1253 1254 if (dostep) { 1255 if (simple_query || l_step_systime(&server->offset)) { 1256 msyslog(LOG_NOTICE, "step time server %s offset %s sec", | 954 } 955} 956 957 958/* 959 * clock_filter - determine a server's delay, dispersion and offset 960 */ 961static void --- 318 unchanged lines hidden (view full) --- 1280 if (absoffset < 0) 1281 absoffset = -absoffset; 1282 dostep = (absoffset >= NTPDATE_THRESHOLD || absoffset < 0); 1283 } 1284 1285 if (dostep) { 1286 if (simple_query || l_step_systime(&server->offset)) { 1287 msyslog(LOG_NOTICE, "step time server %s offset %s sec", |
1257 ntoa(&server->srcadr), | 1288 stoa(&server->srcadr), |
1258 lfptoa(&server->offset, 6)); 1259 } 1260 } else { 1261#if !defined SYS_WINNT && !defined SYS_CYGWIN32 1262 if (simple_query || l_adj_systime(&server->offset)) { 1263 msyslog(LOG_NOTICE, "adjust time server %s offset %s sec", | 1289 lfptoa(&server->offset, 6)); 1290 } 1291 } else { 1292#if !defined SYS_WINNT && !defined SYS_CYGWIN32 1293 if (simple_query || l_adj_systime(&server->offset)) { 1294 msyslog(LOG_NOTICE, "adjust time server %s offset %s sec", |
1264 ntoa(&server->srcadr), | 1295 stoa(&server->srcadr), |
1265 lfptoa(&server->offset, 6)); 1266 } 1267#else 1268 /* The NT SetSystemTimeAdjustment() call achieves slewing by 1269 * changing the clock frequency. This means that we cannot specify 1270 * it to slew the clock by a definite amount and then stop like 1271 * the Unix adjtime() routine. We can technically adjust the clock 1272 * frequency, have ntpdate sleep for a while, and then wake --- 15 unchanged lines hidden (view full) --- 1288 * for it. 1289 */ 1290static void 1291addserver( 1292 char *serv 1293 ) 1294{ 1295 register struct server *server; | 1296 lfptoa(&server->offset, 6)); 1297 } 1298#else 1299 /* The NT SetSystemTimeAdjustment() call achieves slewing by 1300 * changing the clock frequency. This means that we cannot specify 1301 * it to slew the clock by a definite amount and then stop like 1302 * the Unix adjtime() routine. We can technically adjust the clock 1303 * frequency, have ntpdate sleep for a while, and then wake --- 15 unchanged lines hidden (view full) --- 1319 * for it. 1320 */ 1321static void 1322addserver( 1323 char *serv 1324 ) 1325{ 1326 register struct server *server; |
1296 u_int32 netnum; | 1327 /* Address infos structure to store result of getaddrinfo */ 1328 struct addrinfo *addrResult; 1329 /* Address infos structure to store hints for getaddrinfo */ 1330 struct addrinfo hints; 1331 /* Error variable for getaddrinfo */ 1332 int error; 1333 /* Service name */ 1334 char service[5]; 1335 strcpy(service, "ntp"); |
1297 | 1336 |
1298 if (!getnetnum(serv, &netnum)) { | 1337 /* Get host address. Looking for UDP datagram connection. */ 1338 memset(&hints, 0, sizeof(hints)); 1339 hints.ai_family = ai_fam_templ; 1340 hints.ai_socktype = SOCK_DGRAM; 1341 1342 printf("Looking for host %s and service %s\n", serv, service); 1343 1344 error = getaddrinfo(serv, service, &hints, &addrResult); 1345 if (error != 0) { 1346 fprintf(stderr, "Error : %s\n", gai_strerror(error)); |
1299 msyslog(LOG_ERR, "can't find host %s\n", serv); 1300 return; 1301 } | 1347 msyslog(LOG_ERR, "can't find host %s\n", serv); 1348 return; 1349 } |
1350 else { 1351 fprintf(stderr, "host found : %s\n", stohost((struct sockaddr_storage*)addrResult->ai_addr)); 1352 } |
|
1302 1303 server = (struct server *)emalloc(sizeof(struct server)); 1304 memset((char *)server, 0, sizeof(struct server)); 1305 | 1353 1354 server = (struct server *)emalloc(sizeof(struct server)); 1355 memset((char *)server, 0, sizeof(struct server)); 1356 |
1306 server->srcadr.sin_family = AF_INET; 1307 server->srcadr.sin_addr.s_addr = netnum; 1308 server->srcadr.sin_port = htons(NTP_PORT); 1309 | 1357 /* For now we only get the first returned server of the addrinfo list */ 1358 memset(&(server->srcadr), 0, sizeof(struct sockaddr_storage)); 1359 memcpy(&(server->srcadr), addrResult->ai_addr, addrResult->ai_addrlen); |
1310 server->event_time = ++sys_numservers; 1311 if (sys_servers == NULL) 1312 sys_servers = server; 1313 else { 1314 struct server *sp; 1315 1316 for (sp = sys_servers; sp->next_server != NULL; 1317 sp = sp->next_server) ; 1318 sp->next_server = server; 1319 } 1320} 1321 1322 1323/* 1324 * findserver - find a server in the list given its address | 1360 server->event_time = ++sys_numservers; 1361 if (sys_servers == NULL) 1362 sys_servers = server; 1363 else { 1364 struct server *sp; 1365 1366 for (sp = sys_servers; sp->next_server != NULL; 1367 sp = sp->next_server) ; 1368 sp->next_server = server; 1369 } 1370} 1371 1372 1373/* 1374 * findserver - find a server in the list given its address |
1375 * ***(For now it isn't totally AF-Independant, to check later..) |
|
1325 */ 1326static struct server * 1327findserver( | 1376 */ 1377static struct server * 1378findserver( |
1328 struct sockaddr_in *addr | 1379 struct sockaddr_storage *addr |
1329 ) 1330{ | 1380 ) 1381{ |
1331 register u_int32 netnum; | |
1332 struct server *server; 1333 struct server *mc_server; 1334 1335 mc_server = NULL; | 1382 struct server *server; 1383 struct server *mc_server; 1384 1385 mc_server = NULL; |
1336 if (htons(addr->sin_port) != NTP_PORT) | 1386 if (htons(((struct sockaddr_in*)addr)->sin_port) != NTP_PORT) |
1337 return 0; | 1387 return 0; |
1338 netnum = addr->sin_addr.s_addr; | |
1339 1340 for (server = sys_servers; server != NULL; 1341 server = server->next_server) { | 1388 1389 for (server = sys_servers; server != NULL; 1390 server = server->next_server) { |
1342 register u_int32 servnum; | |
1343 | 1391 |
1344 servnum = server->srcadr.sin_addr.s_addr; 1345 if (netnum == servnum) | 1392 if (memcmp(addr, &server->srcadr, SOCKLEN(addr))==0) |
1346 return server; | 1393 return server; |
1347 if (IN_MULTICAST(ntohl(servnum))) | 1394 /* Multicast compatibility to verify here... I'm not sure it's working */ 1395 if(addr->ss_family == AF_INET) { 1396 if (IN_MULTICAST(ntohl(((struct sockaddr_in*)addr)->sin_addr.s_addr))) 1397 mc_server = server; 1398 } 1399 else { 1400#ifdef AF_INET6 1401 if (IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)(&server->srcadr))->sin6_addr)) |
1348 mc_server = server; | 1402 mc_server = server; |
1403#else 1404 return 0; 1405#endif 1406 } |
|
1349 } 1350 1351 if (mc_server != NULL) { | 1407 } 1408 1409 if (mc_server != NULL) { |
1410 |
|
1352 struct server *sp; 1353 1354 if (mc_server->event_time != 0) { 1355 mc_server->event_time = 0; 1356 complete_servers++; 1357 } | 1411 struct server *sp; 1412 1413 if (mc_server->event_time != 0) { 1414 mc_server->event_time = 0; 1415 complete_servers++; 1416 } |
1417 |
|
1358 server = (struct server *)emalloc(sizeof(struct server)); 1359 memset((char *)server, 0, sizeof(struct server)); 1360 | 1418 server = (struct server *)emalloc(sizeof(struct server)); 1419 memset((char *)server, 0, sizeof(struct server)); 1420 |
1361 server->srcadr.sin_family = AF_INET; 1362 server->srcadr.sin_addr.s_addr = netnum; 1363 server->srcadr.sin_port = htons(NTP_PORT); | 1421 memcpy(&server->srcadr, &addr, sizeof(struct sockaddr_storage)); |
1364 1365 server->event_time = ++sys_numservers; | 1422 1423 server->event_time = ++sys_numservers; |
1424 |
|
1366 for (sp = sys_servers; sp->next_server != NULL; 1367 sp = sp->next_server) ; 1368 sp->next_server = server; 1369 transmit(server); 1370 } 1371 return NULL; 1372} 1373 --- 106 unchanged lines hidden (view full) --- 1480 /* 1481 * Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ) 1482 * seconds from now and they continue on every 1/TIMER_HZ seconds. 1483 */ 1484 (void) signal_no_reset(SIGALRM, alarming); 1485 itimer.it_interval.tv_sec = itimer.it_value.tv_sec = 0; 1486 itimer.it_interval.tv_usec = 1000000/TIMER_HZ; 1487 itimer.it_value.tv_usec = 1000000/(TIMER_HZ<<1); | 1425 for (sp = sys_servers; sp->next_server != NULL; 1426 sp = sp->next_server) ; 1427 sp->next_server = server; 1428 transmit(server); 1429 } 1430 return NULL; 1431} 1432 --- 106 unchanged lines hidden (view full) --- 1539 /* 1540 * Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ) 1541 * seconds from now and they continue on every 1/TIMER_HZ seconds. 1542 */ 1543 (void) signal_no_reset(SIGALRM, alarming); 1544 itimer.it_interval.tv_sec = itimer.it_value.tv_sec = 0; 1545 itimer.it_interval.tv_usec = 1000000/TIMER_HZ; 1546 itimer.it_value.tv_usec = 1000000/(TIMER_HZ<<1); |
1547 |
|
1488 setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); 1489# endif 1490#if defined SYS_CYGWIN32 1491 /* 1492 * Get previleges needed for fiddling with the clock 1493 */ 1494 1495 /* get the current process token handle */ --- 81 unchanged lines hidden (view full) --- 1577 1578 1579/* 1580 * init_io - initialize I/O data and open socket 1581 */ 1582static void 1583init_io(void) 1584{ | 1548 setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); 1549# endif 1550#if defined SYS_CYGWIN32 1551 /* 1552 * Get previleges needed for fiddling with the clock 1553 */ 1554 1555 /* get the current process token handle */ --- 81 unchanged lines hidden (view full) --- 1637 1638 1639/* 1640 * init_io - initialize I/O data and open socket 1641 */ 1642static void 1643init_io(void) 1644{ |
1645 struct addrinfo *res, *ressave; 1646 struct addrinfo hints; 1647 char service[5]; 1648 int optval = 1; 1649 |
|
1585 /* 1586 * Init buffer free list and stat counters 1587 */ 1588 init_recvbuff(sys_numservers + 2); | 1650 /* 1651 * Init buffer free list and stat counters 1652 */ 1653 init_recvbuff(sys_numservers + 2); |
1654 |
|
1589 /* 1590 * Open the socket 1591 */ 1592 | 1655 /* 1656 * Open the socket 1657 */ 1658 |
1659 strcpy(service, "ntp"); 1660 1661 /* 1662 * Init hints addrinfo structure 1663 */ 1664 memset(&hints, 0, sizeof(hints)); 1665 hints.ai_flags = AI_PASSIVE; 1666 hints.ai_socktype = SOCK_DGRAM; 1667 1668 if(getaddrinfo(NULL, service, &hints, &res) != 0) { 1669 msyslog(LOG_ERR, "getaddrinfo() failed: %m"); 1670 exit(1); 1671 /*NOTREACHED*/ 1672 } 1673 1674 /* Remember the address of the addrinfo structure chain */ 1675 ressave = res; 1676 1677 /* 1678 * For each structure returned, open and bind socket 1679 */ 1680 for(nbsock = 0; (nbsock < MAX_AF) && res ; res = res->ai_next) { |
|
1593 /* create a datagram (UDP) socket */ | 1681 /* create a datagram (UDP) socket */ |
1594 if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 1595 msyslog(LOG_ERR, "socket() failed: %m"); | 1682 if ((fd[nbsock] = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0) { 1683 if (errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT || 1684 errno == EPFNOSUPPORT) 1685 continue; 1686 netsyslog(LOG_ERR, "socket() failed: %m"); |
1596 exit(1); 1597 /*NOTREACHED*/ 1598 } | 1687 exit(1); 1688 /*NOTREACHED*/ 1689 } |
1690 /* set socket to reuse address */ 1691 if (setsockopt(fd[nbsock], SOL_SOCKET, SO_REUSEADDR, (void*) &optval, sizeof(optval)) < 0) { 1692 netsyslog(LOG_ERR, "setsockopt() SO_REUSEADDR failed: %m"); 1693 exit(1); 1694 /*NOTREACHED*/ 1695 } 1696#ifdef IPV6_V6ONLY 1697 /* Restricts AF_INET6 socket to IPv6 communications (see RFC 2553bis-03) */ 1698 if (res->ai_family == AF_INET6) 1699 if (setsockopt(fd[nbsock], IPPROTO_IPV6, IPV6_V6ONLY, (void*) &optval, sizeof(optval)) < 0) { 1700 netsyslog(LOG_ERR, "setsockopt() IPV6_V6ONLY failed: %m"); 1701 exit(1); 1702 /*NOTREACHED*/ 1703 } 1704#endif |
|
1599 | 1705 |
1706 /* Remember the socket family in fd_family structure */ 1707 fd_family[nbsock] = res->ai_family; 1708 |
|
1600 /* 1601 * bind the socket to the NTP port 1602 */ 1603 if (!debug && !simple_query && !unpriv_port) { | 1709 /* 1710 * bind the socket to the NTP port 1711 */ 1712 if (!debug && !simple_query && !unpriv_port) { |
1604 struct sockaddr_in addr; 1605 1606 memset((char *)&addr, 0, sizeof addr); 1607 addr.sin_family = AF_INET; 1608 addr.sin_port = htons(NTP_PORT); 1609 addr.sin_addr.s_addr = htonl(INADDR_ANY); 1610 if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { | 1713 if (bind(fd[nbsock], res->ai_addr, SOCKLEN(res->ai_addr)) < 0) { |
1611#ifndef SYS_WINNT 1612 if (errno == EADDRINUSE) 1613#else 1614 if (WSAGetLastError() == WSAEADDRINUSE) 1615#endif /* SYS_WINNT */ | 1714#ifndef SYS_WINNT 1715 if (errno == EADDRINUSE) 1716#else 1717 if (WSAGetLastError() == WSAEADDRINUSE) 1718#endif /* SYS_WINNT */ |
1616 msyslog(LOG_ERR, | 1719 netsyslog(LOG_ERR, |
1617 "the NTP socket is in use, exiting"); 1618 else | 1720 "the NTP socket is in use, exiting"); 1721 else |
1619 msyslog(LOG_ERR, "bind() fails: %m"); | 1722 netsyslog(LOG_ERR, "bind() fails: %m"); |
1620 exit(1); 1621 } 1622 } 1623 1624#ifdef HAVE_POLL_H | 1723 exit(1); 1724 } 1725 } 1726 1727#ifdef HAVE_POLL_H |
1625 fdmask.fd = fd; 1626 fdmask.events = POLLIN; | 1728 fdmask[nbsock].fd = fd[nbsock]; 1729 fdmask[nbsock].events = POLLIN; |
1627#else | 1730#else |
1628 FD_ZERO(&fdmask); 1629 FD_SET(fd, &fdmask); | 1731 FD_SET(fd[nbsock], &fdmask); 1732 if ((SOCKET) maxfd < fd[nbsock]+1) { 1733 maxfd = fd[nbsock]+1; 1734 } |
1630#endif 1631 1632 /* 1633 * set non-blocking, 1634 */ 1635#ifndef SYS_WINNT 1636# ifdef SYS_VXWORKS 1637 { 1638 int on = TRUE; 1639 | 1735#endif 1736 1737 /* 1738 * set non-blocking, 1739 */ 1740#ifndef SYS_WINNT 1741# ifdef SYS_VXWORKS 1742 { 1743 int on = TRUE; 1744 |
1640 if (ioctl(fd,FIONBIO, &on) == ERROR) { 1641 msyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m"); | 1745 if (ioctl(fd[nbsock],FIONBIO, &on) == ERROR) { 1746 netsyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m"); |
1642 exit(1); 1643 } 1644 } 1645# else /* not SYS_VXWORKS */ 1646# if defined(O_NONBLOCK) | 1747 exit(1); 1748 } 1749 } 1750# else /* not SYS_VXWORKS */ 1751# if defined(O_NONBLOCK) |
1647 if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { 1648 msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); | 1752 if (fcntl(fd[nbsock], F_SETFL, O_NONBLOCK) < 0) { 1753 netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); |
1649 exit(1); 1650 /*NOTREACHED*/ 1651 } 1652# else /* not O_NONBLOCK */ 1653# if defined(FNDELAY) | 1754 exit(1); 1755 /*NOTREACHED*/ 1756 } 1757# else /* not O_NONBLOCK */ 1758# if defined(FNDELAY) |
1654 if (fcntl(fd, F_SETFL, FNDELAY) < 0) { 1655 msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); | 1759 if (fcntl(fd[nbsock], F_SETFL, FNDELAY) < 0) { 1760 netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); |
1656 exit(1); 1657 /*NOTREACHED*/ 1658 } 1659# else /* FNDELAY */ 1660# include "Bletch: Need non blocking I/O" 1661# endif /* FNDELAY */ 1662# endif /* not O_NONBLOCK */ 1663# endif /* SYS_VXWORKS */ 1664#else /* SYS_WINNT */ | 1761 exit(1); 1762 /*NOTREACHED*/ 1763 } 1764# else /* FNDELAY */ 1765# include "Bletch: Need non blocking I/O" 1766# endif /* FNDELAY */ 1767# endif /* not O_NONBLOCK */ 1768# endif /* SYS_VXWORKS */ 1769#else /* SYS_WINNT */ |
1665 if (ioctlsocket(fd, FIONBIO, (u_long *) &on) == SOCKET_ERROR) { 1666 msyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m"); | 1770 if (ioctlsocket(fd[nbsock], FIONBIO, (u_long *) &on) == SOCKET_ERROR) { 1771 netsyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m"); |
1667 exit(1); 1668 } 1669#endif /* SYS_WINNT */ | 1772 exit(1); 1773 } 1774#endif /* SYS_WINNT */ |
1775 nbsock++; 1776 } 1777 freeaddrinfo(ressave); |
|
1670} 1671 | 1778} 1779 |
1672 | |
1673/* 1674 * sendpkt - send a packet to the specified destination 1675 */ 1676static void 1677sendpkt( | 1780/* 1781 * sendpkt - send a packet to the specified destination 1782 */ 1783static void 1784sendpkt( |
1678 struct sockaddr_in *dest, | 1785 struct sockaddr_storage *dest, |
1679 struct pkt *pkt, 1680 int len 1681 ) 1682{ | 1786 struct pkt *pkt, 1787 int len 1788 ) 1789{ |
1790 int i; |
|
1683 int cc; | 1791 int cc; |
1792 SOCKET sock = 0; |
|
1684 1685#ifdef SYS_WINNT 1686 DWORD err; 1687#endif /* SYS_WINNT */ 1688 | 1793 1794#ifdef SYS_WINNT 1795 DWORD err; 1796#endif /* SYS_WINNT */ 1797 |
1689 cc = sendto(fd, (char *)pkt, (size_t)len, 0, (struct sockaddr *)dest, 1690 sizeof(struct sockaddr_in)); | 1798 /* Find a local family compatible socket to send ntp packet to ntp server */ 1799 for(i = 0; (i < MAX_AF); i++) { 1800 if(dest->ss_family == fd_family[i]) { 1801 sock = fd[i]; 1802 break; 1803 } 1804 } 1805 1806 if ( sock == 0 ) { 1807 netsyslog(LOG_ERR, "cannot find family compatible socket to send ntp packet"); 1808 exit(1); 1809 /*NOTREACHED*/ 1810 } 1811 1812 cc = sendto(sock, (char *)pkt, len, 0, (struct sockaddr *)dest, 1813 SOCKLEN(dest)); 1814 |
1691#ifndef SYS_WINNT 1692 if (cc == -1) { 1693 if (errno != EWOULDBLOCK && errno != ENOBUFS) 1694#else 1695 if (cc == SOCKET_ERROR) { 1696 err = WSAGetLastError(); 1697 if (err != WSAEWOULDBLOCK && err != WSAENOBUFS) 1698#endif /* SYS_WINNT */ | 1815#ifndef SYS_WINNT 1816 if (cc == -1) { 1817 if (errno != EWOULDBLOCK && errno != ENOBUFS) 1818#else 1819 if (cc == SOCKET_ERROR) { 1820 err = WSAGetLastError(); 1821 if (err != WSAEWOULDBLOCK && err != WSAENOBUFS) 1822#endif /* SYS_WINNT */ |
1699 msyslog(LOG_ERR, "sendto(%s): %m", ntoa(dest)); | 1823 netsyslog(LOG_ERR, "sendto(%s): %m", stohost(dest)); |
1700 } 1701} 1702 1703 1704/* 1705 * input_handler - receive packets asynchronously 1706 */ 1707void 1708input_handler(void) 1709{ 1710 register int n; 1711 register struct recvbuf *rb; 1712 struct timeval tvzero; 1713 int fromlen; 1714 l_fp ts; | 1824 } 1825} 1826 1827 1828/* 1829 * input_handler - receive packets asynchronously 1830 */ 1831void 1832input_handler(void) 1833{ 1834 register int n; 1835 register struct recvbuf *rb; 1836 struct timeval tvzero; 1837 int fromlen; 1838 l_fp ts; |
1839 int i; |
|
1715#ifdef HAVE_POLL_H | 1840#ifdef HAVE_POLL_H |
1716 struct pollfd fds; | 1841 struct pollfd fds[MAX_AF]; |
1717#else 1718 fd_set fds; 1719#endif | 1842#else 1843 fd_set fds; 1844#endif |
1845 int fdc = 0; |
|
1720 1721 /* 1722 * Do a poll to see if we have data 1723 */ 1724 for (;;) { | 1846 1847 /* 1848 * Do a poll to see if we have data 1849 */ 1850 for (;;) { |
1725 fds = fdmask; | |
1726 tvzero.tv_sec = tvzero.tv_usec = 0; 1727#ifdef HAVE_POLL_H | 1851 tvzero.tv_sec = tvzero.tv_usec = 0; 1852#ifdef HAVE_POLL_H |
1728 n = poll(&fds, 1, tvzero.tv_sec * 1000); | 1853 memcpy(fds, fdmask, sizeof(fdmask)); 1854 n = poll(fds, (unsigned int)nbsock, tvzero.tv_sec * 1000); 1855 1856 /* 1857 * Determine which socket received data 1858 */ 1859 1860 for(i=0; i < nbsock; i++) { 1861 if(fds[i].revents & POLLIN) { 1862 fdc = fd[i]; 1863 break; 1864 } 1865 } 1866 |
1729#else | 1867#else |
1730 n = select(fd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero); | 1868 fds = fdmask; 1869 n = select(maxfd, &fds, (fd_set *)0, (fd_set *)0, &tvzero); 1870 1871 /* 1872 * Determine which socket received data 1873 */ 1874 1875 for(i=0; i < maxfd; i++) { 1876 if(FD_ISSET(fd[i], &fds)) { 1877 fdc = fd[i]; 1878 break; 1879 } 1880 } 1881 |
1731#endif 1732 1733 /* 1734 * If nothing to do, just return. If an error occurred, 1735 * complain and return. If we've got some, freeze a 1736 * timestamp. 1737 */ 1738 if (n == 0) 1739 return; 1740 else if (n == -1) { 1741 if (errno != EINTR) | 1882#endif 1883 1884 /* 1885 * If nothing to do, just return. If an error occurred, 1886 * complain and return. If we've got some, freeze a 1887 * timestamp. 1888 */ 1889 if (n == 0) 1890 return; 1891 else if (n == -1) { 1892 if (errno != EINTR) |
1742 msyslog(LOG_ERR, | 1893 netsyslog(LOG_ERR, |
1743#ifdef HAVE_POLL_H 1744 "poll() error: %m" 1745#else 1746 "select() error: %m" 1747#endif 1748 ); 1749 return; 1750 } 1751 get_systime(&ts); 1752 1753 /* 1754 * Get a buffer and read the frame. If we 1755 * haven't got a buffer, or this is received 1756 * on the wild card socket, just dump the packet. 1757 */ 1758 if (initializing || free_recvbuffs() == 0) { 1759 char buf[100]; 1760 | 1894#ifdef HAVE_POLL_H 1895 "poll() error: %m" 1896#else 1897 "select() error: %m" 1898#endif 1899 ); 1900 return; 1901 } 1902 get_systime(&ts); 1903 1904 /* 1905 * Get a buffer and read the frame. If we 1906 * haven't got a buffer, or this is received 1907 * on the wild card socket, just dump the packet. 1908 */ 1909 if (initializing || free_recvbuffs() == 0) { 1910 char buf[100]; 1911 |
1912 |
|
1761#ifndef SYS_WINNT | 1913#ifndef SYS_WINNT |
1762 (void) read(fd, buf, sizeof buf); | 1914 (void) read(fdc, buf, sizeof buf); |
1763#else 1764 /* NT's _read does not operate on nonblocking sockets 1765 * either recvfrom or ReadFile() has to be used here. 1766 * ReadFile is used in [ntpd]ntp_intres() and ntpdc, 1767 * just to be different use recvfrom() here 1768 */ | 1915#else 1916 /* NT's _read does not operate on nonblocking sockets 1917 * either recvfrom or ReadFile() has to be used here. 1918 * ReadFile is used in [ntpd]ntp_intres() and ntpdc, 1919 * just to be different use recvfrom() here 1920 */ |
1769 recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)0, NULL); | 1921 recvfrom(fdc, buf, sizeof(buf), 0, (struct sockaddr *)0, NULL); |
1770#endif /* SYS_WINNT */ 1771 continue; 1772 } 1773 1774 rb = get_free_recv_buffer(); 1775 | 1922#endif /* SYS_WINNT */ 1923 continue; 1924 } 1925 1926 rb = get_free_recv_buffer(); 1927 |
1776 fromlen = sizeof(struct sockaddr_in); 1777 rb->recv_length = recvfrom(fd, (char *)&rb->recv_pkt, | 1928 fromlen = sizeof(struct sockaddr_storage); 1929 rb->recv_length = recvfrom(fdc, (char *)&rb->recv_pkt, |
1778 sizeof(rb->recv_pkt), 0, 1779 (struct sockaddr *)&rb->recv_srcadr, &fromlen); 1780 if (rb->recv_length == -1) { 1781 freerecvbuf(rb); 1782 continue; 1783 } 1784 1785 /* --- 117 unchanged lines hidden (view full) --- 1903#else /* SLEWALWAYS */ 1904 if (debug) 1905 return 1; 1906 LFPTOD(ts, dtemp); 1907 return step_systime(dtemp); 1908#endif /* SLEWALWAYS */ 1909} 1910 | 1930 sizeof(rb->recv_pkt), 0, 1931 (struct sockaddr *)&rb->recv_srcadr, &fromlen); 1932 if (rb->recv_length == -1) { 1933 freerecvbuf(rb); 1934 continue; 1935 } 1936 1937 /* --- 117 unchanged lines hidden (view full) --- 2055#else /* SLEWALWAYS */ 2056 if (debug) 2057 return 1; 2058 LFPTOD(ts, dtemp); 2059 return step_systime(dtemp); 2060#endif /* SLEWALWAYS */ 2061} 2062 |
1911/* 1912 * getnetnum - given a host name, return its net number 1913 */ 1914static int 1915getnetnum( 1916 const char *host, 1917 u_int32 *num 1918 ) 1919{ 1920 struct hostent *hp; | |
1921 | 2063 |
1922 if (decodenetnum(host, num)) { 1923 return 1; 1924 } else if ((hp = gethostbyname(host)) != 0) { 1925 memmove((char *)num, hp->h_addr, sizeof(u_int32)); 1926 return (1); 1927 } 1928 return (0); 1929} 1930 | |
1931/* XXX ELIMINATE printserver similar in ntptrace.c, ntpdate.c */ 1932/* 1933 * printserver - print detail information for a server 1934 */ 1935static void 1936printserver( 1937 register struct server *pp, 1938 FILE *fp 1939 ) 1940{ 1941 register int i; 1942 char junk[5]; 1943 char *str; 1944 1945 if (!debug) { 1946 (void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n", | 2064/* XXX ELIMINATE printserver similar in ntptrace.c, ntpdate.c */ 2065/* 2066 * printserver - print detail information for a server 2067 */ 2068static void 2069printserver( 2070 register struct server *pp, 2071 FILE *fp 2072 ) 2073{ 2074 register int i; 2075 char junk[5]; 2076 char *str; 2077 2078 if (!debug) { 2079 (void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n", |
1947 ntoa(&pp->srcadr), pp->stratum, | 2080 stoa(&pp->srcadr), pp->stratum, |
1948 lfptoa(&pp->offset, 6), fptoa((s_fp)pp->delay, 5)); 1949 return; 1950 } 1951 1952 (void) fprintf(fp, "server %s, port %d\n", | 2081 lfptoa(&pp->offset, 6), fptoa((s_fp)pp->delay, 5)); 2082 return; 2083 } 2084 2085 (void) fprintf(fp, "server %s, port %d\n", |
1953 ntoa(&pp->srcadr), ntohs(pp->srcadr.sin_port)); | 2086 stoa(&pp->srcadr), ntohs(((struct sockaddr_in*)&(pp->srcadr))->sin_port)); |
1954 1955 (void) fprintf(fp, "stratum %d, precision %d, leap %c%c, trust %03o\n", 1956 pp->stratum, pp->precision, 1957 pp->leap & 0x2 ? '1' : '0', 1958 pp->leap & 0x1 ? '1' : '0', 1959 pp->trust); 1960 1961 if (pp->stratum == 1) { 1962 junk[4] = 0; 1963 memmove(junk, (char *)&pp->refid, 4); 1964 str = junk; 1965 } else { | 2087 2088 (void) fprintf(fp, "stratum %d, precision %d, leap %c%c, trust %03o\n", 2089 pp->stratum, pp->precision, 2090 pp->leap & 0x2 ? '1' : '0', 2091 pp->leap & 0x1 ? '1' : '0', 2092 pp->trust); 2093 2094 if (pp->stratum == 1) { 2095 junk[4] = 0; 2096 memmove(junk, (char *)&pp->refid, 4); 2097 str = junk; 2098 } else { |
1966 str = numtoa(pp->refid); | 2099 str = stoa(&pp->srcadr); |
1967 } 1968 (void) fprintf(fp, 1969 "refid [%s], delay %s, dispersion %s\n", 1970 str, fptoa((s_fp)pp->delay, 5), 1971 ufptoa(pp->dispersion, 5)); 1972 1973 (void) fprintf(fp, "transmitted %d, in filter %d\n", 1974 pp->xmtcnt, pp->filter_nextpt); --- 113 unchanged lines hidden --- | 2100 } 2101 (void) fprintf(fp, 2102 "refid [%s], delay %s, dispersion %s\n", 2103 str, fptoa((s_fp)pp->delay, 5), 2104 ufptoa(pp->dispersion, 5)); 2105 2106 (void) fprintf(fp, "transmitted %d, in filter %d\n", 2107 pp->xmtcnt, pp->filter_nextpt); --- 113 unchanged lines hidden --- |