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 |
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 |
70#include "recvbuff.h" 71 72#ifdef SYS_WINNT |
73#define EPROTONOSUPPORT WSAEPROTONOSUPPORT 74#define EAFNOSUPPORT WSAEAFNOSUPPORT 75#define EPFNOSUPPORT WSAEPFNOSUPPORT 76#define TARGET_RESOLUTION 1 /* Try for 1-millisecond accuracy |
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 */ |
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 */ |
119#ifdef HAVE_POLL_H |
120struct pollfd fdmask[MAX_AF]; |
121#else 122fd_set fdmask; |
123int maxfd; |
124#endif |
125int polltest = 0; |
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 |
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 *)); |
214static struct server *findserver P((struct sockaddr_storage *)); |
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)); |
221static void sendpkt P((struct sockaddr_storage *, struct pkt *, int)); |
222void input_handler P((void)); 223 224static int l_adj_systime P((l_fp *)); 225static int l_step_systime P((l_fp *)); 226 |
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 |
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)) { |
337 netsyslog(LOG_ERR, "No useable winsock.dll: %m"); |
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 */ |
360 while ((c = ntp_getopt(argc, argv, "46a:bBde:k:o:p:qr:st:uv")) != EOF) |
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; |
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, |
458 "usage: %s [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-r rate] [-t timeo] server ...\n", 459 progname); |
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 |
568 |
569 570 initializing = 0; |
571 was_alarmed = 0; 572 rbuflist = (struct recvbuf *)0; |
573 |
574 while (complete_servers < sys_numservers) { 575#ifdef HAVE_POLL_H |
576 struct pollfd* rdfdes; 577 rdfdes = fdmask; |
578#else 579 fd_set rdfdes; |
580 rdfdes = fdmask; |
581#endif |
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 */ |
593#ifdef HAVE_POLL_H |
594 nfound = poll(rdfdes, (unsigned int)nbsock, timeout.tv_sec * 1000); 595 |
596#else |
597 nfound = select(maxfd, &rdfdes, (fd_set *)0, |
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 |
612 netsyslog(LOG_ERR, |
613#ifdef HAVE_POLL_H 614 "poll() error: %m" 615#else 616 "select() error: %m" 617#endif 618 ); 619 } else { 620#ifndef SYS_VXWORKS |
621 netsyslog(LOG_DEBUG, |
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 |
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) |
690 printf("transmit(%s)\n", stoa(&(server->srcadr))); |
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", |
745 stoa(&(server->srcadr))); |
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) |
752 printf("transmit to %s\n", stoa(&(server->srcadr))); |
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) |
782 printf("receive(%s)\n", stoa(&rbufp->recv_srcadr)); |
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{ |
945 u_short i; |
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; |
953 server->filter_nextpt = (u_short)(i + 1); |
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", |
1288 stoa(&server->srcadr), |
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", |
1295 stoa(&server->srcadr), |
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; |
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"); |
1336 |
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)); |
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 } |
1353 1354 server = (struct server *)emalloc(sizeof(struct server)); 1355 memset((char *)server, 0, sizeof(struct server)); 1356 |
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); |
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..) |
1376 */ 1377static struct server * 1378findserver( |
1379 struct sockaddr_storage *addr |
1380 ) 1381{ |
1382 struct server *server; 1383 struct server *mc_server; 1384 1385 mc_server = NULL; |
1386 if (htons(((struct sockaddr_in*)addr)->sin_port) != NTP_PORT) |
1387 return 0; |
1388 1389 for (server = sys_servers; server != NULL; 1390 server = server->next_server) { |
1391 |
1392 if (memcmp(addr, &server->srcadr, SOCKLEN(addr))==0) |
1393 return server; |
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)) |
1402 mc_server = server; |
1403#else 1404 return 0; 1405#endif 1406 } |
1407 } 1408 1409 if (mc_server != NULL) { |
1410 |
1411 struct server *sp; 1412 1413 if (mc_server->event_time != 0) { 1414 mc_server->event_time = 0; 1415 complete_servers++; 1416 } |
1417 |
1418 server = (struct server *)emalloc(sizeof(struct server)); 1419 memset((char *)server, 0, sizeof(struct server)); 1420 |
1421 memcpy(&server->srcadr, &addr, sizeof(struct sockaddr_storage)); |
1422 1423 server->event_time = ++sys_numservers; |
1424 |
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 |
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 |
1650 /* 1651 * Init buffer free list and stat counters 1652 */ 1653 init_recvbuff(sys_numservers + 2); |
1654 |
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) { |
1681 /* create a datagram (UDP) socket */ |
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"); |
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 |
1705 |
1706 /* Remember the socket family in fd_family structure */ 1707 fd_family[nbsock] = res->ai_family; 1708 |
1709 /* 1710 * bind the socket to the NTP port 1711 */ 1712 if (!debug && !simple_query && !unpriv_port) { |
1713 if (bind(fd[nbsock], res->ai_addr, SOCKLEN(res->ai_addr)) < 0) { |
1714#ifndef SYS_WINNT 1715 if (errno == EADDRINUSE) 1716#else 1717 if (WSAGetLastError() == WSAEADDRINUSE) 1718#endif /* SYS_WINNT */ |
1719 netsyslog(LOG_ERR, |
1720 "the NTP socket is in use, exiting"); 1721 else |
1722 netsyslog(LOG_ERR, "bind() fails: %m"); |
1723 exit(1); 1724 } 1725 } 1726 1727#ifdef HAVE_POLL_H |
1728 fdmask[nbsock].fd = fd[nbsock]; 1729 fdmask[nbsock].events = POLLIN; |
1730#else |
1731 FD_SET(fd[nbsock], &fdmask); 1732 if ((SOCKET) maxfd < fd[nbsock]+1) { 1733 maxfd = fd[nbsock]+1; 1734 } |
1735#endif 1736 1737 /* 1738 * set non-blocking, 1739 */ 1740#ifndef SYS_WINNT 1741# ifdef SYS_VXWORKS 1742 { 1743 int on = TRUE; 1744 |
1745 if (ioctl(fd[nbsock],FIONBIO, &on) == ERROR) { 1746 netsyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m"); |
1747 exit(1); 1748 } 1749 } 1750# else /* not SYS_VXWORKS */ 1751# if defined(O_NONBLOCK) |
1752 if (fcntl(fd[nbsock], F_SETFL, O_NONBLOCK) < 0) { 1753 netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); |
1754 exit(1); 1755 /*NOTREACHED*/ 1756 } 1757# else /* not O_NONBLOCK */ 1758# if defined(FNDELAY) |
1759 if (fcntl(fd[nbsock], F_SETFL, FNDELAY) < 0) { 1760 netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m"); |
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 */ |
1770 if (ioctlsocket(fd[nbsock], FIONBIO, (u_long *) &on) == SOCKET_ERROR) { 1771 netsyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m"); |
1772 exit(1); 1773 } 1774#endif /* SYS_WINNT */ |
1775 nbsock++; 1776 } 1777 freeaddrinfo(ressave); |
1778} 1779 |
1780/* 1781 * sendpkt - send a packet to the specified destination 1782 */ 1783static void 1784sendpkt( |
1785 struct sockaddr_storage *dest, |
1786 struct pkt *pkt, 1787 int len 1788 ) 1789{ |
1790 int i; |
1791 int cc; |
1792 SOCKET sock = 0; |
1793 1794#ifdef SYS_WINNT 1795 DWORD err; 1796#endif /* SYS_WINNT */ 1797 |
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 |
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 */ |
1823 netsyslog(LOG_ERR, "sendto(%s): %m", stohost(dest)); |
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; |
1840#ifdef HAVE_POLL_H |
1841 struct pollfd fds[MAX_AF]; |
1842#else 1843 fd_set fds; 1844#endif |
1845 int fdc = 0; |
1846 1847 /* 1848 * Do a poll to see if we have data 1849 */ 1850 for (;;) { |
1851 tvzero.tv_sec = tvzero.tv_usec = 0; 1852#ifdef HAVE_POLL_H |
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 |
1867#else |
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 |
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) |
1893 netsyslog(LOG_ERR, |
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 |
1913#ifndef SYS_WINNT |
1914 (void) read(fdc, buf, sizeof buf); |
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 */ |
1921 recvfrom(fdc, buf, sizeof(buf), 0, (struct sockaddr *)0, NULL); |
1922#endif /* SYS_WINNT */ 1923 continue; 1924 } 1925 1926 rb = get_free_recv_buffer(); 1927 |
1928 fromlen = sizeof(struct sockaddr_storage); 1929 rb->recv_length = recvfrom(fdc, (char *)&rb->recv_pkt, |
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 |
2063 |
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", |
2080 stoa(&pp->srcadr), pp->stratum, |
2081 lfptoa(&pp->offset, 6), fptoa((s_fp)pp->delay, 5)); 2082 return; 2083 } 2084 2085 (void) fprintf(fp, "server %s, port %d\n", |
2086 stoa(&pp->srcadr), ntohs(((struct sockaddr_in*)&(pp->srcadr))->sin_port)); |
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 { |
2099 str = stoa(&pp->srcadr); |
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 --- |