186
211
static struct server *clock_select P((void));
187
212
static int clock_adjust P((void));
188
213
static void addserver P((char *));
189
static struct server *findserver P((struct sockaddr_in *));
214
static struct server *findserver P((struct sockaddr_storage *));
190
215
void timer P((void));
191
216
static void init_alarm P((void));
192
217
#ifndef SYS_WINNT
193
218
static RETSIGTYPE alarming P((int));
194
219
#endif /* SYS_WINNT */
195
220
static void init_io P((void));
196
static void sendpkt P((struct sockaddr_in *, struct pkt *, int));
221
static void sendpkt P((struct sockaddr_storage *, struct pkt *, int));
197
222
void input_handler P((void));
199
224
static int l_adj_systime P((l_fp *));
200
225
static int l_step_systime P((l_fp *));
202
static int getnetnum P((const char *, u_int32 *));
203
227
static void printserver P((struct server *, FILE *));
556
591
* Nothing to do. Wait for something.
559
593
#ifdef HAVE_POLL_H
560
nfound = poll(&rdfdes, 1, timeout.tv_sec * 1000);
594
nfound = poll(rdfdes, (unsigned int)nbsock, timeout.tv_sec * 1000);
562
nfound = select(fd+1, &rdfdes, (fd_set *)0,
597
nfound = select(maxfd, &rdfdes, (fd_set *)0,
563
598
(fd_set *)0, &timeout);
708
744
printf("transmit auth to %s\n",
709
ntoa(&(server->srcadr)));
745
stoa(&(server->srcadr)));
711
747
get_systime(&(server->xmt));
712
748
HTONL_FP(&server->xmt, &xpkt.xmt);
713
749
sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC);
716
printf("transmit to %s\n", ntoa(&(server->srcadr)));
752
printf("transmit to %s\n", stoa(&(server->srcadr)));
1016
1058
nlist = 0; /* none yet */
1017
1059
for (server = sys_servers; server != NULL; server = server->next_server) {
1018
if (server->delay == 0)
1060
if (server->delay == 0) {
1062
printf("%s: Server dropped: no data\n", ntoa(&server->srcadr));
1019
1063
continue; /* no data */
1020
if (server->stratum > NTP_INFIN)
1065
if (server->stratum > NTP_INFIN) {
1067
printf("%s: Server dropped: strata too high\n", ntoa(&server->srcadr));
1021
1068
continue; /* stratum no good */
1022
1070
if (server->delay > NTP_MAXWGT) {
1072
printf("%s: Server dropped: server too far away\n",
1073
ntoa(&server->srcadr));
1023
1074
continue; /* too far away */
1025
if (server->leap == LEAP_NOTINSYNC)
1076
if (server->leap == LEAP_NOTINSYNC) {
1078
printf("%s: Server dropped: Leap not in sync\n", ntoa(&server->srcadr));
1026
1079
continue; /* he's in trouble */
1027
1081
if (!L_ISHIS(&server->org, &server->reftime)) {
1083
printf("%s: Server dropped: server is very broken\n",
1084
ntoa(&server->srcadr));
1028
1085
continue; /* very broken host */
1030
1087
if ((server->org.l_ui - server->reftime.l_ui)
1090
printf("%s: Server dropped: Server has gone too long without sync\n",
1091
ntoa(&server->srcadr));
1032
1092
continue; /* too long without sync */
1034
1094
if (server->trust != 0) {
1096
printf("%s: Server dropped: Server is untrusted\n",
1097
ntoa(&server->srcadr));
1216
1279
absoffset = server->soffset;
1217
1280
if (absoffset < 0)
1218
1281
absoffset = -absoffset;
1219
dostep = (absoffset >= NTPDATE_THRESHOLD);
1282
dostep = (absoffset >= NTPDATE_THRESHOLD || absoffset < 0);
1223
1286
if (simple_query || l_step_systime(&server->offset)) {
1224
1287
msyslog(LOG_NOTICE, "step time server %s offset %s sec",
1225
ntoa(&server->srcadr),
1288
stoa(&server->srcadr),
1226
1289
lfptoa(&server->offset, 6));
1229
1292
#if !defined SYS_WINNT && !defined SYS_CYGWIN32
1230
1293
if (simple_query || l_adj_systime(&server->offset)) {
1231
1294
msyslog(LOG_NOTICE, "adjust time server %s offset %s sec",
1232
ntoa(&server->srcadr),
1295
stoa(&server->srcadr),
1233
1296
lfptoa(&server->offset, 6));
1263
1326
register struct server *server;
1266
if (!getnetnum(serv, &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 */
1335
strcpy(service, "ntp");
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;
1344
printf("Looking for host %s and service %s\n", serv, service);
1347
error = getaddrinfo(serv, service, &hints, &addrResult);
1349
fprintf(stderr, "Error : %s\n", gai_strerror(error));
1267
1350
msyslog(LOG_ERR, "can't find host %s\n", serv);
1355
fprintf(stderr, "host found : %s\n", stohost((struct sockaddr_storage*)addrResult->ai_addr));
1271
1359
server = (struct server *)emalloc(sizeof(struct server));
1272
1360
memset((char *)server, 0, sizeof(struct server));
1274
server->srcadr.sin_family = AF_INET;
1275
server->srcadr.sin_addr.s_addr = netnum;
1276
server->srcadr.sin_port = htons(NTP_PORT);
1362
/* For now we only get the first returned server of the addrinfo list */
1363
memset(&(server->srcadr), 0, sizeof(struct sockaddr_storage));
1364
memcpy(&(server->srcadr), addrResult->ai_addr, addrResult->ai_addrlen);
1278
1365
server->event_time = ++sys_numservers;
1279
1366
if (sys_servers == NULL)
1280
1367
sys_servers = server;
1292
1379
* findserver - find a server in the list given its address
1380
* ***(For now it isn't totally AF-Independant, to check later..)
1294
1382
static struct server *
1296
struct sockaddr_in *addr
1384
struct sockaddr_storage *addr
1299
register u_int32 netnum;
1300
1387
struct server *server;
1301
1388
struct server *mc_server;
1303
1390
mc_server = NULL;
1304
if (htons(addr->sin_port) != NTP_PORT)
1391
if (htons(((struct sockaddr_in*)addr)->sin_port) != NTP_PORT)
1306
netnum = addr->sin_addr.s_addr;
1308
1394
for (server = sys_servers; server != NULL;
1309
1395
server = server->next_server) {
1310
register u_int32 servnum;
1312
servnum = server->srcadr.sin_addr.s_addr;
1313
if (netnum == servnum)
1397
if (memcmp(addr, &server->srcadr, SOCKLEN(addr))==0)
1315
if (IN_MULTICAST(ntohl(servnum)))
1399
/* Multicast compatibility to verify here... I'm not sure it's working */
1400
if(addr->ss_family == AF_INET) {
1401
if (IN_MULTICAST(ntohl(((struct sockaddr_in*)addr)->sin_addr.s_addr)))
1406
if (IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)(&server->srcadr))->sin6_addr))
1316
1407
mc_server = server;
1319
1414
if (mc_server != NULL) {
1320
1416
struct server *sp;
1322
1418
if (mc_server->event_time != 0) {
1323
1419
mc_server->event_time = 0;
1324
1420
complete_servers++;
1326
1423
server = (struct server *)emalloc(sizeof(struct server));
1327
1424
memset((char *)server, 0, sizeof(struct server));
1329
server->srcadr.sin_family = AF_INET;
1330
server->srcadr.sin_addr.s_addr = netnum;
1331
server->srcadr.sin_port = htons(NTP_PORT);
1426
memcpy(&server->srcadr, &addr, sizeof(struct sockaddr_storage));
1333
1428
server->event_time = ++sys_numservers;
1334
1430
for (sp = sys_servers; sp->next_server != NULL;
1335
1431
sp = sp->next_server) ;
1336
1432
sp->next_server = server;
1468
1565
/* get the LUID for system-time privilege. */
1469
1566
LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, &tkp.Privileges[0].Luid);
1470
tkp.PrivilegeCount = 1; /* one privilege to set */
1567
tkp.PrivilegeCount = 1; /* one privilege to set */
1471
1568
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
1472
1569
/* get set-time privilege for this process. */
1473
1570
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
1490
1587
/* get the LUID for system-time privilege. */
1491
1588
LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, &tkp.Privileges[0].Luid);
1492
tkp.PrivilegeCount = 1; /* one privilege to set */
1589
tkp.PrivilegeCount = 1; /* one privilege to set */
1493
1590
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
1494
1591
/* get set-time privilege for this process. */
1495
1592
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
1516
1613
/* start the timer event */
1517
1614
wTimerID = timeSetEvent(
1518
(UINT) (1000/TIMER_HZ), /* Delay */
1519
wTimerRes, /* Resolution */
1520
(LPTIMECALLBACK) alarming, /* Callback function */
1521
(DWORD) dwUser, /* User data */
1522
TIME_PERIODIC); /* Event type (periodic) */
1615
(UINT) (1000/TIMER_HZ), /* Delay */
1616
wTimerRes, /* Resolution */
1617
(LPTIMECALLBACK) alarming, /* Callback function */
1618
(DWORD) dwUser, /* User data */
1619
TIME_PERIODIC); /* Event type (periodic) */
1523
1620
if (wTimerID == 0) {
1524
1621
msyslog(LOG_ERR, "timeSetEvent failed: %m");
1650
struct addrinfo *res, *ressave;
1651
struct addrinfo hints;
1554
1656
* Init buffer free list and stat counters
1556
1658
init_recvbuff(sys_numservers + 2);
1558
1661
* Open the socket
1664
strcpy(service, "ntp");
1667
* Init hints addrinfo structure
1669
memset(&hints, 0, sizeof(hints));
1670
hints.ai_flags = AI_PASSIVE;
1671
hints.ai_socktype = SOCK_DGRAM;
1673
if(getaddrinfo(NULL, service, &hints, &res) != 0) {
1674
msyslog(LOG_ERR, "getaddrinfo() failed: %m");
1679
/* Remember the address of the addrinfo structure chain */
1683
* For each structure returned, open and bind socket
1685
for(nbsock = 0; (nbsock < MAX_AF) && res ; res = res->ai_next) {
1561
1686
/* create a datagram (UDP) socket */
1562
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
1563
msyslog(LOG_ERR, "socket() failed: %m");
1687
if ((fd[nbsock] = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0) {
1688
if (errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT ||
1689
errno == EPFNOSUPPORT)
1691
netsyslog(LOG_ERR, "socket() failed: %m");
1695
/* set socket to reuse address */
1696
if (setsockopt(fd[nbsock], SOL_SOCKET, SO_REUSEADDR, (void*) &optval, sizeof(optval)) < 0) {
1697
netsyslog(LOG_ERR, "setsockopt() SO_REUSEADDR failed: %m");
1702
/* Restricts AF_INET6 socket to IPv6 communications (see RFC 2553bis-03) */
1703
if (res->ai_family == AF_INET6)
1704
if (setsockopt(fd[nbsock], IPPROTO_IPV6, IPV6_V6ONLY, (void*) &optval, sizeof(optval)) < 0) {
1705
netsyslog(LOG_ERR, "setsockopt() IPV6_V6ONLY failed: %m");
1711
/* Remember the socket family in fd_family structure */
1712
fd_family[nbsock] = res->ai_family;
1569
1715
* bind the socket to the NTP port
1571
if (!debug && !simple_query && !unpriv_port) {
1572
struct sockaddr_in addr;
1574
memset((char *)&addr, 0, sizeof addr);
1575
addr.sin_family = AF_INET;
1576
addr.sin_port = htons(NTP_PORT);
1577
addr.sin_addr.s_addr = htonl(INADDR_ANY);
1578
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
1717
if (!simple_query && !unpriv_port) {
1718
if (bind(fd[nbsock], res->ai_addr, SOCKLEN(res->ai_addr)) < 0) {
1579
1719
#ifndef SYS_WINNT
1580
1720
if (errno == EADDRINUSE)
1582
1722
if (WSAGetLastError() == WSAEADDRINUSE)
1583
1723
#endif /* SYS_WINNT */
1585
1725
"the NTP socket is in use, exiting");
1587
msyslog(LOG_ERR, "bind() fails: %m");
1727
netsyslog(LOG_ERR, "bind() fails: %m");
1592
1732
#ifdef HAVE_POLL_H
1594
fdmask.events = POLLIN;
1733
fdmask[nbsock].fd = fd[nbsock];
1734
fdmask[nbsock].events = POLLIN;
1597
FD_SET(fd, &fdmask);
1736
FD_SET(fd[nbsock], &fdmask);
1737
if ((SOCKET) maxfd < fd[nbsock]+1) {
1738
maxfd = fd[nbsock]+1;
1608
if (ioctl(fd,FIONBIO, &on) == ERROR) {
1609
msyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m");
1750
if (ioctl(fd[nbsock],FIONBIO, &on) == ERROR) {
1751
netsyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m");
1613
1755
# else /* not SYS_VXWORKS */
1614
1756
# if defined(O_NONBLOCK)
1615
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
1616
msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1757
if (fcntl(fd[nbsock], F_SETFL, O_NONBLOCK) < 0) {
1758
netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1620
1762
# else /* not O_NONBLOCK */
1621
1763
# if defined(FNDELAY)
1622
if (fcntl(fd, F_SETFL, FNDELAY) < 0) {
1623
msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1764
if (fcntl(fd[nbsock], F_SETFL, FNDELAY) < 0) {
1765
netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1630
1772
# endif /* not O_NONBLOCK */
1631
1773
# endif /* SYS_VXWORKS */
1632
1774
#else /* SYS_WINNT */
1633
if (ioctlsocket(fd, FIONBIO, (u_long *) &on) == SOCKET_ERROR) {
1634
msyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m");
1775
if (ioctlsocket(fd[nbsock], FIONBIO, (u_long *) &on) == SOCKET_ERROR) {
1776
netsyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m");
1637
1779
#endif /* SYS_WINNT */
1782
freeaddrinfo(ressave);
1642
1786
* sendpkt - send a packet to the specified destination
1646
struct sockaddr_in *dest,
1790
struct sockaddr_storage *dest,
1647
1791
struct pkt *pkt,
1653
1799
#ifdef SYS_WINNT
1655
1801
#endif /* SYS_WINNT */
1657
cc = sendto(fd, (char *)pkt, (size_t)len, 0, (struct sockaddr *)dest,
1658
sizeof(struct sockaddr_in));
1803
/* Find a local family compatible socket to send ntp packet to ntp server */
1804
for(i = 0; (i < MAX_AF); i++) {
1805
if(dest->ss_family == fd_family[i]) {
1812
netsyslog(LOG_ERR, "cannot find family compatible socket to send ntp packet");
1817
cc = sendto(sock, (char *)pkt, len, 0, (struct sockaddr *)dest,
1659
1820
#ifndef SYS_WINNT
1660
1821
if (cc == -1) {
1661
1822
if (errno != EWOULDBLOCK && errno != ENOBUFS)
1680
1841
struct timeval tvzero;
1683
1845
#ifdef HAVE_POLL_H
1846
struct pollfd fds[MAX_AF];
1690
1853
* Do a poll to see if we have data
1856
tvzero.tv_sec = tvzero.tv_usec = 0;
1858
memcpy(fds, fdmask, sizeof(fdmask));
1859
n = poll(fds, (unsigned int)nbsock, tvzero.tv_sec * 1000);
1862
* Determine which socket received data
1865
for(i=0; i < nbsock; i++) {
1866
if(fds[i].revents & POLLIN) {
1694
tvzero.tv_sec = tvzero.tv_usec = 0;
1696
n = poll(&fds, 1, tvzero.tv_sec * 1000);
1698
n = select(fd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero);
1874
n = select(maxfd, &fds, (fd_set *)0, (fd_set *)0, &tvzero);
1877
* Determine which socket received data
1880
for(i=0; i < maxfd; i++) {
1881
if(FD_ISSET(fd[i], &fds)) {
1726
1914
if (initializing || free_recvbuffs() == 0) {
1729
1918
#ifndef SYS_WINNT
1730
(void) read(fd, buf, sizeof buf);
1919
(void) read(fdc, buf, sizeof buf);
1732
1921
/* NT's _read does not operate on nonblocking sockets
1733
1922
* either recvfrom or ReadFile() has to be used here.
1734
1923
* ReadFile is used in [ntpd]ntp_intres() and ntpdc,
1735
1924
* just to be different use recvfrom() here
1737
recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)0, NULL);
1926
recvfrom(fdc, buf, sizeof(buf), 0, (struct sockaddr *)0, NULL);
1738
1927
#endif /* SYS_WINNT */
1742
1931
rb = get_free_recv_buffer();
1744
fromlen = sizeof(struct sockaddr_in);
1745
rb->recv_length = recvfrom(fd, (char *)&rb->recv_pkt,
1933
fromlen = sizeof(struct sockaddr_storage);
1934
rb->recv_length = recvfrom(fdc, (char *)&rb->recv_pkt,
1746
1935
sizeof(rb->recv_pkt), 0,
1747
1936
(struct sockaddr *)&rb->recv_srcadr, &fromlen);
1748
1937
if (rb->recv_length == -1) {
1914
2079
(void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n",
1915
ntoa(&pp->srcadr), pp->stratum,
2080
stoa(&pp->srcadr), pp->stratum,
1916
2081
lfptoa(&pp->offset, 6), fptoa((s_fp)pp->delay, 5));
1920
2085
(void) fprintf(fp, "server %s, port %d\n",
1921
ntoa(&pp->srcadr), ntohs(pp->srcadr.sin_port));
2086
stoa(&pp->srcadr), ntohs(((struct sockaddr_in*)&(pp->srcadr))->sin_port));
1923
2088
(void) fprintf(fp, "stratum %d, precision %d, leap %c%c, trust %03o\n",
1924
2089
pp->stratum, pp->precision,