]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Bug fixes to support IPv6 changes for non-IPv6 capable systems
authorDanny Mayer <mayer@ntp.org>
Wed, 2 Nov 2005 04:40:29 +0000 (23:40 -0500)
committerDanny Mayer <mayer@ntp.org>
Wed, 2 Nov 2005 04:40:29 +0000 (23:40 -0500)
bk: 4368433dx2-I9aBuuud4T7QUvZTxwQ

include/isc/ipv6.h
include/isc/net.h
include/ntp_machine.h
include/ntp_rfc2553.h
libisc/net.c
libisc/sockaddr.c
libntp/ntp_rfc2553.c
ntpdate/ntpdate.c

index edc41074fa4fea4f424156d2a50629c2c9305f88..007de7c0dd372ec2b2d2a14effcee87cd14872a3 100644 (file)
@@ -76,8 +76,8 @@ struct in6_addr {
 #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;
index 1a17b99e233321586ec68128d0c60211b3c90100..dae59780b69b70eee420b47fbe4eef5eabf67a10 100644 (file)
@@ -180,12 +180,12 @@ struct in6_pktinfo {
 /*
  * 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
index 6590e10fa7430c480928019c9ba2c75d27140616..16b272f0e38034e328f977bbd8846296e6e3af80 100644 (file)
@@ -239,6 +239,7 @@ typedef unsigned long u_long;
 #ifndef SYS_WINNT
 # define SOCKET        int
 # define INVALID_SOCKET        -1
+# define SOCKET_ERROR  -1
 # define closesocket close
 #endif
 /*
index 6d41fe3ca1cc436481d234e1e8dfb55ad205d11f..662b118942f6d3b228ac067d0a57d28ee7ae3b95 100644 (file)
 #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
  */
 
@@ -141,6 +147,19 @@ struct sockaddr_storage {
 #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
@@ -148,11 +167,6 @@ struct sockaddr_storage {
 #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 {
@@ -165,18 +179,9 @@ struct in6_addr {
 #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
index 2a72e891ca50dc1b4563365450aa9126be5c8b6c..64381b9d4f3ac9b1d50d027e20586587508ff9f9 100644 (file)
@@ -30,7 +30,6 @@
 
 #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)
index 4e928169e5bb58c5d340158e106f737795c934e6..33d7a1b9178a7561816384c4d609f241764398fa 100644 (file)
@@ -261,10 +261,10 @@ isc_sockaddr_any(isc_sockaddr_t *sockaddr)
        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
@@ -274,8 +274,8 @@ isc_sockaddr_any6(isc_sockaddr_t *sockaddr)
        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,
index be9de7ca0ff6d401f0b002c339ad9d95729ea42c..231aea1ffabc710a2098943b44c71b53fb116bdb 100644 (file)
@@ -313,7 +313,13 @@ do_nodename(
                {
                        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);
index 3594d52c35c85e9a1a581717d7f5141cbc329722..9cf4c76d0b3fe7f8e0c88f0b7cd7a1796841ca4a 100644 (file)
 #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"
@@ -351,6 +361,12 @@ ntpdatemain (
        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;
@@ -605,13 +621,13 @@ ntpdatemain (
 #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"
@@ -1419,6 +1435,16 @@ findserver(
 {
        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)
@@ -1427,20 +1453,18 @@ findserver(
        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;
                }
        }
 
@@ -1856,11 +1880,10 @@ sendpkt(
        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 */