#define s6_addr16 _S6_un._S6_u16
#define s6_addr32 _S6_un._S6_u32
-#define IN6ADDR_ANY_INIT {{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}}
-#define IN6ADDR_LOOPBACK_INIT {{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }}}
+#define IN6ADDR_ANY_INIT {{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}
+#define IN6ADDR_LOOPBACK_INIT {{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }}
LIBISC_EXTERNAL_DATA extern const struct in6_addr in6addr_any;
LIBISC_EXTERNAL_DATA extern const struct in6_addr in6addr_loopback;
/*
* Cope with a missing in6addr_any and in6addr_loopback.
*/
-#if defined(ISC_PLATFORM_NEEDIN6ADDRANY)
+#if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRANY)
extern const struct in6_addr isc_net_in6addrany;
#define in6addr_any isc_net_in6addrany
#endif
-#if defined(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
+#if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
extern const struct in6_addr isc_net_in6addrloop;
#define in6addr_loopback isc_net_in6addrloop
#endif
#ifndef SYS_WINNT
# define SOCKET int
# define INVALID_SOCKET -1
+# define SOCKET_ERROR -1
# define closesocket close
#endif
/*
#include "ntp_types.h"
/*
+ * Don't include any additional IPv6 definitions
+ * We are defining our own here.
+ */
+#define ISC_IPV6_H 1
+
+ /*
* If various macros are not defined we need to define them
*/
#endif
#ifndef ISC_PLATFORM_HAVEIPV6
+/*
+ * Definition of some useful macros to handle IP6 addresses
+ */
+#ifdef ISC_PLATFORM_NEEDIN6ADDRANY
+#ifdef SYS_WINNT
+#define IN6ADDR_ANY_INIT {{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}
+#else
+#define IN6ADDR_ANY_INIT \
+ {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
+#endif
+#endif
+
/*
* IPv6 address
#ifdef SYS_WINNT
#define in6_addr in_addr6
#else
-/*
- * Don't include any additional IPv6 definitions
- * We are defining our own here.
- */
-#define ISC_IPV6_H 1
struct in6_addr {
union {
#define s6_addr __u6_addr.__u6_addr8
#endif
-/*
- * Definition of some useful macros to handle IP6 addresses
- */
-#ifdef SYS_WINNT
-#define IN6ADDR_ANY_INIT {{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}
-#else
-#define IN6ADDR_ANY_INIT \
- {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
-#endif
-
+#if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRANY)
extern const struct in6_addr in6addr_any;
+#endif
#define SIN6_LEN
#ifndef HAVE_SOCKADDR_IN6
#if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRANY)
const struct in6_addr isc_net_in6addrany = IN6ADDR_ANY_INIT;
-#define in6addr_any isc_net_in6addrany
#endif
#if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
ISC_LINK_INIT(sockaddr, link);
}
-#ifdef ISC_PLATFORM_HAVEIPV6
void
isc_sockaddr_any6(isc_sockaddr_t *sockaddr)
{
+#ifdef ISC_PLATFORM_HAVEIPV6
memset(sockaddr, 0, sizeof(*sockaddr));
sockaddr->type.sin6.sin6_family = AF_INET6;
#ifdef ISC_PLATFORM_HAVESALEN
sockaddr->type.sin6.sin6_port = 0;
sockaddr->length = sizeof(sockaddr->type.sin6);
ISC_LINK_INIT(sockaddr, link);
-}
#endif
+}
void
isc_sockaddr_fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
{
sockin6 = (struct sockaddr_in6 *)ai->ai_addr;
sockin6->sin6_family = (short) ai->ai_family;
- sockin6->sin6_addr = in6addr_any;
+ /*
+ * we have already zeroed out the address
+ * so we don't actually need to do this
+ * This assignment is causing problems so
+ * we don't do what this would do.
+ sockin6->sin6_addr = in6addr_any;
+ */
}
#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
ai->ai_addr->sa_len = SOCKLEN(ai->ai_addr);
#include "ntp_select.h"
#include "ntp_stdlib.h"
+/* Don't include ISC's version of IPv6 variables and structures */
+#define ISC_IPV6_H 1
+#include "isc/net.h"
+#include "isc/result.h"
+#include "isc/sockaddr.h"
+
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <arpa/inet.h>
+#ifdef __QNXNTO__
+# include "adjtime.h"
+#endif
+
#ifdef SYS_VXWORKS
# include "ioLib.h"
# include "sockLib.h"
clear_globals();
#endif
+
+ /* Check to see if we have IPv6. Otherwise force the -4 flag */
+ if (isc_net_probeipv6() != ISC_R_SUCCESS) {
+ ai_fam_templ = AF_INET;
+ }
+
errflg = 0;
progname = argv[0];
syslogit = 0;
#endif
if (nfound > 0)
input_handler();
-#ifndef SYS_WINNT
- else if (nfound == -1)
-#else
else if (nfound == SOCKET_ERROR)
-#endif /* SYS_WINNT */
{
+#ifndef SYS_WINNT
if (errno != EINTR)
+#else
+ if (WSAGetLastError() != WSAEINTR)
+#endif
netsyslog(LOG_ERR,
#ifdef HAVE_POLL_H
"poll() error: %m"
{
struct server *server;
struct server *mc_server;
+ isc_sockaddr_t laddr;
+ isc_sockaddr_t saddr;
+
+ if(addr->ss_family == AF_INET) {
+ isc_sockaddr_fromin( &laddr, &((struct sockaddr_in*)&addr)->sin_addr, 0);
+ }
+ else {
+ isc_sockaddr_fromin6(&laddr, &((struct sockaddr_in6*)&addr)->sin6_addr, 0);
+ }
+
mc_server = NULL;
if (htons(((struct sockaddr_in*)addr)->sin_port) != NTP_PORT)
for (server = sys_servers; server != NULL;
server = server->next_server) {
- if (memcmp(addr, &server->srcadr, SOCKLEN(addr))==0)
- return server;
- /* Multicast compatibility to verify here... I'm not sure it's working */
- if(addr->ss_family == AF_INET) {
- if (IN_MULTICAST(ntohl(((struct sockaddr_in*)addr)->sin_addr.s_addr)))
- mc_server = server;
+ if(server->srcadr.ss_family == AF_INET) {
+ isc_sockaddr_fromin(&saddr, &((struct sockaddr_in*)&server->srcadr)->sin_addr, 0);
}
else {
-#ifdef AF_INET6
- if (IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)(&server->srcadr))->sin6_addr))
- mc_server = server;
-#else
- return 0;
-#endif
+ isc_sockaddr_fromin6(&saddr, &((struct sockaddr_in6*)&server->srcadr)->sin6_addr, 0);
+ }
+ if (isc_sockaddr_eqaddr(&laddr, &saddr) == ISC_TRUE)
+ return server;
+
+ if(addr->ss_family == server->srcadr.ss_family) {
+ if (isc_sockaddr_ismulticast(&saddr) == ISC_TRUE)
+ mc_server = server;
}
}
cc = sendto(sock, (char *)pkt, len, 0, (struct sockaddr *)dest,
SOCKLEN(dest));
+ if (cc == SOCKET_ERROR) {
#ifndef SYS_WINNT
- if (cc == -1) {
if (errno != EWOULDBLOCK && errno != ENOBUFS)
#else
- if (cc == SOCKET_ERROR) {
err = WSAGetLastError();
if (err != WSAEWOULDBLOCK && err != WSAENOBUFS)
#endif /* SYS_WINNT */