49
50
struct conf_entry *ce_next;
50
51
char *ce_name; /* name we are trying to resolve */
51
52
struct conf_peer ce_config; /* configuration info for peer */
53
struct sockaddr_storage peer_store; /* address info for both fams */
53
55
#define ce_peeraddr ce_config.peeraddr
56
#define ce_peeraddr6 ce_config.peeraddr6
54
57
#define ce_hmode ce_config.hmode
55
58
#define ce_version ce_config.version
56
59
#define ce_minpoll ce_config.minpoll
409
411
ce = (struct conf_entry *)emalloc(sizeof(struct conf_entry));
410
412
ce->ce_name = cp;
411
413
ce->ce_peeraddr = 0;
414
ce->ce_peeraddr6 = in6addr_any;
415
ANYSOCK(&ce->peer_store);
412
416
ce->ce_hmode = (u_char)mode;
413
417
ce->ce_version = (u_char)version;
414
418
ce->ce_minpoll = (u_char)minpoll;
445
449
struct conf_entry *entry
452
struct addrinfo *addr;
451
455
checkparent(); /* make sure our guy is still running */
453
if (entry->ce_name && entry->ce_peeraddr) {
457
if (entry->ce_name != NULL && SOCKNUL(&entry->peer_store)) {
454
458
/* HMS: Squawk? */
455
459
msyslog(LOG_ERR, "findhostaddr: both ce_name and ce_peeraddr are defined...");
459
if (!entry->ce_name && !entry->ce_peeraddr) {
463
if (entry->ce_name == NULL && !SOCKNUL(&entry->peer_store)) {
460
464
msyslog(LOG_ERR, "findhostaddr: both ce_name and ce_peeraddr are undefined!");
467
471
msyslog(LOG_INFO, "findhostaddr: Resolving <%s>",
469
473
#endif /* DEBUG */
470
hp = gethostbyname(entry->ce_name);
474
error = getaddrinfo(entry->ce_name, NULL, NULL, &addr);
476
entry->peer_store = *((struct sockaddr_storage*)(addr->ai_addr));
477
if (entry->peer_store.ss_family == AF_INET) {
479
GET_INADDR(entry->peer_store);
480
entry->ce_config.v6_flag = 0;
482
entry->ce_peeraddr6 =
483
GET_INADDR6(entry->peer_store);
484
entry->ce_config.v6_flag = 1;
474
msyslog(LOG_INFO, "findhostaddr: Resolving %x>",
490
msyslog(LOG_INFO, "findhostaddr: Resolving %s>",
491
stoa(&entry->peer_store));
477
in.s_addr = entry->ce_peeraddr;
478
hp = gethostbyaddr((const char *)&in,
479
sizeof entry->ce_peeraddr,
493
entry->ce_name = emalloc(MAXHOSTNAMELEN);
494
error = getnameinfo((const struct sockaddr *)&entry->peer_store,
495
SOCKLEN(&entry->peer_store),
496
(char *)&entry->ce_name, MAXHOSTNAMELEN,
485
502
* If the resolver is in use, see if the failure is
486
503
* temporary. If so, return success.
496
513
msyslog(LOG_INFO, "findhostaddr: name resolved.");
499
* Use the first address. We don't have any way to tell
500
* preferences and older gethostbyname() implementations
503
memmove((char *)&(entry->ce_peeraddr),
505
sizeof(struct in_addr));
506
if (entry->ce_keystr[0] == '*')
507
strncpy((char *)&(entry->ce_keystr), hp->h_name,
515
518
msyslog(LOG_INFO, "findhostaddr: address resolved.");
517
s = strlen(hp->h_name) + 1;
519
strcpy(cp, hp->h_name);
533
struct sockaddr_in saddr;
532
struct addrinfo hints;
533
struct addrinfo *addrResult;
538
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
538
memset(&hints, 0, sizeof(hints));
539
hints.ai_family = AF_UNSPEC;
540
hints.ai_socktype = SOCK_DGRAM;
541
if (getaddrinfo(NULL, "ntp", &hints, &addrResult)!=0) {
542
msyslog(LOG_ERR, "getaddrinfo failed: %m");
545
sockfd = socket(addrResult->ai_family, addrResult->ai_socktype, 0);
539
547
if (sockfd == -1) {
540
548
msyslog(LOG_ERR, "socket() failed: %m");
544
memset((char *)&saddr, 0, sizeof(saddr));
545
saddr.sin_family = AF_INET;
546
saddr.sin_port = htons(NTP_PORT); /* trash */
547
saddr.sin_addr.s_addr = htonl(LOCALHOST); /* garbage */
550
553
* Make the socket non-blocking. We'll wait with select()
576
579
#endif /* SYS_WINNT */
579
if (connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) {
580
if (connect(sockfd, addrResult->ai_addr, addrResult->ai_addrlen) == -1) {
580
581
msyslog(LOG_ERR, "openntp: connect() failed: %m");
584
freeaddrinfo(addrResult);
676
678
overlap.Offset = overlap.OffsetHigh = (DWORD)0;
677
679
overlap.hEvent = hReadWriteEvent;
678
680
ret = WriteFile((HANDLE)sockfd, (char *)&reqpkt, REQ_LEN_NOMAC + n,
679
(LPDWORD)&NumberOfBytesWritten, (LPOVERLAPPED)&overlap);
681
NULL, (LPOVERLAPPED)&overlap);
680
682
if ((ret == FALSE) && (GetLastError() != ERROR_IO_PENDING)) {
681
683
msyslog(LOG_ERR, "send to NTP server failed: %m");
687
689
msyslog(LOG_ERR, "WaitForSingleObject failed: %m");
692
if (!GetOverlappedResult((HANDLE)sockfd, (LPOVERLAPPED)&overlap,
693
(LPDWORD)&NumberOfBytesWritten, FALSE)) {
694
msyslog(LOG_ERR, "GetOverlappedResult for WriteFile fails: %m");
690
697
#endif /* SYS_WINNT */
732
740
#else /* Overlapped I/O used on non-blocking sockets on Windows NT */
733
741
ret = ReadFile((HANDLE)sockfd, (char *)&reqpkt, (DWORD)REQ_LEN_MAC,
734
(LPDWORD)&NumberOfBytesRead, (LPOVERLAPPED)&overlap);
742
NULL, (LPOVERLAPPED)&overlap);
735
743
if ((ret == FALSE) && (GetLastError() != ERROR_IO_PENDING)) {
736
744
msyslog(LOG_ERR, "ReadFile() fails: %m");
739
747
dwWait = WaitForSingleObject(hReadWriteEvent, (DWORD) TIMEOUT_SEC * 1000);
740
748
if ((dwWait == WAIT_FAILED) || (dwWait == WAIT_TIMEOUT)) {
741
749
if (dwWait == WAIT_FAILED) {
742
msyslog(LOG_ERR, "WaitForSingleObject fails: %m");
750
msyslog(LOG_ERR, "WaitForSingleObject for ReadFile fails: %m");
755
if (!GetOverlappedResult((HANDLE)sockfd, (LPOVERLAPPED)&overlap,
756
(LPDWORD)&NumberOfBytesRead, FALSE)) {
757
msyslog(LOG_ERR, "GetOverlappedResult fails: %m");
747
760
n = NumberOfBytesRead;
748
761
#endif /* SYS_WINNT */
832
845
case INFO_ERR_IMPL:
834
"server reports implementation mismatch!!");
847
"ntpd reports implementation mismatch!");
837
850
case INFO_ERR_REQ:
839
"server claims configuration request is unknown");
852
"ntpd says configuration request is unknown!");
842
855
case INFO_ERR_FMT:
844
"server indicates a format error occurred(!!)");
857
"ntpd indicates a format error occurred!");
847
860
case INFO_ERR_NODATA:
849
"server indicates no data available (shouldn't happen)");
862
"ntpd indicates no data available!");
852
865
case INFO_ERR_AUTH:
854
"server returns a permission denied error");
867
"ntpd returns a permission denied error!");
859
"server returns unknown error code %d", n);
872
"ntpd returns unknown error code %d!", n);
1030
1043
msyslog(LOG_INFO,
1031
"doconfigure: <%s> has peeraddr %#x",
1032
ce->ce_name, ce->ce_peeraddr);
1044
"doconfigure: <%s> has peeraddr %s",
1045
ce->ce_name, stoa(&ce->peer_store));
1034
if (dores && ce->ce_peeraddr == 0) {
1047
if (dores && !SOCKNUL(&(ce->peer_store))) {
1035
1048
if (!findhostaddr(ce)) {
1036
1049
msyslog(LOG_ERR,
1037
1050
"couldn't resolve `%s', giving up on it",