]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Use a union for structs sockaddr, sockaddr_storage, sockaddr_in, and
authorDave Hart <hart@ntp.org>
Mon, 15 Jun 2009 03:46:17 +0000 (03:46 +0000)
committerDave Hart <hart@ntp.org>
Mon, 15 Jun 2009 03:46:17 +0000 (03:46 +0000)
  sockaddr_in6 to remove casts and enable type checking.  Collapse
  some previously separate IPv4/IPv6 paths into a single codepath.

bk: 4a35c409E3ge3bnkaS0TKelKK0EsJA

67 files changed:
ChangeLog
gsoc_sntp/main.c
gsoc_sntp/networking.c
gsoc_sntp/networking.h
gsoc_sntp/utilities.c
gsoc_sntp/utilities.h
include/iosignal.h
include/ntp.h
include/ntp_control.h
include/ntp_fp.h
include/ntp_malloc.h
include/ntp_net.h
include/ntp_refclock.h
include/ntp_request.h
include/ntp_stdlib.h
include/ntpd.h
include/ntpsim.h
include/recvbuff.h
libntp/a_md5encrypt.c
libntp/clocktypes.c
libntp/decodenetnum.c
libntp/lib_strbuf.c
libntp/lib_strbuf.h
libntp/netof.c
libntp/numtoa.c
libntp/recvbuff.c
libntp/refnumtoa.c
libntp/socktoa.c
libntp/socktohost.c
ntpd/ntp_config.c
ntpd/ntp_control.c
ntpd/ntp_crypto.c
ntpd/ntp_intres.c
ntpd/ntp_io.c
ntpd/ntp_monitor.c
ntpd/ntp_peer.c
ntpd/ntp_proto.c
ntpd/ntp_refclock.c
ntpd/ntp_request.c
ntpd/ntp_restrict.c
ntpd/ntp_timer.c
ntpd/ntp_util.c
ntpd/ntpd.c
ntpd/ntpsim.c
ntpd/refclock_nmea.c
ntpdate/ntpdate.c
ntpdate/ntpdate.h
ntpdc/layout.std
ntpdc/ntpdc.c
ntpdc/ntpdc.h
ntpdc/ntpdc_ops.c
ntpq/libntpq.c
ntpq/libntpq.h
ntpq/libntpq_subs.c
ntpq/ntpq-subs.c
ntpq/ntpq.c
ntpq/ntpq.h
ports/winnt/include/config.h
ports/winnt/include/ntp_iocompletionport.h
ports/winnt/include/transmitbuff.h
ports/winnt/include/win32_io.h
ports/winnt/libntp/libntp.vcproj
ports/winnt/libntp/transmitbuff.c
ports/winnt/ntpd/nt_clockstuff.c
ports/winnt/ntpd/ntp_iocompletionport.c
ports/winnt/ntpd/ntpd.vcproj
ports/winnt/ntpdate/ntpdate.vcproj

index 369233592dadf3357a572edbb44ecc2f02448a50..b4dc57a21f02a5b2df7d21dcce18d95ab2075735 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,10 @@
+* Use a union for structs sockaddr, sockaddr_storage, sockaddr_in, and
+  sockaddr_in6 to remove casts and enable type checking.  Collapse
+  some previously separate IPv4/IPv6 paths into a single codepath.
 * [Bug 1041] xmt -> aorg timestamp cleanup from Dave Mills,
   reported by Dave Hart.
 * [Bug 1193] Compile error: conflicting types for emalloc.
-* [Bug 1196] VC6 winsock2.h does not define SO_EXLUSIVEADDRUSE.
+* [Bug 1196] VC6 winsock2.h does not define SO_EXCLUSIVEADDRUSE.
 * Leap/expire cleanup from Dave Mills.
 (4.2.5p178) 2009/05/21 Released by Harlan Stenn <stenn@ntp.org>
 * Provide erealloc() and estrdup(), a la emalloc().
index c81e96a14a1103757e26b7f8f5647c700bed2454..a204258391d7f31a3f45098d015741b9b87f8a5a 100644 (file)
@@ -118,7 +118,7 @@ sntp_main (
        int sync_data_suc = 0;
        for(c=0; c<resc && !sync_data_suc; c++) {
                getnameinfo(resh[c]->ai_addr, resh[c]->ai_addrlen, adr_buf, 
-                               INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+                               sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
 
                int kodc;
                char *hostname = addrinfo_to_str(resh[c]);
@@ -187,9 +187,9 @@ on_wire (
                /* FIXME! Modus broadcast + adr. check -> bdr. pkt */
                set_li_vn_mode(x_pkt, LEAP_NOTINSYNC, 4, 3);
 
-               create_socket(&sock, (struct sockaddr_storage *)host->ai_addr);
+               create_socket(&sock, (sockaddr_u *)host->ai_addr);
 
-               sendpkt(sock, (struct sockaddr_storage *)host->ai_addr, x_pkt, LEN_PKT_NOMAC);
+               sendpkt(sock, (sockaddr_u *)host->ai_addr, x_pkt, LEN_PKT_NOMAC);
                rpktl = recvpkt(sock, r_pkt, x_pkt);
 
                close_socket(sock);
@@ -243,7 +243,7 @@ on_wire (
 
                        if(ENABLED_OPT(NORMALVERBOSE)) {
                                getnameinfo(host->ai_addr, host->ai_addrlen, adr_buf, 
-                                               INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+                                               sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
 
                                printf("sntp on_wire: Received %i bytes from %s\n", rpktl, adr_buf);
                        }
@@ -307,7 +307,7 @@ on_wire (
        }
 
        char logmsg[32 + INET6_ADDRSTRLEN];
-       getnameinfo(host->ai_addr, host->ai_addrlen, adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+       getnameinfo(host->ai_addr, host->ai_addrlen, adr_buf, sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
 
        snprintf(logmsg, 32 + INET6_ADDRSTRLEN, "Received no useable packet from %s!", adr_buf);
 
index 1fa641b47650e3e9809d89181bde80f30887d4e6..16e968deb6719900d462a7d4bdef3d4a5b0957c3 100644 (file)
@@ -79,7 +79,7 @@ resolve_hosts (
                        for(dres=*tres[a]; dres; dres=dres->ai_next) {
                                entryc++;
 #ifdef DEBUG   
-                               getnameinfo(dres->ai_addr, dres->ai_addrlen, adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+                               getnameinfo(dres->ai_addr, dres->ai_addrlen, adr_buf, sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
                                STDLINE
                                printf("Resolv No.: %i Result of getaddrinfo for %s:\n", entryc, hosts[a]);
                                printf("socktype: %i ", dres->ai_socktype); 
@@ -116,7 +116,7 @@ resolve_hosts (
 
 #ifdef DEBUG
        for(a=0; a<entryc; a++)
-               getnameinfo(result[a]->ai_addr, result[a]->ai_addrlen, adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+               getnameinfo(result[a]->ai_addr, result[a]->ai_addrlen, adr_buf, sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
 
                printf("%x: IP %s\n", (unsigned int) result[a], adr_buf); 
 #endif
@@ -133,34 +133,20 @@ resolve_hosts (
 void 
 create_socket (
                SOCKET *rsock,
-               struct sockaddr_storage *dest
+               sockaddr_u *dest
                )
 {
-       *rsock = socket(dest->ss_family, SOCK_DGRAM, 0);
+       *rsock = socket(AF(dest), SOCK_DGRAM, 0);
 
-       if(*rsock == -1)
-               if(ENABLED_OPT(NORMALVERBOSE))
-                       printf("Failed to create UDP socket with family %i\n", dest->ss_family);
-
-}
-
-/* If there's nothing more to do here we might need this function 
- * Originally I thought about doing some broad-/multicast related
- * cleaning up here. 
- */
-void 
-close_socket (
-               SOCKET rsock
-               )
-{
-       close(rsock);
+       if (-1 == *rsock && ENABLED_OPT(NORMALVERBOSE))
+               printf("Failed to create UDP socket with family %d\n", AF(dest));
 }
 
 /* Send a packet */
 void
 sendpkt (
        SOCKET rsock,
-       struct sockaddr_storage *dest,
+       sockaddr_u *dest,
        struct pkt *pkt,
        int len
        )
@@ -171,12 +157,12 @@ sendpkt (
 #endif
 
        if(ENABLED_OPT(NORMALVERBOSE)) {
-               getnameinfo((struct sockaddr *) dest, SOCKLEN(dest), adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
+               getnameinfo(&dest->sa, SOCKLEN(dest), adr_buf, sizeof(adr_buf), NULL, 0, NI_NUMERICHOST);
 
                printf("sntp sendpkt: Sending packet to %s... ", adr_buf);
        }
 
-       int cc = sendto(rsock, (char *)pkt, len, 0, (struct sockaddr *)dest, SOCKLEN(dest));
+       int cc = sendto(rsock, (char *)pkt, len, 0, &dest->sa, SOCKLEN(dest));
 
        if (cc == SOCKET_ERROR) {
 #ifdef DEBUG
@@ -197,34 +183,31 @@ sendpkt (
 int
 recvdata (
                SOCKET rsock,
-               struct sockaddr_storage *sender,
+               sockaddr_u *sender,
                char *rdata,
                int rdata_length
         )
 {
-       GETSOCKNAME_SOCKLEN_TYPE slen = SOCKLEN(&rsock);
+       GETSOCKNAME_SOCKLEN_TYPE slen;
+       int recvc;
+       int saved_errno;
 
 #ifdef DEBUG
        printf("sntp recvdata: Trying to receive data from...\n");
 #endif
-
-       int recvc = recvfrom(rsock, rdata, rdata_length, 0, 
-                       (struct sockaddr *) sender, &slen);
-#ifdef DEBUG
-       printf("sntp recvdata: recvfrom returned...\n");
-#endif
-
+       slen = sizeof(sender->sas);
+       recvc = recvfrom(rsock, rdata, rdata_length, 0, 
+                        &sender->sa, &slen);
 #ifdef DEBUG
-
-       if(recvc > 0) {
-               getnameinfo((struct sockaddr *)sender, SOCKLEN(sender), adr_buf, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
-
-               printf("Received %i bytes from %s:\n", recvc, adr_buf);
+       if (recvc > 0) {
+               printf("Received %d bytes from %s:\n", recvc, stoa(sender));
 
                pkt_output((struct pkt *) rdata, recvc, stdout);
        }
        else {
-               printf("Failure, recvc: %i\n", recvc);
+               saved_errno = errno;
+               printf("recvfrom error %d (%s)\n", errno, strerror(errno));
+               errno = saved_errno;
        }
 #endif
 
@@ -238,8 +221,8 @@ recv_bcst_data (
                SOCKET rsock,
                char *rdata,
                int rdata_len,
-               struct sockaddr_storage *sas,
-               struct sockaddr_storage *ras
+               sockaddr_u *sas,
+               sockaddr_u *ras
         )
 {
        struct timeval timeout_tv;
@@ -251,10 +234,13 @@ recv_bcst_data (
         
        setsockopt(rsock, SOL_SOCKET, SO_REUSEADDR, &btrue, sizeof(btrue));
 
-       if(sas->ss_family == AF_INET) {
+       if (IS_IPV4(sas)) {
                struct ip_mreq mdevadr;
        
-               if(bind(rsock, (struct sockaddr *) sas, SOCKLEN(sas)) < 0) {}
+               if (bind(rsock, &sas->sa, SOCKLEN(sas)) < 0) {
+                       if (ENABLED_OPT(NORMALVERBOSE))
+                               printf("sntp recv_bcst_data: Couldn't bind() address.\n");
+               }
 
 
                if(setsockopt(rsock, IPPROTO_IP, IP_MULTICAST_LOOP, &btrue, sizeof(btrue)) < 0) {
@@ -262,23 +248,20 @@ recv_bcst_data (
                        return BROADCAST_FAILED;
                }
 
-               buf = ss_to_str(sas);
-
-               mdevadr.imr_multiaddr.s_addr = inet_addr(buf); 
+               mdevadr.imr_multiaddr.s_addr = NSRCADR(sas); 
                mdevadr.imr_interface.s_addr = htonl(INADDR_ANY);
 
-               if(mdevadr.imr_multiaddr.s_addr == -1) {
-                       if(ENABLED_OPT(NORMALVERBOSE)) {
-                               printf("sntp recv_bcst_data: %s is not a broad-/multicast address, aborting...\n", buf);
+               if (mdevadr.imr_multiaddr.s_addr == -1) {
+                       if (ENABLED_OPT(NORMALVERBOSE)) {
+                               printf("sntp recv_bcst_data: %s is not a broad-/multicast address, aborting...\n",
+                                      stoa(sas));
                        }
                        
                        return BROADCAST_FAILED;
                }
 
-               free(buf);
-
                if (setsockopt(rsock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mdevadr, sizeof(mdevadr)) < 0) {
-                       if(ENABLED_OPT(NORMALVERBOSE)) {
+                       if (ENABLED_OPT(NORMALVERBOSE)) {
                                buf = ss_to_str(sas);
 
                                printf("sntp recv_bcst_data: Couldn't add IP membership for %s\n", buf);
@@ -289,24 +272,24 @@ recv_bcst_data (
                        }
                }
        }
-       else if(sas->ss_family == AF_INET6) {
+       else if (IS_IPV6(sas)) {
                struct ipv6_mreq mdevadr;
 
-               if(bind(rsock, (struct sockaddr *) sas, sizeof(sas)) < 0) {
-                       if(ENABLED_OPT(NORMALVERBOSE))
+               if (bind(rsock, &sas->sa, SOCKLEN(sas)) < 0) {
+                       if (ENABLED_OPT(NORMALVERBOSE))
                                printf("sntp recv_bcst_data: Couldn't bind() address.\n");
                }
 
                if(setsockopt(rsock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &btrue, sizeof (btrue)) < 0) {
                        /* some error message regarding setting up multicast loop */
                        return BROADCAST_FAILED;
-           }
+               }
 
-               mdevadr.ipv6mr_multiaddr = *((struct in6_addr *) sas);
+               mdevadr.ipv6mr_multiaddr = SOCK_ADDR6(sas);
                /* FIXME    hat value for ipv6mr_interface?  Use utilities for sock to char op*/
                /* mdevadr.ipv6mr_interface = in6addr_any; */ 
                                                                                                                 
-               if(!IN6_IS_ADDR_MULTICAST((struct in6_addr *) &mdevadr.ipv6mr_multiaddr)) {
+               if(!IN6_IS_ADDR_MULTICAST(&mdevadr.ipv6mr_multiaddr)) {
                        if(ENABLED_OPT(NORMALVERBOSE)) {
                                buf = ss_to_str(sas); 
 
@@ -356,22 +339,24 @@ recv_bcst_data (
                        return BROADCAST_FAILED;
                        break;
 
-/*             default: */
-                       GETSOCKNAME_SOCKLEN_TYPE ss_len = SOCKLEN(ras);
+               default:
+               {
+                       GETSOCKNAME_SOCKLEN_TYPE ss_len = sizeof(ras->sas);
 
-                       recv_bytes = recvfrom(rsock, rdata, rdata_len, 0, (struct sockaddr *) ras, (GETSOCKNAME_SOCKLEN_TYPE *) &ss_len);
+                       recv_bytes = recvfrom(rsock, rdata, rdata_len, 0, &ras->sa, &ss_len);
+               }
        }
 
-       if(recv_bytes == -1) {
+       if (recv_bytes == -1) {
                if(ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recv_bcst_data: Failed to receive from broad-/multicast\n");
 
                return BROADCAST_FAILED;
        }
 
-       if(sas->ss_family == AF_INET
+       if (IS_IPV4(sas)
                setsockopt(rsock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &btrue, sizeof(btrue));
-       else if(sas->ss_family == AF_INET6)
+       else if (IS_IPV6(sas))
                setsockopt(rsock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &btrue, sizeof(btrue));
                
        return recv_bytes;
@@ -381,23 +366,23 @@ int
 recv_bcst_pkt (
                SOCKET rsock,
                struct pkt *rpkt,
-               struct sockaddr_storage *sas
+               sockaddr_u *sas
                )
 {
-       struct sockaddr_storage sender;
+       sockaddr_u sender;
        register int a;
        int is_authentic, has_mac = 0, orig_pkt_len;
 
-       char *rdata = (char *) malloc(sizeof(char) * 256);
+       char *rdata = malloc(sizeof(char) * 256);
 
        int pkt_len = recv_bcst_data(rsock, rdata, 256, sas, &sender);
 
 
-       if(pkt_len < 0)
+       if (pkt_len < 0)
                return BROADCAST_FAILED;
 
        /* No MAC, no authentication */
-       if(pkt_len == LEN_PKT_NOMAC)
+       if (LEN_PKT_NOMAC == pkt_len)
                has_mac = 0;
 
        /* If there's more than just the NTP packet it should be a MAC */       
@@ -412,7 +397,7 @@ recv_bcst_pkt (
        /* Packet too big */
        if(pkt_len > LEN_PKT_NOMAC + MAX_MAC_LEN) {
                if(ENABLED_OPT(NORMALVERBOSE))
-                       printf("sntp recv_bcst_pkt: Received packet is too big (%i bytes), trying again to get a useable packet\n", 
+                       printf("sntp recv_bcst_pkt: Received packet is too big (%i bytes), trying again to get a useFable packet\n", 
                                        pkt_len);
 
                return PACKET_UNUSEABLE;
@@ -422,8 +407,8 @@ recv_bcst_pkt (
        pkt_len = min(pkt_len, sizeof(struct pkt));
 
        /* Let's copy the received data to the packet structure */
-       for(a=0; a<pkt_len; a++) 
-               if(a < orig_pkt_len)
+       for (a = 0; a < pkt_len; a++) 
+               if (a < orig_pkt_len)
                        ((char *)rpkt)[a] = rdata[a];
                else
                        ((char *)rpkt)[a] = 0;
@@ -431,13 +416,13 @@ recv_bcst_pkt (
        free(rdata);
 
        /* MAC could be useable for us */
-       if(has_mac) {
+       if (has_mac) {
                /* Two more things that the MAC must conform to */
-               if(has_mac > MAX_MAC_LEN || has_mac % 4 != 0) {
+               if (has_mac > MAX_MAC_LEN || has_mac % 4 != 0) {
                        is_authentic = 0; /* Or should we discard this packet? */
                }
                else  {
-                       if(has_mac == MAX_MAC_LEN) {
+                       if (MAX_MAC_LEN == has_mac) {
                                struct key *pkt_key = NULL;
 
                                /* Look for the key used by the server in the specified keyfile
@@ -445,13 +430,13 @@ recv_bcst_pkt (
                                get_key(rpkt->mac[0], &pkt_key);
 
                                /* Seems like we've got a key with matching keyid */
-                               if(pkt_key != NULL) {
+                               if (pkt_key != NULL) {
                                        /* Generate a md5sum of the packet with the key from our keyfile
                                         * and compare those md5sums */
-                                       if(!auth_md5((char *) rpkt, has_mac, pkt_key)) {
-                                               if(ENABLED_OPT(AUTHENTICATION)) {
+                                       if (!auth_md5((char *) rpkt, has_mac, pkt_key)) {
+                                               if (ENABLED_OPT(AUTHENTICATION)) {
                                                        /* We want a authenticated packet */
-                                                       if(ENABLED_OPT(NORMALVERBOSE)) {
+                                                       if (ENABLED_OPT(NORMALVERBOSE)) {
                                                                char *hostname = ss_to_str(sas);
                                                                printf("sntp recv_bcst_pkt: Broadcast packet received from %s is not authentic. Will discard this packet.\n", 
                                                                                hostname);
@@ -463,7 +448,7 @@ recv_bcst_pkt (
                                                else {
                                                        /* We don't know if the user wanted authentication so let's 
                                                         * use it anyways */
-                                                       if(ENABLED_OPT(NORMALVERBOSE)) {
+                                                       if (ENABLED_OPT(NORMALVERBOSE)) {
                                                                char *hostname = ss_to_str(sas);
                                                                printf("sntp recv_bcst_pkt: Broadcast packet received from %s is not authentic. Authentication not enforced.\n", 
                                                                                hostname);
@@ -476,7 +461,7 @@ recv_bcst_pkt (
                                        }
                                        else {
                                                /* Yay! Things worked out! */
-                                               if(ENABLED_OPT(NORMALVERBOSE)) {
+                                               if (ENABLED_OPT(NORMALVERBOSE)) {
                                                        char *hostname = ss_to_str(sas);
                                                        printf("sntp recv_bcst_pkt: Broadcast packet received from %s successfully authenticated using key id %i.\n", 
                                                                        hostname, rpkt->mac[0]);
@@ -492,9 +477,9 @@ recv_bcst_pkt (
        }
 
        /* Check for server's ntp version */
-       if(PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
+       if (PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
                PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) {
-               if(ENABLED_OPT(NORMALVERBOSE))
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recv_bcst_pkt: Packet shows wrong version (%i)\n", 
                                        PKT_VERSION(rpkt->li_vn_mode));
 
@@ -502,30 +487,30 @@ recv_bcst_pkt (
        } 
 
        /* We want a server to sync with */
-       if(PKT_MODE(rpkt->li_vn_mode) != MODE_BROADCAST
+       if (PKT_MODE(rpkt->li_vn_mode) != MODE_BROADCAST
                 && PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) {
-               if(ENABLED_OPT(NORMALVERBOSE))
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recv_bcst_pkt: mode %d stratum %i\n",
                           PKT_MODE(rpkt->li_vn_mode), rpkt->stratum);
 
                return SERVER_UNUSEABLE;
        }
 
-       if(rpkt->stratum == STRATUM_PKT_UNSPEC) {
-               if(ENABLED_OPT(NORMALVERBOSE))
+       if (STRATUM_PKT_UNSPEC == rpkt->stratum) {
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recv_bcst_pkt: Stratum unspecified, going to check for KOD (stratum: %i)\n", rpkt->stratum);
 
                char *ref_char = (char *) &rpkt->refid;
                
                /* If it's a KOD packet we'll just use the KOD information */
-               if(ref_char[0] != 'X') {
-                       if(strncmp(ref_char, "DENY", 4))
+               if (ref_char[0] != 'X') {
+                       if (strncmp(ref_char, "DENY", 4))
                                return KOD_DEMOBILIZE;
 
-                       if(strncmp(ref_char, "RSTR", 4))
+                       if (strncmp(ref_char, "RSTR", 4))
                                return KOD_DEMOBILIZE;
 
-                       if(strncmp(ref_char, "RATE", 4))
+                       if (strncmp(ref_char, "RATE", 4))
                                return KOD_RATE;
 
                        /* There are other interesting kiss codes which might be interesting for authentication */
@@ -533,8 +518,8 @@ recv_bcst_pkt (
        }
 
        /* If the server is not synced it's not really useable for us */
-       if(PKT_LEAP(rpkt->li_vn_mode) == LEAP_NOTINSYNC) {
-               if(ENABLED_OPT(NORMALVERBOSE)) 
+       if (LEAP_NOTINSYNC == PKT_LEAP(rpkt->li_vn_mode)) {
+               if (ENABLED_OPT(NORMALVERBOSE)) 
                        printf("recv_bcst_pkt: Server not in sync, skipping this server\n");
 
                return SERVER_UNUSEABLE;
@@ -555,44 +540,46 @@ recvpkt (
                struct pkt *spkt
        )
 {
-       struct sockaddr_storage sender;
-       char *rdata, done;
+       sockaddr_u sender;
+       char *rdata /* , done */;
 
        register int a;
        int has_mac, is_authentic, orig_pkt_len;
 
 
        /* Much space, just to be sure */
-       rdata = (char *) malloc(sizeof(char) * 256);
+       rdata = malloc(sizeof(char) * 256);
 
        int pkt_len = recvdata(rsock, &sender, rdata, 256);
 
-       if(!done) {
+#if 0  /* done uninitialized */
+       if (!done) {
                /* Do something about it, first check for a maximum length of ntp packets,
                 * probably that's something we can avoid 
                 */
        }
+#endif
        
        /* Some checks to see if that packet is intended for us */
 
        /* No MAC, no authentication */
-       if(pkt_len == LEN_PKT_NOMAC)
+       if (LEN_PKT_NOMAC == pkt_len)
                has_mac = 0;
 
        /* If there's more than just the NTP packet it should be a MAC */       
-       else if(pkt_len > LEN_PKT_NOMAC) 
+       else if (pkt_len > LEN_PKT_NOMAC) 
                has_mac = pkt_len - LEN_PKT_NOMAC;
        
        else {
-               if(ENABLED_OPT(NORMALVERBOSE))
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recvpkt: Funny packet length: %i. Discarding package.\n", pkt_len);
 
                        return PACKET_UNUSEABLE;
        }
 
        /* Packet too big */
-       if(pkt_len > LEN_PKT_MAC) {
-               if(ENABLED_OPT(NORMALVERBOSE))
+       if (pkt_len > LEN_PKT_MAC) {
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recvpkt: Received packet is too big (%i bytes), trying again to get a useable packet\n", 
                                        pkt_len);
 
@@ -602,21 +589,21 @@ recvpkt (
        orig_pkt_len = pkt_len;
        pkt_len = min(pkt_len, sizeof(struct pkt));
        
-       for(a=0; a<pkt_len; a++) 
+       for (a = 0; a < pkt_len; a++) 
                /* FIXME! */
-               if(a < orig_pkt_len)
+               if (a < orig_pkt_len)
                        ((char *) rpkt)[a] = rdata[a];
                else
                        ((char *) rpkt)[a] = 0;
 
        /* MAC could be useable for us */
-       if(has_mac) {
+       if (has_mac) {
                /* Two more things that the MAC must conform to */
                if(has_mac > MAX_MAC_LEN || has_mac % 4 != 0) {
                        is_authentic = 0; /* Or should we discard this packet? */
                }
-               else  {
-                       if(has_mac == MAX_MAC_LEN) {
+               else {
+                       if (MAX_MAC_LEN == has_mac) {
                                struct key *pkt_key = NULL;
                                
                                /*
@@ -626,15 +613,15 @@ recvpkt (
                                get_key(rpkt->mac[0], &pkt_key);
 
                                /* Seems like we've got a key with matching keyid */
-                               if(pkt_key != NULL) {
+                               if (pkt_key != NULL) {
                                        /*
                                         * Generate a md5sum of the packet with the key from our keyfile
                                         * and compare those md5sums 
                                         */
-                                       if(!auth_md5((char *) rpkt, has_mac, pkt_key)) {
-                                               if(ENABLED_OPT(AUTHENTICATION)) {
+                                       if (!auth_md5((char *) rpkt, has_mac, pkt_key)) {
+                                               if (ENABLED_OPT(AUTHENTICATION)) {
                                                        /* We want a authenticated packet */
-                                                       if(ENABLED_OPT(NORMALVERBOSE)) {
+                                                       if (ENABLED_OPT(NORMALVERBOSE)) {
                                                                char *hostname = ss_to_str(&sender);
                                                                printf("sntp recvpkt: Broadcast packet received from %s is not authentic. Will discard this packet.\n", 
                                                                                hostname);
@@ -648,7 +635,7 @@ recvpkt (
                                                         * We don't know if the user wanted authentication so let's 
                                                         * use it anyways 
                                                         */
-                                                       if(ENABLED_OPT(NORMALVERBOSE)) {
+                                                       if (ENABLED_OPT(NORMALVERBOSE)) {
                                                                char *hostname = ss_to_str(&sender);
                                                                printf("sntp recvpkt: Broadcast packet received from %s is not authentic. Authentication not enforced.\n", 
                                                                                hostname);
@@ -661,7 +648,7 @@ recvpkt (
                                        }
                                        else {
                                                /* Yay! Things worked out! */
-                                               if(ENABLED_OPT(NORMALVERBOSE)) {
+                                               if (ENABLED_OPT(NORMALVERBOSE)) {
                                                        char *hostname = ss_to_str(&sender);
                                                        printf("sntp recvpkt: Broadcast packet received from %s successfully authenticated using key id %i.\n", 
                                                                        hostname, rpkt->mac[0]);
@@ -677,18 +664,18 @@ recvpkt (
        }
 
        /* Check for server's ntp version */
-       if(PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
-               PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) {
-               if(ENABLED_OPT(NORMALVERBOSE))
+       if (PKT_VERSION(rpkt->li_vn_mode) < NTP_OLDVERSION ||
+           PKT_VERSION(rpkt->li_vn_mode) > NTP_VERSION) {
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recvpkt: Packet got wrong version (%i)\n", PKT_VERSION(rpkt->li_vn_mode));
 
                return SERVER_UNUSEABLE;
        } 
 
        /* We want a server to sync with */
-       if(PKT_MODE(rpkt->li_vn_mode) != MODE_SERVER
-                && PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) {
-               if(ENABLED_OPT(NORMALVERBOSE))
+       if (PKT_MODE(rpkt->li_vn_mode) != MODE_SERVER &&
+           PKT_MODE(rpkt->li_vn_mode) != MODE_PASSIVE) {
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recvpkt: mode %d stratum %i\n",
                           PKT_MODE(rpkt->li_vn_mode), rpkt->stratum);
 
@@ -696,25 +683,25 @@ recvpkt (
        }
 
        /* Stratum is unspecified (0) check what's going on */
-       if(rpkt->stratum == STRATUM_PKT_UNSPEC) {
-               if(ENABLED_OPT(NORMALVERBOSE))
+       if (STRATUM_PKT_UNSPEC == rpkt->stratum) {
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recvpkt: Stratum unspecified, going to check for KOD (stratum: %i)\n", rpkt->stratum);
 
 
                char *ref_char = (char *) &rpkt->refid;
 
-               if(ENABLED_OPT(NORMALVERBOSE)) 
+               if (ENABLED_OPT(NORMALVERBOSE)) 
                        printf("sntp recvpkt: Packet refid: %c%c%c%c\n", ref_char[0], ref_char[1], ref_char[2], ref_char[3]);
                
                /* If it's a KOD packet we'll just use the KOD information */
-               if(ref_char[0] != 'X') {
-                       if(!strncmp(ref_char, "DENY", 4))
+               if (ref_char[0] != 'X') {
+                       if (!strncmp(ref_char, "DENY", 4))
                                return KOD_DEMOBILIZE;
 
-                       if(!strncmp(ref_char, "RSTR", 4))
+                       if (!strncmp(ref_char, "RSTR", 4))
                                return KOD_DEMOBILIZE;
 
-                       if(!strncmp(ref_char, "RATE", 4))
+                       if (!strncmp(ref_char, "RATE", 4))
                                return KOD_RATE;
 
                        /* There are other interesting kiss codes which might be interesting for authentication */
@@ -722,8 +709,8 @@ recvpkt (
        }
 
        /* If the server is not synced it's not really useable for us */
-       if(PKT_LEAP(rpkt->li_vn_mode) == LEAP_NOTINSYNC) {
-               if(ENABLED_OPT(NORMALVERBOSE)) 
+       if (LEAP_NOTINSYNC == PKT_LEAP(rpkt->li_vn_mode)) {
+               if (ENABLED_OPT(NORMALVERBOSE)) 
                        printf("sntp recvpkt: Server not in sync, skipping this server\n");
 
                return SERVER_UNUSEABLE;
@@ -742,7 +729,7 @@ recvpkt (
 #endif
        
        if (!L_ISEQU(&rpkt->org, &spkt->xmt)) {
-               if(ENABLED_OPT(NORMALVERBOSE))
+               if (ENABLED_OPT(NORMALVERBOSE))
                        printf("sntp recvpkt: pkt.org and peer.xmt differ\n");
                
                return PACKET_UNUSEABLE;
@@ -763,14 +750,14 @@ is_reachable (
 
        sockfd = socket(dst->ai_family, SOCK_DGRAM, 0);
 
-       if (sockfd == -1) {
+       if (-1 == sockfd) {
 #ifdef DEBUG
                printf("is_reachable: Couldn't create socket\n");
 #endif
                return 0;
        }
 
-       if(connect(sockfd, dst->ai_addr, SOCKLEN(dst->ai_addr))) {
+       if (connect(sockfd, dst->ai_addr, SOCKLEN((sockaddr_u *)dst->ai_addr))) {
                closesocket(sockfd);
                return 0;
        }
index 8605ab204f71e8df56616843114aced6fa3630df..b453e771516b5620d772739f19c54f697d8e9651 100644 (file)
@@ -54,24 +54,22 @@ int is_reachable (struct addrinfo *dst);
 
 int resolve_hosts (char **hosts, int hostc, struct addrinfo **res, int pref_family);
 
-void create_socket (SOCKET *rsock, struct sockaddr_storage *dest);
+void create_socket (SOCKET *rsock, sockaddr_u *dest);
 
-void close_socket (SOCKET rsock);
+void sendpkt (SOCKET rsock, sockaddr_u *dest, struct pkt *pkt, int len);
 
-void sendpkt (SOCKET rsock, struct sockaddr_storage *dest, struct pkt *pkt, int len);
-
-int recvdata (SOCKET rsock, struct sockaddr_storage *sender, char *rdata, int rdata_len);
+int recvdata (SOCKET rsock, sockaddr_u *sender, char *rdata, int rdata_len);
 
 int recvpkt (SOCKET rsock, struct pkt *rpkt, struct pkt *spkt);
 
-int recv_bcst_data (SOCKET rsock, char *rdata, int rdata_len, struct sockaddr_storage *sas, struct sockaddr_storage *ras);
+int recv_bcst_data (SOCKET rsock, char *rdata, int rdata_len, sockaddr_u *sas, sockaddr_u *ras);
 
-int recv_bcst_pkt (SOCKET rsock, struct pkt *rpkt, struct sockaddr_storage *sas);
+int recv_bcst_pkt (SOCKET rsock, struct pkt *rpkt, sockaddr_u *sas);
 
 /* Shortened peer structure. Not absolutely necessary yet */
 struct speer {
        struct speer *next;
-       struct sockaddr_storage srcadr;
+       sockaddr_u srcadr;
        u_char version;
        u_char hmode;
        u_char hpoll;
index d6942c56db3101904c8226e85abdbe38bee593c8..74a830f235199687693246283654798529315896 100644 (file)
@@ -141,17 +141,19 @@ addrinfo_to_str (
        return buf;
 }
 
-/* Convert a struct sockaddr_storage to a string containing the address in
+/* Convert a sockaddr_u to a string containing the address in
  * style of inet_ntoa
+ * Why not switch callers to use stoa from libntp?  No free() needed
+ * in that case.
  */
 char *
 ss_to_str (
-               struct sockaddr_storage *saddr
+               sockaddr_u *saddr
                )
 {
        char *buf = (char *) malloc(sizeof(char) * INET6_ADDRSTRLEN);
 
-       getnameinfo((struct sockaddr *) saddr, SOCKLEN(saddr), buf,
+       getnameinfo(&saddr->sa, SOCKLEN(saddr), buf,
                        INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
 
 
index 8d9575f6314f9c7cc47a889b1a792188fc7acb59..78962f4032ae48190496103a8509e97ac60a778e 100644 (file)
@@ -52,7 +52,7 @@ void l_fp_output_bin (l_fp *ts, FILE *output);
 void l_fp_output_dec (l_fp *ts, FILE *output);
 
 char *addrinfo_to_str (struct addrinfo *addr);
-char *ss_to_str (struct sockaddr_storage *saddr);
+char *ss_to_str (sockaddr_u *saddr);
 char *tv_to_str (struct timeval *tv);
 
 #endif
index 6540fa82aadd4c738bddfd71da38fe050c3e1546..6c4052b7f049ede1b29b5a860781531367969081 100644 (file)
@@ -4,15 +4,15 @@
 #include "ntp_refclock.h"
 
 #if defined(HAVE_SIGNALED_IO)
-extern void                    block_sigio     (void);
-extern void                    unblock_sigio   (void);
-extern int                     init_clock_sig  (struct refclockio *);
-extern void                    init_socket_sig (int);
-extern void                    set_signal              (void);
-RETSIGTYPE     sigio_handler   (int);
+extern void            block_sigio     (void);
+extern void            unblock_sigio   (void);
+extern int             init_clock_sig  (struct refclockio *);
+extern void            init_socket_sig (int);
+extern void            set_signal      (void);
+RETSIGTYPE             sigio_handler   (int);
 
-# define BLOCKIO()      ((void) block_sigio())
-# define UNBLOCKIO() ((void) unblock_sigio())
+# define BLOCKIO()     block_sigio()
+# define UNBLOCKIO()   unblock_sigio()
 
 #else
 
index 333a1d2163762dc9f709b53b7aa6d0da76b0f8a6..6872d3eb94c632eac67d3e8da5de05061c5c2d63 100644 (file)
@@ -169,6 +169,7 @@ typedef char s_char;
 
 #define        EVENT_TIMEOUT   0       /* one second, that is */
 
+
 /*
  * The interface structure is used to hold the addresses and socket
  * numbers of each of the interfaces we are using.
@@ -176,27 +177,27 @@ typedef char s_char;
 struct interface {
        SOCKET fd;                      /* socket this is opened on */
        SOCKET bfd;                     /* socket for receiving broadcasts */
-       struct sockaddr_storage sin;    /* interface address */
-       struct sockaddr_storage bcast;  /* broadcast address */
-       struct sockaddr_storage mask;   /* interface mask */
+       sockaddr_u sin;                 /* interface address */
+       sockaddr_u bcast;               /* broadcast address */
+       sockaddr_u mask;                /* interface mask */
        char name[32];                  /* name of interface */
-       short  family;                  /* Address family */
+       u_short family;                 /* Address family */
+       u_short phase;                  /* phase in update cycle */
        int flags;                      /* interface flags */
        int last_ttl;                   /* last TTL specified */
        u_int32 addr_refid;             /* IPv4 addr or IPv6 hash */
        int num_mcast;                  /* No. of IP addresses in multicast socket */
-       u_long starttime;               /* current_time as of creation of interface structure */
+       u_long starttime;               /* current_time as of creation of interface structure */
        volatile long received;         /* number of incoming packets */
        long sent;                      /* number of outgoing packets */
        long notsent;                   /* number of send failures */
        u_int scopeid;                  /* Scope used for Multicasting */
        u_int ifindex;                  /* interface index */
-       u_int ifnum;                    /* sequential interface instance count */
-        u_char phase;                  /* phase in update cycle */
-       isc_boolean_t ignore_packets;   /* Specify whether the packet should be ignored */
-        ISC_LIST(struct peer) peers;    /* list of peers for the interface */
-        u_int peercnt;                 /* number of peers referencinf this interface - informational only */
-        ISC_LINK(struct interface) link;     /* interface list */
+       u_int ifnum;                    /* sequential interface instance count */
+       isc_boolean_t ignore_packets;   /* listen-read-drop this? */
+       ISC_LIST(struct peer) peers;    /* list of peers for the interface */
+       u_int peercnt;                  /* peers referencing this interface */
+       ISC_LINK(struct interface) link;/* interface list */
 };
 
 /*
@@ -247,9 +248,9 @@ struct interface {
 struct peer {
        struct peer *next;      /* pointer to next association */
        struct peer *ass_next;  /* link pointer in associd hash */
-       struct sockaddr_storage srcadr; /* address of remote host */
-       struct interface *dstadr; /* pointer to address on local host */
-        ISC_LINK(struct peer) ilink; /* interface link list */
+       sockaddr_u srcadr;      /* address of remote host */
+       struct interface *dstadr; /* local address (interface) */
+       ISC_LINK(struct peer) ilink; /* peers using this interface */
        associd_t associd;      /* association ID */
        u_char  version;        /* version number */
        u_char  hmode;          /* local association mode */
@@ -520,93 +521,6 @@ struct peer {
 #define REFCLK_NEOCLOCK4X      44      /* NeoClock4X DCF77 or TDF receiver */
 #define REFCLK_MAX             44      /* NeoClock4X DCF77 or TDF receiver */
 
- /*
- * Macro for sockaddr_storage structures operations
- */
-#ifdef ISC_PLATFORM_HAVESCOPEID
-#define SOCKSCOPE(sock1, sock2) (((struct sockaddr_in6 *)sock1)->sin6_scope_id == ((struct sockaddr_in6 *)sock2)->sin6_scope_id)
-#else
-#define SOCKSCOPE(sock1, sock2) 1
-#endif
-
-#define SOCKCMP(sock1, sock2) \
-       (((struct sockaddr_storage *)sock1)->ss_family \
-        == ((struct sockaddr_storage *)sock2)->ss_family \
-               ? (((struct sockaddr_storage *)sock1)->ss_family == AF_INET \
-                       ? (memcmp(&((struct sockaddr_in *)sock1)->sin_addr, \
-                                 &((struct sockaddr_in *)sock2)->sin_addr, \
-                                 sizeof(struct in_addr)) == 0) \
-                       : (memcmp(&((struct sockaddr_in6 *)sock1)->sin6_addr, \
-                                 &((struct sockaddr_in6 *)sock2)->sin6_addr, \
-                                 sizeof(struct in6_addr)) == 0) \
-                         && SOCKSCOPE(sock1, sock2)) \
-               : 0)
-
-#define SOCKNUL(sock1) \
-       (((struct sockaddr_storage *)sock1)->ss_family == AF_INET ? \
-       (((struct sockaddr_in *)sock1)->sin_addr.s_addr == 0) : \
-       (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)sock1)->sin6_addr)))
-
-#define SOCKLEN(sock) \
-       (((struct sockaddr_storage *)sock)->ss_family == AF_INET ? \
-       (sizeof(struct sockaddr_in)) : (sizeof(struct sockaddr_in6)))
-
-#define ANYSOCK(sock) \
-       memset(((struct sockaddr_storage *)sock), 0, \
-           sizeof(struct sockaddr_storage))
-
-#define ANY_INTERFACE_CHOOSE(sock) \
-       (((struct sockaddr_storage *)sock)->ss_family == AF_INET ? \
-       any_interface : any6_interface)
-
-/*
- * We tell reference clocks from real peers by giving the reference
- * clocks an address of the form 127.127.t.u, where t is the type and
- * u is the unit number.  We define some of this here since we will need
- * some sanity checks to make sure this address isn't interpretted as
- * that of a normal peer.
- */
-#define        REFCLOCK_ADDR   0x7f7f0000      /* 127.127.0.0 */
-#define        REFCLOCK_MASK   0xffff0000      /* 255.255.0.0 */
-
-#define        ISREFCLOCKADR(srcadr)   ((SRCADR(srcadr) & REFCLOCK_MASK) \
-                                       == REFCLOCK_ADDR)
-
-/*
- * Macro for checking for invalid addresses.  This is really, really
- * gross, but is needed so no one configures a host on net 127 now that
- * we're encouraging it the the configuration file.
- */
-#define        LOOPBACKADR     0x7f000001
-#define        LOOPNETMASK     0xff000000
-
-#define        ISBADADR(srcadr)        (((SRCADR(srcadr) & LOOPNETMASK) \
-                                   == (LOOPBACKADR & LOOPNETMASK)) \
-                                   && (SRCADR(srcadr) != LOOPBACKADR))
-
-/*
- * Utilities for manipulating addresses and port numbers
- */
-#define        NSRCADR(src)    (((struct sockaddr_in *)src)->sin_addr.s_addr) /* address in net byte order */
-#define        NSRCPORT(src)   (((struct sockaddr_in *)src)->sin_port) /* port in net byte order */
-#define        SRCADR(src)     (ntohl(NSRCADR((src)))) /* address in host byte order */
-#define        SRCPORT(src)    (ntohs(NSRCPORT((src))))        /* host port */
-
-#define CAST_V4(src)   ((struct sockaddr_in *)&(src))
-#define CAST_V6(src)   ((struct sockaddr_in6 *)&(src))
-#define GET_INADDR(src)  (CAST_V4(src)->sin_addr.s_addr)
-#define GET_INADDR6(src) (CAST_V6(src)->sin6_addr)
-
-#define SET_HOSTMASK(addr, family)     \
-       do { \
-               memset((char *)(addr), 0, sizeof(struct sockaddr_storage)); \
-               (addr)->ss_family = (family); \
-               if ((family) == AF_INET) \
-                       GET_INADDR(*(addr)) = 0xffffffff; \
-               else \
-                       memset(&GET_INADDR6(*(addr)), 0xff, \
-                           sizeof(struct in6_addr)); \
-       } while(0)
 
 /*
  * NTP packet format.  The mac field is optional.  It isn't really
@@ -831,7 +745,7 @@ struct mon_data {
        int     count;                  /* total packet count */
        u_long  firsttime;              /* first time found */
        u_long  lasttime;               /* last time found */
-       struct sockaddr_storage rmtadr; /* address of remote host */
+       sockaddr_u rmtadr;              /* address of remote host */
        struct interface *interface;    /* interface on which this arrived */
        u_short rmtport;                /* remote port last came from */
        u_char  mode;                   /* packet mode */
index 32b9e8943a07b3876074a7a835036f0cda4c9584..7faac27076acc12de00176158800f39fbce8b132 100644 (file)
@@ -261,7 +261,7 @@ struct ntp_control {
  * ntp_request.c wants to see this.
  */
 struct ctl_trap {
-       struct sockaddr_storage tr_addr;/* address of trap recipient */
+       sockaddr_u tr_addr;             /* address of trap recipient */
        struct interface *tr_localaddr; /* interface to send this through */
        u_long tr_settime;              /* time trap was set */
        u_long tr_count;                /* async messages sent to this guy */
index 1f83d5a36f46d81d0664c2de3b47aa10b77fcc5d..63b0f5dfb4e2070d88685a789214cffcdd39f257 100644 (file)
@@ -355,19 +355,17 @@ extern    int     adj_systime     (double);
 
 extern struct tm * ntp2unix_tm (u_long ntp, int local);
 
-#define        lfptoa(_fpv, _ndec)     mfptoa((_fpv)->l_ui, (_fpv)->l_uf, (_ndec))
-#define        lfptoms(_fpv, _ndec)    mfptoms((_fpv)->l_ui, (_fpv)->l_uf, (_ndec))
-
-#define stoa(_sin)     socktoa((_sin))
-#define stohost(_sin)  socktohost((_sin))
-
-#define        ntoa(_sin)      stoa(_sin)
-#define        ntohost(_sin)   stohost(_sin)
-
-#define        ufptoa(_fpv, _ndec)     dofptoa((_fpv), 0, (_ndec), 0)
-#define        ufptoms(_fpv, _ndec)    dofptoa((_fpv), 0, (_ndec), 1)
-#define        ulfptoa(_fpv, _ndec)    dolfptoa((_fpv)->l_ui, (_fpv)->l_uf, 0, (_ndec), 0)
-#define        ulfptoms(_fpv, _ndec)   dolfptoa((_fpv)->l_ui, (_fpv)->l_uf, 0, (_ndec), 1)
-#define        umfptoa(_fpi, _fpf, _ndec) dolfptoa((_fpi), (_fpf), 0, (_ndec), 0)
+#define        lfptoa(fpv, ndec)       mfptoa((fpv)->l_ui, (fpv)->l_uf, (ndec))
+#define        lfptoms(fpv, ndec)      mfptoms((fpv)->l_ui, (fpv)->l_uf, (ndec))
+
+#define stoa(addr)             socktoa(addr)
+#define        ntoa(addr)              stoa(addr)
+#define stohost(addr)          socktohost(addr)
+
+#define        ufptoa(fpv, ndec)       dofptoa((fpv), 0, (ndec), 0)
+#define        ufptoms(fpv, ndec)      dofptoa((fpv), 0, (ndec), 1)
+#define        ulfptoa(fpv, ndec)      dolfptoa((fpv)->l_ui, (fpv)->l_uf, 0, (ndec), 0)
+#define        ulfptoms(fpv, ndec)     dolfptoa((fpv)->l_ui, (fpv)->l_uf, 0, (ndec), 1)
+#define        umfptoa(fpi, fpf, ndec) dolfptoa((fpi), (fpf), 0, (ndec), 0)
 
 #endif /* NTP_FP_H */
index 099c83effe9034cf9074442068ee5bded2ade8b7..0dbcbeed448301f7f67aece5b7de1cbd389edc83 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Define malloc and friends.
  */
-#ifndef  _ntp_malloc_h
-#define  _ntp_malloc_h
+#ifndef NTP_MALLOC_H
+#define NTP_MALLOC_H
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 
 #ifdef HAVE_STDLIB_H
 # include <stdlib.h>
-#else /* HAVE_STDLIB_H */
+#else
 # ifdef HAVE_MALLOC_H
 #  include <malloc.h>
 # endif
-#endif /* HAVE_STDLIB_H */
+#endif
 
-#endif /* _ntp_malloc_h */
+#endif /* NTP_MALLOC_H */
index 2eaf1615de57590e03f7858c519bcb7c7d01f1ce..5238816397ec9c163dd88123b1d170ad96054e42 100644 (file)
 
 #include "ntp_rfc2553.h"
 
+typedef union {
+       struct sockaddr         sa;
+       struct sockaddr_storage sas;
+       struct sockaddr_in      sa4;
+       struct sockaddr_in6     sa6;
+} sockaddr_u;
+
+/*
+ * Utilities for manipulating sockaddr_u v4/v6 unions
+ */
+#define SOCK_ADDR4(psau)       ((psau)->sa4.sin_addr)
+#define SOCK_ADDR6(psau)       ((psau)->sa6.sin6_addr)
+
+#define PSOCK_ADDR4(psau)      (&SOCK_ADDR4(psau))
+#define PSOCK_ADDR6(psau)      (&SOCK_ADDR6(psau))
+
+#define AF(psau)               ((psau)->sas.ss_family)
+
+#define IS_IPV4(psau)          (AF_INET == AF(psau))
+#define IS_IPV6(psau)          (AF_INET6 == AF(psau))
+
+/* sockaddr_u v4 address in network byte order */
+#define        NSRCADR(psau)           (SOCK_ADDR4(psau).s_addr)
+
+/* sockaddr_u v4 address in host byte order */
+#define        SRCADR(psau)            (ntohl(NSRCADR(psau)))
+
+/* sockaddr_u v6 address in network byte order */
+#define NSRCADR6(psau)         (SOCK_ADDR6(psau).s6_addr)
+
+/* assign sockaddr_u v4 address from host byte order */
+#define        SET_ADDR4(psau, addr4)  (NSRCADR(psau) = htonl(addr4))
+
+/* assign sockaddr_u v4 address from network byte order */
+#define SET_ADDR4N(psau, addr4n) (NSRCADR(psau) = (addr4n));
+
+/* assign sockaddr_u v6 address from network byte order */
+#define SET_ADDR6N(psau, s6_addr)                              \
+       (SOCK_ADDR6(psau) = (s6_addr))
+
+/* sockaddr_u v4/v6 port in network byte order */
+#define        NSRCPORT(psau)          ((psau)->sa4.sin_port)
+
+/* sockaddr_u v4/v6 port in host byte order */
+#define        SRCPORT(psau)           (ntohs(NSRCPORT(psau)))
+
+/* assign sockaddr_u v4/v6 port from host byte order */
+#define SET_PORT(psau, port)   (NSRCPORT(psau) = htons(port))
+
+/* sockaddr_u v6 scope */
+#define SCOPE_VAR(psau)                ((psau)->sa6.sin6_scope_id)
+
+#ifdef ISC_PLATFORM_HAVESCOPEID
+/* v4/v6 scope (always zero for v4) */
+# define SCOPE(psau)           (IS_IPV4(psau)                  \
+                                   ? 0                         \
+                                   : SCOPE_VAR(psau))
+
+/* are two v6 sockaddr_u scopes equal? */
+# define SCOPE_EQ(psau1, psau2)                                        \
+       (SCOPE_VAR(psau1) == SCOPE_VAR(psau2))
+
+/* assign scope if supported */
+# define SET_SCOPE(psau, s)                                    \
+       do                                                      \
+               if (IS_IPV6(psau))                              \
+                       SCOPE_VAR(psau) = (s);                  \
+       while (0)
+#else  /* ISC_PLATFORM_HAVESCOPEID not defined */
+# define SCOPE(psau)           (0)
+# define SCOPE_EQ(psau1, psau2)        (1)
+# define SET_SCOPE(psau, s)    do { } while (0)
+#endif /* ISC_PLATFORM_HAVESCOPEID */
+
+/* v4/v6 is multicast address */
+#define IS_MCAST(psau)                                         \
+       (IS_IPV4(psau)                                          \
+           ? IN_CLASSD(SRCADR(psau))                           \
+           : IN6_IS_ADDR_MULTICAST(PSOCK_ADDR6(psau)))
+
+#define SIZEOF_SOCKADDR(fam)                                   \
+       ((AF_INET == (fam))                                     \
+           ? sizeof(struct sockaddr_in)                        \
+           : sizeof(struct sockaddr_in6))
+
+#define SOCKLEN(psau)                                          \
+       (IS_IPV4(psau)                                          \
+           ? sizeof((psau)->sa4)                               \
+           : sizeof((psau)->sa6))
+
+#define ZERO_SOCK(psau)                                                \
+       memset(&(psau)->sas, 0, sizeof((psau)->sas))
+
+/* blast a byte value across sockaddr_u v6 address */
+#define        MEMSET_ADDR6(psau, v)                                   \
+       memset((void *)(psau)->sa6.sin6_addr.s6_addr, (v),      \
+               sizeof((psau)->sa6.sin6_addr.s6_addr))
+
+#define SET_ONESMASK(psau)                                     \
+       do {                                                    \
+               if (IS_IPV6(psau))                              \
+                       MEMSET_ADDR6((psau), 0xff);             \
+               else                                            \
+                       NSRCADR(psau) = 0xffffffff;             \
+       } while(0)
+
+/* zero sockaddr_u, fill in family and all-ones (host) mask */
+#define SET_HOSTMASK(psau, family)                             \
+       do {                                                    \
+               ZERO_SOCK(psau);                                \
+               AF(psau) = (family);                            \
+               SET_ONESMASK(psau);                             \
+       } while (0)
+
+/* compare a in6_addr with socket address */
+#if !defined(SYS_WINNT) || !defined(in_addr6)
+#define S_ADDR6_EQ(psau, my_in6_addr)                          \
+       (!memcmp(&(psau)->sa6.sin6_addr,                        \
+                (my_in6_addr),                                 \
+                sizeof((psau)->sa6.sin6_addr)))
+#else
+#define S_ADDR6_EQ(psau, my_in6_addr)                          \
+       IN6_ADDR_EQUAL(&(psau)->sa6.sin6_addr,                  \
+                      (my_in6_addr))
+#endif
+
+/* are two sockaddr_u's addresses equal? */
+#define SOCK_EQ(psau1, psau2)                                  \
+       ((AF(psau1) != AF(psau2))                               \
+            ? 0                                                \
+            : IS_IPV4(psau1)                                   \
+                  ? (NSRCADR(psau1) == NSRCADR(psau2))         \
+                  : (S_ADDR6_EQ((psau1), PSOCK_ADDR6(psau2))   \
+                     && SCOPE_EQ((psau1), (psau2))))
+
+/* is sockaddr_u address unspecified? */
+#define SOCK_UNSPEC(psau)                                      \
+       (IS_IPV4(psau)                                          \
+           ? !NSRCADR(psau)                                    \
+           : IN6_IS_ADDR_UNSPECIFIED(PSOCK_ADDR6(psau)))
+
+/* just how unspecified do you mean? (scope 0/unspec too) */
+#define SOCK_UNSPEC_S(psau)                                    \
+       (SOCK_UNSPEC(psau) && !SCOPE(psau))
+
+/* choose a default net interface (struct interface) for v4 or v6 */
+#define ANY_INTERFACE_BYFAM(family)                            \
+       ((AF_INET == family)                                    \
+            ? any_interface                                    \
+            : any6_interface)
+
+/* choose a default interface for addresses' protocol (addr family) */
+#define ANY_INTERFACE_CHOOSE(psau)                             \
+       ANY_INTERFACE_BYFAM(AF(psau))
+
+
+/*
+ * We tell reference clocks from real peers by giving the reference
+ * clocks an address of the form 127.127.t.u, where t is the type and
+ * u is the unit number.  We define some of this here since we will need
+ * some sanity checks to make sure this address isn't interpretted as
+ * that of a normal peer.
+ */
+#define        REFCLOCK_ADDR   0x7f7f0000      /* 127.127.0.0 */
+#define        REFCLOCK_MASK   0xffff0000      /* 255.255.0.0 */
+
+#ifdef REFCLOCK
+#define        ISREFCLOCKADR(srcadr)                                   \
+       (IS_IPV4(srcadr) &&                                     \
+        (SRCADR(srcadr) & REFCLOCK_MASK) == REFCLOCK_ADDR)
+#else
+#define ISREFCLOCKADR(srcadr)          (0)
+#endif
+
+/*
+ * Macro for checking for invalid addresses.  This is really, really
+ * gross, but is needed so no one configures a host on net 127 now that
+ * we're encouraging it the the configuration file.
+ */
+#define        LOOPBACKADR     0x7f000001
+#define        LOOPNETMASK     0xff000000
+
+#define        ISBADADR(srcadr)                                        \
+       (IS_IPV4(srcadr)                                        \
+        && ((SRCADR(srcadr) & LOOPNETMASK)                     \
+            == (LOOPBACKADR & LOOPNETMASK))                    \
+        && SRCADR(srcadr) != LOOPBACKADR)
+
+
 #endif /* NTP_NET_H */
index 5f58021d87cbc961beb7036b5bc074349eefedea..d98eb841c5a472029ec85a678b6857a1650849df 100644 (file)
@@ -253,9 +253,9 @@ extern      int     io_addclock     (struct refclockio *);
 extern void    io_closeclock   (struct refclockio *);
 
 #ifdef REFCLOCK
-extern void    refclock_buginfo (struct sockaddr_storage *,
+extern void    refclock_buginfo (sockaddr_u *,
                                    struct refclockbug *);
-extern void    refclock_control (struct sockaddr_storage *,
+extern void    refclock_control (sockaddr_u *,
                                    struct refclockstat *,
                                    struct refclockstat *);
 extern int     refclock_open   (char *, u_int, u_int);
index eda0d597a2cba28dafee95063453d3190bc548dc..78225bfc06653712ed5e5a2494067830235af51f 100644 (file)
@@ -2,8 +2,8 @@
  * ntp_request.h - definitions for the ntpd remote query facility
  */
 
-#ifndef _NTP_REQUEST_H
-#define _NTP_REQUEST_H
+#ifndef NTP_REQUEST_H
+#define NTP_REQUEST_H
 
 #include "ntp_types.h"
 #include "recvbuff.h"
@@ -668,7 +668,7 @@ struct conf_restrict {
 struct info_monitor_1 {        
        u_int32 lasttime;       /* last packet from this host */
        u_int32 firsttime;      /* first time we received a packet */
-       u_int32 lastdrop;        /* last time we rejected a packet due to client limitation policy */
+       u_int32 restr;          /* restrict bits (was named lastdrop) */
        u_int32 count;          /* count of packets received */
        u_int32 addr;           /* host address V4 style */
        u_int32 daddr;          /* destination host address */
@@ -689,7 +689,7 @@ struct info_monitor_1 {
 struct info_monitor {  
        u_int32 lasttime;       /* last packet from this host */
        u_int32 firsttime;      /* first time we received a packet */
-       u_int32 lastdrop;       /* last time we rejected a packet due to client limitation policy */
+       u_int32 restr;          /* restrict bits (was named lastdrop) */
        u_int32 count;          /* count of packets received */
        u_int32 addr;           /* host address */
        u_short port;           /* port number of last reception */
@@ -701,7 +701,7 @@ struct info_monitor {
 };
 
 /*
- * Structure used for returning monitor data (old format
+ * Structure used for returning monitor data (old format)
  */
 struct old_info_monitor {      
        u_int32 lasttime;       /* last packet from this host */
index 0e8e5f6657b7385be688208832854ce27cfe670b..b4f00be1ed573c0c8da85ddae69e8d24b41d9923 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "ntp_types.h"
 #include "ntp_string.h"
+#include "ntp_net.h"
 #include "l_stdlib.h"
 
 /*
@@ -62,10 +63,12 @@ extern      struct savekey *auth_findkey (keyid_t);
 extern int     auth_moremem    (void);
 extern int     ymd2yd          (int, int, int);
 
+/* a_md5encrypt.c */
 extern int     MD5authdecrypt  (u_char *, u_int32 *, int, int);
 extern int     MD5authencrypt  (u_char *, u_int32 *, int);
 extern void    MD5auth_setkey  (keyid_t, const u_char *, const int);
-extern u_int32 addr2refid      (struct sockaddr_storage *);
+extern u_int32 addr2refid      (sockaddr_u *);
+
 
 extern int     atoint          (const char *, long *);
 extern int     atouint         (const char *, u_long *);
@@ -81,18 +84,18 @@ extern      char *  statustoa       (int, int);
 extern  const char * sysstatstr (int);
 extern  const char * peerstatstr (int);
 extern  const char * clockstatstr (int);
-extern struct sockaddr_storage* netof (struct sockaddr_storage*);
+extern sockaddr_u * netof      (sockaddr_u *);
 extern char *  numtoa          (u_int32);
 extern char *  numtohost       (u_int32);
-extern char *  socktoa         (struct sockaddr_storage *);
-extern char *  socktohost      (struct sockaddr_storage *);
+extern char *  socktoa         (sockaddr_u *);
+extern char *  socktohost      (sockaddr_u *);
 extern int     octtoint        (const char *, u_long *);
 extern u_long  ranp2           (int);
-extern char *  refnumtoa       (struct sockaddr_storage *);
+extern char *  refnumtoa       (sockaddr_u *);
 extern int     tsftomsu        (u_long, int);
 extern char *  uinttoa         (u_long);
 
-extern int     decodenetnum    (const char *, struct sockaddr_storage *);
+extern int     decodenetnum    (const char *, sockaddr_u *);
 
 extern const char * FindConfig (const char *);
 
@@ -133,6 +136,10 @@ extern u_int       cache_keylen;           /* key length */
 extern char *  ntp_optarg;             /* global argument pointer */
 extern int     ntp_optind;             /* global argv index */
 
+/* lib_strbuf.c */
+extern int     ipv4_works;
+extern int     ipv6_works;
+
 /* machines.c */
 extern const char *set_tod_using;
 
index 8658311616dd337765973fb02c48b3e75555c816..f6a936fcdfb9c75095c373a5e2e7106762a58e04 100644 (file)
@@ -18,9 +18,9 @@ extern        char    *keysdir;       /* crypto keys and leaptable directory */
 
 extern void    getconfig       (int, char **);
 extern void    ctl_clr_stats   (void);
-extern int     ctlclrtrap      (struct sockaddr_storage *, struct interface *, int);
+extern int     ctlclrtrap      (sockaddr_u *, struct interface *, int);
 extern u_short ctlpeerstatus   (struct peer *);
-extern int     ctlsettrap      (struct sockaddr_storage *, struct interface *, int, int);
+extern int     ctlsettrap      (sockaddr_u *, struct interface *, int, int);
 extern u_short ctlsysstatus    (void);
 extern void    init_control    (void);
 extern void    init_logging    (char const *, int);
@@ -58,7 +58,7 @@ extern  void    set_var (struct ctl_var **, const char *, u_long, u_short);
 extern  void    set_sys_var (const char *, u_long, u_short);
 
 /* ntp_intres.c */
-extern void    ntp_res_name    (struct sockaddr_storage, u_short);
+extern void    ntp_res_name    (sockaddr_u, u_short);
 extern void    ntp_res_recv    (void);
 extern void    ntp_intres      (void);
 #ifdef SYS_WINNT
@@ -67,40 +67,39 @@ extern      unsigned WINAPI ntp_intres_thread       (void *);
 
 /* ntp_io.c */
 typedef struct interface_info {
-       struct interface *interface;
-       u_char       action;
+       struct interface *      interface;
+       u_char                  action;
 } interface_info_t;
 
-typedef void (*interface_receiver_t)(void *, interface_info_t *);
+typedef void   (*interface_receiver_t) (void *, interface_info_t *);
 
-extern  volatile int disable_dynamic_updates;
+extern  int    disable_dynamic_updates;
 
-extern  void    interface_enumerate (interface_receiver_t, void *);
-extern struct interface *findinterface (struct sockaddr_storage *);
-extern  struct interface *findbcastinter (struct sockaddr_storage *);
-extern  void   enable_broadcast (struct interface *, struct sockaddr_storage *);
-extern  void   enable_multicast_if (struct interface *, struct sockaddr_storage *);
-extern void    interface_dump   (struct interface *);
+extern void    interface_enumerate     (interface_receiver_t, void *);
+extern struct interface *findinterface (sockaddr_u *);
+extern struct interface *findbcastinter(sockaddr_u *);
+extern void    enable_broadcast        (struct interface *, sockaddr_u *);
+extern void    enable_multicast_if     (struct interface *, sockaddr_u *);
+extern void    interface_update        (interface_receiver_t, void *);
 
-extern  void    interface_update (interface_receiver_t, void *);
 extern void    init_io         (void);
 extern void    input_handler   (l_fp *);
 extern void    io_clr_stats    (void);
 extern void    io_setbclient   (void);
-extern void    io_unsetbclient (void);
-extern void    io_multicast_add (struct sockaddr_storage);
-extern void    io_multicast_del (struct sockaddr_storage);
-extern void    kill_asyncio     (int);
-extern void    sendpkt         (struct sockaddr_storage *, struct interface *, int, struct pkt *, int);
+extern void    io_unsetbclient (void);
+extern void    io_multicast_add(sockaddr_u *);
+extern void    io_multicast_del(sockaddr_u *);
+extern void    kill_asyncio    (int);
+extern void    sendpkt         (sockaddr_u *, struct interface *, int, struct pkt *, int);
 #ifdef DEBUG
-extern  void    collect_timing  (struct recvbuf *, const char *, int, l_fp *);
+extern void    collect_timing  (struct recvbuf *, const char *, int, l_fp *);
 #endif
 #ifdef HAVE_SIGNALED_IO
-extern void    wait_for_signal (void);
-extern void    unblock_io_and_alarm (void);
-extern void    block_io_and_alarm (void);
-#define UNBLOCK_IO_AND_ALARM() unblock_io_and_alarm()
-#define BLOCK_IO_AND_ALARM() block_io_and_alarm()
+extern void    wait_for_signal         (void);
+extern void    unblock_io_and_alarm    (void);
+extern void    block_io_and_alarm      (void);
+#define UNBLOCK_IO_AND_ALARM()         unblock_io_and_alarm()
+#define BLOCK_IO_AND_ALARM()           block_io_and_alarm()
 #else
 #define UNBLOCK_IO_AND_ALARM()
 #define BLOCK_IO_AND_ALARM()
@@ -124,14 +123,14 @@ extern  void    ntp_monclearinterface (struct interface *interface);
 
 /* ntp_peer.c */
 extern void    init_peer       (void);
-extern struct peer *findexistingpeer (struct sockaddr_storage *, struct peer *, int);
-extern struct peer *findpeer   (struct sockaddr_storage *, struct interface *, int, int *);
+extern struct peer *findexistingpeer (sockaddr_u *, struct peer *, int);
+extern struct peer *findpeer   (sockaddr_u *, struct interface *, int, int *);
 extern struct peer *findpeerbyassoc (u_int);
 extern  void   set_peerdstadr  (struct peer *peer, struct interface *interface);
-extern struct peer *newpeer    (struct sockaddr_storage *, struct interface *, int, int, int, int, u_int, u_char, int, keyid_t);
+extern struct peer *newpeer    (sockaddr_u *, struct interface *, int, int, int, int, u_int, u_char, int, keyid_t);
 extern void    peer_all_reset  (void);
 extern void    peer_clr_stats  (void);
-extern struct peer *peer_config (struct sockaddr_storage *, struct interface *, int, int, int, int, u_int, int, keyid_t, u_char *);
+extern struct peer *peer_config (sockaddr_u *, struct interface *, int, int, int, int, u_int, int, keyid_t, u_char *);
 extern void    peer_reset      (struct peer *);
 extern void    refresh_all_peerinterfaces (void);
 extern void    unpeer          (struct peer *);
@@ -145,8 +144,7 @@ extern      int     crypto_recv     (struct peer *, struct recvbuf *);
 extern int     crypto_xmit     (struct peer *, struct pkt *,
                                    struct recvbuf *, int,
                                    struct exten *, keyid_t);
-extern keyid_t session_key     (struct sockaddr_storage *,
-                                   struct sockaddr_storage *, keyid_t,
+extern keyid_t session_key     (sockaddr_u *, sockaddr_u *, keyid_t,
                                    keyid_t, u_long);
 extern int     make_keylist    (struct peer *, struct interface *);
 extern void    key_expire      (struct peer *);
@@ -193,7 +191,7 @@ extern      void    poll_update (struct peer *, int);
 extern void    clear           (struct peer *);
 extern void    clock_filter    (struct peer *, double, double, double);
 extern void    init_proto      (void);
-extern void    proto_config    (int, u_long, double, struct sockaddr_storage*);
+extern void    proto_config    (int, u_long, double, sockaddr_u *);
 extern void    proto_clr_stats (void);
 
 #ifdef REFCLOCK
@@ -211,8 +209,8 @@ extern      void    process_private (struct recvbuf *, int);
 
 /* ntp_restrict.c */
 extern void    init_restrict   (void);
-extern int     restrictions    (struct sockaddr_storage *);
-extern void    hack_restrict   (int, struct sockaddr_storage *, struct sockaddr_storage *, int, int);
+extern int     restrictions    (sockaddr_u *);
+extern void    hack_restrict   (int, sockaddr_u *, sockaddr_u *, int, int);
 
 /* ntp_timer.c */
 extern void    init_timer      (void);
@@ -233,17 +231,17 @@ extern u_long     sys_automax;    /* session key timeout */
 extern void    init_util       (void);
 extern void    write_stats     (void);
 extern void    stats_config    (int, const char *);
-extern void    record_peer_stats (struct sockaddr_storage *, int, double, double, double, double);
+extern void    record_peer_stats (sockaddr_u *, int, double, double, double, double);
 extern void    record_proto_stats (char *);
 extern void    record_loop_stats (double, double, double, double, int);
-extern void    record_clock_stats (struct sockaddr_storage *, const char *);
-extern void    record_raw_stats (struct sockaddr_storage *, struct sockaddr_storage *, l_fp *, l_fp *, l_fp *, l_fp *);
+extern void    record_clock_stats (sockaddr_u *, const char *);
+extern void    record_raw_stats (sockaddr_u *, sockaddr_u *, l_fp *, l_fp *, l_fp *, l_fp *);
 extern u_long  leap_month(u_long);
-extern void    record_crypto_stats (struct sockaddr_storage *, const char *);
+extern void    record_crypto_stats (sockaddr_u *, const char *);
 #ifdef DEBUG
 extern void    record_timing_stats (const char *);
 #endif
-extern  int    sock_hash (struct sockaddr_storage *);
+extern  int    sock_hash (sockaddr_u *);
 extern char *  fstostr(time_t);        /* NTP timescale seconds */
 extern double  old_drift;
 extern int     drift_file_sw;
index 1d9e6d7ca97363f06487104fba99300eea728387..29e205d850dae46fe1d88840bac213e71a385c7a 100644 (file)
@@ -93,7 +93,7 @@ typedef struct {
 
 typedef struct {
     double server_time;             /* Server time */
-    struct sockaddr_storage *addr;  /* Server Address */
+    sockaddr_u *addr;                      /* Server Address */
     queue *script;                  /* Server Script */
     script_info *curr_script;       /* Current Script */
 } server_info;
@@ -128,7 +128,7 @@ extern sim_info simulation;         /* Simulation Control Variables */
 int     ntpsim                  (int argc, char *argv[]);
 Event    *event                  (double t, funcTkn f);
 void     sim_event_timer         (Event *e);
-int      simulate_server         (struct sockaddr_storage *serv_addr,
+int      simulate_server         (sockaddr_u *serv_addr,
                                  struct interface *inter,
                                  struct pkt *rpkt);
 void     sim_update_clocks       (Event *e);
index 590bba77626067437e9671a7e14c9208b4aa7069..32ff76a5e1e11726e9bbccb38dafc27c84a79667 100644 (file)
@@ -53,19 +53,18 @@ typedef struct recvbuf recvbuf_t;
 struct recvbuf {
        ISC_LINK(recvbuf_t)     link;
        union {
-               struct sockaddr_storage X_recv_srcadr;
+               sockaddr_u X_recv_srcadr;
                caddr_t X_recv_srcclock;
                struct peer *X_recv_peer;
        } X_from_where;
 #define recv_srcadr    X_from_where.X_recv_srcadr
 #define        recv_srcclock   X_from_where.X_recv_srcclock
 #define recv_peer      X_from_where.X_recv_peer
-#if defined HAVE_IO_COMPLETION_PORT
-       WSABUF          wsabuff;
+#ifndef HAVE_IO_COMPLETION_PORT
+       sockaddr_u srcadr;              /* where packet came from */
 #else
-       struct sockaddr_storage srcadr; /* where packet came from */
+       int recv_srcadr_len;            /* filled in on completion */
 #endif
-       int src_addr_len;               /* source address length */
        struct interface *dstadr;       /* interface datagram arrived thru */
        SOCKET  fd;                     /* fd on which it was received */
        int msg_flags;                  /* Flags received about the packet */
@@ -76,9 +75,9 @@ struct recvbuf {
                struct pkt X_recv_pkt;
                u_char X_recv_buffer[RX_BUFF_SIZE];
        } recv_space;
-       int used;
 #define        recv_pkt        recv_space.X_recv_pkt
 #define        recv_buffer     recv_space.X_recv_buffer
+       int used;                       /* reference count */
 };
 
 extern void    init_recvbuff   (int);
index e1ea37c16d7ff0385670122b7051fd3b0791a7b3..b3ca811f1e220d3b7ba2ff9f8606cc5b9b18d348 100644 (file)
@@ -86,17 +86,17 @@ MD5authdecrypt(
  * it and use the bottom 4 bytes.
  */
 u_int32
-addr2refid(struct sockaddr_storage *addr)
+addr2refid(sockaddr_u *addr)
 {
        MD5_CTX md5;
        u_char digest[16];
        u_int32 addr_refid;
 
-       if (addr->ss_family == AF_INET)
-               return (GET_INADDR(*addr));
+       if (IS_IPV4(addr))
+               return (NSRCADR(addr));
 
        MD5Init(&md5);
-       MD5Update(&md5, (u_char *)&GET_INADDR6(*addr),
+       MD5Update(&md5, (u_char *)PSOCK_ADDR6(addr),
            sizeof(struct in6_addr));
        MD5Final(digest, &md5);
        memcpy(&addr_refid, digest, 4);
index d7dc4ee09b2b33823a248fdf9bdf18fd013aaa5f..4459830ed19de39b1f4a78b2be00165318b523d8 100644 (file)
@@ -68,8 +68,8 @@ struct clktype clktypes[] = {
          "MSF_ARCRON" },
        { REFCLK_SHM,           "Clock attached thru shared Memory (28)",
          "SHM" },
-        { REFCLK_PALISADE,      "Trimble Navigation Palisade GPS (29)",
-          "GPS_PALISADE" },
+       { REFCLK_PALISADE,      "Trimble Navigation Palisade GPS (29)",
+         "GPS_PALISADE" },
        { REFCLK_ONCORE,        "Motorola UT Oncore GPS (30)",
          "GPS_ONCORE" },
        { REFCLK_GPS_JUPITER,   "Rockwell Jupiter GPS (31)",
@@ -78,7 +78,7 @@ struct clktype clktypes[] = {
          "CHRONOLOG" },
        { REFCLK_DUMBCLOCK,     "Dumb generic hh:mm:ss local clock (33)",
          "DUMBCLOCK" },
-       { REFCLK_ULINK,         "Ultralink M320 WWVB receiver (34)",
+       { REFCLK_ULINK,         "Ultralink M320 WWVB receiver (34)",
          "ULINK_M320"},
        { REFCLK_PCF,           "Conrad parallel port radio clock (35)",
          "PCF"},
@@ -112,7 +112,7 @@ clockname(
   
        for (clk = clktypes; clk->code != -1; clk++) {
                if (num == clk->code)
-                   return (clk->abbrev);
+                       return (clk->abbrev);
        }
        return (NULL);
 }
index 746c855d8bd1b6e9ccdc8b8f67b7fa6462b7d6c2..debe8138386266c8630e859ea931a346924103ed 100644 (file)
@@ -11,7 +11,7 @@
 int
 decodenetnum(
        const char *num,
-       struct sockaddr_storage *netnum
+       sockaddr_u *netnum
        )
 {
        struct addrinfo hints, *ai = NULL;
@@ -33,7 +33,7 @@ decodenetnum(
        err = getaddrinfo(num, NULL, &hints, &ai);
        if (err != 0)
                return 0;
-       memcpy(netnum, (struct sockaddr_storage *)ai->ai_addr, ai->ai_addrlen); 
+       memcpy(netnum, ai->ai_addr, ai->ai_addrlen); 
        freeaddrinfo(ai);
        return 1;
 }
index 315070f3a9435b209833b878f3ac4bfd3a7432de..3c65f194bf9c00cdfa11e72c4e99b07c91e12428 100644 (file)
@@ -1,7 +1,11 @@
 /*
  * lib_strbuf - library string storage
  */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 
+#include <isc/net.h>
 #include "ntp_stdlib.h"
 #include "lib_strbuf.h"
 
@@ -10,6 +14,8 @@
  */
 char lib_stringbuf[LIB_NUMBUFS][LIB_BUFLENGTH];
 int lib_nextbuf;
+int ipv4_works;
+int ipv6_works;
 int lib_inited = 0;
 
 /*
@@ -19,5 +25,7 @@ void
 init_lib(void)
 {
        lib_nextbuf = 0;
+       ipv4_works = isc_net_probeipv4();
+       ipv6_works = isc_net_probeipv6();
        lib_inited = 1;
 }
index 5aa0eb0a6d72d4e4f00b8d829399cb2d4893a678..b92c2e801365974f70f3884c15cf17b5a1dbebac 100644 (file)
@@ -25,4 +25,6 @@
 
 extern char lib_stringbuf[LIB_NUMBUFS][LIB_BUFLENGTH];
 extern int lib_nextbuf;
+extern int ipv4_works;
+extern int ipv6_works;
 extern int lib_inited;
index fd57568d313037df5ed932ca184ec2228dea1134..55a4092befe16a44795afdcc4a10cf03168d5799 100644 (file)
@@ -3,46 +3,52 @@
  *         (zero out host part)
  */
 #include <stdio.h>
+#include <syslog.h>
 
 #include "ntp_fp.h"
+#include "ntp_net.h"
 #include "ntp_stdlib.h"
 #include "ntp.h"
 
-#define NUM_NETOF_BUFS 10
-static struct sockaddr_storage ssbuf[NUM_NETOF_BUFS];
-static int next_ssbuf = 0;
-
-struct sockaddr_storage*
+sockaddr_u *
 netof(
-        struct sockaddr_storage* hostaddr
+       sockaddr_u *hostaddr
        )
 {
-       register u_int32 netnum;
-        struct sockaddr_storage *netaddr;
+       static sockaddr_u       netofbuf[8];
+       static int              next_netofbuf;
+       u_int32                 netnum;
+       sockaddr_u *            netaddr;
+
+       netaddr = &netofbuf[next_netofbuf];
+       next_netofbuf = (next_netofbuf + 1) % COUNTOF(netofbuf);
 
-       netaddr = &ssbuf[next_ssbuf++];
-       if (next_ssbuf == NUM_NETOF_BUFS)
-               next_ssbuf = 0;
-        memcpy(netaddr, hostaddr, sizeof(struct sockaddr_storage));
+       memcpy(netaddr, hostaddr, sizeof(*netaddr));
 
-        if(netaddr->ss_family == AF_INET) {
-                netnum = ((struct sockaddr_in*)netaddr)->sin_addr.s_addr;
+       if (IS_IPV4(netaddr)) {
+               netnum = SRCADR(netaddr);
 
                /*
                 * We live in a modern CIDR world where the basement nets, which
                 * used to be class A, are now probably associated with each
                 * host address. So, for class-A nets, all bits are significant.
                 */
-               if(IN_CLASSC(netnum))
-                   netnum &= IN_CLASSC_NET;
+               if (IN_CLASSC(netnum))
+                       netnum &= IN_CLASSC_NET;
                else if (IN_CLASSB(netnum))
-                   netnum &= IN_CLASSB_NET;
-                       ((struct sockaddr_in*)netaddr)->sin_addr.s_addr = netnum;
-                }
-         else if(netaddr->ss_family == AF_INET6) {
-               /* Here we put 0 at the local link address so we get net address */
-                 memset(&((struct sockaddr_in6*)netaddr)->sin6_addr.s6_addr[8], 0, 8*sizeof(u_char));
-         }
-
-         return netaddr;
+                       netnum &= IN_CLASSB_NET;
+
+               SET_ADDR4(netaddr, netnum);
+
+       } else if (IS_IPV6(netaddr))
+               /* assume the typical /64 subnet size */
+               memset(&NSRCADR6(netaddr)[8], 0, 8);
+#ifdef DEBUG
+       else {
+               msyslog(LOG_ERR, "netof unknown AF %d", AF(netaddr));
+               exit(1);
+       }
+#endif
+
+       return netaddr;
 }
index 4ec6036ec74e459760239a6cf3233d28e67c8f7c..2a77ea2ab267827b90ecc04586040474055f1643 100644 (file)
@@ -25,8 +25,10 @@ numtoa(
 
        netnum = ntohl(num);
        LIB_GETBUF(buf);
-       (void) sprintf(buf, "%lu.%lu.%lu.%lu", ((u_long)netnum >> 24) & 0xff,
-                      ((u_long)netnum >> 16) & 0xff, ((u_long)netnum >> 8) & 0xff,
-                      (u_long)netnum & 0xff);
+       snprintf(buf, LIB_BUFLENGTH, "%lu.%lu.%lu.%lu",
+                ((u_long)netnum >> 24) & 0xff,
+                ((u_long)netnum >> 16) & 0xff,
+                ((u_long)netnum >> 8) & 0xff,
+                (u_long)netnum & 0xff);
        return buf;
 }
index a12d647162d0f00ff18b701ca66aed922484ecf7..fa9134512029169948121f17d157cd1e4a2a2a2f 100644 (file)
@@ -65,15 +65,10 @@ lowater_additions(void)
        return lowater_adds;
 }
 
-static void 
+static inline void 
 initialise_buffer(recvbuf_t *buff)
 {
-       memset((char *) buff, 0, sizeof(recvbuf_t));
-
-#if defined SYS_WINNT
-       buff->wsabuff.len = RX_BUFF_SIZE;
-       buff->wsabuff.buf = (char *) buff->recv_buffer;
-#endif
+       memset(buff, 0, sizeof(*buff));
 }
 
 static void
index ef90f1211745df08331ab314de00053cc5e6d3ba..106d0b841dccd154e7c5c1236a8df47fb697cc09 100644 (file)
@@ -9,7 +9,7 @@
 
 char *
 refnumtoa(
-       struct sockaddr_storage* num
+       sockaddr_u *num
        )
 {
        register u_int32 netnum;
@@ -18,19 +18,22 @@ refnumtoa(
 
        LIB_GETBUF(buf);
 
-       if(num->ss_family == AF_INET) {
-               netnum = ntohl(((struct sockaddr_in*)num)->sin_addr.s_addr);
+       if (IS_IPV4(num)) {
+               netnum = SRCADR(num);
                rclock = clockname((int)((u_long)netnum >> 8) & 0xff);
 
                if (rclock != NULL)
-                   (void)sprintf(buf, "%s(%lu)", rclock, (u_long)netnum & 0xff);
+                       snprintf(buf, LIB_BUFLENGTH, "%s(%lu)",
+                                rclock, (u_long)netnum & 0xff);
                else
-               (void)sprintf(buf, "REFCLK(%lu,%lu)",
-                                 ((u_long)netnum >> 8) & 0xff, (u_long)netnum & 0xff);
+                       snprintf(buf, LIB_BUFLENGTH, "REFCLK(%lu,%lu)",
+                                ((u_long)netnum >> 8) & 0xff,
+                                (u_long)netnum & 0xff);
+
+       } else
+               strncpy(buf,
+                       "refclock address type not implemented, use IPv4 refclock address.",
+                       LIB_BUFLENGTH);
 
-       }
-       else {
-               (void)sprintf(buf, "refclock address type not implemented yet, use IPv4 refclock address.");
-       }
        return buf;
 }
index fb41b22a0c3fa4d57d17367057e19a5629c6e9b4..fc51fe449b0febf87e9fce338d001901901bc79d 100644 (file)
@@ -2,7 +2,9 @@
  * socktoa - return a numeric host name from a sockaddr_storage structure
  */
 
+#ifdef HAVE_CONFIG_H
 #include <config.h>
+#endif
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -23,7 +25,7 @@
 
 char *
 socktoa(
-       struct sockaddr_storage* sock
+       sockaddr_u *sock
        )
 {
        register char *buffer;
@@ -31,26 +33,23 @@ socktoa(
        LIB_GETBUF(buffer);
 
        if (sock == NULL)
-               strcpy(buffer, "null");
-       else
-       {
-
-               switch(sock->ss_family) {
+               strncpy(buffer, "(null)", LIB_BUFLENGTH);
+       else {
+               switch(AF(sock)) {
 
-               default:
                case AF_INET :
-                       inet_ntop(AF_INET, &GET_INADDR(*sock), buffer,
+                       inet_ntop(AF_INET, PSOCK_ADDR4(sock), buffer,
                            LIB_BUFLENGTH);
                        break;
 
                case AF_INET6 :
-                       inet_ntop(AF_INET6, &GET_INADDR6(*sock), buffer,
+                       inet_ntop(AF_INET6, PSOCK_ADDR6(sock), buffer,
                            LIB_BUFLENGTH);
-#if 0
+
                default:
-                       strcpy(buffer, "unknown");
-#endif
+                       strncpy(buffer, "(socktoa unknown family)",
+                               LIB_BUFLENGTH);
                }
        }
-       return buffer;
+       return buffer;
 }
index 7aafdc710dbda252829661a49c02a4289a59adc8..616bf74fe3a98d8e0e55cf57697c6629fe49ad4c 100644 (file)
 
 char *
 socktohost(
-       struct sockaddr_storage* sock
+       sockaddr_u *sock
        )
 {
        register char *buffer;
 
        LIB_GETBUF(buffer);
-       if (getnameinfo((struct sockaddr *)sock, SOCKLEN(sock), buffer,
-           LIB_BUFLENGTH /* NI_MAXHOST*/, NULL, 0, 0))
+       if (getnameinfo(&sock->sa, SOCKLEN(sock), buffer,
+           LIB_BUFLENGTH, NULL, 0, 0))
                return stoa(sock);
 
-       return buffer;
+       return buffer;
 }
index 8935a11c571f092e5624cfa0479d96b59a3aa4ae..54f963d96577e59f781a6aa7a655931027e90dc7 100644 (file)
@@ -177,20 +177,17 @@ struct netinfo_config_state {
 #endif
 
 struct REMOTE_CONFIG_INFO remote_config;  /* Remote configuration buffer and
-                                             pointer info */
+                                            pointer info */
 int input_from_file = 1;     /* A boolean flag, which when set, indicates that
-                                the input is to be taken from the configuration
-                                file, instead of the remote-configuration buffer
-                             */
-/* int newline_is_special = 1; */ /* A boolean flag, which when set, implies that
-                                    newlines are special characters that need to
-                                    be returned as tokens */
+                               the input is to be taken from the configuration
+                               file, instead of the remote-configuration buffer
+                            */
 
 int old_config_style = 1;    /* A boolean flag, which when set,
-                              * indicates that the old configuration
-                              * format with a newline at the end of
-                              * every command is being used
-                              */
+                             * indicates that the old configuration
+                             * format with a newline at the end of
+                             * every command is being used
+                             */
 int    cryptosw;               /* crypto command called */
 
 extern int sys_maxclock;
@@ -212,7 +209,7 @@ static void free_auth_node(void);
 double *create_dval(double val);
 void destroy_restrict_node(struct restrict_node *my_node);
 #if !defined(SIM)
-static struct sockaddr_storage *get_next_address(struct address_node *addr);
+static sockaddr_u *get_next_address(struct address_node *addr);
 #endif
 
 static void config_other_modes(void);
@@ -230,7 +227,7 @@ static void config_ttl(void);
 static void config_trap(void);
 static void config_fudge(void);
 static void config_vars(void);
-static int is_sane_resolved_address(struct sockaddr_storage peeraddr, int hmode);
+static int is_sane_resolved_address(sockaddr_u *peeraddr, int hmode);
 static int get_correct_host_mode(int hmode);
 static void config_peers(void);
 static void config_unpeers(void);
@@ -257,9 +254,14 @@ do {                                       \
 static unsigned long get_pfxmatch(char **s,struct masks *m);
 static unsigned long get_match(char *s,struct masks *m);
 static unsigned long get_logmask(char *s);
-static int getnetnum(const char *num,struct sockaddr_storage *addr,int complain,enum gnn_type a_type);
-static int get_multiple_netnums(const char *num, struct sockaddr_storage *addr, struct addrinfo **res, int complain, enum gnn_type a_type);
-static void save_resolve(char *name,int mode,int version,int minpoll,int maxpoll,u_int flags,int ttl,keyid_t keyid,u_char *keystr);
+static int getnetnum(const char *num,sockaddr_u *addr, int complain,
+                    enum gnn_type a_type);
+static int get_multiple_netnums(const char *num, sockaddr_u *addr,
+                               struct addrinfo **res, int complain,
+                               enum gnn_type a_type);
+static void save_resolve(char *name, int mode, int version,
+                        int minpoll, int maxpoll, u_int flags,int ttl,
+                        keyid_t keyid,u_char *keystr);
 static void abort_resolve(void);
 static void do_resolve_internal(void);
 
@@ -827,7 +829,7 @@ create_sim_script_info(
 
 #define ADDR_LENGTH 16 + 1
 
-static struct sockaddr_storage *
+static sockaddr_u *
 get_next_address(
        struct address_node *addr
        )
@@ -835,7 +837,7 @@ get_next_address(
        const char addr_prefix[] = "192.168.0.";
        static int curr_addr_no = 1;
        char addr_string[ADDR_LENGTH];
-       struct sockaddr_storage *final_addr;
+       sockaddr_u *final_addr;
        struct addrinfo *ptr;
        int retval;
        
@@ -1080,25 +1082,27 @@ static void
 config_other_modes(void)
 {
 
-       struct sockaddr_storage addr_sock;
+       sockaddr_u addr_sock;
        struct address_node *addr_node;
 
        if (my_config.broadcastclient) {
-               proto_config(PROTO_BROADCLIENT, my_config.broadcastclient, 0., NULL);
+               proto_config(PROTO_BROADCLIENT,
+                            my_config.broadcastclient, 0., NULL);
                my_config.broadcastclient = 0;
        }
 
        /* Configure the many-cast servers */
        if (!empty(my_config.manycastserver)) {
                while (!empty(my_config.manycastserver)) {
-                       addr_node = (struct address_node *)
-                           dequeue(my_config.manycastserver);
+                       addr_node = dequeue(my_config.manycastserver);
 
-                       memset((char *)&addr_sock, 0, sizeof(addr_sock));
-                       addr_sock.ss_family = (u_short)addr_node->type;
+                       ZERO_SOCK(&addr_sock);
+                       AF(&addr_sock) = (u_short)addr_node->type;
 
-                       if (getnetnum(addr_node->address, &addr_sock, 1, t_UNK)  == 1)
-                               proto_config(PROTO_MULTICAST_ADD, 0, 0., &addr_sock);
+                       if (getnetnum(addr_node->address, &addr_sock,
+                           1, t_UNK) == 1)
+                               proto_config(PROTO_MULTICAST_ADD, 0,
+                                            0., &addr_sock);
 
                        destroy_address_node(addr_node);
                }
@@ -1108,15 +1112,15 @@ config_other_modes(void)
        /* Configure the multicast clients */
        if (!empty(my_config.multicastclient)) {
                while (!empty(my_config.multicastclient)) {
-                       addr_node = (struct address_node *)
-                           dequeue(my_config.multicastclient);
+                       addr_node = dequeue(my_config.multicastclient);
 
-                       memset((char *)&addr_sock, 0, sizeof(addr_sock));
-                       addr_sock.ss_family = (u_short)addr_node->type;
-
-                       if (getnetnum(addr_node->address, &addr_sock, 1, t_UNK)  == 1)
-                               proto_config(PROTO_MULTICAST_ADD, 0, 0., &addr_sock);
+                       ZERO_SOCK(&addr_sock);
+                       AF(&addr_sock) = (u_short)addr_node->type;
 
+                       if (getnetnum(addr_node->address, &addr_sock,
+                           1, t_UNK) == 1)
+                               proto_config(PROTO_MULTICAST_ADD, 0,
+                                            0., &addr_sock);
 
                        destroy_address_node(addr_node);
                }
@@ -1354,8 +1358,8 @@ config_access(void)
 {
        struct attr_val *       my_opt;
        struct restrict_node *  my_node;
-       struct sockaddr_storage addr_sock;
-       struct sockaddr_storage addr_mask;
+       sockaddr_u              addr_sock;
+       sockaddr_u              addr_mask;
        int                     flags;
        int                     mflags;
        int                     restrict_default;
@@ -1391,7 +1395,7 @@ config_access(void)
        while (!empty(my_config.restrict_opts)) {
                my_node = dequeue(my_config.restrict_opts);
 
-               memset(&addr_sock, 0, sizeof addr_sock);
+               ZERO_SOCK(&addr_sock);
 
                if (NULL == my_node->addr) {
                        /*
@@ -1399,11 +1403,11 @@ config_access(void)
                         * -4 / -6 qualifier, add to both lists
                         */
                        restrict_default = 1;
-                       ANYSOCK(&addr_mask);
+                       ZERO_SOCK(&addr_mask);
                } else {
                        restrict_default = 0;
                        /* Resolve the specified address */
-                       addr_sock.ss_family = (u_short)my_node->addr->type;
+                       AF(&addr_sock) = (u_short)my_node->addr->type;
 
                        if (getnetnum(my_node->addr->address,
                                      &addr_sock, 1, t_UNK) != 1) {
@@ -1415,12 +1419,12 @@ config_access(void)
                                continue;
                        }
 
-                       SET_HOSTMASK(&addr_mask, addr_sock.ss_family);
+                       SET_HOSTMASK(&addr_mask, AF(&addr_sock));
 
                        /* Resolve the mask */
                        if (my_node->mask) {
-                               memset((char *)&addr_mask, 0, sizeof(addr_mask));
-                               addr_mask.ss_family = (u_short)my_node->mask->type;
+                               ZERO_SOCK(&addr_mask);
+                               AF(&addr_mask) = (u_short)my_node->mask->type;
                                if (getnetnum(my_node->mask->address, &addr_mask, 1, t_MSK) != 1) {
 
                                        msyslog(LOG_ERR,
@@ -1447,11 +1451,11 @@ config_access(void)
 
                /* Set the flags */
                if (restrict_default) {
-                       addr_sock.ss_family = AF_INET;
+                       AF(&addr_sock) = AF_INET;
                        hack_restrict(RESTRICT_FLAGS, &addr_sock, &addr_mask,
                                      mflags, flags);
 
-                       addr_sock.ss_family = AF_INET6;
+                       AF(&addr_sock) = AF_INET6;
                }
 
                hack_restrict(RESTRICT_FLAGS, &addr_sock, &addr_mask,
@@ -1626,15 +1630,15 @@ config_trap(void)
 
        struct addr_opts_node *curr_trap;
        struct attr_val *curr_opt;
-       struct sockaddr_storage addr_sock;
-       struct sockaddr_storage peeraddr;
+       sockaddr_u addr_sock;
+       sockaddr_u peeraddr;
        struct address_node *addr_node;
        struct interface *localaddr;
        u_short port_no;
        int err_flag;
 
        /* silence warning about addr_sock potentially uninitialized */
-       addr_sock.ss_family = AF_UNSPEC;
+       AF(&addr_sock) = AF_UNSPEC;
        port_no = 0;
        localaddr = NULL;
 
@@ -1660,8 +1664,8 @@ config_trap(void)
                                addr_node = curr_opt->value.p;
 
                                /* Resolve the interface address */
-                               memset(&addr_sock, 0, sizeof(addr_sock));
-                               addr_sock.ss_family = (u_short)addr_node->type;
+                               ZERO_SOCK(&addr_sock);
+                               AF(&addr_sock) = (u_short)addr_node->type;
 
                                if (getnetnum(addr_node->address,
                                              &addr_sock, 1, t_UNK) != 1) {
@@ -1688,7 +1692,7 @@ config_trap(void)
                 * and port number
                 */
                if (!err_flag) {
-                       memset((char *)&peeraddr, 0, sizeof(peeraddr));
+                       ZERO_SOCK(&peeraddr);
                        if (1 != getnetnum(curr_trap->addr->address,
                                           &peeraddr, 1, t_UNK)) {
                                err_flag = 1;
@@ -1696,15 +1700,14 @@ config_trap(void)
                        }
 
                        /* port is at same location for v4 and v6 */
-                       ((struct sockaddr_in6*)&peeraddr)->sin6_port =
-                               htons(port_no ? port_no : TRAPPORT);
+                       SET_PORT(&peeraddr, port_no ? port_no : TRAPPORT);
 
                        if (NULL == localaddr) {
-                               peeraddr.ss_family = default_ai_family;
+                               AF(&peeraddr) = default_ai_family;
                                localaddr = ANY_INTERFACE_CHOOSE(&peeraddr);
                        }
                        else
-                               peeraddr.ss_family = addr_sock.ss_family;
+                               AF(&peeraddr) = AF(&addr_sock);
 
                        if (!ctlsettrap(&peeraddr, localaddr, 0,
                                        NTP_VERSION))
@@ -1722,7 +1725,7 @@ config_fudge(void)
 {
        struct addr_opts_node *curr_fudge;
        struct attr_val *curr_opt;
-       struct sockaddr_storage addr_sock;
+       sockaddr_u addr_sock;
        struct address_node *addr_node;
        struct refclockstat clock_stat;
        int err_flag;
@@ -1736,7 +1739,7 @@ config_fudge(void)
                 * ensure that it is sane
                 */
                addr_node = curr_fudge->addr;
-               memset((char *)&addr_sock, 0, sizeof(addr_sock));
+               ZERO_SOCK(&addr_sock);
                if (getnetnum(addr_node->address, &addr_sock, 1, t_REF) != 1)
                        err_flag = 1;
 
@@ -1748,7 +1751,7 @@ config_fudge(void)
                }
 
                /* Parse all the options to the fudge command */
-               memset((void *)&clock_stat, 0, sizeof clock_stat);
+               memset(&clock_stat, 0, sizeof(clock_stat));
                while (!empty(curr_fudge->options)) {
                        curr_opt = (struct attr_val *) dequeue(curr_fudge->options);
 
@@ -1884,18 +1887,14 @@ config_vars(void)
  */
 static int
 is_sane_resolved_address(
-       struct sockaddr_storage peeraddr,
-       int hmode
+       sockaddr_u *    peeraddr,
+       int             hmode
        )
 {
-       if (
-#ifdef REFCLOCK
-               !ISREFCLOCKADR(&peeraddr) &&
-#endif
-               ISBADADR(&peeraddr)) {
+       if (!ISREFCLOCKADR(peeraddr) && ISBADADR(peeraddr)) {
                msyslog(LOG_ERR,
                        "attempt to configure invalid address %s",
-                       stoa(&peeraddr));
+                       stoa(peeraddr));
                return 0;
        }
        /*
@@ -1903,50 +1902,21 @@ is_sane_resolved_address(
         * address for server/peer!
         * and unicast address for manycastclient!
         */
-       /* Check for IPv4 */
-       if (peeraddr.ss_family == AF_INET) {
-               if (((hmode == T_Server) || (hmode == T_Peer) || (hmode == T_Pool)) &&
-#ifdef REFCLOCK
-                   !ISREFCLOCKADR(&peeraddr) &&
-#endif
-                   IN_CLASSD(ntohl(((struct sockaddr_in*)&peeraddr)->sin_addr.s_addr))) {
-                       msyslog(LOG_ERR,
-                               "attempt to configure invalid address %s",
-                               stoa(&peeraddr));
-                       return 0;
-               }
-               if ((hmode == T_Manycastclient) &&
-                   !IN_CLASSD(ntohl(((struct sockaddr_in*)&peeraddr)->sin_addr.s_addr))) {
-                       msyslog(LOG_ERR,
-                               "attempt to configure invalid address %s",
-                               stoa(&peeraddr));
-                       return 0;
-               }
-
+       if ((T_Server == hmode || T_Peer == hmode || T_Pool == hmode)
+           && IS_MCAST(peeraddr)) {
+               msyslog(LOG_ERR,
+                       "attempt to configure invalid address %s",
+                       stoa(peeraddr));
+               return 0;
        }
-       /* Check for IPv6 */
-       else if(peeraddr.ss_family == AF_INET6) {
-               if (((hmode == T_Server) || (hmode == T_Peer) || (hmode == T_Pool)) &&
-#ifdef REFCLOCK
-                   !ISREFCLOCKADR(&peeraddr) &&
-#endif
-                   IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)&peeraddr)->sin6_addr)) {
-                       msyslog(LOG_ERR,
-                               "attempt to configure in valid address %s",
-                               stoa(&peeraddr));
-                       return 0;
-               }
-               if ((hmode == T_Manycastclient) &&
-                   !IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)&peeraddr)->sin6_addr)) {
-                       msyslog(LOG_ERR,
-                               "attempt to configure in valid address %s",
-                               stoa(&peeraddr));
-                       return 0;
-               }
+       if (T_Manycastclient == hmode && !IS_MCAST(peeraddr)) {
+               msyslog(LOG_ERR,
+                       "attempt to configure invalid address %s",
+                       stoa(peeraddr));
+               return 0;
        }
 
-       if (peeraddr.ss_family == AF_INET6 &&
-           isc_net_probeipv6() != ISC_R_SUCCESS)
+       if (IS_IPV6(peeraddr) && !ipv6_works)
                return 0;
 
        /* Ok, all tests succeeded, now we can return 1 */
@@ -1981,7 +1951,7 @@ static void
 config_peers(void)
 {
        struct addrinfo *res, *res_bak;
-       struct sockaddr_storage peeraddr;
+       sockaddr_u peeraddr;
        struct peer_node *curr_peer;
        int hmode;
        int status;
@@ -2001,8 +1971,8 @@ config_peers(void)
                hmode = get_correct_host_mode(curr_peer->host_mode);
 
                /* Attempt to resolve the address */
-               memset((char *)&peeraddr, 0, sizeof(peeraddr));
-               peeraddr.ss_family = (u_short)curr_peer->addr->type;
+               ZERO_SOCK(&peeraddr);
+               AF(&peeraddr) = (u_short)curr_peer->addr->type;
 
                status = get_multiple_netnums(curr_peer->addr->address, &peeraddr, &res, 0, t_UNK);
 
@@ -2046,10 +2016,12 @@ config_peers(void)
                                ++i;
                                memcpy(&peeraddr, res->ai_addr,
                                    res->ai_addrlen);
-                               if (is_sane_resolved_address(peeraddr,
-                                   curr_peer->host_mode))
+                               if (is_sane_resolved_address(
+                                       &peeraddr,
+                                       curr_peer->host_mode))
+
                                        peer_config(&peeraddr,
-                                       ANY_INTERFACE_CHOOSE(&peeraddr),
+                                       ANY_INTERFACE_CHOOSE(&peeraddr),
                                            hmode,
                                            curr_peer->peerversion,
                                            curr_peer->minpoll,
@@ -2072,7 +2044,7 @@ static void
 config_unpeers(void)
 {
        struct addrinfo *res, *res_bak;
-       struct sockaddr_storage peeraddr;
+       sockaddr_u peeraddr;
        struct unpeer_node *curr_unpeer;
        struct peer *peer;
        int status;
@@ -2082,8 +2054,8 @@ config_unpeers(void)
                curr_unpeer = (struct unpeer_node *) dequeue(my_config.unpeers);
 
                /* Attempt to resolve the address */
-               memset((char *)&peeraddr, 0, sizeof(peeraddr));
-               peeraddr.ss_family = (u_short)curr_unpeer->addr->type;
+               ZERO_SOCK(&peeraddr);
+               AF(&peeraddr) = (u_short)curr_unpeer->addr->type;
 
                status = get_multiple_netnums(curr_unpeer->addr->address, &peeraddr, &res, 0, t_UNK);
 
@@ -2652,7 +2624,7 @@ gettokens_netinfo (
 static int
 getnetnum(
        const char *num,
-       struct sockaddr_storage *addr,
+       sockaddr_u *addr,
        int complain,
        enum gnn_type a_type
        )
@@ -2684,7 +2656,7 @@ getnetnum(
 static int
 get_multiple_netnums(
        const char *num,
-       struct sockaddr_storage *addr,
+       sockaddr_u *addr,
        struct addrinfo **res,
        int complain,
        enum gnn_type a_type
@@ -2696,15 +2668,15 @@ get_multiple_netnums(
        int retval;
 
        /* Get host address. Looking for UDP datagram connection */
-       memset(&hints, 0, sizeof (hints));
-       if (addr->ss_family == AF_INET || addr->ss_family == AF_INET6)
-               hints.ai_family = addr->ss_family;
+       memset(&hints, 0, sizeof(hints));
+       if (IS_IPV4(addr) || IS_IPV6(addr))
+               hints.ai_family = AF(addr);
        else
                hints.ai_family = AF_UNSPEC;
        /*
         * If we don't have an IPv6 stack, just look up IPv4 addresses
         */
-       if (isc_net_probeipv6() != ISC_R_SUCCESS)
+       if (!ipv6_works)
                hints.ai_family = AF_INET;
 
        hints.ai_socktype = SOCK_DGRAM;
@@ -2713,10 +2685,7 @@ get_multiple_netnums(
 
        retval = getaddrinfo(num, "ntp", &hints, &ptr);
 
-       if (retval ||
-           (ptr->ai_family == AF_INET6 
-            && isc_net_probeipv6() != ISC_R_SUCCESS)) {
-
+       if (retval || (AF_INET6 == ptr->ai_family && !ipv6_works)) {
                if (complain)
                        msyslog(LOG_ERR,
                                "getaddrinfo: \"%s\" invalid host "
index abad0624738268c88a8f4d06d9486445b1e9160d..5a138e57653b561852df55981a75d6824d15ddd9 100644 (file)
@@ -54,7 +54,7 @@ static        void    ctl_puthex      (const char *, u_long);
 static void    ctl_putint      (const char *, long);
 static void    ctl_putts       (const char *, l_fp *);
 static void    ctl_putadr      (const char *, u_int32,
-                                struct sockaddr_storage*);
+                                sockaddr_u *);
 static void    ctl_putid       (const char *, char *);
 static void    ctl_putarray    (const char *, double *, int);
 static void    ctl_putsys      (int);
@@ -74,7 +74,7 @@ static        void    write_clock_status (struct recvbuf *, int);
 static void    set_trap        (struct recvbuf *, int);
 static void    unset_trap      (struct recvbuf *, int);
 static void    configure       (struct recvbuf *, int);
-static struct ctl_trap *ctlfindtrap (struct sockaddr_storage *,
+static struct ctl_trap *ctlfindtrap (sockaddr_u *,
                                      struct interface *);
 
 static struct ctl_proc control_codes[] = {
@@ -461,7 +461,7 @@ static u_char * datapt;
 static u_char * dataend;
 static int     datalinelen;
 static int     datanotbinflag;
-static struct sockaddr_storage *rmt_addr;
+static sockaddr_u *rmt_addr;
 static struct interface *lcl_inter;
 
 static u_char  res_authenticate;
@@ -1131,7 +1131,7 @@ static void
 ctl_putadr(
        const char *tag,
        u_int32 addr32,
-       struct sockaddr_storage* addr
+       sockaddr_u *addr
        )
 {
        register char *cp;
@@ -1150,7 +1150,7 @@ ctl_putadr(
                cq = stoa(addr);
        while (*cq != '\0')
                *cp++ = *cq++;
-       ctl_putdata(buffer, (unsigned)( cp - buffer ), 0);
+       ctl_putdata(buffer, (unsigned)(cp - buffer), 0);
 }
 
 /*
@@ -2603,7 +2603,7 @@ unset_trap(
  */
 int
 ctlsettrap(
-       struct sockaddr_storage *raddr,
+       sockaddr_u *raddr,
        struct interface *linter,
        int traptype,
        int version
@@ -2724,7 +2724,7 @@ ctlsettrap(
  */
 int
 ctlclrtrap(
-       struct sockaddr_storage *raddr,
+       sockaddr_u *raddr,
        struct interface *linter,
        int traptype
        )
@@ -2749,7 +2749,7 @@ ctlclrtrap(
  */
 static struct ctl_trap *
 ctlfindtrap(
-       struct sockaddr_storage *raddr,
+       sockaddr_u *raddr,
        struct interface *linter
        )
 {
@@ -2758,7 +2758,7 @@ ctlfindtrap(
        for (tp = ctl_trap; tp < &ctl_trap[CTL_MAXTRAPS]; tp++) {
                if ((tp->tr_flags & TRAP_INUSE)
                    && (NSRCPORT(raddr) == NSRCPORT(&tp->tr_addr))
-                   && SOCKCMP(raddr, &tp->tr_addr)
+                   && SOCK_EQ(raddr, &tp->tr_addr)
                    && (linter == tp->tr_localaddr) )
                        return (tp);
        }
index 819eca85ea70e432d68ccbba845d48d91f2cf2d6..704d7708e4113cc530cbbfb1985d7edf11a7ddb9 100644 (file)
@@ -165,8 +165,7 @@ static      int     cert_sign       (struct exten *, struct value *);
 static struct cert_info *cert_install (struct exten *, struct peer *);
 static int     cert_hike       (struct peer *, struct cert_info *);
 static void    cert_free       (struct cert_info *);
-static struct pkey_info *crypto_key (char *, char *, struct
-                                   sockaddr_storage *);
+static struct pkey_info *crypto_key (char *, char *, sockaddr_u *);
 static void    bighash         (BIGNUM *, BIGNUM *);
 static struct cert_info *crypto_cert (char *);
 
@@ -189,8 +188,8 @@ readlink(char * link, char * file, int len) {
  */
 keyid_t
 session_key(
-       struct sockaddr_storage *srcadr, /* source address */
-       struct sockaddr_storage *dstadr, /* destination address */
+       sockaddr_u *srcadr,     /* source address */
+       sockaddr_u *dstadr,     /* destination address */
        keyid_t keyno,          /* key ID */
        keyid_t private,        /* private value */
        u_long  lifetime        /* key lifetime */
@@ -210,21 +209,19 @@ session_key(
         * greater than zero, install the key and call it trusted.
         */
        hdlen = 0;
-       switch(srcadr->ss_family) {
+       switch(AF(srcadr)) {
        case AF_INET:
-               header[0] =
-                   ((struct sockaddr_in *)srcadr)->sin_addr.s_addr;
-               header[1] =
-                   ((struct sockaddr_in *)dstadr)->sin_addr.s_addr;
+               header[0] = NSRCADR(srcadr);
+               header[1] = NSRCADR(dstadr);
                header[2] = htonl(keyno);
                header[3] = htonl(private);
                hdlen = 4 * sizeof(u_int32);
                break;
 
        case AF_INET6:
-               memcpy(&header[0], &GET_INADDR6(*srcadr),
+               memcpy(&header[0], PSOCK_ADDR6(srcadr),
                    sizeof(struct in6_addr));
-               memcpy(&header[4], &GET_INADDR6(*dstadr),
+               memcpy(&header[4], PSOCK_ADDR6(dstadr),
                    sizeof(struct in6_addr));
                header[8] = htonl(keyno);
                header[9] = htonl(private);
@@ -240,13 +237,10 @@ session_key(
                MD5auth_setkey(keyno, dgst, len);
                authtrust(keyno, lifetime);
        }
-#ifdef DEBUG
-       if (debug > 1)
-               printf(
-                   "session_key: %s > %s %08x %08x hash %08x life %lu\n",
+       DPRINTF(2, ("session_key: %s > %s %08x %08x hash %08x life %lu\n",
                    stoa(srcadr), stoa(dstadr), keyno,
-                   private, keyid, lifetime);
-#endif
+                   private, keyid, lifetime));
+
        return (keyid);
 }
 
@@ -1073,7 +1067,7 @@ crypto_xmit(
 {
        struct exten *fp;       /* extension pointers */
        struct cert_info *cp, *xp, *yp; /* cert info/value pointer */
-       struct sockaddr_storage *srcadr_sin; /* source address */
+       sockaddr_u *srcadr_sin; /* source address */
        u_int32 *pkt;           /* packet pointer */
        u_int   opcode;         /* extension field opcode */
        char    certname[MAXHOSTNAME + 1]; /* subject name buffer */
@@ -3268,8 +3262,7 @@ cert_parse(
                X509_free(cert);
                return (NULL);
        }
-       ret->subject = emalloc(strlen(ptr) + 1);
-       strcpy(ret->subject, ptr + 3);
+       ret->subject = estrdup(ptr + 3);
 
        /*
         * Extract remaining objects. Note that the NTP serial number is
@@ -3291,8 +3284,7 @@ cert_parse(
                X509_free(cert);
                return (NULL);
        }
-       ret->issuer = emalloc(strlen(ptr) + 1);
-       strcpy(ret->issuer, ptr + 3);
+       ret->issuer = estrdup(ptr + 3);
        ret->first = asn2ntp(X509_get_notBefore(cert));
        ret->last = asn2ntp(X509_get_notAfter(cert));
 
@@ -3433,7 +3425,7 @@ static struct pkey_info *
 crypto_key(
        char    *cp,            /* file name */
        char    *passwd1,       /* password */
-       struct sockaddr_storage *addr /* IP address */
+       sockaddr_u *addr        /* IP address */
        )
 {
        FILE    *str;           /* file handle */
index bf5f5ff1a3e49c54ae6f194dab7bf477ebe3b521..2d1869ca980a6aecb176ed7b049439b5f56feafb 100644 (file)
@@ -50,9 +50,9 @@
  */
 struct conf_entry {
        struct conf_entry *ce_next;
-       char *ce_name;                  /* name we are trying to resolve */
-       struct conf_peer ce_config;     /* configuration info for peer */
-       struct sockaddr_storage peer_store; /* address info for both fams */
+       char *ce_name;                  /* name to resolve */
+       struct conf_peer ce_config;     /* config info for peer */
+       sockaddr_u peer_store;          /* address info for both fams */
 };
 #define        ce_peeraddr     ce_config.peeraddr
 #define        ce_peeraddr6    ce_config.peeraddr6
@@ -436,7 +436,7 @@ addentry(
 #ifdef ISC_PLATFORM_HAVEIPV6
        ce->ce_peeraddr6 = in6addr_any;
 #endif
-       ANYSOCK(&ce->peer_store);
+       ZERO_SOCK(&ce->peer_store);
        ce->ce_hmode = (u_char)mode;
        ce->ce_version = (u_char)version;
        ce->ce_minpoll = (u_char)minpoll;
@@ -481,13 +481,13 @@ findhostaddr(
 
        checkparent();          /* make sure our guy is still running */
 
-       if (entry->ce_name != NULL && !SOCKNUL(&entry->peer_store)) {
+       if (entry->ce_name != NULL && !SOCK_UNSPEC(&entry->peer_store)) {
                /* HMS: Squawk? */
                msyslog(LOG_ERR, "findhostaddr: both ce_name and ce_peeraddr are defined...");
                return 1;
        }
 
-       if (entry->ce_name == NULL && SOCKNUL(&entry->peer_store)) {
+       if (entry->ce_name == NULL && SOCK_UNSPEC(&entry->peer_store)) {
                msyslog(LOG_ERR, "findhostaddr: both ce_name and ce_peeraddr are undefined!");
                return 0;
        }
@@ -506,14 +506,14 @@ findhostaddr(
 
                error = getaddrinfo(entry->ce_name, NULL, &hints, &addr);
                if (error == 0) {
-                       entry->peer_store = *((struct sockaddr_storage*)(addr->ai_addr));
-                       if (entry->peer_store.ss_family == AF_INET) {
+                       entry->peer_store = *((sockaddr_u *)(addr->ai_addr));
+                       if (IS_IPV4(&entry->peer_store)) {
                                entry->ce_peeraddr =
-                                   GET_INADDR(entry->peer_store);
+                                   NSRCADR(&entry->peer_store);
                                entry->ce_config.v6_flag = 0;
                        } else {
                                entry->ce_peeraddr6 =
-                                   GET_INADDR6(entry->peer_store);
+                                   SOCK_ADDR6(&entry->peer_store);
                                entry->ce_config.v6_flag = 1;
                        }
                }
@@ -1155,7 +1155,7 @@ doconfigure(
                            "doconfigure: <%s> has peeraddr %s",
                            ce->ce_name, stoa(&ce->peer_store));
 #endif
-               if (dores && SOCKNUL(&(ce->peer_store))) {
+               if (dores && SOCK_UNSPEC(&ce->peer_store)) {
                        if (!findhostaddr(ce)) {
 #ifndef IGNORE_DNS_ERRORS
                                msyslog(LOG_ERR,
@@ -1169,7 +1169,7 @@ doconfigure(
                        }
                }
 
-               if (!SOCKNUL(&ce->peer_store)) {
+               if (!SOCK_UNSPEC(&ce->peer_store)) {
                        if (request(&ce->ce_config)) {
                                ceremove = ce;
                                ce = ceremove->ce_next;
index 08c912b1641fdadb7dd067f401c676f7e026ddd3..898c4c2b966501dfdffdd369d1dadd319701ea28 100644 (file)
@@ -7,6 +7,27 @@
 # include <config.h>
 #endif
 
+#include <stdio.h>
+#include <signal.h>
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#ifdef HAVE_SYS_SOCKIO_H       /* UXPV: SIOC* #defines (Frank Vance <fvance@waii.com>) */
+# include <sys/sockio.h>
+#endif
+#ifdef HAVE_SYS_UIO_H
+# include <sys/uio.h>
+#endif
+#ifdef HAS_ROUTING_SOCKET
+# include <net/route.h>
+# ifdef HAVE_RTNETLINK
+#  include <linux/rtnetlink.h>
+# endif
+#endif
+
 #include "ntp_machine.h"
 #include "ntpd.h"
 #include "ntp_io.h"
 #include "ntpsim.h"
 #endif
 
-#include <stdio.h>
-#include <signal.h>
-#ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif /* HAVE_SYS_PARAM_H */
-#ifdef HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-#endif
-#ifdef HAVE_SYS_SOCKIO_H       /* UXPV: SIOC* #defines (Frank Vance <fvance@waii.com>) */
-# include <sys/sockio.h>
-#endif
-#ifdef HAVE_SYS_UIO_H
-# include <sys/uio.h>
-#endif
 
 /*
  * setsockopt does not always have the same arg declaration
@@ -107,17 +114,6 @@ ISC_LIST(limit_address_t) limit_address_list;
 #if defined(SYS_WINNT)
 #include <transmitbuff.h>
 #include <isc/win32os.h>
-/*
- * Define this macro to control the behavior of connection
- * resets on UDP sockets.  See Microsoft KnowledgeBase Article Q263823
- * for details.
- * NOTE: This requires that Windows 2000 systems install Service Pack 2
- * or later.
- */
-#ifndef SIO_UDP_CONNRESET 
-#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12) 
-#endif
-
 /*
  * Windows C runtime ioctl() can't deal properly with sockets, 
  * map to ioctlsocket for this source file.
@@ -148,8 +144,8 @@ ISC_LIST(limit_address_t) limit_address_list;
 volatile u_long packets_dropped;       /* total number of packets dropped on reception */
 volatile u_long packets_ignored;       /* packets received on wild card interface */
 volatile u_long packets_received;      /* total number of packets received */
-u_long packets_sent;   /* total number of packets sent */
-u_long packets_notsent; /* total number of packets which couldn't be sent */
+        u_long packets_sent;           /* total number of packets sent */
+        u_long packets_notsent;        /* total number of packets which couldn't be sent */
 
 volatile u_long handler_calls; /* number of calls to interrupt handler */
 volatile u_long handler_pkts;  /* number of pkts received by handler */
@@ -162,10 +158,10 @@ struct interface *any_interface;  /* default ipv4 interface */
 struct interface *any6_interface;      /* default ipv6 interface */
 struct interface *loopback_interface;  /* loopback ipv4 interface */
 
-isc_boolean_t  broadcast_client_enabled = ISC_FALSE;   /* is broadcast client enabled */
+isc_boolean_t broadcast_client_enabled;        /* is broadcast client enabled */
 int ninterfaces;                       /* Total number of interfaces */
 
-volatile int disable_dynamic_updates;   /* when set to != 0 dynamic updates won't happen */
+int disable_dynamic_updates;           /* scan interfaces once only */
 
 #ifdef REFCLOCK
 /*
@@ -184,19 +180,6 @@ static     struct refclockio *refio;
 # endif
 #endif
 
-/*
- * Define what the possible "soft" errors can be.  These are non-fatal returns
- * of various network related functions, like recv() and so on.
- *
- * For some reason, BSDI (and perhaps others) will sometimes return <0
- * from recv() but will have errno==0.  This is broken, but we have to
- * work around it here.
- */
-#define SOFT_ERROR(e)  ((e) == EAGAIN || \
-                        (e) == EWOULDBLOCK || \
-                        (e) == EINTR || \
-                        (e) == 0)
-
 /*
  * File descriptor masks etc. for call to select
  * Not needed for I/O Completion Ports
@@ -206,42 +189,44 @@ int maxactivefd;
 /*
  * bit alternating value to detect verified interfaces during an update cycle
  */
-static  u_char          sys_interphase = 0;
+static  u_short                sys_interphase = 0;
 
-static  struct interface *new_interface (struct interface *);
-static  void add_interface (struct interface *);
-static  int update_interfaces (u_short, interface_receiver_t, void *);
-static  void remove_interface (struct interface *);
-static  struct interface *create_interface (u_short, struct interface *);
+static struct interface *new_interface (struct interface *);
+static void            add_interface   (struct interface *);
+static int             update_interfaces(u_short, interface_receiver_t, void *);
+static void            remove_interface(struct interface *);
+static struct interface *create_interface(u_short, struct interface *);
 
-static int     move_fd         (SOCKET);
+static int             move_fd         (SOCKET);
 
 /*
  * Multicast functions
  */
-static isc_boolean_t   addr_ismulticast         (struct sockaddr_storage *);
+static isc_boolean_t   addr_ismulticast        (sockaddr_u *);
 /*
  * Not all platforms support multicast
  */
 #ifdef MCAST
-static isc_boolean_t   socket_multicast_enable  (struct interface *, int, struct sockaddr_storage *);
-static isc_boolean_t   socket_multicast_disable (struct interface *, struct sockaddr_storage *);
+static isc_boolean_t   socket_multicast_enable (struct interface *, int, sockaddr_u *);
+static isc_boolean_t   socket_multicast_disable(struct interface *, sockaddr_u *);
 #endif
 
 #ifdef DEBUG
+static void interface_dump     (struct interface *);
+static void sockaddr_dump      (sockaddr_u *psau);
 static void print_interface    (struct interface *, char *, char *);
-#define DPRINT_INTERFACE(_LVL_, _ARGS_) do { if (debug >= (_LVL_)) { print_interface _ARGS_; } } while (0)
+#define DPRINT_INTERFACE(level, args) do { if (debug >= (level)) { print_interface args; } } while (0)
 #else
-#define DPRINT_INTERFACE(_LVL_, _ARGS_) do {} while (0)
+#define DPRINT_INTERFACE(level, args) do {} while (0)
 #endif
 
 typedef struct vsock vsock_t;
 enum desc_type { FD_TYPE_SOCKET, FD_TYPE_FILE };
 
 struct vsock {
-       SOCKET                          fd;
-       enum desc_type                  type;
-       ISC_LINK(vsock_t)               link;
+       SOCKET                  fd;
+       enum desc_type          type;
+       ISC_LINK(vsock_t)       link;
 };
 
 #if !defined(HAVE_IO_COMPLETION_PORT) && defined(HAS_ROUTING_SOCKET)
@@ -253,10 +238,10 @@ struct vsock {
  * like e. g. routing sockets
  */
 struct asyncio_reader {
-       SOCKET fd;                                  /* fd to be read */
-       void  *data;                                /* possibly local data */
+       SOCKET fd;                                  /* fd to be read */
+       void  *data;                                /* possibly local data */
        void (*receiver)(struct asyncio_reader *);  /* input handler */
-       ISC_LINK(struct asyncio_reader) link;       /* the list this is being kept in */
+       ISC_LINK(struct asyncio_reader) link;       /* the list this is being kept in */
 };
 
 ISC_LIST(struct asyncio_reader) asyncio_reader_list;
@@ -271,20 +256,20 @@ static void remove_asyncio_reader (struct asyncio_reader *);
 static void init_async_notifications (void);
 
 static int create_sockets      (u_short);
-static SOCKET  open_socket     (struct sockaddr_storage *, int, int, struct interface *);
+static SOCKET  open_socket     (sockaddr_u *, int, int, struct interface *);
 static char *  fdbits          (int, fd_set *);
 static void    set_reuseaddr   (int);
-static isc_boolean_t   socket_broadcast_enable  (struct interface *, SOCKET, struct sockaddr_storage *);
-static isc_boolean_t   socket_broadcast_disable (struct interface *, struct sockaddr_storage *);
+static isc_boolean_t   socket_broadcast_enable  (struct interface *, SOCKET, sockaddr_u *);
+static isc_boolean_t   socket_broadcast_disable (struct interface *, sockaddr_u *);
 
 ISC_LIST(vsock_t)      fd_list;
 
 typedef struct remaddr remaddr_t;
 
 struct remaddr {
-      struct sockaddr_storage   addr;
-      struct interface               *interface;
-      ISC_LINK(remaddr_t)       link;
+       sockaddr_u              addr;
+       struct interface *      interface;
+       ISC_LINK(remaddr_t)     link;
 };
 
 ISC_LIST(remaddr_t)       remoteaddr_list;
@@ -296,19 +281,19 @@ static struct interface *wildipv6 = NULL;
 
 static void    add_fd_to_list  (SOCKET, enum desc_type);
 static void    close_and_delete_fd_from_list   (SOCKET);
-static void    add_addr_to_list        (struct sockaddr_storage *, struct interface *);
-static void    delete_addr_from_list   (struct sockaddr_storage *);
+static void    add_addr_to_list        (sockaddr_u *, struct interface *);
+static void    delete_addr_from_list   (sockaddr_u *);
 static void    delete_interface_from_list      (struct interface *);
-static struct interface *find_addr_in_list     (struct sockaddr_storage *);
-static struct interface *find_samenet_addr_in_list (struct sockaddr_storage *);
-static struct interface *find_flagged_addr_in_list (struct sockaddr_storage *, int);
+static struct interface *find_addr_in_list     (sockaddr_u *);
+static struct interface *find_samenet_addr_in_list (sockaddr_u *);
+static struct interface *find_flagged_addr_in_list (sockaddr_u *, int);
 static void    create_wildcards        (u_short);
 static isc_boolean_t   address_okay    (isc_interface_t *);
 static void            convert_isc_if          (isc_interface_t *, struct interface *, u_short);
-static struct interface *getinterface  (struct sockaddr_storage *, int);
-static struct interface *getsamenetinterface   (struct sockaddr_storage *, int);
-static struct interface *findlocalinterface    (struct sockaddr_storage *, int, int);
-static struct interface *findlocalcastinterface        (struct sockaddr_storage *, int);
+static struct interface *getinterface  (sockaddr_u *, int);
+static struct interface *getsamenetinterface   (sockaddr_u *, int);
+static struct interface *findlocalinterface    (sockaddr_u *, int, int);
+static struct interface *findlocalcastinterface        (sockaddr_u *);
 
 /*
  * Routines to read the ntp packets
@@ -331,11 +316,11 @@ static inline int     read_refclock_packet        (SOCKET, struct refclockio *, l_fp);
  */
 void
 connection_reset_fix(
-       SOCKET fd,
-       struct sockaddr_storage *addr
+       SOCKET          fd,
+       sockaddr_u *    addr
        )
 {
-       DWORD dwBytesReturned = 0;
+       DWORD dw;
        BOOL  bNewBehavior = FALSE;
        DWORD status;
 
@@ -346,11 +331,11 @@ connection_reset_fix(
        if (isc_win32os_majorversion() >= 5) {
                status = WSAIoctl(fd, SIO_UDP_CONNRESET, &bNewBehavior,
                                  sizeof(bNewBehavior), NULL, 0,
-                                 &dwBytesReturned, NULL, NULL);
+                                 &dw, NULL, NULL);
                if (SOCKET_ERROR == status)
-                       netsyslog(LOG_ERR, "connection_reset_fix() "
-                                          "failed for address %s: %m", 
-                                          stoa(addr));
+                       msyslog(LOG_ERR,
+                               "connection_reset_fix() failed for address %s: %m", 
+                               stoa(addr));
        }
 }
 #endif
@@ -358,12 +343,12 @@ connection_reset_fix(
 /*
  * on Unix systems the stdio library typically
  * makes use of file descriptors in the lower
- * integer range. stdio usually will make use
- * of the file descriptor in the range of
+ * integer range.  stdio usually will make use
+ * of the file descriptors in the range of
  * [0..FOPEN_MAX)
- * in order to keep this range clean for socket
+ * in order to keep this range clean, for socket
  * file descriptors we attempt to move them above
- * FOPEM_MAX. This is not as easy as it sounds as
+ * FOPEN_MAX. This is not as easy as it sounds as
  * FOPEN_MAX changes from implementation to implementation
  * and may exceed to current file decriptor limits.
  * We are using following strategy:
@@ -384,7 +369,10 @@ connection_reset_fix(
  *     allocation is possible or 0 is reached - at this
  *     point the algrithm will be disabled
  */
-static int move_fd(SOCKET fd)
+static int
+move_fd(
+       SOCKET fd
+       )
 {
 #if !defined(SYS_WINNT) && defined(F_DUPFD)
 #ifndef FD_CHUNK
@@ -425,7 +413,8 @@ static int move_fd(SOCKET fd)
                socket_boundary = max(0, min(getdtablesize() - FD_CHUNK, 
                                             min(FOPEN_MAX, FD_PREFERRED_SOCKBOUNDARY)));
 #ifdef DEBUG
-               msyslog(LOG_DEBUG, "ntp_io: estimated max descriptors: %d, initial socket boundary: %d",
+               msyslog(LOG_DEBUG,
+                       "ntp_io: estimated max descriptors: %d, initial socket boundary: %d",
                        getdtablesize(), socket_boundary);
 #endif
        }
@@ -441,21 +430,22 @@ static int move_fd(SOCKET fd)
                        
                        if (newfd != -1) {
                                /* success: drop the old one - return the new one */
-                               (void)close(fd);
-                               return (newfd);
+                               close(fd);
+                               return newfd;
                        }
                } else {
                        /* outside reserved range: no work - return the original one */
-                       return (fd);
+                       return fd;
                }
                socket_boundary = max(0, socket_boundary - FD_CHUNK);
 #ifdef DEBUG
-               msyslog(LOG_DEBUG, "ntp_io: selecting new socket boundary: %d",
+               msyslog(LOG_DEBUG,
+                       "ntp_io: selecting new socket boundary: %d",
                        socket_boundary);
 #endif
        } while (socket_boundary > 0);
 #endif /* !defined(SYS_WINNT) && defined(F_DUPFD) */
-       return (fd);
+       return fd;
 }
 
 #ifdef DEBUG_TIMING
@@ -469,16 +459,19 @@ static int move_fd(SOCKET fd)
 void
 collect_timing(struct recvbuf *rb, const char *tag, int count, l_fp *dts)
 {
-       char buf[2048];
+       char buf[256];
 
        snprintf(buf, sizeof(buf), "%s %d %s %s", 
-                (rb != NULL) ? 
-                ((rb->dstadr) ? stoa(&rb->recv_srcadr) : "-REFCLOCK-") : "-",
+                (rb != NULL)
+                    ? ((rb->dstadr != NULL)
+                           ? stoa(&rb->recv_srcadr)
+                           : "-REFCLOCK-")
+                    : "-",
                 count, lfptoa(dts, 9), tag);
        record_timing_stats(buf);
 }
 #endif
-  
+
 /*
  * About dynamic interfaces, sockets, reception and more...
  *
@@ -527,10 +520,12 @@ init_io(void)
 
        if (!Win32InitSockets())
        {
-               netsyslog(LOG_ERR, "No useable winsock.dll: %m");
+               msyslog(LOG_ERR, "No useable winsock.dll: %m");
                exit(1);
        }
+#if 0                          /* transmitbuff code unused */
        init_transmitbuff();
+#endif
 #endif /* SYS_WINNT */
 
        /*
@@ -561,7 +556,7 @@ init_io(void)
        ISC_LIST_INIT(asyncio_reader_list);
 #endif
 
-        ISC_LIST_INIT(remoteaddr_list);
+       ISC_LIST_INIT(remoteaddr_list);
 
        ISC_LIST_INIT(inter_list);
 
@@ -569,7 +564,7 @@ init_io(void)
         * Create the sockets
         */
        BLOCKIO();
-       (void) create_sockets(htons(NTP_PORT));
+       create_sockets(NTP_PORT);
        UNBLOCKIO();
 
        init_async_notifications();
@@ -585,41 +580,15 @@ init_io(void)
 void
 interface_dump(struct interface *itf)
 {
-       u_char* cp;
-       int i;
-       /* Limit the size of the sockaddr_storage hex dump */
-       int maxsize = min(32, sizeof(struct sockaddr_storage));
-
        printf("Dumping interface: %p\n", itf);
        printf("fd = %d\n", itf->fd);
        printf("bfd = %d\n", itf->bfd);
-       printf("sin = %s,\n", stoa(&(itf->sin)));
-       cp = (u_char*) &(itf->sin);
-       for(i = 0; i < maxsize; i++)
-       {
-               printf("%02x", *cp++);
-               if((i+1)%4 == 0)
-                       printf(" ");
-       }
-       printf("\n");
-       printf("bcast = %s,\n", stoa(&(itf->bcast)));
-       cp = (u_char*) &(itf->bcast);
-       for(i = 0; i < maxsize; i++)
-       {
-               printf("%02x", *cp++);
-               if((i+1)%4 == 0)
-                       printf(" ");
-       }
-       printf("\n");
-       printf("mask = %s,\n", stoa(&(itf->mask)));
-       cp = (u_char*) &(itf->mask);
-       for(i = 0; i < maxsize; i++)
-       {
-               printf("%02x", *cp++);
-               if((i+1)%4 == 0)
-                       printf(" ");
-       }
-       printf("\n");
+       printf("sin = %s,\n", stoa(&itf->sin));
+       sockaddr_dump(&itf->sin);
+       printf("bcast = %s,\n", stoa(&itf->bcast));
+       sockaddr_dump(&itf->bcast);
+       printf("mask = %s,\n", stoa(&itf->mask));
+       sockaddr_dump(&itf->mask);
        printf("name = %s\n", itf->name);
        printf("flags = 0x%08x\n", itf->flags);
        printf("last_ttl = %d\n", itf->last_ttl);
@@ -634,13 +603,35 @@ interface_dump(struct interface *itf)
        printf("phase = %u\n", itf->phase);
 }
 
+/*
+ * sockaddr_dump - hex dump the start of a sockaddr_u
+ */
+static void
+sockaddr_dump(sockaddr_u *psau)
+{
+       /* Limit the size of the sockaddr_storage hex dump */
+       const int maxsize = min(32, sizeof(psau->sas));
+       u_char *        cp;
+       int             i;
+
+       cp = (u_char *)&psau->sas;
+
+       for(i = 0; i < maxsize; i++)
+       {
+               printf("%02x", *cp++);
+               if (!((i + 1) % 4))
+                       printf(" ");
+       }
+       printf("\n");
+}
+
 /*
  * print_interface - helper to output debug information
  */
 static void
 print_interface(struct interface *iface, char *pfx, char *sfx)
 {
-       printf("%sinterface #%d: fd=%d, bfd=%d, name=%s, flags=0x%x, scope=%d, ifindex=%d",
+       printf("%sinterface #%d: fd=%d, bfd=%d, name=%s, flags=0x%x, scope=%d, ifindex=%d, sin=%s",
               pfx,
               iface->ifnum,
               iface->fd,
@@ -648,21 +639,21 @@ print_interface(struct interface *iface, char *pfx, char *sfx)
               iface->name,
               iface->flags,
               iface->scopeid,
-              iface->ifindex);
-       /* Leave these as three printf calls (stoa() static buffer). */
-       printf(", sin=%s",
-              stoa((&iface->sin)));
-       if (iface->flags & INT_BROADCAST)
-               printf(", bcast=%s,",
-                      stoa((&iface->bcast)));
-       if (iface->family == AF_INET)
-         printf(", mask=%s",
-                stoa((&iface->mask)));
-       printf(", %s:%s", iface->ignore_packets == ISC_FALSE ? "Enabled" : "Disabled", sfx);
+              iface->ifindex,
+              stoa(&iface->sin));
+       if (AF_INET == iface->family) {
+               if (iface->flags & INT_BROADCAST)
+                       printf(", bcast=%s", stoa(&iface->bcast));
+               printf(", mask=%s", stoa(&iface->mask));
+       }
+       printf(", %s:%s",
+              (iface->ignore_packets) 
+                  ? "Disabled"
+                  : "Enabled",
+              sfx);
        if (debug > 4)  /* in-depth debugging only */
                interface_dump(iface);
 }
-
 #endif
 
 #if !defined(HAVE_IO_COMPLETION_PORT) && defined(HAS_ROUTING_SOCKET)
@@ -670,13 +661,13 @@ print_interface(struct interface *iface, char *pfx, char *sfx)
  * create an asyncio_reader structure
  */
 static struct asyncio_reader *
-new_asyncio_reader()
+new_asyncio_reader(void)
 {
        struct asyncio_reader *reader;
 
-       reader = (struct asyncio_reader *)emalloc(sizeof(struct asyncio_reader));
+       reader = emalloc(sizeof(*reader));
 
-       memset((char *)reader, 0, sizeof(*reader));
+       memset(reader, 0, sizeof(*reader));
        ISC_LINK_INIT(reader, link);
        reader->fd = INVALID_SOCKET;
        return reader;
@@ -686,7 +677,9 @@ new_asyncio_reader()
  * delete a reader
  */
 static void
-delete_asyncio_reader(struct asyncio_reader *reader)
+delete_asyncio_reader(
+       struct asyncio_reader *reader
+       )
 {
        free(reader);
 }
@@ -695,7 +688,9 @@ delete_asyncio_reader(struct asyncio_reader *reader)
  * add asynchio_reader
  */
 static void
-add_asyncio_reader(struct asyncio_reader *reader, enum desc_type type)
+add_asyncio_reader(
+       struct asyncio_reader * reader, 
+       enum desc_type          type)
 {
        ISC_LIST_APPEND(asyncio_reader_list, reader, link);
        add_fd_to_list(reader->fd, type);
@@ -705,9 +700,12 @@ add_asyncio_reader(struct asyncio_reader *reader, enum desc_type type)
  * remove asynchio_reader
  */
 static void
-remove_asyncio_reader(struct asyncio_reader *reader)
+remove_asyncio_reader(
+       struct asyncio_reader *reader
+       )
 {
-       ISC_LIST_UNLINK_TYPE(asyncio_reader_list, reader, link, struct asyncio_reader);
+       ISC_LIST_UNLINK_TYPE(asyncio_reader_list, reader, link,
+                            struct asyncio_reader);
 
        if (reader->fd != INVALID_SOCKET)
                close_and_delete_fd_from_list(reader->fd);
@@ -723,16 +721,17 @@ remove_asyncio_reader(struct asyncio_reader *reader)
  * see the bind9/getaddresses.c for details
  */
 isc_boolean_t
-is_ip_address( const char *host, isc_netaddr_t *addr)
+is_ip_address(
+       const char *    host,
+       isc_netaddr_t * addr
+       )
 {
        struct in_addr in4;
        struct in6_addr in6;
-/*
- * PDM Implement later
 
-       REQUIRE(host != NULL);
-       REQUIRE(addrs != NULL);
-*/
+       NTP_REQUIRE(host != NULL);
+       NTP_REQUIRE(addr != NULL);
+
        /*
         * Try IPv4, then IPv6.  In order to handle the extended format
         * for IPv6 scoped addresses (address%scope_ID), we'll use a local
@@ -768,25 +767,29 @@ is_ip_address( const char *host, isc_netaddr_t *addr)
  * Specific interface code
  */
 void
-add_specific_interface (const char *if_name)
+add_specific_interface(
+       const char *if_name
+       )
 {
-       specific_interface_t *iface;
-       isc_netaddr_t *addr;
-       addr = emalloc(sizeof(isc_netaddr_t));
+       specific_interface_t *siface;
+       isc_netaddr_t *naddr;
+
+       naddr = emalloc(sizeof(*naddr));
 
-       if (is_ip_address(if_name, addr) == ISC_TRUE) {
-               add_limit_address(addr);
+       if (is_ip_address(if_name, naddr)) {
+               add_limit_address(naddr);
        } else {
-               free(addr);
-               iface = (specific_interface_t *)emalloc(sizeof(specific_interface_t));
-               iface->name = if_name;
-               ISC_LINK_INIT(iface, link);
-               ISC_LIST_APPEND(specific_interface_list, iface, link);
+               free(naddr);
+               siface = emalloc(sizeof(*siface));
+               siface->name = if_name;
+               ISC_LINK_INIT(siface, link);
+               ISC_LIST_APPEND(specific_interface_list, siface, link);
        }
        interface_optioncount++;
 }
+
 void
-init_specific_interface (void)
+init_specific_interface(void)
 {
        ISC_LIST_INIT(specific_interface_list);
        init_limit_address();
@@ -796,17 +799,19 @@ init_specific_interface (void)
  * Limit address code
  */
 void
-add_limit_address (const isc_netaddr_t *addr)
+add_limit_address(
+       const isc_netaddr_t *addr
+       )
 {
        limit_address_t *iaddr;
 
-       iaddr = (limit_address_t *)emalloc(sizeof(limit_address_t));
+       iaddr = emalloc(sizeof(*iaddr));
        iaddr->addr = addr;
        ISC_LIST_APPEND(limit_address_list, iaddr, link);
 }
 
 void
-init_limit_address (void)
+init_limit_address(void)
 {
        ISC_LIST_INIT(limit_address_list);
 }
@@ -815,10 +820,13 @@ init_limit_address (void)
  * interface list enumerator - visitor pattern
  */
 void
-interface_enumerate(interface_receiver_t receiver, void *data)
+interface_enumerate(
+       interface_receiver_t    receiver, 
+       void *                  data
+       )
 {
        interface_info_t ifi;
-        struct interface *interf;
+       struct interface *interf;
 
        ifi.action = IFS_EXISTS;
        
@@ -826,7 +834,7 @@ interface_enumerate(interface_receiver_t receiver, void *data)
             interf != NULL;
             interf = ISC_LIST_NEXT(interf, link)) {
                ifi.interface = interf;
-               receiver(data, &ifi);
+               (*receiver)(data, &ifi);
        }
 }
 
@@ -834,63 +842,68 @@ interface_enumerate(interface_receiver_t receiver, void *data)
  * do standard initialization of interface structure
  */
 static void
-init_interface(struct interface *interface)
+init_interface(
+       struct interface *iface
+       )
 {
-       memset((char *)interface, 0, sizeof(struct interface));
-       ISC_LINK_INIT(interface, link);
-       ISC_LIST_INIT(interface->peers);
-       interface->fd = INVALID_SOCKET;
-       interface->bfd = INVALID_SOCKET;
-       interface->num_mcast = 0;
-       interface->received = 0;
-       interface->sent = 0;
-       interface->notsent = 0;
-       interface->peercnt = 0;
-       interface->phase = sys_interphase;
+       memset(iface, 0, sizeof(*iface));
+       ISC_LINK_INIT(iface, link);
+       ISC_LIST_INIT(iface->peers);
+       iface->fd = INVALID_SOCKET;
+       iface->bfd = INVALID_SOCKET;
+       iface->phase = sys_interphase;
 }
 
+
 /*
  * create new interface structure initialize from
  * template structure or via standard initialization
  * function
  */
 static struct interface *
-new_interface(struct interface *interface)
+new_interface(
+       struct interface *interface
+       )
 {
-       static u_int sys_ifnum = 0;
+       static u_int            sys_ifnum = 0;
+       struct interface *      iface;
 
-       struct interface *iface = (struct interface *)emalloc(sizeof(struct interface));
+       iface = emalloc(sizeof(*iface));
 
-       if (interface != NULL)
-       {
-               memcpy((char*)iface, (char*)interface, sizeof(*interface));
-       }
-       else
-       {
+       if (NULL == interface)
                init_interface(iface);
-       }
+       else                            /* use the template */
+               memcpy(iface, interface, sizeof(*iface));
 
-       iface->ifnum = sys_ifnum++;  /* count every new instance of an interface in the system */
+       /* count every new instance of an interface in the system */
+       iface->ifnum = sys_ifnum++;
        iface->starttime = current_time;
 
        return iface;
 }
 
+
 /*
  * return interface storage into free memory pool
  */
-static void
-delete_interface(struct interface *interface)
+static inline void
+delete_interface(
+       struct interface *interface
+       )
 {
        free(interface);
 }
 
+
 /*
  * link interface into list of known interfaces
  */
 static void
-add_interface(struct interface *interface)
+add_interface(
+       struct interface *interface
+       )
 {
+#ifdef DEBUG
        static struct interface *listhead = NULL;
 
        /*
@@ -909,6 +922,7 @@ add_interface(struct interface *interface)
                        listhead, inter_list.head);
                exit(1);
        }
+#endif
        /*
         * Calculate the address hash
         */
@@ -918,99 +932,105 @@ add_interface(struct interface *interface)
        ninterfaces++;
 }
 
+
 /*
  * remove interface from known interface list and clean up
  * associated resources
  */
 static void
-remove_interface(struct interface *interface)
+remove_interface(
+       struct interface *iface
+       )
 {
-       struct sockaddr_storage resmask;
+       sockaddr_u resmask;
 
-       ISC_LIST_UNLINK_TYPE(inter_list, interface, link, struct interface);
+       ISC_LIST_UNLINK_TYPE(inter_list, iface, link,
+                            struct interface);
 
-       delete_interface_from_list(interface);
+       delete_interface_from_list(iface);
   
-       if (interface->fd != INVALID_SOCKET) 
-       {
-               msyslog(LOG_INFO, "Deleting interface #%d %s, %s#%d, interface stats: received=%ld, sent=%ld, dropped=%ld, active_time=%ld secs",
-                       interface->ifnum,
-                       interface->name,
-                       stoa((&interface->sin)),
-                       NTP_PORT,  /* XXX should extract port from sin structure */
-                       interface->received,
-                       interface->sent,
-                       interface->notsent,
-                       current_time - interface->starttime);
-
-               close_and_delete_fd_from_list(interface->fd);
+       if (iface->fd != INVALID_SOCKET) {
+               msyslog(LOG_INFO,
+                       "Deleting interface #%d %s, %s#%d, interface stats: received=%ld, sent=%ld, dropped=%ld, active_time=%ld secs",
+                       iface->ifnum,
+                       iface->name,
+                       stoa(&iface->sin),
+                       SRCPORT(&iface->sin),
+                       iface->received,
+                       iface->sent,
+                       iface->notsent,
+                       current_time - iface->starttime);
+
+               close_and_delete_fd_from_list(iface->fd);
        }
-  
-       if (interface->bfd != INVALID_SOCKET) 
-       {
-               msyslog(LOG_INFO, "Deleting interface #%d %s, broadcast address %s#%d",
-                       interface->ifnum,
-                       interface->name,
-                       stoa((&interface->bcast)),
-                       (u_short) NTP_PORT);  /* XXX extract port from sin structure */
-               close_and_delete_fd_from_list(interface->bfd);
+
+       if (iface->bfd != INVALID_SOCKET) {
+               msyslog(LOG_INFO,
+                       "Deleting broadcast address %s#%d from interface #%d %s",
+                       stoa(&iface->bcast),
+                       SRCPORT(&iface->bcast),
+                       iface->ifnum,
+                       iface->name);
+
+               close_and_delete_fd_from_list(iface->bfd);
        }
 
        ninterfaces--;
-       ntp_monclearinterface(interface);
+       ntp_monclearinterface(iface);
 
        /* remove restrict interface entry */
-
-       /*
-        * Blacklist bound interface address
-        */
-       SET_HOSTMASK(&resmask, interface->sin.ss_family);
-       hack_restrict(RESTRICT_REMOVEIF, &interface->sin, &resmask,
-                     RESM_NTPONLY|RESM_INTERFACE, RES_IGNORE);
+       SET_HOSTMASK(&resmask, AF(&iface->sin));
+       hack_restrict(RESTRICT_REMOVEIF, &iface->sin, &resmask,
+                     RESM_NTPONLY | RESM_INTERFACE, RES_IGNORE);
 }
 
+
 static void
-list_if_listening(struct interface *interface, u_short port)
+list_if_listening(
+       struct interface *      interface
+       )
 {
        msyslog(LOG_INFO, "Listening on interface #%d %s, %s#%d %s",
                interface->ifnum,
                interface->name,
-               stoa((&interface->sin)),
-               ntohs( (u_short) port),
-               (interface->ignore_packets == ISC_FALSE) ?
-               "Enabled": "Disabled");
+               stoa(&interface->sin),
+               SRCPORT(&interface->sin),
+               (interface->ignore_packets) 
+                   ? "Disabled"
+                   : "Enabled");
 }
 
+
 static void
-create_wildcards(u_short port) {
-       isc_boolean_t okipv4 = ISC_TRUE;
+create_wildcards(
+       u_short port
+       )
+{
+       struct interface *      interface;
+
        /*
         * create pseudo-interface with wildcard IPv4 address
         */
-#ifdef IPV6_V6ONLY
-       if(isc_net_probeipv4() != ISC_R_SUCCESS)
-               okipv4 = ISC_FALSE;
-#endif
+       if (ipv4_works) {
+               interface = new_interface(NULL);
 
-       if(okipv4 == ISC_TRUE) {
-               struct interface *interface = new_interface(NULL);
+               strncpy(interface->name, "wildcard", COUNTOF(interface->name));
+               interface->family =
+                       AF(&interface->sin) = 
+                       AF(&interface->mask) = AF_INET;
+               SET_ADDR4(&interface->sin, INADDR_ANY);
+               SET_PORT(&interface->sin, port);
+               SET_ONESMASK(&interface->mask);
 
-               interface->family = AF_INET;
-               interface->sin.ss_family = AF_INET;
-               ((struct sockaddr_in*)&interface->sin)->sin_addr.s_addr = htonl(INADDR_ANY);
-               ((struct sockaddr_in*)&interface->sin)->sin_port = port;
-               (void) strncpy(interface->name, "wildcard", sizeof(interface->name));
-               interface->mask.ss_family = AF_INET;
-               ((struct sockaddr_in*)&interface->mask)->sin_addr.s_addr = htonl(~(u_int32)0);
                interface->flags = INT_BROADCAST | INT_UP | INT_WILDCARD;
                interface->ignore_packets = ISC_TRUE;
 #if defined(MCAST)
                /*
-                * enable possible multicast reception on the broadcast socket
+                * enable multicast reception on the broadcast socket
                 */
-               interface->bcast.ss_family = AF_INET;
-               ((struct sockaddr_in*)&interface->bcast)->sin_port = port;
-               ((struct sockaddr_in*)&interface->bcast)->sin_addr.s_addr = htonl(INADDR_ANY);
+               AF(&interface->bcast) = AF_INET;
+               SET_ADDR4(&interface->bcast, INADDR_ANY);
+               SET_PORT(&interface->bcast, port);
 #endif /* MCAST */
                interface->fd = open_socket(&interface->sin,
                                 0, 1, interface);
@@ -1021,32 +1041,32 @@ create_wildcards(u_short port) {
                        
                        add_addr_to_list(&interface->sin, interface);
                        add_interface(interface);
-                       list_if_listening(interface, port);
+                       list_if_listening(interface);
                } else {
-                       msyslog(LOG_ERR, "unable to bind to wildcard socket address %s - another process may be running - EXITING",
-                               stoa((&interface->sin)));
+                       msyslog(LOG_ERR, 
+                               "unable to bind to wildcard address %s - another process may be running - EXITING",
+                               stoa(&interface->sin));
                        exit(1);
                }
-       DPRINT_INTERFACE(2, (interface, "created ", "\n"));
+               DPRINT_INTERFACE(2, (interface, "created ", "\n"));
        }
 
 #ifdef INCLUDE_IPV6_SUPPORT
        /*
         * create pseudo-interface with wildcard IPv6 address
         */
-       if (isc_net_probeipv6() == ISC_R_SUCCESS) {
-               struct interface *interface = new_interface(NULL);
-
-               interface->family = AF_INET6;
-               interface->sin.ss_family = AF_INET6;
-               ((struct sockaddr_in6*)&interface->sin)->sin6_addr = in6addr_any;
-               ((struct sockaddr_in6*)&interface->sin)->sin6_port = port;
-# ifdef ISC_PLATFORM_HAVESCOPEID
-               ((struct sockaddr_in6*)&interface->sin)->sin6_scope_id = 0;
-# endif
-               (void) strncpy(interface->name, "wildcard", sizeof(interface->name));
-               interface->mask.ss_family = AF_INET6;
-               memset(&((struct sockaddr_in6*)&interface->mask)->sin6_addr.s6_addr, 0xff, sizeof(struct in6_addr));
+       if (ipv6_works) {
+               interface = new_interface(NULL);
+
+               strncpy(interface->name, "wildcard", COUNTOF(interface->name));
+               interface->family =
+                       AF(&interface->sin) = 
+                       AF(&interface->mask) = AF_INET6;
+               SET_ADDR6N(&interface->sin, in6addr_any);
+               SET_PORT(&interface->sin, port);
+               SET_SCOPE(&interface->sin, 0);
+               SET_ONESMASK(&interface->mask);
+
                interface->flags = INT_UP | INT_WILDCARD;
                interface->ignore_packets = ISC_TRUE;
 
@@ -1058,19 +1078,27 @@ create_wildcards(u_short port) {
                        any6_interface = interface;
                        add_addr_to_list(&interface->sin, interface);
                        add_interface(interface);
-                       list_if_listening(interface, port);
+                       list_if_listening(interface);
                } else {
-                       msyslog(LOG_ERR, "unable to bind to wildcard socket address %s - another process may be running - EXITING",
-                               stoa((&interface->sin)));
+                       msyslog(LOG_ERR,
+                               "unable to bind to wildcard address %s - another process may be running - EXITING",
+                               stoa(&interface->sin));
                        exit(1);
                }
-       DPRINT_INTERFACE(2, (interface, "created ", "\n"));
+               DPRINT_INTERFACE(2, (interface, "created ", "\n"));
        }
 #endif
 }
 
+
 static isc_boolean_t
-address_okay(isc_interface_t *isc_if) {
+address_okay(
+       isc_interface_t *isc_if
+       )
+{
+       const limit_address_t *laddr;
+       specific_interface_t *iface;
+
 
        DPRINTF(4, ("address_okay: listen Virtual: %d, IF name: %s\n", 
                    listen_to_virtual_ips, isc_if->name));
@@ -1078,118 +1106,108 @@ address_okay(isc_interface_t *isc_if) {
        /*
         * Always allow the loopback
         */
-       if((isc_if->flags & INTERFACE_F_LOOPBACK) != 0) {
+       if (INTERFACE_F_LOOPBACK & isc_if->flags) {
                DPRINTF(4, ("address_okay: loopback - OK\n"));
                return (ISC_TRUE);
        }
        /*
-        * Check if the IP address matches one given to -I, which if given
-        * limits interfaces/addresses to be used to those listed with -I.
+        * Check if the IP address matches one given to -I, which limits
+        * interfaces/addresses to be used to only those listed with -I.
         */
-       {
-               const limit_address_t *laddr;
-               for (laddr = ISC_LIST_HEAD(limit_address_list); laddr != NULL; laddr = ISC_LIST_NEXT(laddr, link))
-                       if (isc_netaddr_equal(&(isc_if->address), laddr->addr)) {
-                               DPRINTF(4, ("address_okay: specific interface address matched - OK\n"));
-                               return (ISC_TRUE);
-                       }
-       }
+       for (laddr = ISC_LIST_HEAD(limit_address_list);
+            NULL != laddr;
+            laddr = ISC_LIST_NEXT(laddr, link))
+               if (isc_netaddr_equal(&isc_if->address, laddr->addr)) {
+                       DPRINTF(4, ("address_okay: specific interface address matched - OK\n"));
+                       return (ISC_TRUE);
+               }
        /*
         * Check if the interface name was specified with an -I option.
         */
-       {
-               specific_interface_t *iface;
-               for (iface = ISC_LIST_HEAD(specific_interface_list); iface != NULL; iface = ISC_LIST_NEXT(iface, link))
-                       if (strcasecmp(isc_if->name, iface->name) == 0) {
-                               DPRINTF(4, ("address_okay: specific interface name matched - OK\n"));
-                               return (ISC_TRUE);
-                       }
-       }
+       for (iface = ISC_LIST_HEAD(specific_interface_list);
+            NULL != iface; 
+            iface = ISC_LIST_NEXT(iface, link))
+               if (!strcasecmp(isc_if->name, iface->name)) {
+                       DPRINTF(4, ("address_okay: specific interface name matched - OK\n"));
+                       return (ISC_TRUE);
+               }
        /*
         * Check if we are excluding virtual IPs/aliases, and if so, is
         * this interface such?
         */
-       if (listen_to_virtual_ips == 0  && 
-               (strchr(isc_if->name, (int)':') != NULL)) {
-               DPRINTF(4, ("address_okay: virtual ip/alias - FAIL\n"));
+       if (!listen_to_virtual_ips 
+           && strchr(isc_if->name, ':') != NULL) {
+               DPRINTF(4, ("address_okay: virtual ip/alias - NO\n"));
                return (ISC_FALSE);
        }
        /*
         * If any -I options were given, only listed interfaces and
         * addresses are used.
         */
-       if (interface_optioncount > 0) {
-               DPRINTF(4, ("address_okay: FAIL\n"));
+       if (interface_optioncount) {
+               DPRINTF(4, ("address_okay: not given with -I, NO\n"));
                return (ISC_FALSE);
        }
        DPRINTF(4, ("address_okay: OK\n"));
        return (ISC_TRUE);
 }
 
+
 static void
-convert_isc_if(isc_interface_t *isc_if, struct interface *itf, u_short port) {
+convert_isc_if(
+       isc_interface_t *isc_if,
+       struct interface *itf,
+       u_short port
+       )
+{
+       strncpy(itf->name, isc_if->name, sizeof(itf->name));
+       itf->ifindex = isc_if->ifindex;
+       itf->family = 
+               AF(&itf->sin) = 
+               AF(&itf->mask) =
+               AF(&itf->bcast) = (u_short)isc_if->af;
+       SET_PORT(&itf->sin, port);
+       SET_PORT(&itf->mask, port);
+       SET_PORT(&itf->bcast, port);
        itf->scopeid = 0;
-       itf->family = (short) isc_if->af;
-       strcpy(itf->name, isc_if->name);
 
-       if(isc_if->af == AF_INET) {
-               itf->sin.ss_family = (u_short) isc_if->af;
-               memcpy(&(((struct sockaddr_in*)&itf->sin)->sin_addr),
-                      &(isc_if->address.type.in),
-                      sizeof(struct in_addr));
-               ((struct sockaddr_in*)&itf->sin)->sin_port = port;
+       if (IS_IPV4(&itf->sin)) {
+               NSRCADR(&itf->sin) = isc_if->address.type.in.s_addr;
+               NSRCADR(&itf->mask) = isc_if->netmask.type.in.s_addr;
 
                if((isc_if->flags & INTERFACE_F_BROADCAST) != 0) {
                        itf->flags |= INT_BROADCAST;
-                       itf->bcast.ss_family = itf->sin.ss_family;
-                       memcpy(&(((struct sockaddr_in*)&itf->bcast)->sin_addr),
-                              &(isc_if->broadcast.type.in),
-                                sizeof(struct in_addr));
-                       ((struct sockaddr_in*)&itf->bcast)->sin_port = port;
+                       NSRCADR(&itf->bcast) = 
+                               isc_if->broadcast.type.in.s_addr;
                }
-
-               itf->mask.ss_family = itf->sin.ss_family;
-               memcpy(&(((struct sockaddr_in*)&itf->mask)->sin_addr),
-                      &(isc_if->netmask.type.in),
-                      sizeof(struct in_addr));
-               ((struct sockaddr_in*)&itf->mask)->sin_port = port;
        }
 #ifdef INCLUDE_IPV6_SUPPORT
-       else if (isc_if->af == AF_INET6) {
-               itf->sin.ss_family = (u_short) isc_if->af;
-               memcpy(&(((struct sockaddr_in6 *)&itf->sin)->sin6_addr),
-                      &(isc_if->address.type.in6),
-                      sizeof(((struct sockaddr_in6 *)&itf->sin)->sin6_addr));
-               ((struct sockaddr_in6 *)&itf->sin)->sin6_port = port;
-
-#ifdef ISC_PLATFORM_HAVESCOPEID
-               ((struct sockaddr_in6 *)&itf->sin)->sin6_scope_id = isc_netaddr_getzone(&isc_if->address);
-               itf->scopeid = isc_netaddr_getzone(&isc_if->address);
-#endif
-               itf->mask.ss_family = itf->sin.ss_family;
-               memcpy(&(((struct sockaddr_in6 *)&itf->mask)->sin6_addr),
-                      &(isc_if->netmask.type.in6),
-                      sizeof(struct in6_addr));
-               ((struct sockaddr_in6 *)&itf->mask)->sin6_port = port;
-               /* Copy the interface index */
-               itf->ifindex = isc_if->ifindex;
+       else if (IS_IPV6(&itf->sin)) {
+               SET_ADDR6N(&itf->sin, isc_if->address.type.in6);
+               SET_ADDR6N(&itf->mask, isc_if->netmask.type.in6);
+
+               SET_SCOPE(&itf->sin,
+                         isc_netaddr_getzone(&isc_if->address));
+               itf->scopeid = SCOPE(&itf->sin);
        }
 #endif /* INCLUDE_IPV6_SUPPORT */
 
 
        /* Process the rest of the flags */
 
-       if((isc_if->flags & INTERFACE_F_UP) != 0)
-               itf->flags |= INT_UP;
-       if((isc_if->flags & INTERFACE_F_LOOPBACK) != 0)
-               itf->flags |= INT_LOOPBACK;
-       if((isc_if->flags & INTERFACE_F_POINTTOPOINT) != 0)
-               itf->flags |= INT_PPP;
-       if((isc_if->flags & INTERFACE_F_MULTICAST) != 0)
-               itf->flags |= INT_MULTICAST;
-
+       itf->flags =
+                 (INTERFACE_F_UP & isc_if->flags)
+                        ? INT_UP : 0
+               | (INTERFACE_F_LOOPBACK & isc_if->flags) 
+                        ? INT_LOOPBACK : 0
+               | (INTERFACE_F_POINTTOPOINT & isc_if->flags) 
+                        ? INT_PPP : 0
+               | (INTERFACE_F_MULTICAST & isc_if->flags) 
+                        ? INT_MULTICAST : 0
+               ;
 }
 
+
 /*
  * refresh_interface
  *
@@ -1200,11 +1218,12 @@ convert_isc_if(isc_interface_t *isc_if, struct interface *itf, u_short port) {
  * the socket.
  */
 static int
-refresh_interface(struct interface * interface)
+refresh_interface(
+       struct interface * interface
+       )
 {
 #ifdef  OS_MISSES_SPECIFIC_ROUTE_UPDATES
-       if (interface->fd != INVALID_SOCKET)
-       {
+       if (interface->fd != INVALID_SOCKET) {
                close_and_delete_fd_from_list(interface->fd);
                interface->fd = open_socket(&interface->sin,
                                            0, 0, interface);
@@ -1213,14 +1232,11 @@ refresh_interface(struct interface * interface)
                  * next time around
                  */
                interface->last_ttl = 0;
-               return interface->fd != INVALID_SOCKET;
-       }
-       else
-       {
+               return (interface->fd != INVALID_SOCKET);
+       } else
                return 0;       /* invalid sockets are not refreshable */
-       }
 #else /* !OS_MISSES_SPECIFIC_ROUTE_UPDATES */
-       return interface->fd != INVALID_SOCKET;
+       return (interface->fd != INVALID_SOCKET);
 #endif /* !OS_MISSES_SPECIFIC_ROUTE_UPDATES */
 }
 
@@ -1228,91 +1244,80 @@ refresh_interface(struct interface * interface)
  * interface_update - externally callable update function
  */
 void
-interface_update(interface_receiver_t receiver, void *data)
+interface_update(
+       interface_receiver_t    receiver,
+       void *                  data)
 {
-       if (!disable_dynamic_updates) {
-               int new_interface_found;
+       int new_interface_found;
 
-               BLOCKIO();
-               new_interface_found = update_interfaces(htons(NTP_PORT), receiver, data);
-               UNBLOCKIO();
+       if (disable_dynamic_updates)
+               return;
+
+       BLOCKIO();
+       new_interface_found = update_interfaces(NTP_PORT, receiver, data);
+       UNBLOCKIO();
+
+       if (!new_interface_found)
+               return;
 
-               if (new_interface_found) {
 #ifdef DEBUG
-                       msyslog(LOG_DEBUG, "new interface(s) found: waking up resolver");
+       msyslog(LOG_DEBUG, "new interface(s) found: waking up resolver");
 #endif
 #ifdef SYS_WINNT
-                       /* wake up the resolver thread */
-                       if (ResolverEventHandle != NULL)
-                               SetEvent(ResolverEventHandle);
+       /* wake up the resolver thread */
+       if (ResolverEventHandle != NULL)
+               SetEvent(ResolverEventHandle);
 #else
-                       /* write any single byte to the pipe to wake up the resolver process */
-                       write( resolver_pipe_fd[1], &new_interface_found, 1 );
+       /* write any single byte to the pipe to wake up the resolver process */
+       write( resolver_pipe_fd[1], &new_interface_found, 1 );
 #endif
-               }
-       }
 }
 
-/*
- * find out if a given interface structure contains
- * a wildcard address
- */
+
 static int
-is_wildcard_addr(struct sockaddr_storage *sas)
+is_wildcard_addr(
+       sockaddr_u *psau
+       )
 {
-       if (sas->ss_family == AF_INET &&
-           ((struct sockaddr_in*)sas)->sin_addr.s_addr == htonl(INADDR_ANY))
+       if (IS_IPV4(psau) && !NSRCADR(psau))
                return 1;
 
 #ifdef INCLUDE_IPV6_SUPPORT
-       if (sas->ss_family == AF_INET6 &&
-           memcmp(&((struct sockaddr_in6*)sas)->sin6_addr, &in6addr_any,
-                  sizeof(in6addr_any) == 0))
+       if (IS_IPV6(psau) && S_ADDR6_EQ(psau, &in6addr_any))
                return 1;
 #endif
 
        return 0;
 }
 
+
 #ifdef OS_NEEDS_REUSEADDR_FOR_IFADDRBIND
 /*
  * enable/disable re-use of wildcard address socket
  */
 static void
-set_wildcard_reuse(int family, int on)
+set_wildcard_reuse(
+       u_short family,
+       int     on
+       )
 {
-       int onvalue = 1;
-       int offvalue = 0;
-       int *onoff;
+       struct interface *any;
        SOCKET fd = INVALID_SOCKET;
 
-       onoff = on ? &onvalue : &offvalue;
-
-       switch (family) {
-       case AF_INET:
-               if (any_interface) {
-                       fd = any_interface->fd;
-               }
-               break;
-
-#ifdef INCLUDE_IPV6_SUPPORT
-       case AF_INET6:
-               if (any6_interface) {
-                       fd = any6_interface->fd;
-               }
-               break;
-#endif /* !INCLUDE_IPV6_SUPPORT */
-       }
+       any = ANY_INTERFACE_BYFAM(family);
+       if (any != NULL)
+               fd = any->fd;
 
        if (fd != INVALID_SOCKET) {
-               if (setsockopt(fd, SOL_SOCKET,
-                              SO_REUSEADDR, (char *)onoff,
-                              sizeof(*onoff))) {
-                       netsyslog(LOG_ERR, "set_wildcard_reuse: setsockopt(SO_REUSEADDR, %s) failed: %m", *onoff ? "on" : "off");
-               }
-               DPRINTF(4, ("set SO_REUSEADDR to %s on %s\n", *onoff ? "ON" : "OFF",
-                           stoa((family == AF_INET) ?
-                                 &any_interface->sin : &any6_interface->sin)));
+               if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
+                              (char *)&on, sizeof(on)))
+                       msyslog(LOG_ERR,
+                               "set_wildcard_reuse: setsockopt(SO_REUSEADDR, %s) failed: %m",
+                               on ? "on" : "off");
+
+               DPRINTF(4, ("set SO_REUSEADDR to %s on %s\n", 
+                           on ? "on" : "off",
+                           stoa(any)));
        }
 }
 #endif /* OS_NEEDS_REUSEADDR_FOR_IFADDRBIND */
@@ -1325,17 +1330,17 @@ set_wildcard_reuse(int family, int on)
  * Phase 1:
  * forall currently existing interfaces
  *   if address is known:
- *       drop socket - rebind again
+ *     drop socket - rebind again
  *
  *   if address is NOT known:
- *     attempt to create a new interface entry
+ *     attempt to create a new interface entry
  *
  * Phase 2:
  * forall currently known non MCAST and WILDCARD interfaces
  *   if interface does not match configuration phase (not seen in phase 1):
- *     remove interface from known interface list
- *     forall peers associated with this interface
- *       disconnect peer from this interface
+ *     remove interface from known interface list
+ *     forall peers associated with this interface
+ *         disconnect peer from this interface
  *
  * Phase 3:
  *   attempt to re-assign interfaces to peers
@@ -1344,60 +1349,47 @@ set_wildcard_reuse(int family, int on)
 
 static int
 update_interfaces(
-       u_short port,
-       interface_receiver_t receiver,
-       void *data
+       u_short                 port,
+       interface_receiver_t    receiver,
+       void *                  data
        )
 {
-       interface_info_t ifi;
-       isc_mem_t *mctx = NULL;
-       isc_interfaceiter_t *iter = NULL;
-       isc_boolean_t scan_ipv4 = ISC_FALSE;
-       isc_boolean_t scan_ipv6 = ISC_FALSE;
-       isc_result_t result;
-       int new_interface_found = 0;
-
-       DPRINTF(3, ("update_interfaces(%d)\n", ntohs( (u_short) port)));
-
-#ifdef INCLUDE_IPV6_SUPPORT
-       if (isc_net_probeipv6() == ISC_R_SUCCESS)
-               scan_ipv6 = ISC_TRUE;
-#if defined(DEBUG)
-       else
-               if (debug)
-                       netsyslog(LOG_ERR, "no IPv6 interfaces found");
-#endif
-#endif
+       interface_info_t        ifi;
+       isc_interfaceiter_t *   iter;
+       isc_result_t            result;
+       isc_interface_t         isc_if;
+       int                     new_interface_found;
+       unsigned int            family;
+       struct interface        interface;
+       struct interface *      iface;
+       struct interface *      next;
+       struct peer *           peer;
+
+       DPRINTF(3, ("update_interfaces(%d)\n", port));
 
-       if (isc_net_probeipv4() == ISC_R_SUCCESS)
-               scan_ipv4 = ISC_TRUE;
-#ifdef DEBUG
-       else
-               if(debug)
-                       netsyslog(LOG_ERR, "no IPv4 interfaces found");
-#endif
        /*
         * phase one - scan interfaces
         * - create those that are not found
         * - update those that are found
         */
 
-       result = isc_interfaceiter_create(mctx, &iter);
+       new_interface_found = 0;
+       iter = NULL;
+       result = isc_interfaceiter_create(NULL, &iter);
 
        if (result != ISC_R_SUCCESS)
                return 0;
 
-       sys_interphase ^= 0x1;  /* toggle system phase for finding untouched (to be deleted) interfaces */
+       /* 
+        * Toggle system interface scan phase to find untouched
+        * interfaces to be deleted.
+        */
+       sys_interphase ^= 0x1;
        
        for (result = isc_interfaceiter_first(iter);
-            result == ISC_R_SUCCESS;
-            result = isc_interfaceiter_next(iter))
-       {
-               isc_interface_t isc_if;
-               unsigned int family;
-               struct interface interface;
-               struct interface *iface;
-               
+            ISC_R_SUCCESS == result;
+            result = isc_interfaceiter_next(iter)) {
+
                result = isc_interfaceiter_current(iter, &isc_if);
 
                if (result != ISC_R_SUCCESS)
@@ -1405,16 +1397,14 @@ update_interfaces(
 
                /* See if we have a valid family to use */
                family = isc_if.address.family;
-               if (family != AF_INET && family != AF_INET6)
+               if (AF_INET != family && AF_INET6 != family)
                        continue;
-               if (scan_ipv4 == ISC_FALSE && family == AF_INET)
+               if (AF_INET == family && !ipv4_works)
                        continue;
-               if (scan_ipv6 == ISC_FALSE && family == AF_INET6)
+               if (AF_INET6 == family && !ipv6_works)
                        continue;
 
-               /*
-                * create prototype
-                */
+               /* create prototype */
                init_interface(&interface);
 
                convert_isc_if(&isc_if, &interface, port);
@@ -1427,9 +1417,8 @@ update_interfaces(
                 * and potentially causing problems with more than one
                 * process fiddling with the clock
                 */
-               if (address_okay(&isc_if) == ISC_TRUE) {
+               if (address_okay(&isc_if))
                        interface.ignore_packets = ISC_FALSE;
-               }
                else {
 #ifndef NO_LISTEN_READ_DROP
                        interface.ignore_packets = ISC_TRUE;
@@ -1440,8 +1429,10 @@ update_interfaces(
 
                DPRINT_INTERFACE(4, (&interface, "examining ", "\n"));
 
-               if (!(interface.flags & INT_UP))  { /* interfaces must be UP to be usable */
-                       DPRINTF(4, ("skipping interface %s (%s) - DOWN\n", interface.name, stoa(&interface.sin)));
+                /* interfaces must be UP to be usable */
+               if (!(interface.flags & INT_UP)) {
+                       DPRINTF(4, ("skipping interface %s (%s) - DOWN\n",
+                                   interface.name, stoa(&interface.sin)));
                        continue;
                }
 
@@ -1454,52 +1445,65 @@ update_interfaces(
                        continue;
 
                /*
-                * map to local *address* in order
-                * to map all duplicate interfaces to an interface structure
-                * with the appropriate socket (our name space is
-                * (ip-address) - NOT (interface name, ip-address))
+                * map to local *address* in order to map all duplicate
+                * interfaces to an interface structure with the
+                * appropriate socket.  Our name space is (ip-address), 
+                * NOT (interface name, ip-address).
                 */
                iface = getinterface(&interface.sin, INT_WILDCARD);
                
-               if (iface && refresh_interface(iface)) 
-               {
+               if (iface != NULL && refresh_interface(iface)) {
                        /*
-                        * found existing and up to date interface - mark present
+                        * found existing and up to date interface -
+                        * mark present.
                         */
-                       if (iface->phase != sys_interphase)
-                       {
-                               /*
-                                * on a new round we reset the name so the interface name
-                                * shows up again if this address is not shared any more
-                                * same reasoning goes for the enable flag
-                                */
-                               strcpy(iface->name, interface.name);
-                               iface->ignore_packets = interface.ignore_packets;
-                       } else {
+                       if (iface->phase != sys_interphase) {
                                /*
-                                * name collision - rename interface name to "*multiple*"
+                                * On a new round we reset the name so
+                                * the interface name shows up again if
+                                * this address is no longer shared.
+                                * The same reasoning goes for the
+                                * ignore_packets flag.
                                 */
-                               strcpy(iface->name, "*multiple*");
-                       }
-
-                       DPRINT_INTERFACE(4, (iface, "updating ", " present\n"));
-
-                       if (iface->ignore_packets != interface.ignore_packets)
-                       {
+                               strncpy(iface->name, interface.name,
+                                       sizeof(iface->name));
+                               iface->ignore_packets = 
+                                       interface.ignore_packets;
+                       } else
+                               /* name collision - rename interface */
+                               strncpy(iface->name, "*multiple*",
+                                       sizeof(iface->name));
+
+                       DPRINT_INTERFACE(4, (iface, "updating ", 
+                                            " present\n"));
+
+                       if (iface->ignore_packets != 
+                           interface.ignore_packets) {
                                /*
-                                * We have conflicting configurations for the interface address.
-                                * This is caused by using -I <interfacename> for an interface
-                                * that shares it address with other interfaces. We cannot disambiguate
-                                * incoming pakets being delivered to this socket without extra
-                                * syscalls/features. These are not (commonly) available.
-                                * Note is is a more unusual configuration where several interfaces
-                                * share an address but filtering via interface name is attempted.
-                                * We resolve the configuration conflict by disabling the reception
-                                * of pakets. This leads to a basically non-functional service on the
-                                * interface address where the conflict occurs.
+                                * We have conflicting configurations
+                                * for the interface address. This is
+                                * caused by using -I <interfacename>
+                                * for an interface that shares its 
+                                * address with other interfaces. We
+                                * can not disambiguate incoming
+                                * packets delivered to this socket
+                                * without extra syscalls/features.
+                                * These are not (commonly) available.
+                                * Note this is a more unusual
+                                * configuration where several
+                                * interfaces share an address but
+                                * filtering via interface name is
+                                * attempted.  We resolve the
+                                * configuration conflict by disabling
+                                * the processing of received packets.
+                                * This leads to no service on the
+                                * interface address where the conflict
+                                * occurs.
                                 */
-                               msyslog(LOG_ERR, "WARNING: conflicting enable configuration for interfaces %s and %s for address %s - unsupported configuration - address DISABLED",
-                                       interface.name, iface->name, stoa(&interface.sin));
+                               msyslog(LOG_ERR,
+                                       "WARNING: conflicting enable configuration for interfaces %s and %s for address %s - unsupported configuration - address DISABLED",
+                                       interface.name, iface->name,
+                                       stoa(&interface.sin));
 
                                iface->ignore_packets = ISC_TRUE;                               
                        }
@@ -1508,36 +1512,38 @@ update_interfaces(
 
                        ifi.action = IFS_EXISTS;
                        ifi.interface = iface;
-                       if (receiver)
-                               receiver(data, &ifi);
-               }
-               else
-               {
+                       if (receiver != NULL)
+                               (*receiver)(data, &ifi);
+               } else {
                        /*
-                        * this is new or refreshing failed - add to our interface list
-                        * if refreshing failed we will delete the interface structure in
-                        * phase 2 as the interface was not marked current. We can bind to
-                        * the address as the refresh code already closed the offending socket
+                        * This is new or refreshing failed - add to
+                        * our interface list.  If refreshing failed we
+                        * will delete the interface structure in phase
+                        * 2 as the interface was not marked current.
+                        * We can bind to the address as the refresh
+                        * code already closed the offending socket
                         */
-                       
                        iface = create_interface(port, &interface);
 
-                       if (iface)
-                       {
+                       if (iface != NULL) {
                                ifi.action = IFS_CREATED;
                                ifi.interface = iface;
-                               if (receiver)
-                                       receiver(data, &ifi);
+                               if (receiver != NULL)
+                                       (*receiver)(data, &ifi);
 
                                new_interface_found = 1;
 
-                               DPRINT_INTERFACE(3, (iface, "updating ", " new - created\n"));
-                       }
-                       else
-                       {
-                               DPRINT_INTERFACE(3, (&interface, "updating ", " new - creation FAILED"));
+                               DPRINT_INTERFACE(3,
+                                       (iface, "updating ",
+                                        " new - created\n"));
+                       } else {
+                               DPRINT_INTERFACE(3, 
+                                       (&interface, "updating ",
+                                        " new - creation FAILED"));
                        
-                               msyslog(LOG_INFO, "failed to initialize interface for address %s", stoa(&interface.sin));
+                               msyslog(LOG_INFO,
+                                       "failed to init interface for address %s", 
+                                       stoa(&interface.sin));
                                continue;
                        }
                }
@@ -1546,58 +1552,53 @@ update_interfaces(
        isc_interfaceiter_destroy(&iter);
 
        /*
-        * phase 2 - delete gone interfaces - reassigning peers to other interfaces
+        * phase 2 - delete gone interfaces - reassigning peers to
+        * other interfaces
         */
-       {
-               struct interface *interf = ISC_LIST_HEAD(inter_list);
+       iface = ISC_LIST_HEAD(inter_list);
+
+       while (iface != NULL) {
+               next = ISC_LIST_NEXT(iface, link);
+                 
+               if (!(iface->flags & (INT_WILDCARD | INT_MCASTIF))) {
+                       /*
+                        * if phase does not match sys_phase this
+                        * interface was not enumerated during the last
+                        * interface scan - so it is gone and will be
+                        * deleted here unless it is solely an MCAST or
+                        * WILDCARD interface.
+                        */
+                       if (iface->phase != sys_interphase) {
+                               DPRINT_INTERFACE(3, 
+                                       (iface, "updating ",
+                                        "GONE - deleting\n"));
+                               remove_interface(iface);
+
+                               ifi.action = IFS_DELETED;
+                               ifi.interface = iface;
+                               if (receiver != NULL)
+                                       (*receiver)(data, &ifi);
 
-               while (interf != NULL)
-               {
-                       struct interface *next = ISC_LIST_NEXT(interf, link);
-                         
-                       if (!(interf->flags & (INT_WILDCARD|INT_MCASTIF))) {
                                /*
-                                * if phase does not match sys_phase this interface was not
-                                * enumerated during interface scan - so it is gone and
-                                * will be deleted here unless it is solely an MCAST/WILDCARD interface
+                                * disconnect peers from deleted
+                                * interface
                                 */
-                               if (interf->phase != sys_interphase) {
-                                       struct peer *peer;
-                                       DPRINT_INTERFACE(3, (interf, "updating ", "GONE - deleting\n"));
-                                       remove_interface(interf);
-
-                                       ifi.action = IFS_DELETED;
-                                       ifi.interface = interf;
-                                       if (receiver)
-                                               receiver(data, &ifi);
-
-                                       peer = ISC_LIST_HEAD(interf->peers);
-                                       /*
-                                        * disconnect peer from deleted interface
-                                        */
-                                       while (peer != NULL) {
-                                               struct peer *npeer = ISC_LIST_NEXT(peer, ilink);
-                                               
-                                               /*
-                                                * this one just lost it's interface
-                                                */
-                                               set_peerdstadr(peer, NULL);
-       
-                                               peer = npeer;
-                                       }
+                               for (peer = ISC_LIST_HEAD(iface->peers);
+                                    peer != NULL;
+                                    peer = ISC_LIST_HEAD(iface->peers))
+                                       set_peerdstadr(peer, NULL);
 
-                                       /*
-                                        * update globals in case we lose 
-                                        * a loopback interface
-                                        */
-                                       if (interf == loopback_interface)
-                                               loopback_interface = NULL;
+                               /*
+                                * update globals in case we lose 
+                                * a loopback interface
+                                */
+                               if (iface == loopback_interface)
+                                       loopback_interface = NULL;
 
-                                       delete_interface(interf);
-                               }
+                               delete_interface(iface);
                        }
-                       interf = next;
                }
+               iface = next;
        }
 
        /*
@@ -1625,7 +1626,7 @@ create_sockets(
        FD_ZERO(&activefds);
 #endif
 
-       DPRINTF(2, ("create_sockets(%d)\n", ntohs( (u_short) port)));
+       DPRINTF(2, ("create_sockets(%d)\n", port));
 
        create_wildcards(port);
 
@@ -1648,77 +1649,74 @@ create_sockets(
  */
 static struct interface *
 create_interface(
-                u_short port,
-                struct interface *iface
-                )
+       u_short                 port,
+       struct interface *      protot
+       )
 {
-       struct sockaddr_storage resmask;
-       struct interface *interface;
+       sockaddr_u resmask;
+       struct interface *iface;
 
-       DPRINTF(2, ("create_interface(%s#%d)\n", stoa(&iface->sin), ntohs( (u_short) port)));
+       DPRINTF(2, ("create_interface(%s#%d)\n", stoa(&protot->sin),
+                   port));
 
        /* build an interface */
-       interface = new_interface(iface);
+       iface = new_interface(protot);
        
        /*
         * create socket
         */
-       interface->fd = open_socket(&interface->sin,
-                                0, 0, interface);
+       iface->fd = open_socket(&iface->sin, 0, 0, iface);
 
-       if (interface->fd != INVALID_SOCKET)
-               list_if_listening(interface, port);
+       if (iface->fd != INVALID_SOCKET)
+               list_if_listening(iface);
 
-       if ((interface->flags & INT_BROADCAST) &&
-           interface->bfd != INVALID_SOCKET)
-         msyslog(LOG_INFO, "Listening on broadcast address %s#%d",
-                 stoa((&interface->bcast)),
-                 ntohs( (u_short) port));
+       if ((INT_BROADCAST & iface->flags)
+           && iface->bfd != INVALID_SOCKET)
+               msyslog(LOG_INFO, "Listening on broadcast address %s#%d",
+                       stoa((&iface->bcast)), port);
 
-       if (interface->fd == INVALID_SOCKET &&
-           interface->bfd == INVALID_SOCKET) {
+       if (INVALID_SOCKET == iface->fd
+           && INVALID_SOCKET == iface->bfd) {
                msyslog(LOG_ERR, "unable to create socket on %s (%d) for %s#%d",
-                       interface->name,
-                       interface->ifnum,
-                       stoa((&interface->sin)),
-                       ntohs( (u_short) port));
-               delete_interface(interface);
+                       iface->name,
+                       iface->ifnum,
+                       stoa((&iface->sin)),
+                       port);
+               delete_interface(iface);
                return NULL;
        }
        
-        /*
-        * Blacklist bound interface address
+       /*
+        * Blacklist our own addresses, no use talking to ourself
         */
-       
-       SET_HOSTMASK(&resmask, interface->sin.ss_family);
-       hack_restrict(RESTRICT_FLAGS, &interface->sin, &resmask,
-                     RESM_NTPONLY|RESM_INTERFACE, RES_IGNORE);
+       SET_HOSTMASK(&resmask, AF(&iface->sin));
+       hack_restrict(RESTRICT_FLAGS, &iface->sin, &resmask,
+                     RESM_NTPONLY | RESM_INTERFACE, RES_IGNORE);
          
        /*
         * set globals with the first found
         * loopback interface of the appropriate class
         */
-       if ((loopback_interface == NULL) &&
-           (interface->family == AF_INET) &&
-           ((interface->flags & INT_LOOPBACK) != 0))
-       {
-               loopback_interface = interface;
-       }
+       if (NULL == loopback_interface && AF_INET == iface->family
+           && (INT_LOOPBACK & iface->flags))
+               loopback_interface = iface;
 
        /*
         * put into our interface list
         */
-       add_addr_to_list(&interface->sin, interface);
-       add_interface(interface);
+       add_addr_to_list(&iface->sin, iface);
+       add_interface(iface);
 
-       DPRINT_INTERFACE(2, (interface, "created ", "\n"));
-       return interface;
+       DPRINT_INTERFACE(2, (iface, "created ", "\n"));
+       return iface;
 }
 
 
 #ifdef SO_EXCLUSIVEADDRUSE
 static void
-set_excladdruse(int fd)
+set_excladdruse(
+       SOCKET fd
+       )
 {
        int one = 1;
        int failed;
@@ -1727,8 +1725,9 @@ set_excladdruse(int fd)
                            (char *)&one, sizeof(one));
 
        if (failed)
-               netsyslog(LOG_ERR, 
-                         "setsockopt(%d, SO_EXCLUSIVEADDRUSE, on): %m", fd);
+               msyslog(LOG_ERR, 
+                       "setsockopt(%d, SO_EXCLUSIVEADDRUSE, on): %m",
+                       (int)fd);
 }
 #endif  /* SO_EXCLUSIVEADDRUSE */
 
@@ -1739,7 +1738,10 @@ set_excladdruse(int fd)
  *                     fd's also?
  */
 static void
-set_reuseaddr(int flag) {
+set_reuseaddr(
+       int flag
+       )
+{
        struct interface *interf;
 
 #ifndef SO_EXCLUSIVEADDRUSE
@@ -1755,13 +1757,15 @@ set_reuseaddr(int flag) {
                 * if interf->fd  is INVALID_SOCKET, we might have a adapter
                 * configured but not present
                 */
-               DPRINTF(4, ("setting SO_REUSEADDR on %.16s@%s to %s\n", interf->name, stoa(&interf->sin), flag ? "on" : "off"));
+               DPRINTF(4, ("setting SO_REUSEADDR on %.16s@%s to %s\n",
+                           interf->name, stoa(&interf->sin),
+                           flag ? "on" : "off"));
                
                if (interf->fd != INVALID_SOCKET) {
                        if (setsockopt(interf->fd, SOL_SOCKET,
                                        SO_REUSEADDR, (char *)&flag,
                                        sizeof(flag))) {
-                               netsyslog(LOG_ERR, "set_reuseaddr: setsockopt(SO_REUSEADDR, %s) failed: %m", flag ? "on" : "off");
+                               msyslog(LOG_ERR, "set_reuseaddr: setsockopt(SO_REUSEADDR, %s) failed: %m", flag ? "on" : "off");
                        }
                }
        }
@@ -1773,9 +1777,12 @@ set_reuseaddr(int flag) {
  * make other changes as necessary later on
  */
 void
-enable_broadcast(struct interface *iface, struct sockaddr_storage *baddr)
+enable_broadcast(
+       struct interface *      iface, 
+       sockaddr_u *            baddr
+       )
 {
-#ifdef SO_BROADCAST
+#ifdef OPEN_BCAST_SOCKET 
        socket_broadcast_enable(iface, iface->fd, baddr);
 #endif
 }
@@ -1787,26 +1794,25 @@ enable_broadcast(struct interface *iface, struct sockaddr_storage *baddr)
  * broadcasting. It is not this function's job to select the socket
  */
 static isc_boolean_t
-socket_broadcast_enable(struct interface *iface, SOCKET fd, struct sockaddr_storage *maddr)
+socket_broadcast_enable(
+       struct interface *      iface, 
+       SOCKET                  fd, 
+       sockaddr_u *            baddr
+       )
 {
 #ifdef SO_BROADCAST
        int on = 1;
 
-       if (maddr->ss_family == AF_INET)
-       {
+       if (IS_IPV4(baddr)) {
                /* if this interface can support broadcast, set SO_BROADCAST */
                if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST,
                               (char *)&on, sizeof(on)))
-               {
-                       netsyslog(LOG_ERR, "setsockopt(SO_BROADCAST) enable failure on address %s: %m",
-                               stoa(maddr));
-               }
-#ifdef DEBUG
-               else if (debug > 1) {
-                       printf("Broadcast enabled on socket %d for address %s\n",
-                               fd, stoa(maddr));
-               }
-#endif
+                       msyslog(LOG_ERR,
+                               "setsockopt(SO_BROADCAST) enable failure on address %s: %m",
+                               stoa(baddr));
+               else
+                       DPRINTF(2, ("Broadcast enabled on socket %d for address %s\n",
+                                   fd, stoa(baddr)));
        }
        iface->flags |= INT_BCASTOPEN;
        broadcast_client_enabled = ISC_TRUE;
@@ -1822,20 +1828,20 @@ socket_broadcast_enable(struct interface *iface, SOCKET fd, struct sockaddr_stor
  * broadcasting. It is not this function's job to select the socket
  */
 static isc_boolean_t
-socket_broadcast_disable(struct interface *iface, struct sockaddr_storage *maddr)
+socket_broadcast_disable(
+       struct interface *      iface, 
+       sockaddr_u *            baddr
+       )
 {
 #ifdef SO_BROADCAST
        int off = 0;    /* This seems to be OK as an int */
 
-       if (maddr->ss_family == AF_INET)
-       {
-               if (setsockopt(iface->fd, SOL_SOCKET, SO_BROADCAST,
-                              (char *)&off, sizeof(off)))
-               {
-                       netsyslog(LOG_ERR, "setsockopt(SO_BROADCAST) disable failure on address %s: %m",
-                               stoa(maddr));
-               }
-       }
+       if (IS_IPV4(baddr) && setsockopt(iface->fd, SOL_SOCKET,
+           SO_BROADCAST, (char *)&off, sizeof(off)))
+               msyslog(LOG_ERR,
+                       "setsockopt(SO_BROADCAST) disable failure on address %s: %m",
+                       stoa(baddr));
+
        iface->flags &= ~INT_BCASTOPEN;
        broadcast_client_enabled = ISC_FALSE;
        return ISC_TRUE;
@@ -1858,43 +1864,27 @@ get_broadcastclient_flag(void)
  * Check to see if the address is a multicast address
  */
 static isc_boolean_t
-addr_ismulticast(struct sockaddr_storage *maddr)
+addr_ismulticast(
+       sockaddr_u *maddr
+       )
 {
-       switch (maddr->ss_family)
-       {
-       case AF_INET :
-               if (!IN_CLASSD(ntohl(((struct sockaddr_in*)maddr)->sin_addr.s_addr))) {
-                       DPRINTF(4, ("multicast address %s not class D\n", stoa(maddr)));
-                       return (ISC_FALSE);
-               }
-               else
-               {
-                       return (ISC_TRUE);
-               }
-
-       case AF_INET6 :
-#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
-               if (!IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)maddr)->sin6_addr)) {
-                       DPRINTF(4, ("address %s not IPv6 multicast address\n", stoa(maddr)));
-                       return (ISC_FALSE);
-               }
-               else
-               {
-                       return (ISC_TRUE);
-               }
+       isc_boolean_t result;
 
-/*
- * If we don't have IPV6 support any IPV6 address is not multicast
- */
-#else
-               return (ISC_FALSE);
-#endif
+#ifndef INCLUDE_IPV6_MULTICAST_SUPPORT
        /*
-        * Never valid
+        * If we don't have IPV6 support any IPV6 addr is not multicast
         */
-       default:
-               return (ISC_FALSE);
-       }
+       if (IS_IPV6(maddr))
+               result = ISC_FALSE;
+       else
+#endif
+               result = IS_MCAST(maddr);
+
+       if (!result)
+               DPRINTF(4, ("address %s is not multicast\n",
+                           stoa(maddr)));
+
+       return result;
 }
 
 /*
@@ -1903,62 +1893,79 @@ addr_ismulticast(struct sockaddr_storage *maddr)
  * send the multicast packet.
  */
 void
-enable_multicast_if(struct interface *iface, struct sockaddr_storage *maddr)
+enable_multicast_if(
+       struct interface *      iface,
+       sockaddr_u *            maddr
+       )
 {
 #ifdef MCAST
-       /*u_char*/ TYPEOF_IP_MULTICAST_LOOP off = 0;
+       TYPEOF_IP_MULTICAST_LOOP off = 0;
+
+       NTP_REQUIRE(AF(maddr) == AF(&iface->sin));
+
+       switch (AF(&iface->sin)) {
 
-       switch (maddr->ss_family)
-       {
        case AF_INET:
                if (setsockopt(iface->fd, IPPROTO_IP, IP_MULTICAST_IF,
-                  (char *)&(((struct sockaddr_in*)&iface->sin)->sin_addr.s_addr),
-                   sizeof(struct in_addr)) == -1) {
-                       netsyslog(LOG_ERR,
-                       "setsockopt IP_MULTICAST_IF failure: %m on socket %d, addr %s for multicast address %s",
-                       iface->fd, stoa(&iface->sin), stoa(maddr));
+                              (char *)NSRCADR(&iface->sin),
+                              sizeof(NSRCADR(&iface->sin)))) {
+
+                       msyslog(LOG_ERR,
+                               "setsockopt IP_MULTICAST_IF failed: %m on socket %d, addr %s for multicast address %s",
+                               iface->fd, stoa(&iface->sin),
+                               stoa(maddr));
                        return;
                }
 #ifdef IP_MULTICAST_LOOP
                /*
-                * Don't send back to itself, but allow it to fail to set it
+                * Don't send back to itself, but allow failure to set
                 */
-               if (setsockopt(iface->fd, IPPROTO_IP, IP_MULTICAST_LOOP,
-                      SETSOCKOPT_ARG_CAST &off, sizeof(off)) == -1) {
-                       netsyslog(LOG_ERR,
-                       "setsockopt IP_MULTICAST_LOOP failure: %m on socket %d, addr %s for multicast address %s",
-                       iface->fd, stoa(&iface->sin), stoa(maddr));
+               if (setsockopt(iface->fd, IPPROTO_IP,
+                              IP_MULTICAST_LOOP,
+                              SETSOCKOPT_ARG_CAST &off,
+                              sizeof(off))) {
+
+                       msyslog(LOG_ERR,
+                               "setsockopt IP_MULTICAST_LOOP failed: %m on socket %d, addr %s for multicast address %s",
+                               iface->fd, stoa(&iface->sin), 
+                               stoa(maddr));
                }
 #endif
-       DPRINTF(4, ("Added IPv4 multicast interface on socket %d, addr %s for multicast address %s\n",
+               DPRINTF(4, ("Added IPv4 multicast interface on socket %d, addr %s for multicast address %s\n",
                            iface->fd, stoa(&iface->sin),
                            stoa(maddr)));
                break;
 
        case AF_INET6:
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
-               if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
-                   (char *) &iface->scopeid, sizeof(iface->scopeid)) == -1) {
-                       netsyslog(LOG_ERR,
-                       "setsockopt IPV6_MULTICAST_IF failure: %m on socket %d, addr %s, scope %d for multicast address %s",
-                       iface->fd, stoa(&iface->sin), iface->scopeid,
-                       stoa(maddr));
+               if (setsockopt(iface->fd, IPPROTO_IPV6,
+                              IPV6_MULTICAST_IF,
+                              (char *)&iface->scopeid,
+                              sizeof(iface->scopeid))) {
+
+                       msyslog(LOG_ERR,
+                               "setsockopt IPV6_MULTICAST_IF failed: %m on socket %d, addr %s, scope %d for multicast address %s",
+                               iface->fd, stoa(&iface->sin),
+                               iface->scopeid, stoa(maddr));
                        return;
                }
 #ifdef IPV6_MULTICAST_LOOP
                /*
-                * Don't send back to itself, but allow it to fail to set it
+                * Don't send back to itself, but allow failure to set
                 */
-               if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
-                      (char *) &off, sizeof(off)) == -1) {
-                       netsyslog(LOG_ERR,
-                       "setsockopt IP_MULTICAST_LOOP failure: %m on socket %d, addr %s for multicast address %s",
-                       iface->fd, stoa(&iface->sin), stoa(maddr));
+               if (setsockopt(iface->fd, IPPROTO_IPV6,
+                              IPV6_MULTICAST_LOOP,
+                              (char *) &off, sizeof(off))) {
+
+                       msyslog(LOG_ERR,
+                               "setsockopt IP_MULTICAST_LOOP failed: %m on socket %d, addr %s for multicast address %s",
+                               iface->fd, stoa(&iface->sin),
+                               stoa(maddr));
                }
 #endif
                DPRINTF(4, ("Added IPv6 multicast interface on socket %d, addr %s, scope %d for multicast address %s\n",
-                           iface->fd,  stoa(&iface->sin), iface->scopeid,
-                           stoa(maddr)));
+                           iface->fd,  stoa(&iface->sin),
+                           iface->scopeid, stoa(maddr)));
                break;
 #else
                return;
@@ -1973,34 +1980,42 @@ enable_multicast_if(struct interface *iface, struct sockaddr_storage *maddr)
  * The socket is in the inter_list all we need to do is enable
  * multicasting. It is not this function's job to select the socket
  */
+#ifdef MCAST
 static isc_boolean_t
-socket_multicast_enable(struct interface *iface, int lscope, struct sockaddr_storage *maddr)
+socket_multicast_enable(
+       struct interface *      iface,
+       int                     lscope,
+       sockaddr_u *            maddr
+       )
 {
+       struct ip_mreq          mreq;
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
-       struct ipv6_mreq mreq6;
-       struct in6_addr iaddr6;
-#endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
-
-       struct ip_mreq mreq;
+       struct ipv6_mreq        mreq6;
+#endif
 
-       if (find_addr_in_list(maddr)) {
-               DPRINTF(4, ("socket_multicast_enable(%s): already enabled\n", stoa(maddr)));
+       if (find_addr_in_list(maddr) != NULL) {
+               DPRINTF(4, ("socket_multicast_enable(%s): already enabled\n",
+                           stoa(maddr)));
                return ISC_TRUE;
        }
 
-       switch (maddr->ss_family)
-       {
+       switch (AF(maddr)) {
+
        case AF_INET:
-               memset((char *)&mreq, 0, sizeof(mreq));
-               mreq.imr_multiaddr = (((struct sockaddr_in*)maddr)->sin_addr);
+               memset(&mreq, 0, sizeof(mreq));
+               mreq.imr_multiaddr = SOCK_ADDR4(maddr);
                mreq.imr_interface.s_addr = htonl(INADDR_ANY);
-               if (setsockopt(iface->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
-                       (char *)&mreq, sizeof(mreq)) == -1) {
-                       netsyslog(LOG_ERR,
-                       "setsockopt IP_ADD_MEMBERSHIP failure: %m on socket %d, addr %s for %x / %x (%s)",
-                       iface->fd, stoa(&iface->sin),
-                       mreq.imr_multiaddr.s_addr,
-                       mreq.imr_interface.s_addr, stoa(maddr));
+               if (setsockopt(iface->fd,
+                              IPPROTO_IP,
+                              IP_ADD_MEMBERSHIP,
+                              (char *)&mreq, 
+                              sizeof(mreq))) {
+                       msyslog(LOG_ERR,
+                               "setsockopt IP_ADD_MEMBERSHIP failed: %m on socket %d, addr %s for %x / %x (%s)",
+                               iface->fd, stoa(&iface->sin),
+                               mreq.imr_multiaddr.s_addr,
+                               mreq.imr_interface.s_addr,
+                               stoa(maddr));
                        return ISC_FALSE;
                }
                DPRINTF(4, ("Added IPv4 multicast membership on socket %d, addr %s for %x / %x (%s)\n",
@@ -2012,28 +2027,28 @@ socket_multicast_enable(struct interface *iface, int lscope, struct sockaddr_sto
        case AF_INET6:
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
                /*
-                * Enable reception of multicast packets
-                * If the address is link-local we can get the interface index
-                * from the scope id. Don't do this for other types of multicast
-                * addresses. For now let the kernel figure it out.
+                * Enable reception of multicast packets.
+                * If the address is link-local we can get the
+                * interface index from the scope id. Don't do this
+                * for other types of multicast addresses. For now let
+                * the kernel figure it out.
                 */
-               memset((char *)&mreq6, 0, sizeof(mreq6));
-               iaddr6 = ((struct sockaddr_in6*)maddr)->sin6_addr;
-               mreq6.ipv6mr_multiaddr = iaddr6;
+               memset(&mreq6, 0, sizeof(mreq6));
+               mreq6.ipv6mr_multiaddr = SOCK_ADDR6(maddr);
                mreq6.ipv6mr_interface = lscope;
 
-               if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_JOIN_GROUP,
-                       (char *)&mreq6, sizeof(mreq6)) == -1) {
-                       netsyslog(LOG_ERR,
-                        "setsockopt IPV6_JOIN_GROUP failure: %m on socket %d, addr %s for interface %d(%s)",
-                       iface->fd, stoa(&iface->sin),
-                       mreq6.ipv6mr_interface, stoa(maddr));
+               if (setsockopt(iface->fd, IPPROTO_IPV6,
+                              IPV6_JOIN_GROUP, (char *)&mreq6, 
+                              sizeof(mreq6))) {
+                       msyslog(LOG_ERR,
+                               "setsockopt IPV6_JOIN_GROUP failed: %m on socket %d, addr %s for interface %d (%s)",
+                               iface->fd, stoa(&iface->sin),
+                               mreq6.ipv6mr_interface, stoa(maddr));
                        return ISC_FALSE;
                }
                DPRINTF(4, ("Added IPv6 multicast group on socket %d, addr %s for interface %d(%s)\n",
                            iface->fd, stoa(&iface->sin),
                            mreq6.ipv6mr_interface, stoa(maddr)));
-               break;
 #else
                return ISC_FALSE;
 #endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
@@ -2050,33 +2065,38 @@ socket_multicast_enable(struct interface *iface, int lscope, struct sockaddr_sto
  * multicasting. It is not this function's job to select the socket
  */
 static isc_boolean_t
-socket_multicast_disable(struct interface *iface, struct sockaddr_storage *maddr)
+socket_multicast_disable(
+       struct interface *      iface,
+       sockaddr_u *            maddr
+       )
 {
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
        struct ipv6_mreq mreq6;
-       struct in6_addr iaddr6;
-#endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
-
+#endif
        struct ip_mreq mreq;
-       memset((char *)&mreq, 0, sizeof(mreq));
+
+       memset(&mreq, 0, sizeof(mreq));
 
        if (find_addr_in_list(maddr) == NULL) {
-               DPRINTF(4, ("socket_multicast_disable(%s): not enabled\n", stoa(maddr)));
+               DPRINTF(4, ("socket_multicast_disable(%s): not found\n", 
+                           stoa(maddr)));
                return ISC_TRUE;
        }
 
-       switch (maddr->ss_family)
-       {
+       switch (AF(maddr)) {
+
        case AF_INET:
-               mreq.imr_multiaddr = (((struct sockaddr_in*)&maddr)->sin_addr);
-               mreq.imr_interface.s_addr = ((struct sockaddr_in*)&iface->sin)->sin_addr.s_addr;
-               if (setsockopt(iface->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP,
-                       (char *)&mreq, sizeof(mreq)) == -1) {
-                       netsyslog(LOG_ERR,
-                       "setsockopt IP_DROP_MEMBERSHIP failure: %m on socket %d, addr %s for %x / %x (%s)",
-                       iface->fd, stoa(&iface->sin),
-                       mreq.imr_multiaddr.s_addr,
-                       mreq.imr_interface.s_addr, stoa(maddr));
+               mreq.imr_multiaddr = SOCK_ADDR4(maddr);
+               mreq.imr_interface = SOCK_ADDR4(&iface->sin);
+               if (setsockopt(iface->fd, IPPROTO_IP,
+                              IP_DROP_MEMBERSHIP, (char *)&mreq,
+                              sizeof(mreq))) {
+
+                       msyslog(LOG_ERR,
+                               "setsockopt IP_DROP_MEMBERSHIP failed: %m on socket %d, addr %s for %x / %x (%s)",
+                               iface->fd, stoa(&iface->sin),
+                               SRCADR(maddr), SRCADR(&iface->sin),
+                               stoa(maddr));
                        return ISC_FALSE;
                }
                break;
@@ -2084,35 +2104,37 @@ socket_multicast_disable(struct interface *iface, struct sockaddr_storage *maddr
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
                /*
                 * Disable reception of multicast packets
-                * If the address is link-local we can get the interface index
-                * from the scope id. Don't do this for other types of multicast
-                * addresses. For now let the kernel figure it out.
+                * If the address is link-local we can get the
+                * interface index from the scope id.  Don't do this
+                * for other types of multicast addresses. For now let
+                * the kernel figure it out.
                 */
-               iaddr6 = ((struct sockaddr_in6*)&maddr)->sin6_addr;
-               mreq6.ipv6mr_multiaddr = iaddr6;
+               mreq6.ipv6mr_multiaddr = SOCK_ADDR6(maddr);
                mreq6.ipv6mr_interface = iface->scopeid;
 
-               if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
-                       (char *)&mreq6, sizeof(mreq6)) == -1) {
-                       netsyslog(LOG_ERR,
-                       "setsockopt IPV6_LEAVE_GROUP failure: %m on socket %d, addr %s for %d(%s)",
-                       iface->fd, stoa(&iface->sin),
-                       mreq6.ipv6mr_interface, stoa(maddr));
+               if (setsockopt(iface->fd, IPPROTO_IPV6,
+                              IPV6_LEAVE_GROUP, (char *)&mreq6,
+                              sizeof(mreq6))) {
+
+                       msyslog(LOG_ERR,
+                               "setsockopt IPV6_LEAVE_GROUP failure: %m on socket %d, addr %s for %d (%s)",
+                               iface->fd, stoa(&iface->sin),
+                               iface->scopeid, stoa(maddr));
                        return ISC_FALSE;
                }
                break;
 #else
                return ISC_FALSE;
 #endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
-
        }
+
        iface->num_mcast--;
-       if (iface->num_mcast <= 0) {
-                iface->num_mcast = 0;
+       if (!iface->num_mcast)
                iface->flags &= ~INT_MCASTOPEN;
-       }
+
        return ISC_TRUE;
 }
+#endif /* MCAST */
 
 /*
  * io_setbclient - open the broadcast client sockets
@@ -2121,37 +2143,39 @@ void
 io_setbclient(void)
 {
 #ifdef OPEN_BCAST_SOCKET 
-        struct interface *interf;
-       int nif = 0;
-       isc_boolean_t jstatus; 
-       SOCKET fd;
+       struct interface *      interf;
+       int                     nif;
+       isc_boolean_t           jstatus; 
+       SOCKET                  fd;
 
+       nif = 0;
        set_reuseaddr(1);
 
        for (interf = ISC_LIST_HEAD(inter_list);
             interf != NULL;
             interf = ISC_LIST_NEXT(interf, link)) {
-               if (interf->flags & INT_WILDCARD)
-                       continue;
+
+               if (interf->flags & (INT_WILDCARD | INT_LOOPBACK))
+                       continue;
          
                /* use only allowed addresses */
-               if (interf->ignore_packets == ISC_TRUE)
-                       continue;
-               /* Only IPv4 addresses are valid for broadcast */
-               if (interf->sin.ss_family != AF_INET)
+               if (interf->ignore_packets)
                        continue;
 
-               /* Is this a broadcast address? */
+
+               /* Need a broadcast-capable interface */
                if (!(interf->flags & INT_BROADCAST))
                        continue;
 
-               /* Skip the loopback addresses */
-               if (interf->flags & INT_LOOPBACK)
-                       continue;
+               /* Only IPv4 addresses are valid for broadcast */
+               NTP_REQUIRE(IS_IPV4(&interf->sin));
 
                /* Do we already have the broadcast address open? */
                if (interf->flags & INT_BCASTOPEN) {
-               /* account for already open interfaces to aviod misleading warning below */
+                       /* 
+                        * account for already open interfaces to avoid
+                        * misleading warning below 
+                        */
                        nif++;
                        continue;
                }
@@ -2160,42 +2184,40 @@ io_setbclient(void)
                 * Try to open the broadcast address
                 */
                interf->family = AF_INET;
-               interf->bfd = open_socket(&interf->bcast,
-                                   INT_BROADCAST, 0, interf);
+               interf->bfd = open_socket(&interf->bcast, 1, 0, interf);
 
-                /*
-                * If we succeeded then we use it otherwise
-                * enable the underlying address
+               /*
+                * If we succeeded then we use it otherwise enable
+                * broadcast on the interface address
                 */
-               if (interf->bfd == INVALID_SOCKET) {
-                       fd = interf->fd;
-                       jstatus = socket_broadcast_enable(interf, fd, &interf->sin);
-               }
-               else {
+               if (interf->bfd != INVALID_SOCKET) {
                        fd = interf->bfd;
                        jstatus = ISC_TRUE;
+               } else {
+                       fd = interf->fd;
+                       jstatus = socket_broadcast_enable(interf, fd,
+                                       &interf->sin);
                }
 
                /* Enable Broadcast on socket */
-               if (jstatus == ISC_TRUE)
-               {
+               if (jstatus) {
                        nif++;
-                       netsyslog(LOG_INFO,"io_setbclient: Opened broadcast client on interface #%d %s, socket: %d",
-                                 interf->ifnum, interf->name, fd);
+                       msyslog(LOG_INFO,
+                               "io_setbclient: Opened broadcast client on interface #%d %s",
+                               interf->ifnum, interf->name);
                        interf->addr_refid = addr2refid(&interf->sin);
                }
        }
        set_reuseaddr(0);
-#ifdef DEBUG
-       if (debug)
-               if (nif > 0)
-                       printf("io_setbclient: Opened broadcast clients\n");
-#endif
-       if (nif == 0)
-               netsyslog(LOG_ERR, "Unable to listen for broadcasts, no broadcast interfaces available");
+       if (nif > 0)
+               DPRINTF(1, ("io_setbclient: Opened broadcast clients\n"));
+       else if (!nif)
+               msyslog(LOG_ERR,
+                       "Unable to listen for broadcasts, no broadcast interfaces available");
 #else
-       netsyslog(LOG_ERR, "io_setbclient: Broadcast Client disabled by build");
-#endif
+       msyslog(LOG_ERR,
+               "io_setbclient: Broadcast Client disabled by build");
+#endif /* OPEN_BCAST_SOCKET */
 }
 
 /*
@@ -2204,19 +2226,19 @@ io_setbclient(void)
 void
 io_unsetbclient(void)
 {
-        struct interface *interf;
-       isc_boolean_t lstatus;
+       struct interface *interf;
 
        for (interf = ISC_LIST_HEAD(inter_list);
-            interf != NULL;
+            NULL != interf;
             interf = ISC_LIST_NEXT(interf, link))
        {
-               if (interf->flags & INT_WILDCARD)
-                   continue;
+               if (interf->flags & INT_WILDCARD)
+                       continue;
          
                if (!(interf->flags & INT_BCASTOPEN))
-                   continue;
-               lstatus = socket_broadcast_disable(interf, &interf->sin);
+                       continue;
+
+               socket_broadcast_disable(interf, &interf->sin);
        }
 }
 
@@ -2225,7 +2247,7 @@ io_unsetbclient(void)
  */
 void
 io_multicast_add(
-       struct sockaddr_storage addr
+       sockaddr_u *addr
        )
 {
 #ifdef MCAST
@@ -2238,14 +2260,14 @@ io_multicast_add(
        /*
         * Check to see if this is a multicast address
         */
-       if (addr_ismulticast(&addr) == ISC_FALSE)
+       if (!addr_ismulticast(addr))
                return;
 
        /* If we already have it we can just return */
-       if (find_flagged_addr_in_list(&addr, INT_MCASTOPEN|INT_MCASTIF) != NULL)
-       {
-               netsyslog(LOG_INFO, "Duplicate request found for multicast address %s",
-                       stoa(&addr));
+       if (NULL != find_flagged_addr_in_list(addr, INT_MCASTOPEN)) {
+               msyslog(LOG_INFO, 
+                       "Duplicate request found for multicast address %s",
+                       stoa(addr));
                return;
        }
 
@@ -2255,77 +2277,73 @@ io_multicast_add(
        /*
         * Open a new socket for the multicast address
         */
-       interface->sin.ss_family = addr.ss_family;
-       interface->family = addr.ss_family;
+       interface->family = 
+               AF(&interface->sin) = 
+               AF(&interface->mask) = AF(addr);
+       SET_PORT(&interface->sin, NTP_PORT);
+       SET_ONESMASK(&interface->mask);
+
+       switch(AF(addr)) {
 
-       switch(addr.ss_family) {
        case AF_INET:
-               memcpy(&(((struct sockaddr_in *)&interface->sin)->sin_addr),
-                      &(((struct sockaddr_in*)&addr)->sin_addr),
-                      sizeof(struct in_addr));
-               ((struct sockaddr_in*)&interface->sin)->sin_port = htons(NTP_PORT);
-               memset(&((struct sockaddr_in*)&interface->mask)->sin_addr.s_addr, 0xff, sizeof(struct in_addr));
+               NSRCADR(&interface->sin) = NSRCADR(addr);
                break;
+
        case AF_INET6:
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
-               memcpy(&(((struct sockaddr_in6 *)&interface->sin)->sin6_addr),
-                      &((struct sockaddr_in6*)&addr)->sin6_addr,
-                      sizeof(struct in6_addr));
-               ((struct sockaddr_in6*)&interface->sin)->sin6_port = htons(NTP_PORT);
-#ifdef ISC_PLATFORM_HAVESCOPEID
-               ((struct sockaddr_in6*)&interface->sin)->sin6_scope_id = ((struct sockaddr_in6*)&addr)->sin6_scope_id;
+               SET_ADDR6N(&interface->sin, SOCK_ADDR6(addr));
+               lscope = SCOPE(addr);
+               SET_SCOPE(&interface->sin, lscope); 
 #endif
-               memset(&((struct sockaddr_in6*)&interface->mask)->sin6_addr.s6_addr, 0xff, sizeof(struct in6_addr));
-#endif
-               iface = findlocalcastinterface(&addr, INT_MULTICAST);
-               if (iface) {
-# ifdef ISC_PLATFORM_HAVESCOPEID
-                       lscope = ((struct sockaddr_in6*)&iface->sin)->sin6_scope_id;
-# endif
-                       DPRINTF(4, ("Found interface #%d %s, scope: %d for address %s\n", iface->ifnum, iface->name, lscope, stoa(&addr)));
-               }
-               break;
+               iface = findlocalcastinterface(addr);
+               if (iface != NULL)
+                       DPRINTF(4, ("Found interface #%d %s, scope %d for address %s\n",
+                                   iface->ifnum, iface->name, lscope,
+                                   stoa(addr)));
        }
                
        set_reuseaddr(1);
        interface->bfd = INVALID_SOCKET;
-       interface->fd = open_socket(&interface->sin,
-                           INT_MULTICAST, 0, interface);
+       interface->fd = open_socket(&interface->sin, INT_MULTICAST, 0,
+                                   interface);
 
-       if (interface->fd != INVALID_SOCKET)
-       {
+       if (interface->fd != INVALID_SOCKET) {
                interface->bfd = INVALID_SOCKET;
                interface->ignore_packets = ISC_FALSE;
                interface->flags |= INT_MCASTIF;
                
-               (void) strncpy(interface->name, "multicast",
+               strncpy(interface->name, "multicast",
                        sizeof(interface->name));
-               ((struct sockaddr_in*)&interface->mask)->sin_addr.s_addr =
-                                               htonl(~(u_int32)0);
                DPRINT_INTERFACE(2, (interface, "multicast add ", "\n"));
-               /* socket_multicast_enable() will add this address to the addresslist */
+               /*
+                * socket_multicast_enable() will add this address to
+                * the addresslist
+                */
                add_interface(interface);
-               list_if_listening(interface, htons(NTP_PORT));
-       }
-       else
-       {
-               delete_interface(interface);  /* re-use existing interface */
-               interface = NULL;
-               if (addr.ss_family == AF_INET)
+               list_if_listening(interface);
+       } else {
+               /* bind failed, re-use wildcard interface */
+               delete_interface(interface);
+
+               if (IS_IPV4(addr))
                        interface = wildipv4;
-               else if (addr.ss_family == AF_INET6)
+               else if (IS_IPV6(addr))
                        interface = wildipv6;
+               else
+                       interface = NULL;
 
                if (interface != NULL) {
                        /* HACK ! -- stuff in an address */
-                       interface->bcast = addr;
-                       netsyslog(LOG_ERR,
-                        "...multicast address %s using wildcard interface #%d %s",
-                                 stoa(&addr), interface->ifnum, interface->name);
+                       /* because we don't bind addr? DH */
+                       interface->bcast = *addr;
+                       msyslog(LOG_ERR,
+                               "multicast address %s using wildcard interface #%d %s",
+                                stoa(addr), interface->ifnum,
+                                interface->name);
                } else {
-                       netsyslog(LOG_ERR,
-                       "No multicast socket available to use for address %s",
-                       stoa(&addr));
+                       msyslog(LOG_ERR,
+                               "No multicast socket available to use for address %s",
+                               stoa(addr));
                        return;
                }
        }
@@ -2333,110 +2351,77 @@ io_multicast_add(
        /*
         * For the case where we can't use a separate socket
         */
-       interface = findlocalcastinterface(&addr, INT_MULTICAST);
+       interface = findlocalcastinterface(addr);
        /*
         * If we don't have a valid socket, just return
         */
-       if (!interface)
-       {
-               netsyslog(LOG_ERR,
-               "Cannot add multicast address %s: Cannot find slot",
-               stoa(&addr));
+       if (NULL == interface) {
+               msyslog(LOG_ERR,
+                       "Can not add multicast address %s: no multicast interface found",
+                       stoa(addr));
                return;
        }
 
 #endif
-       {
-               isc_boolean_t jstatus;
-               jstatus = socket_multicast_enable(interface, lscope, &addr);
-       
-               if (jstatus == ISC_TRUE)
-                       netsyslog(LOG_INFO, "Added Multicast Listener %s on interface #%d %s\n", stoa(&addr), interface->ifnum, interface->name);
-               else
-                       netsyslog(LOG_ERR, "Failed to add Multicast Listener %s\n", stoa(&addr));
-       }
+       if (socket_multicast_enable(interface, lscope, addr))
+               msyslog(LOG_INFO, 
+                       "Added Multicast Listener %s on interface #%d %s",
+                       stoa(addr), interface->ifnum, interface->name);
+       else
+               msyslog(LOG_ERR, "Failed to add Multicast Listener %s",
+                       stoa(addr));
 #else /* MCAST */
-       netsyslog(LOG_ERR,
-                 "Cannot add multicast address %s: no Multicast support",
-                 stoa(&addr));
+       msyslog(LOG_ERR,
+               "Can not add multicast address %s: no multicast support",
+               stoa(addr));
 #endif /* MCAST */
        return;
 }
 
+
 /*
  * io_multicast_del() - delete multicast group address
  */
 void
 io_multicast_del(
-       struct sockaddr_storage addr
+       sockaddr_u *    addr
        )
 {
 #ifdef MCAST
-        struct interface *interface;
-       isc_boolean_t lstatus;
+       struct interface *iface;
 
        /*
         * Check to see if this is a multicast address
         */
-       if (addr_ismulticast(&addr) == ISC_FALSE)
-       {
-               netsyslog(LOG_ERR,
-                        "invalid multicast address %s", stoa(&addr));
+       if (!addr_ismulticast(addr)) {
+               msyslog(LOG_ERR, "invalid multicast address %s",
+                       stoa(addr));
                return;
        }
 
-       switch (addr.ss_family)
-       {
-       case AF_INET :
-               /*
-                * Disable reception of multicast packets
-                */
-               interface = find_flagged_addr_in_list(&addr, INT_MCASTOPEN);
-               while ( interface != NULL) {
-                       lstatus = socket_multicast_disable(interface, &addr);
-                       interface = find_flagged_addr_in_list(&addr, INT_MCASTOPEN);
-               }
-               break;
-
-#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
-       case AF_INET6 :
-               /*
-                * Disable reception of multicast packets
-                */
-               for (interface = ISC_LIST_HEAD(inter_list);
-                    interface != NULL;
-                    interface = ISC_LIST_NEXT(interface, link))
-               {
-                        if (interface->flags & INT_WILDCARD)
-                               continue;
-         
-                       /* Be sure it's the correct family */
-                       if (interface->sin.ss_family != AF_INET6)
-                               continue;
-                       if (!(interface->flags & INT_MCASTOPEN))
-                               continue;
-                       if (!(interface->fd < 0))
-                               continue;
-                       if (!SOCKCMP(&addr, &interface->sin))
-                               continue;
-                       lstatus = socket_multicast_disable(interface, &addr);
-               }
-               break;
-#endif /* INCLUDE_IPV6_MULTICAST_SUPPORT */
-
-       }/* switch */
+       /*
+        * Disable reception of multicast packets
+        */
+       while ((iface = find_flagged_addr_in_list(addr, INT_MCASTOPEN))
+              != NULL)
+               socket_multicast_disable(iface, addr);
 
-        delete_addr_from_list(&addr);
+       delete_addr_from_list(addr);
 
 #else /* not MCAST */
-       netsyslog(LOG_ERR, "this function requires multicast kernel");
+       msyslog(LOG_ERR,
+               "Can not delete multicast address %s: no multicast support",
+               stoa(addr));
 #endif /* not MCAST */
 }
 
+
 /*
  * init_nonblocking_io() - set up descriptor to be non blocking
  */
-static void init_nonblocking_io(SOCKET fd)
+static void init_nonblocking_io(
+       SOCKET fd
+       )
 {
        /*
         * set non-blocking,
@@ -2452,47 +2437,39 @@ static void init_nonblocking_io(SOCKET fd)
 #endif
 
 #if defined(O_NONBLOCK) /* POSIX */
-       if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
-       {
-               netsyslog(LOG_ERR, "fcntl(O_NONBLOCK) fails on fd #%d: %m",
-                       fd);
+       if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
+               msyslog(LOG_ERR,
+                       "fcntl(O_NONBLOCK) fails on fd #%d: %m", fd);
                exit(1);
-               /*NOTREACHED*/
        }
 #elif defined(FNDELAY)
-       if (fcntl(fd, F_SETFL, FNDELAY) < 0)
-       {
-               netsyslog(LOG_ERR, "fcntl(FNDELAY) fails on fd #%d: %m",
+       if (fcntl(fd, F_SETFL, FNDELAY) < 0) {
+               msyslog(LOG_ERR, "fcntl(FNDELAY) fails on fd #%d: %m",
                        fd);
                exit(1);
-               /*NOTREACHED*/
        }
 #elif defined(O_NDELAY) /* generally the same as FNDELAY */
-       if (fcntl(fd, F_SETFL, O_NDELAY) < 0)
-       {
-               netsyslog(LOG_ERR, "fcntl(O_NDELAY) fails on fd #%d: %m",
+       if (fcntl(fd, F_SETFL, O_NDELAY) < 0) {
+               msyslog(LOG_ERR, "fcntl(O_NDELAY) fails on fd #%d: %m",
                        fd);
                exit(1);
-               /*NOTREACHED*/
        }
 #elif defined(FIONBIO)
        {
                int on = 1;
-               if (ioctl(fd,FIONBIO,&on) < 0)
-               {
-                       netsyslog(LOG_ERR, "ioctl(FIONBIO) fails on fd #%d: %m",
+
+               if (ioctl(fd, FIONBIO, &on) < 0) {
+                       msyslog(LOG_ERR,
+                               "ioctl(FIONBIO) fails on fd #%d: %m",
                                fd);
                        exit(1);
-                       /*NOTREACHED*/
                }
        }
 #elif defined(FIOSNBIO)
-       if (ioctl(fd,FIOSNBIO,&on) < 0)
-       {
-               netsyslog(LOG_ERR, "ioctl(FIOSNBIO) fails on fd #%d: %m",
-                       fd);
+       if (ioctl(fd, FIOSNBIO, &on) < 0) {
+               msyslog(LOG_ERR,
+                       "ioctl(FIOSNBIO) fails on fd #%d: %m", fd);
                exit(1);
-               /*NOTREACHED*/
        }
 #else
 # include "Bletch: Need non-blocking I/O!"
@@ -2505,45 +2482,48 @@ static void init_nonblocking_io(SOCKET fd)
 
 static SOCKET
 open_socket(
-       struct sockaddr_storage *addr,
-       int flags,
-       int turn_off_reuse,
-       struct interface *interf
+       sockaddr_u *            addr,
+       int                     bcast,
+       int                     turn_off_reuse,
+       struct interface *      interf
        )
 {
-       int errval;
-       SOCKET fd;
+       SOCKET  fd;
+       int     errval;
+       char    scopetext[16];
        /*
         * int is OK for REUSEADR per 
         * http://www.kohala.com/start/mcast.api.txt
         */
-       int on = 1;
-       int off = 0;
+       int     on = 1;
+       int     off = 0;
 
 
-       if ((addr->ss_family == AF_INET6) && (isc_net_probeipv6() != ISC_R_SUCCESS))
-               return (INVALID_SOCKET);
+       if (IS_IPV6(addr) && !ipv6_works)
+               return INVALID_SOCKET;
 
        /* create a datagram (UDP) socket */
-       fd = socket(addr->ss_family, SOCK_DGRAM, 0);
+       fd = socket(AF(addr), SOCK_DGRAM, 0);
        if (INVALID_SOCKET == fd) {
 #ifndef SYS_WINNT
                errval = errno;
 #else
                errval = WSAGetLastError();
 #endif
-               netsyslog(LOG_ERR, 
-                         "socket(AF_INET%s, SOCK_DGRAM, 0) failed on address %s: %m",
-                         (addr->ss_family == AF_INET6) ? "6" : "",
-                         stoa(addr));
+               msyslog(LOG_ERR, 
+                       "socket(AF_INET%s, SOCK_DGRAM, 0) failed on address %s: %m",
+                       IS_IPV6(addr) ? "6" : "", stoa(addr));
 
                if (errval == EPROTONOSUPPORT || 
                    errval == EAFNOSUPPORT ||
                    errval == EPFNOSUPPORT)
                        return (INVALID_SOCKET);
-               msyslog(LOG_ERR, "unexpected error code %d (not PROTONOSUPPORT|AFNOSUPPORT|FPNOSUPPORT) - exiting", errval);
+
+               errno = errval;
+               msyslog(LOG_ERR,
+                       "unexpected socket() error %m code %d (not EPROTONOSUPPORT nor EAFNOSUPPORT nor EPFNOSUPPORT) - exiting",
+                       errno);
                exit(1);
-               /*NOTREACHED*/
        }
 
 #ifdef SYS_WINNT
@@ -2565,17 +2545,17 @@ open_socket(
        if (isc_win32os_versioncheck(5, 1, 0, 0) < 0)  /* before 5.1 */
 #endif
                if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
-                              (char *)(turn_off_reuse 
-                                       ? &off 
-                                       : &on), 
+                              (char *)((turn_off_reuse) 
+                                           ? &off 
+                                           : &on), 
                               sizeof(on))) {
 
-                       netsyslog(LOG_ERR, "setsockopt SO_REUSEADDR %s"
-                                          " fails for address %s: %m",
-                                          turn_off_reuse 
-                                               ? "off" 
-                                               : "on", 
-                                          stoa(addr));
+                       msyslog(LOG_ERR,
+                               "setsockopt SO_REUSEADDR %s fails for address %s: %m",
+                               (turn_off_reuse)
+                                   ? "off" 
+                                   : "on", 
+                               stoa(addr));
                        closesocket(fd);
                        return INVALID_SOCKET;
                }
@@ -2591,39 +2571,35 @@ open_socket(
        /*
         * IPv4 specific options go here
         */
-       if (addr->ss_family == AF_INET) {
+       if (IS_IPV4(addr)) {
 #if defined(HAVE_IPTOS_SUPPORT)
-               if (setsockopt(fd, IPPROTO_IP, IP_TOS, (char *) &qos,
-                   sizeof(qos)) < 0) {
-                       netsyslog(LOG_ERR,
-                           "setsockopt IP_TOS (%02x) fails on address %s: %m",
-                           qos, stoa(addr));
-               }
+               if (setsockopt(fd, IPPROTO_IP, IP_TOS, (char *)&qos,
+                              sizeof(qos)))
+                       msyslog(LOG_ERR,
+                               "setsockopt IP_TOS (%02x) fails on address %s: %m",
+                               qos, stoa(addr));
 #endif /* HAVE_IPTOS_SUPPORT */
-               if ((flags & INT_BROADCAST))
+               if (bcast)
                        socket_broadcast_enable(interf, fd, addr);
        }
 
        /*
         * IPv6 specific options go here
         */
-        if (addr->ss_family == AF_INET6) {
+       if (IS_IPV6(addr)) {
 #if defined(IPV6_V6ONLY)
-                if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
-                       (char*)&on, sizeof(on)))
-                {
-                       netsyslog(LOG_ERR, "setsockopt IPV6_V6ONLY on fails on address %s: %m",
+               if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, 
+                              (char*)&on, sizeof(on)))
+                       msyslog(LOG_ERR, 
+                               "setsockopt IPV6_V6ONLY on fails for address %s: %m",
                                stoa(addr));
-               }
 #endif /* IPV6_V6ONLY */
 #if defined(IPV6_BINDV6ONLY)
-                if (setsockopt(fd, IPPROTO_IPV6, IPV6_BINDV6ONLY,
-                       (char*)&on, sizeof(on)))
-                {
-                       netsyslog(LOG_ERR,
-                           "setsockopt IPV6_BINDV6ONLY on fails on address %s: %m",
-                           stoa(addr));
-               }
+               if (setsockopt(fd, IPPROTO_IPV6, IPV6_BINDV6ONLY,
+                              (char*)&on, sizeof(on)))
+                       msyslog(LOG_ERR,
+                               "setsockopt IPV6_BINDV6ONLY on fails for address %s: %m",
+                               stoa(addr));
 #endif /* IPV6_BINDV6ONLY */
        }
 
@@ -2633,25 +2609,18 @@ open_socket(
         * addresses if a wildcard address already bound
         * to the port and SO_REUSEADDR is not set
         */
-       if (!is_wildcard_addr(addr)) {
-               set_wildcard_reuse(addr->ss_family, 1);
-       }
+       if (!is_wildcard_addr(addr))
+               set_wildcard_reuse(AF(addr), 1);
 #endif
 
        /*
         * bind the local address.
         */
-       errval = bind(fd, (struct sockaddr *)addr, SOCKLEN(addr));
+       errval = bind(fd, &addr->sa, SOCKLEN(addr));
 
 #ifdef OS_NEEDS_REUSEADDR_FOR_IFADDRBIND
-       /*
-        * some OSes don't allow binding to more specific
-        * addresses if a wildcard address already bound
-        * to the port and REUSE_ADDR is not set
-        */
-       if (!is_wildcard_addr(addr)) {
-               set_wildcard_reuse(addr->ss_family, 0);
-       }
+       if (!is_wildcard_addr(addr))
+               set_wildcard_reuse(AF(addr), 0);
 #endif
 
        if (errval < 0) {
@@ -2662,28 +2631,19 @@ open_socket(
 #ifdef DEBUG
                    || debug > 1
 #endif
-                       ) {
-                       if (addr->ss_family == AF_INET)
-                               netsyslog(LOG_ERR,
-                                         "bind() fd %d, family AF_INET, port %d, addr %s, in_classd=%d flags=0x%x fails: %m",
-                                         fd, (int)ntohs(((struct sockaddr_in*)addr)->sin_port),
-                                         stoa(addr),
-                                         IN_CLASSD(ntohl(((struct sockaddr_in*)addr)->sin_addr.s_addr)), 
-                                         flags);
-#ifdef INCLUDE_IPV6_SUPPORT
-                       else if (addr->ss_family == AF_INET6)
-                               netsyslog(LOG_ERR,
-                                         "bind() fd %d, family AF_INET6, port %d, scope %d, addr %s, mcast=%d flags=0x%x fails: %m",
-                                         fd, (int)ntohs(((struct sockaddr_in6*)addr)->sin6_port),
-# ifdef ISC_PLATFORM_HAVESCOPEID
-                                         ((struct sockaddr_in6*)addr)->sin6_scope_id
-# else
-                                         -1
-# endif
-                                         , stoa(addr),
-                                         IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)addr)->sin6_addr), 
-                                         flags);
-#endif
+                   ) {
+                       if (SCOPE(addr))
+                               snprintf(scopetext, sizeof(scopetext),
+                                        "%%%d", SCOPE(addr));
+                       else
+                               scopetext[0] = 0;
+
+                       msyslog(LOG_ERR,
+                               "bind(%d) AF_INET%s %s%s#%d%s flags 0x%x failed: %m",
+                               fd, IS_IPV6(addr) ? "6" : "",
+                               stoa(addr), scopetext, SRCPORT(addr),
+                               IS_MCAST(addr) ? " (multicast)" : "",
+                               interf->flags);
                }
 
                closesocket(fd);
@@ -2695,25 +2655,17 @@ open_socket(
        {
                if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP,
                               (char*)&on, sizeof(on)))
-               {
-                       netsyslog(LOG_DEBUG,
-                                 "setsockopt SO_TIMESTAMP on fails on address %s: %m",
-                                 stoa(addr));
-               }
-#ifdef DEBUG
+                       msyslog(LOG_DEBUG,
+                               "setsockopt SO_TIMESTAMP on fails on address %s: %m",
+                               stoa(addr));
                else
-               {
-                       DPRINTF(4, ("setsockopt SO_TIMESTAMP enabled on fd %d address %s\n", fd, stoa(addr)));
-               }
-#endif
+                       DPRINTF(4, ("setsockopt SO_TIMESTAMP enabled on fd %d address %s\n",
+                                   fd, stoa(addr)));
        }       
 #endif
-       DPRINTF(4, ("bind() fd %d, family %d, port %d, addr %s, flags=0x%x\n",
-                  fd,
-                  addr->ss_family,
-                  (int)ntohs(((struct sockaddr_in*)addr)->sin_port),
-                  stoa(addr),
-                  interf->flags));
+       DPRINTF(4, ("bind(%d) AF_INET%s, addr %s%%%d#%d, flags 0x%x\n",
+                  fd, IS_IPV6(addr) ? "6" : "", stoa(addr),
+                  SCOPE(addr), SRCPORT(addr), interf->flags));
 
        init_nonblocking_io(fd);
        
@@ -2732,8 +2684,7 @@ open_socket(
 /*
  * Add the socket to the completion port
  */
-       if (io_completion_port_add_socket(fd, interf))
-       {
+       if (io_completion_port_add_socket(fd, interf)) {
                msyslog(LOG_ERR, "unable to set up io completion port - EXITING");
                exit(1);
        }
@@ -2749,216 +2700,98 @@ open_socket(
  */
 void
 sendpkt(
-       struct sockaddr_storage *dest,
+       sockaddr_u *dest,
        struct interface *inter,
        int ttl,
        struct pkt *pkt,
        int len
        )
 {
-       int cc, slot;
-
-       /*
-        * Send error caches. Empty slots have port == 0
-        * Set ERRORCACHESIZE to 0 to disable
-        */
-       struct cache {
-               u_short port;
-               struct  in_addr addr;
-       };
-
-#ifdef INCLUDE_IPV6_SUPPORT
-       struct cache6 {
-               u_short port;
-               struct in6_addr addr;
-       };
-#endif /* INCLUDE_IPV6_SUPPORT */
+       int cc;
 
+       if (NULL == inter) {
+               /*
+                * unbound peer - drop request and wait for better
+                * network conditions 
+                */
+               DPRINTF(2, ("%ssendpkt(dst=%s, ttl=%d, len=%d): no interface - IGNORED\n",
+                           (ttl > 0) ? "\tMCAST\t***** " : "",
+                           stoa(dest), ttl, len));
+               return;
+       }
 
-#ifndef ERRORCACHESIZE
-#define ERRORCACHESIZE 8
-#endif
-#if ERRORCACHESIZE > 0
-       static struct cache badaddrs[ERRORCACHESIZE];
-#ifdef INCLUDE_IPV6_SUPPORT
-       static struct cache6 badaddrs6[ERRORCACHESIZE];
-#endif /* INCLUDE_IPV6_SUPPORT */
-#else
-#define badaddrs ((struct cache *)0)           /* Only used in empty loops! */
-#ifdef INCLUDE_IPV6_SUPPORT
-#define badaddrs6 ((struct cache6 *)0)         /* Only used in empty loops! */
-#endif /* INCLUDE_IPV6_SUPPORT */
-#endif
-#ifdef DEBUG
-       if (debug > 1)
-         {
-           if (inter != NULL) 
-             {
-               printf("%ssendpkt(fd=%d dst=%s, src=%s, ttl=%d, len=%d)\n",
-                      (ttl > 0) ? "\tMCAST\t***** " : "",
-                      inter->fd, stoa(dest),
-                      stoa(&inter->sin), ttl, len);
-             }
-           else
-             {
-               printf("%ssendpkt(dst=%s, ttl=%d, len=%d): no interface - IGNORED\n",
-                      (ttl > 0) ? "\tMCAST\t***** " : "",
-                      stoa(dest),
-                      ttl, len);
-             }
-         }
-#endif
+       DPRINTF(2, ("%ssendpkt(%d, dst=%s, src=%s, ttl=%d, len=%d)\n",
+                   (ttl > 0) ? "\tMCAST\t***** " : "",
+                   inter->fd, stoa(dest), stoa(&inter->sin),
+                   ttl, len));
 
-       if (inter == NULL)      /* unbound peer - drop request and wait for better network conditions */
-         return;
-       
 #ifdef MCAST
-
        /*
         * for the moment we use the bcast option to set multicast ttl
         */
        if (ttl > 0 && ttl != inter->last_ttl) {
-               
                /*
                 * set the multicast ttl for outgoing packets
                 */
-               int rtc;
+               int     rtc;
+               u_char  cttl;
+               u_int   uttl;
                
-               switch (inter->sin.ss_family) {
+               switch (AF(&inter->sin)) {
                        
                case AF_INET :
-               {
-                       u_char mttl = (u_char) ttl;
-
-                       rtc = setsockopt(inter->fd, IPPROTO_IP, IP_MULTICAST_TTL,
-                                        (const void *) &mttl, sizeof(mttl));
+                       cttl = (u_char)ttl;
+                       rtc = setsockopt(inter->fd, IPPROTO_IP, 
+                                        IP_MULTICAST_TTL,
+                                        (void *)&cttl, sizeof(cttl));
                        break;
-               }
                        
 #ifdef INCLUDE_IPV6_SUPPORT
                case AF_INET6 :
-               {
-                       u_int ittl = (u_char) ttl;
-
-                       rtc = setsockopt(inter->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
-                                        (const void *) &ittl, sizeof(ittl));
+                       uttl = (u_int)ttl;
+                       rtc = setsockopt(inter->fd, IPPROTO_IPV6,
+                                        IPV6_MULTICAST_HOPS,
+                                        (void *)&uttl, sizeof(uttl));
                        break;
-               }
-
 #endif /* INCLUDE_IPV6_SUPPORT */
+
                default:        /* just NOP if not supported */
+                       DPRINTF(1, ("sendpkt unknown AF %d", 
+                                   AF(&inter->sin)));
                        rtc = 0;
-                       break;
                }
                
-               if (rtc != 0) {
-                       netsyslog(LOG_ERR, "setsockopt IP_MULTICAST_TTL/IPV6_MULTICAST_HOPS fails on address %s: %m",
-                                 stoa(&inter->sin));
-               }
-               else
+               if (!rtc)
                        inter->last_ttl = ttl;
+               else
+                       msyslog(LOG_ERR, 
+                               "setsockopt IP_MULTICAST_TTL/IPV6_MULTICAST_HOPS fails on address %s: %m",
+                               stoa(&inter->sin));
        }
 
 #endif /* MCAST */
 
-       for (slot = ERRORCACHESIZE; --slot >= 0; )
-               if(dest->ss_family == AF_INET) {
-                       if (badaddrs[slot].port == ((struct sockaddr_in*)dest)->sin_port &&
-                               badaddrs[slot].addr.s_addr == ((struct sockaddr_in*)dest)->sin_addr.s_addr)
-                       break;
-               }
-#ifdef INCLUDE_IPV6_SUPPORT
-               else if (dest->ss_family == AF_INET6) {
-                       if (badaddrs6[slot].port == ((struct sockaddr_in6*)dest)->sin6_port &&
-                               badaddrs6[slot].addr.s6_addr == ((struct sockaddr_in6*)dest)->sin6_addr.s6_addr)
-                       break;
-               }
-#endif /* INCLUDE_IPV6_SUPPORT */
-
 #if defined(HAVE_IO_COMPLETION_PORT)
-        cc = io_completion_port_sendto(inter, pkt, len, dest);
-       if (cc != ERROR_SUCCESS)
+       cc = io_completion_port_sendto(inter, pkt, len, dest);
+       if (cc != ERROR_SUCCESS) {
 #else
 #ifdef SIM
        cc = simulate_server(dest, inter, pkt);
 #else /* SIM */
-       cc = sendto(inter->fd, (char *)pkt, (unsigned int)len, 0, (struct sockaddr *)dest,
-                   SOCKLEN(dest));
+       cc = sendto(inter->fd, (char *)pkt, (unsigned int)len, 0, 
+                   (struct sockaddr *)dest, SOCKLEN(dest));
 #endif /* SIM */
-       if (cc == -1)
+       if (cc == -1) {
 #endif
-       {
                inter->notsent++;
                packets_notsent++;
-
-#if defined(HAVE_IO_COMPLETION_PORT)
-               if (cc != WSAEWOULDBLOCK && cc != WSAENOBUFS && slot < 0)
-#else
-               if (errno != EWOULDBLOCK && errno != ENOBUFS && slot < 0)
-#endif
-               {
-                       /*
-                        * Remember this, if there's an empty slot
-                        */
-                       switch (dest->ss_family) {
-
-                       case AF_INET :
-
-                               for (slot = ERRORCACHESIZE; --slot >= 0; )
-                                       if (badaddrs[slot].port == 0)
-                                       {
-                                               badaddrs[slot].port = SRCPORT(dest);
-                                               badaddrs[slot].addr = ((struct sockaddr_in*)dest)->sin_addr;
-                                               break;
-                                       }
-                               break;
-
-#ifdef INCLUDE_IPV6_SUPPORT
-                       case AF_INET6 :
-
-                               for (slot = ERRORCACHESIZE; --slot >= 0; )
-                                       if (badaddrs6[slot].port == 0)
-                                       {
-                                               badaddrs6[slot].port = SRCPORT(dest);
-                                               badaddrs6[slot].addr = ((struct sockaddr_in6*)dest)->sin6_addr;
-                                               break;
-                                       }
-                               break;
-#endif /* INCLUDE_IPV6_SUPPORT */
-                       default:  /* don't care if not supported */
-                               break;
-                       }
-
-                       netsyslog(LOG_ERR, "sendto(%s) (fd=%d): %m",
-                                 stoa(dest), inter->fd);
-               }
-       }
-       else
-       {
+       } else  {
                inter->sent++;
                packets_sent++;
-               /*
-                * He's not bad any more
-                */
-               if (slot >= 0)
-               {
-                       netsyslog(LOG_INFO, "Connection re-established to %s", stoa(dest));
-                       switch (dest->ss_family) {
-                       case AF_INET :
-                               badaddrs[slot].port = 0;
-                               break;
-#ifdef INCLUDE_IPV6_SUPPORT
-                       case AF_INET6 :
-                               badaddrs6[slot].port = 0;
-                               break;
-#endif /* INCLUDE_IPV6_SUPPORT */
-                       default:  /* don't care if not supported */
-                               break;
-                       }
-               }
        }
 }
 
+
 #if !defined(HAVE_IO_COMPLETION_PORT)
 /*
  * fdbits - generate ascii representation of fd_set (FAU debug support)
@@ -2973,10 +2806,9 @@ fdbits(
        static char buffer[256];
        char * buf = buffer;
 
-       count = (count < 256) ? count : 255;
+       count = min(count,  255);
 
-       while (count >= 0)
-       {
+       while (count >= 0) {
                *buf++ = FD_ISSET(count, set) ? '#' : '-';
                count--;
        }
@@ -2999,8 +2831,7 @@ read_refclock_packet(SOCKET fd, struct refclockio *rp, l_fp ts)
 
        rb = get_free_recv_buffer();
 
-       if (rb == NULL)
-       {
+       if (NULL == rb) {
                /*
                 * No buffer space available - just drop the packet
                 */
@@ -3012,15 +2843,14 @@ read_refclock_packet(SOCKET fd, struct refclockio *rp, l_fp ts)
        }
 
        i = (rp->datalen == 0
-           || rp->datalen > sizeof(rb->recv_space))
-           ? sizeof(rb->recv_space) : rp->datalen;
+            || rp->datalen > sizeof(rb->recv_space))
+               ? sizeof(rb->recv_space)
+               : rp->datalen;
        buflen = read(fd, (char *)&rb->recv_space, (unsigned)i);
 
-       if (buflen < 0)
-       {
-               if (errno != EINTR && errno != EAGAIN) {
-                       netsyslog(LOG_ERR, "clock read fd %d: %m", fd);
-               }
+       if (buflen < 0) {
+               if (errno != EINTR && errno != EAGAIN)
+                       msyslog(LOG_ERR, "clock read fd %d: %m", fd);
                freerecvbuf(rb);
                return (buflen);
        }
@@ -3036,13 +2866,11 @@ read_refclock_packet(SOCKET fd, struct refclockio *rp, l_fp ts)
        rb->recv_time = ts;
        rb->receiver = rp->clock_recv;
 
-       if (rp->io_input)
-       {
+       if (rp->io_input) {
                /*
                 * have direct input routine for refclocks
                 */
-               if (rp->io_input(rb) == 0)
-               {
+               if (rp->io_input(rb) == 0) {
                        /*
                         * data was consumed - nothing to pass up
                         * into block input machine
@@ -3059,12 +2887,17 @@ read_refclock_packet(SOCKET fd, struct refclockio *rp, l_fp ts)
        return (buflen);
 }
 
+
 #ifdef HAVE_TIMESTAMP
 /*
  * extract timestamps from control message buffer
  */
 static l_fp
-       fetch_timestamp(struct recvbuf *rb, struct msghdr *msghdr, l_fp ts)
+fetch_timestamp(
+       struct recvbuf *        rb,
+       struct msghdr *         msghdr, 
+       l_fp                    ts
+       )
 {
 #ifdef USE_TIMESTAMP_CMSG
        struct cmsghdr *cmsghdr;
@@ -3075,28 +2908,36 @@ static l_fp
                {
                case SCM_TIMESTAMP:
                {
-                       struct timeval *tvp = (struct timeval *)CMSG_DATA(cmsghdr);
+                       struct timeval *tvp;
                        double dtemp;
                        l_fp nts;
-                       DPRINTF(4, ("fetch_timestamp: system network time stamp: %ld.%06ld\n", tvp->tv_sec, tvp->tv_usec));
+
+                       tvp = (struct timeval *)CMSG_DATA(cmsghdr);
+                       DPRINTF(4, ("fetch_timestamp: system network time stamp: %ld.%06ld\n",
+                                   tvp->tv_sec, tvp->tv_usec));
                        nts.l_i = tvp->tv_sec + JAN_1970;
-                       dtemp = (tvp->tv_usec + (ntp_random() * 2. / FRAC)) /
-                           1e6;
+                       dtemp = (tvp->tv_usec 
+                                + (ntp_random() * 2. / FRAC)) / 1e6;
                        nts.l_uf = (u_int32)(dtemp * FRAC);
 #ifdef DEBUG_TIMING
                        {
-                               l_fp dts = ts;
+                               l_fp dts;
+
+                               dts = ts;
                                L_SUB(&dts, &nts);
-                               collect_timing(rb, "input processing delay", 1, &dts);
-                               DPRINTF(4, ("fetch_timestamp: timestamp delta: %s (incl. prec fuzz)\n", lfptoa(&dts, 9)));
+                               collect_timing(rb, 
+                                              "input processing delay",
+                                              1, &dts);
+                               DPRINTF(4, ("fetch_timestamp: timestamp delta: %s (incl. prec fuzz)\n",
+                                           lfptoa(&dts, 9)));
                        }
 #endif
                        ts = nts;  /* network time stamp */
                        break;
                }
                default:
-                       DPRINTF(4, ("fetch_timestamp: skipping control message 0x%x\n", cmsghdr->cmsg_type));
-                       break;
+                       DPRINTF(4, ("fetch_timestamp: skipping control message 0x%x\n",
+                                   cmsghdr->cmsg_type));
                }
                cmsghdr = CMSG_NXTHDR(msghdr, cmsghdr);
        }
@@ -3105,22 +2946,26 @@ static l_fp
 }
 #endif
 
+
 /*
  * Routine to read the network NTP packets for a specific interface
  * Return the number of bytes read. That way we know if we should
  * read it again or go on to the next one if no bytes returned
  */
 static inline int
-read_network_packet(SOCKET fd, struct interface *itf, l_fp ts)
+read_network_packet(
+       SOCKET                  fd,
+       struct interface *      itf,
+       l_fp                    ts
+       )
 {
        GETSOCKNAME_SOCKLEN_TYPE fromlen;
        int buflen;
-       isc_boolean_t ignore_this;
        register struct recvbuf *rb;
 #ifdef HAVE_TIMESTAMP
        struct msghdr msghdr;
        struct iovec iovec;
-       char control[TIMESTAMP_CTLMSGBUF_SIZE]; /* pick up control messages */
+       char control[TIMESTAMP_CTLMSGBUF_SIZE];
 #endif
 
        /*
@@ -3131,40 +2976,39 @@ read_network_packet(SOCKET fd, struct interface *itf, l_fp ts)
         */
 
        rb = get_free_recv_buffer();
-       ignore_this = itf->ignore_packets;
-       if (rb == NULL ||(ignore_this == ISC_TRUE)) {
+       if (NULL == rb || itf->ignore_packets) {
                char buf[RX_BUFF_SIZE];
-               struct sockaddr_storage from;
+               sockaddr_u from;
+
                if (rb != NULL)
                        freerecvbuf(rb);
 
                fromlen = sizeof(from);
                buflen = recvfrom(fd, buf, sizeof(buf), 0,
-                               (struct sockaddr*)&from, &fromlen);
+                                 &from.sa, &fromlen);
                DPRINTF(4, ("%s on (%lu) fd=%d from %s\n",
-                       (itf->ignore_packets == ISC_TRUE) ? "ignore" : "drop",
-                       free_recvbuffs(), fd,
-                       stoa(&from)));
-               if (itf->ignore_packets == ISC_TRUE)
+                       (itf->ignore_packets)
+                           ? "ignore"
+                           : "drop",
+                       free_recvbuffs(), fd, stoa(&from)));
+               if (itf->ignore_packets)
                        packets_ignored++;
                else
                        packets_dropped++;
                return (buflen);
        }
 
-       fromlen = sizeof(struct sockaddr_storage);
+       fromlen = sizeof(&rb->recv_srcadr.sas);
 
 #ifndef HAVE_TIMESTAMP
-       rb->recv_length = recvfrom(fd,
-                         (char *)&rb->recv_space,
-                          sizeof(rb->recv_space), 0,
-                          (struct sockaddr *)&rb->recv_srcadr,
-                          &fromlen);
+       rb->recv_length = recvfrom(fd, (char *)&rb->recv_space,
+                                  sizeof(rb->recv_space), 0,
+                                  &rb->recv_srcadr.sa, &fromlen);
 #else
        iovec.iov_base        = (void *)&rb->recv_space;
        iovec.iov_len         = sizeof(rb->recv_space);
-       msghdr.msg_name       = (void *)&rb->recv_srcadr;
-       msghdr.msg_namelen    = sizeof(rb->recv_srcadr);
+       msghdr.msg_name       = &rb->recv_srcadr.sas;
+       msghdr.msg_namelen    = fromlen;
        msghdr.msg_iov        = &iovec;
        msghdr.msg_iovlen     = 1;
        msghdr.msg_control    = (void *)&control;
@@ -3176,37 +3020,24 @@ read_network_packet(SOCKET fd, struct interface *itf, l_fp ts)
        buflen = rb->recv_length;
 
        if (buflen == 0 || (buflen == -1 && 
-           (errno==EWOULDBLOCK
+           (EWOULDBLOCK == errno
 #ifdef EAGAIN
-          || errno==EAGAIN
+            || EAGAIN == errno
 #endif
-        ))) {
+            ))) {
                freerecvbuf(rb);
                return (buflen);
-       }
-       else if (buflen < 0)
-       {
-               netsyslog(LOG_ERR, "recvfrom(%s) fd=%d: %m",
-               stoa(&rb->recv_srcadr), fd);
-               DPRINTF(5, ("read_network_packet: fd=%d dropped (bad recvfrom)\n", fd));
+       } else if (buflen < 0) {
+               msyslog(LOG_ERR, "recvfrom(%s) fd=%d: %m",
+                       stoa(&rb->recv_srcadr), fd);
+               DPRINTF(5, ("read_network_packet: fd=%d dropped (bad recvfrom)\n",
+                           fd));
                freerecvbuf(rb);
                return (buflen);
        }
 
-#ifdef DEBUG
-       if (debug > 2) {
-               if(rb->recv_srcadr.ss_family == AF_INET)
-                       printf("read_network_packet: fd=%d length %d from %08lx %s\n",
-                               fd, buflen,
-                               (u_long)ntohl(((struct sockaddr_in*)&rb->recv_srcadr)->sin_addr.s_addr) &
-                               0x00000000ffffffff,
-                               stoa(&rb->recv_srcadr));
-               else
-                       printf("read_network_packet: fd=%d length %d from %s\n",
-                               fd, buflen,
-                               stoa(&rb->recv_srcadr));
-       }
-#endif
+       DPRINTF(3, ("read_network_packet: fd=%d length %d from %s\n",
+                   fd, buflen, stoa(&rb->recv_srcadr)));
 
        /*
         * Got one.  Mark how and when it got here,
@@ -3215,7 +3046,8 @@ read_network_packet(SOCKET fd, struct interface *itf, l_fp ts)
        rb->dstadr = itf;
        rb->fd = fd;
 #ifdef HAVE_TIMESTAMP
-       ts = fetch_timestamp(rb, &msghdr, ts);  /* pick up a network time stamp if possible */
+       /* pick up a network time stamp if possible */
+       ts = fetch_timestamp(rb, &msghdr, ts);
 #endif
        rb->recv_time = ts;
        rb->receiver = receive;
@@ -3227,6 +3059,7 @@ read_network_packet(SOCKET fd, struct interface *itf, l_fp ts)
        return (buflen);
 }
 
+
 /*
  * input_handler - receive packets asynchronously
  */
@@ -3235,15 +3068,14 @@ input_handler(
        l_fp *cts
        )
 {
-
        int buflen;
        int n;
        int doing;
        SOCKET fd;
        struct timeval tvzero;
-       l_fp ts;                        /* Timestamp at BOselect() gob */
+       l_fp ts;                /* Timestamp at BOselect() gob */
 #ifdef DEBUG_TIMING
-       l_fp ts_e;                      /* Timestamp at EOselect() gob */
+       l_fp ts_e;              /* Timestamp at EOselect() gob */
 #endif
        fd_set fds;
        int select_count = 0;
@@ -3256,7 +3088,7 @@ input_handler(
 
        /*
         * If we have something to do, freeze a timestamp.
-        * See below for the other cases (nothing (left) to do or error)
+        * See below for the other cases (nothing left to do or error)
         */
        ts = *cts;
 
@@ -3267,28 +3099,31 @@ input_handler(
        fds = activefds;
        tvzero.tv_sec = tvzero.tv_usec = 0;
 
-       n = select(maxactivefd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero);
+       n = select(maxactivefd + 1, &fds, (fd_set *)0, (fd_set *)0,
+                  &tvzero);
 
        /*
         * If there are no packets waiting just return
         */
-       if (n < 0)
-       {
+       if (n < 0) {
                int err = errno;
                /*
                 * extended FAU debugging output
                 */
                if (err != EINTR)
-                   netsyslog(LOG_ERR,
-                             "select(%d, %s, 0L, 0L, &0.0) error: %m",
-                             maxactivefd+1,
-                             fdbits(maxactivefd, &activefds));
+                       msyslog(LOG_ERR,
+                               "select(%d, %s, 0L, 0L, &0.0) error: %m",
+                               maxactivefd + 1,
+                               fdbits(maxactivefd, &activefds));
                if (err == EBADF) {
                        int j, b;
                        fds = activefds;
                        for (j = 0; j <= maxactivefd; j++)
-                           if ((FD_ISSET(j, &fds) && (read(j, &b, 0) == -1)))
-                               netsyslog(LOG_ERR, "Bad file descriptor %d", j);
+                               if ((FD_ISSET(j, &fds)
+                                   && (read(j, &b, 0) == -1)))
+                                       msyslog(LOG_ERR,
+                                               "Bad file descriptor %d",
+                                               j);
                }
                return;
        }
@@ -3302,25 +3137,20 @@ input_handler(
         * Check out the reference clocks first, if any
         */
 
-       if (refio != NULL)
-       {
+       if (refio != NULL) {
                register struct refclockio *rp;
 
-               for (rp = refio; rp != NULL; rp = rp->next)
-               {
+               for (rp = refio; rp != NULL; rp = rp->next) {
                        fd = rp->fd;
 
                        if (FD_ISSET(fd, &fds))
-                       {
                                do {
                                        ++select_count;
-                                       buflen = read_refclock_packet(fd, rp, ts);
+                                       buflen = read_refclock_packet(
+                                                       fd, rp, ts);
                                } while (buflen > 0);
-
-                       } /* End if (FD_ISSET(fd, &fds)) */
-               } /* End for (rp = refio; rp != 0 && n > 0; rp = rp->next) */
-       } /* End if (refio != 0) */
-
+               }
+       }
 #endif /* REFCLOCK */
 
        /*
@@ -3328,29 +3158,26 @@ input_handler(
         */
        for (interface = ISC_LIST_TAIL(inter_list);
             interface != NULL;
-            interface = ISC_LIST_PREV(interface, link))
-       {
-               for (doing = 0; (doing < 2); doing++)
-               {
-                       if (doing == 0)
-                       {
+            interface = ISC_LIST_PREV(interface, link)) {
+
+               for (doing = 0; (doing < 2); doing++) {
+                       if (!doing)
                                fd = interface->fd;
-                       }
-                       else
-                       {
+                       else {
                                if (!(interface->flags & INT_BCASTOPEN))
-                                   break;
+                                       break;
                                fd = interface->bfd;
                        }
-                       if (fd < 0) continue;
+                       if (fd < 0)
+                               continue;
                        if (FD_ISSET(fd, &fds))
-                       {
                                do {
                                        ++select_count;
-                                       buflen = read_network_packet(fd, interface, ts);
+                                       buflen = read_network_packet(
+                                                       fd, interface,
+                                                       ts);
                                } while (buflen > 0);
-                       }
-               /* Check more interfaces */
+                       /* Check more interfaces */
                }
        }
 
@@ -3360,9 +3187,10 @@ input_handler(
         */
        asyncio_reader = ISC_LIST_TAIL(asyncio_reader_list);
 
-       while (asyncio_reader != NULL)
-       {
-               struct asyncio_reader *next = ISC_LIST_PREV(asyncio_reader, link);
+       while (asyncio_reader != NULL) {
+               struct asyncio_reader *next;
+               
+               next = ISC_LIST_PREV(asyncio_reader, link);
                if (FD_ISSET(asyncio_reader->fd, &fds)) {
                        ++select_count;
                        asyncio_reader->receiver(asyncio_reader);
@@ -3379,15 +3207,14 @@ input_handler(
         * If nothing to do, just return.
         * If an error occurred, complain and return.
         */
-       if (select_count == 0) /* We really had nothing to do */
-       {
+       if (select_count == 0) { /* We really had nothing to do */
 #ifdef DEBUG
                if (debug)
-                   netsyslog(LOG_DEBUG, "input_handler: select() returned 0");
+                       msyslog(LOG_DEBUG, "input_handler: select() returned 0");
 #endif
                return;
        }
-               /* We've done our work */
+       /* We've done our work */
 #ifdef DEBUG_TIMING
        get_systime(&ts_e);
        /*
@@ -3398,12 +3225,13 @@ input_handler(
        L_SUB(&ts_e, &ts);
        collect_timing(NULL, "input handler", 1, &ts_e);
        if (debug > 3)
-           netsyslog(LOG_INFO, "input_handler: Processed a gob of fd's in %s msec", lfptoms(&ts_e, 6));
+               msyslog(LOG_DEBUG,
+                       "input_handler: Processed a gob of fd's in %s msec",
+                       lfptoms(&ts_e, 6));
 #endif
        /* just bail. */
        return;
 }
-
 #endif
 
 /*
@@ -3411,27 +3239,23 @@ input_handler(
  */
 struct interface *
 findinterface(
-       struct sockaddr_storage *addr
+       sockaddr_u *addr
        )
 {
-       struct interface *interface;
+       struct interface *iface;
        
-       interface = findlocalinterface(addr, INT_WILDCARD, 0);
+       iface = findlocalinterface(addr, INT_WILDCARD, 0);
 
-       if (interface == NULL)
-       {
+       if (NULL == iface) {
                DPRINTF(4, ("Found no interface for address %s - returning wildcard\n",
                            stoa(addr)));
 
-               return (ANY_INTERFACE_CHOOSE(addr));
-       }
-       else
-       {
+               iface = ANY_INTERFACE_CHOOSE(addr);
+       } else
                DPRINTF(4, ("Found interface #%d %s for address %s\n",
-                           interface->ifnum, interface->name, stoa(addr)));
+                           iface->ifnum, iface->name, stoa(addr)));
 
-               return (interface);
-       }
+       return iface;
 }
 
 /*
@@ -3451,62 +3275,50 @@ findinterface(
  */
 static struct interface *
 findlocalinterface(
-       struct sockaddr_storage *addr,
-       int flags,
-       int bcast
+       sockaddr_u *    addr,
+       int             flags,
+       int             bcast
        )
 {
-       SOCKET s;
-       int rtn;
-       struct sockaddr_storage saddr;
-       GETSOCKNAME_SOCKLEN_TYPE saddrlen = SOCKLEN(addr);
-       struct interface *iface;
-       int on = 1;
+       GETSOCKNAME_SOCKLEN_TYPE        sockaddrlen;
+       struct interface *              iface;
+       sockaddr_u                      saddr;
+       SOCKET                          s;
+       int                             rtn;
+       int                             on;
 
        DPRINTF(4, ("Finding interface for addr %s in list of addresses\n",
                    stoa(addr)));
-
-       memset(&saddr, 0, sizeof(saddr));
-       saddr.ss_family = addr->ss_family;
-       if(addr->ss_family == AF_INET) {
-               memcpy(&((struct sockaddr_in*)&saddr)->sin_addr, &((struct sockaddr_in*)addr)->sin_addr, sizeof(struct in_addr));
-               ((struct sockaddr_in*)&saddr)->sin_port = htons(NTP_PORT);
-       }
-#ifdef INCLUDE_IPV6_SUPPORT
-       else if(addr->ss_family == AF_INET6) {
-               memcpy(&((struct sockaddr_in6*)&saddr)->sin6_addr, &((struct sockaddr_in6*)addr)->sin6_addr, sizeof(struct in6_addr));
-               ((struct sockaddr_in6*)&saddr)->sin6_port = htons(NTP_PORT);
-# ifdef ISC_PLATFORM_HAVESCOPEID
-               ((struct sockaddr_in6*)&saddr)->sin6_scope_id = ((struct sockaddr_in6*)addr)->sin6_scope_id;
-# endif
-       }
-#endif
        
-       s = socket(addr->ss_family, SOCK_DGRAM, 0);
-       if (s == INVALID_SOCKET)
+       s = socket(AF(addr), SOCK_DGRAM, 0);
+       if (INVALID_SOCKET == s)
                return NULL;
 
        /*
         * If we are looking for broadcast interface we need to set this
         * socket to allow broadcast
         */
-       if (bcast)
+       if (bcast) {
+               on = 1;
                setsockopt(s, SOL_SOCKET, SO_BROADCAST,
                           (char *)&on, sizeof(on));
+       }
 
-       rtn = connect(s, (struct sockaddr *)&saddr, SOCKLEN(&saddr));
-       if (rtn == SOCKET_ERROR)
-       {
+       rtn = connect(s, &addr->sa, SOCKLEN(addr));
+       if (SOCKET_ERROR == rtn) {
                closesocket(s);
                return NULL;
        }
 
-       rtn = getsockname(s, (struct sockaddr *)&saddr, &saddrlen);
+       sockaddrlen = sizeof(saddr);
+       rtn = getsockname(s, &saddr.sa, &sockaddrlen);
        closesocket(s);
-       if (rtn == SOCKET_ERROR)
+
+       if (SOCKET_ERROR == rtn)
                return NULL;
 
-       DPRINTF(4, ("findlocalinterface: kernel maps %s to %s\n", stoa(addr), stoa(&saddr)));
+       DPRINTF(4, ("findlocalinterface: kernel maps %s to %s\n",
+                   stoa(addr), stoa(&saddr)));
        
        iface = getinterface(&saddr, flags);
 
@@ -3521,68 +3333,76 @@ findlocalinterface(
        if (NULL == iface)
                iface = getsamenetinterface(&saddr, flags);
 
-       /* Don't return an interface which will ignore replies */
-       if (NULL != iface && iface->ignore_packets)
+       /* Don't use an interface which will ignore replies */
+       if (iface != NULL && iface->ignore_packets)
                iface = NULL;
 
        return iface;
 }
 
+
 /*
  * fetch an interface structure the matches the
- * address is has the given flags NOT set
+ * address and has the given flags NOT set
  */
 static struct interface *
-getinterface(struct sockaddr_storage *addr, int flags)
+getinterface(
+       sockaddr_u *    addr, 
+       int             flags
+       )
 {
-       struct interface *interface = find_addr_in_list(addr);
+       struct interface *iface;
+       
+       iface = find_addr_in_list(addr);
 
-       if (interface != NULL && interface->flags & flags)
-       {
-               return NULL;
-       }
-       else
-       {
-               return interface;
-       }
+       if (iface != NULL && (iface->flags & flags))
+               iface = NULL;
+       
+       return iface;
 }
 
+
 /*
  * fetch an interface structure with a local address on the same subnet
  * as addr which has the given flags NOT set
  */
 static struct interface *
-getsamenetinterface(struct sockaddr_storage *addr, int flags)
+getsamenetinterface(
+       sockaddr_u *    addr,
+       int             flags
+       )
 {
        struct interface *iface;
 
        iface = find_samenet_addr_in_list(addr);
 
-       if (NULL != iface && iface->flags & flags)
+       if (iface != NULL && (iface->flags & flags))
                iface = NULL;
 
        return iface;
 }
 
+
 /*
- * findlocalcastinterface - find local *cast interface index corresponding to address
- * depending on the flags passed
+ * findlocalcastinterface - find local *cast interface for addr
  */
 static struct interface *
 findlocalcastinterface(
-       struct sockaddr_storage *addr, int flags
+       sockaddr_u *    addr
        )
 {
-       struct interface *interface;
-       struct interface *nif = NULL;
+       struct interface *      iface;
+       struct interface *      nif;
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
-       isc_boolean_t want_linklocal;
+       isc_boolean_t           want_linklocal;
 #endif 
 
+       NTP_REQUIRE(addr_ismulticast(addr));
+
        /*
         * see how kernel maps the mcast address
         */
-        nif = findlocalinterface(addr, 0, 0);
+       nif = findlocalinterface(addr, 0, 0);
 
        if (nif) {
                DPRINTF(2, ("findlocalcastinterface: kernel recommends interface #%d %s\n", nif->ifnum, nif->name));
@@ -3590,131 +3410,118 @@ findlocalcastinterface(
        }
 
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
-       want_linklocal = ISC_FALSE; 
-       if (addr_ismulticast(addr) && flags == INT_MULTICAST)
-       {
-               if (IN6_IS_ADDR_MC_LINKLOCAL(&((struct sockaddr_in6*)addr)->sin6_addr))
-               {
-                       want_linklocal = ISC_TRUE;
-               }
-               else if (IN6_IS_ADDR_MC_SITELOCAL(&((struct sockaddr_in6*)addr)->sin6_addr))
-               {
-                       want_linklocal = ISC_TRUE;
-               }
-       }
+       want_linklocal = (IN6_IS_ADDR_MC_LINKLOCAL(PSOCK_ADDR6(addr))
+                      || IN6_IS_ADDR_MC_SITELOCAL(PSOCK_ADDR6(addr)));
 #endif
 
-       for (interface = ISC_LIST_HEAD(inter_list);
-            interface != NULL;
-            interface = ISC_LIST_NEXT(interface, link)) 
+       for (iface = ISC_LIST_HEAD(inter_list);
+            iface != NULL;
+            iface = ISC_LIST_NEXT(iface, link)) 
          {
                /* use only allowed addresses */
-               if (interface->ignore_packets == ISC_TRUE)
+               if (iface->ignore_packets)
                        continue;
 
                /* Skip the loopback and wildcard addresses */
-               if (interface->flags & (INT_LOOPBACK|INT_WILDCARD))
+               if (iface->flags & (INT_LOOPBACK | INT_WILDCARD))
                        continue;
 
                /* Skip if different family */
-               if(interface->sin.ss_family != addr->ss_family)
+               if (AF(&iface->sin) != AF(addr))
                        continue;
 
-               /* Is this it one of these based on flags? */
-               if (!(interface->flags & flags))
+               /* Is it multicast capable? */
+               if (!(iface->flags & INT_MULTICAST))
                        continue;
 
-               /* for IPv6 multicast check the address for linklocal */
 #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
-               if (flags == INT_MULTICAST && interface->sin.ss_family == AF_INET6 &&
-                  (IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6*)&interface->sin)->sin6_addr))
-                  && want_linklocal == ISC_TRUE)
-               {
-                       nif = interface;
+               if (want_linklocal && IS_IPV6(&iface->sin) &&
+                   IN6_IS_ADDR_LINKLOCAL(PSOCK_ADDR6(&iface->sin))) {
+                       nif = iface;
                        break;
                }
-               /* If we want a linklocal address and this isn't it, skip */\
-               if (want_linklocal == ISC_TRUE)
+               /* If we want a linklocal address, skip */
+               if (want_linklocal)
                        continue;
 #endif
-               /* Otherwise just look for the flag */
-               if((interface->flags & flags))
-               {
-                       nif = interface;
-                       break;
-               }
-       }
-#ifdef DEBUG
-       if (debug > 2) 
-       {
-               if (nif)
-                       printf("findlocalcastinterface: found interface #%d %s\n", nif->ifnum, nif->name);
-               else
-                       printf("findlocalcastinterface: no interface found for %s flags 0x%x\n", stoa(addr), flags);
-       }
-#endif
-       return (nif);
+               nif = iface;
+               break;
+       }       /* for loop over interfaces */
+
+       if (nif != NULL)
+               DPRINTF(3, ("findlocalcastinterface: found interface #%d %s\n",
+                           nif->ifnum, nif->name));
+       else
+               DPRINTF(3, ("findlocalcastinterface: no interface found for %s\n",
+                           stoa(addr)));
+       return nif;
 }
 
+
 /*
  * findbcastinter - find broadcast interface corresponding to address
  */
 struct interface *
 findbcastinter(
-       struct sockaddr_storage *addr
+       sockaddr_u *addr
        )
 {
 #if !defined(MPE) && (defined(SIOCGIFCONF) || defined(SYS_WINNT))
-        struct interface *interface;
+       struct interface *iface;
        
        
        DPRINTF(4, ("Finding broadcast/multicast interface for addr %s in list of addresses\n",
                    stoa(addr)));
 
-       interface = findlocalinterface(addr, INT_LOOPBACK | INT_WILDCARD, 1);
-       
-       if (interface != NULL)
-       {
-               DPRINTF(4, ("Easily found bcast-/mcast- interface index #%d %s\n", interface->ifnum, interface->name));
-               return interface;
+       iface = findlocalinterface(addr, INT_LOOPBACK | INT_WILDCARD,
+                                  1);  
+       if (iface != NULL) {
+               DPRINTF(4, ("Easily found bcast-/mcast- interface index #%d %s\n",
+                           iface->ifnum, iface->name));
+               return iface;
        }
 
-       /* plan B - try to find something reasonable in our lists in case kernel lookup doesn't help */
-
-       for (interface = ISC_LIST_HEAD(inter_list);
-            interface != NULL;
-            interface = ISC_LIST_NEXT(interface, link)) 
+       /*
+        * plan B - try to find something reasonable in our lists in
+        * case kernel lookup doesn't help
+        */
+       for (iface = ISC_LIST_HEAD(inter_list);
+            iface != NULL;
+            iface = ISC_LIST_NEXT(iface, link)) 
        {
-               if (interface->flags & INT_WILDCARD)
-                       continue;
+               if (iface->flags & INT_WILDCARD)
+                       continue;
                
                /* Don't bother with ignored interfaces */
-               if (interface->ignore_packets == ISC_TRUE)
+               if (iface->ignore_packets)
                        continue;
                
                /*
                 * First look if this is the correct family
                 */
-               if(interface->sin.ss_family != addr->ss_family)
-                       continue;
+               if(AF(&iface->sin) != AF(addr))
+                       continue;
 
                /* Skip the loopback addresses */
-               if (interface->flags & INT_LOOPBACK)
+               if (iface->flags & INT_LOOPBACK)
                        continue;
 
                /*
-                * If we are looking to match a multicast address grab it.
+                * If we are looking to match a multicast address and
+                * this interface is one...
                 */
-               if (addr_ismulticast(addr) == ISC_TRUE && interface->flags & INT_MULTICAST)
-               {
+               if (addr_ismulticast(addr) 
+                   && (iface->flags & INT_MULTICAST)) {
 #ifdef INCLUDE_IPV6_SUPPORT
-                       if(addr->ss_family == AF_INET6) {
-                               /* Only use link-local address for link-scope mcast */
-                               if(IN6_IS_ADDR_MC_LINKLOCAL(&((struct sockaddr_in6*)addr)->sin6_addr) &&
-                                 !IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6*)&interface->sin)->sin6_addr)) {
-                                       continue;
-                               }
-                       }
+                       /*
+                        * ...it is the winner unless we're looking for
+                        * an interface to use for link-local multicast
+                        * and its address is not link-local.
+                        */
+                       if (IS_IPV6(addr)
+                           && IN6_IS_ADDR_MC_LINKLOCAL(PSOCK_ADDR6(addr))
+                           && !IN6_IS_ADDR_LINKLOCAL(PSOCK_ADDR6(&iface->sin)))
+                               continue;
 #endif
                        break;
                }
@@ -3725,34 +3532,33 @@ findbcastinter(
                 * address or the network portion of the IP address.
                 * Sloppy.
                 */
-               if(addr->ss_family == AF_INET) {
-                       if (SOCKCMP(&interface->bcast, addr)) {
+               if (IS_IPV4(addr)) {
+                       if (SOCK_EQ(&iface->bcast, addr))
                                break;
-                       }
-                       if ((NSRCADR(&interface->sin) &
-                            NSRCADR(&interface->mask)) == (NSRCADR(addr) &
-                                                           NSRCADR(&interface->mask)))
+
+                       if ((NSRCADR(&iface->sin) & NSRCADR(&iface->mask)) 
+                           == (NSRCADR(addr)     & NSRCADR(&iface->mask)))
                                break;
                }
 #ifdef INCLUDE_IPV6_SUPPORT
-               else if(addr->ss_family == AF_INET6) {
-                       if (SOCKCMP(&interface->bcast, addr)) {
+               else if(IS_IPV6(addr)) {
+                       if (SOCK_EQ(&iface->bcast, addr))
                                break;
-                       }
-                       if (SOCKCMP(netof(&interface->sin), netof(addr))) {
+
+                       if (SOCK_EQ(netof(&iface->sin), netof(addr)))
                                break;
-                       }
                }
 #endif
        }
 #endif /* SIOCGIFCONF */
-       if (interface == NULL) {
-               DPRINTF(4, ("No bcast interface found for %s\n", stoa(addr)));
-               return ANY_INTERFACE_CHOOSE(addr);
-       } else {
-               DPRINTF(4, ("Found bcast-/mcast- interface index #%d %s\n", interface->ifnum, interface->name));
-               return interface;
-       }
+       if (NULL == iface) {
+               DPRINTF(4, ("No bcast interface found for %s\n",
+                           stoa(addr)));
+               iface = ANY_INTERFACE_CHOOSE(addr);
+       } else
+               DPRINTF(4, ("Found bcast-/mcast- interface index #%d %s\n",
+                           iface->ifnum, iface->name));
+       return iface;
 }
 
 
@@ -3785,21 +3591,20 @@ io_addclock(
        )
 {
        BLOCKIO();
+
        /*
         * Stuff the I/O structure in the list and mark the descriptor
-        * in use.      There is a harmless (I hope) race condition here.
+        * in use.  There is a harmless (I hope) race condition here.
         */
        rio->next = refio;
 
 # ifdef HAVE_SIGNALED_IO
-       if (init_clock_sig(rio))
-       {
+       if (init_clock_sig(rio)) {
                UNBLOCKIO();
                return 0;
        }
 # elif defined(HAVE_IO_COMPLETION_PORT)
-       if (io_completion_port_add_clock_io(rio))
-       {
+       if (io_completion_port_add_clock_io(rio)) {
                UNBLOCKIO();
                return 0;
        }
@@ -3810,7 +3615,7 @@ io_addclock(
         */
        refio = rio;
 
-        /*
+       /*
         * register fd
         */
        add_fd_to_list(rio->fd, FD_TYPE_FILE);
@@ -3827,26 +3632,23 @@ io_closeclock(
        struct refclockio *rio
        )
 {
+       register struct refclockio *rp;
+
        BLOCKIO();
+
        /*
         * Remove structure from the list
         */
        if (refio == rio)
-       {
                refio = rio->next;
-       }
-       else
-       {
-               register struct refclockio *rp;
-
+       else {
                for (rp = refio; rp != NULL; rp = rp->next)
-                   if (rp->next == rio)
-                   {
-                           rp->next = rio->next;
-                           break;
-                   }
+                       if (rp->next == rio) {
+                               rp->next = rio->next;
+                               break;
+                       }
 
-               if (rp == NULL) {
+               if (NULL == rp) {
                        UNBLOCKIO();
                        return;
                }
@@ -3911,16 +3713,17 @@ add_fd_to_list(
         */
 #ifndef HAVE_IO_COMPLETION_PORT
        if (fd < 0 || fd >= FD_SETSIZE) {
-               msyslog(LOG_ERR, "Too many sockets in use, FD_SETSIZE %d exceeded",
+               msyslog(LOG_ERR,
+                       "Too many sockets in use, FD_SETSIZE %d exceeded",
                        FD_SETSIZE);
                exit(1);
        }
        /*
         * keep activefds in sync
         */
-       if (fd > maxactivefd)
-           maxactivefd = fd;
-       FD_SET( (u_int)fd, &activefds);
+       maxactivefd = max(fd, maxactivefd);
+
+       FD_SET(fd, &activefds);
 #endif
 }
 
@@ -3935,19 +3738,22 @@ close_and_delete_fd_from_list(
        while(lsock != NULL) {
                next = ISC_LIST_NEXT(lsock, link);
                if(lsock->fd == fd) {
-                       ISC_LIST_DEQUEUE_TYPE(fd_list, lsock, link, vsock_t);
+                       ISC_LIST_DEQUEUE_TYPE(fd_list, lsock, link,
+                                             vsock_t);
 
                        switch (lsock->type) {
                        case FD_TYPE_SOCKET:
-#ifdef SYS_WINNT
                                closesocket(lsock->fd);
                                break;
-#endif
+
                        case FD_TYPE_FILE:
-                               (void) close(lsock->fd);
+                               close(lsock->fd);
                                break;
+
                        default:
-                               msyslog(LOG_ERR, "internal error - illegal descriptor type %d - EXITING", (int)lsock->type);
+                               msyslog(LOG_ERR,
+                                       "internal error - illegal descriptor type %d - EXITING",
+                                       (int)lsock->type);
                                exit(1);
                        }
 
@@ -3959,14 +3765,17 @@ close_and_delete_fd_from_list(
                        /*
                         * remove from activefds
                         */
-                       FD_CLR( (u_int) fd, &activefds);
+                       FD_CLR(fd, &activefds);
                        
-                       if (fd == maxactivefd) {
-                               int i, newmax = 0;
-                               for (i = 0; i < maxactivefd; i++)
-                                       if (FD_ISSET(i, &activefds))
-                                               newmax = i;
-                               maxactivefd = newmax;
+                       if (fd == maxactivefd && maxactivefd) {
+                               int i;
+                               NTP_INSIST(maxactivefd - 1 < FD_SETSIZE);
+                               for (i = maxactivefd - 1; i >= 0; i--)
+                                       if (FD_ISSET(i, &activefds)) {
+                                               maxactivefd = i;
+                                               break;
+                                       }
+                               NTP_INSIST(fd != maxactivefd);
                        }
 #endif
                        break;
@@ -3977,7 +3786,7 @@ close_and_delete_fd_from_list(
 
 static void
 add_addr_to_list(
-       struct sockaddr_storage *addr,
+       sockaddr_u *addr,
        struct interface *interface
        )
 {
@@ -3996,75 +3805,76 @@ add_addr_to_list(
                DPRINTF(4, ("Added addr %s to list of addresses\n",
                            stoa(addr)));
 #ifdef DEBUG
-       } else {
-               DPRINTF(4, ("WARNING: Attempt to add duplicate addr "
-                           "%s to address list\n",
+       } else
+               DPRINTF(4, ("WARNING: Attempt to add duplicate addr %s to address list\n",
                            stoa(addr)));
-       }
 #endif
 }
 
+
 static void
 delete_addr_from_list(
-       struct sockaddr_storage *addr
+       sockaddr_u *addr
        ) 
 {
-       remaddr_t *next;
-       remaddr_t *laddr = ISC_LIST_HEAD(remoteaddr_list);
-
-       while(laddr != NULL) {
-               next = ISC_LIST_NEXT(laddr, link);
-               if(SOCKCMP(&laddr->addr, addr)) {
-                       ISC_LIST_DEQUEUE_TYPE(remoteaddr_list, laddr, link, remaddr_t);
+       remaddr_t *entry;
+       
+       for (entry = ISC_LIST_HEAD(remoteaddr_list);
+            entry != NULL;
+            entry = ISC_LIST_NEXT(entry, link))
+               if (SOCK_EQ(&entry->addr, addr)) {
+                       ISC_LIST_DEQUEUE_TYPE(remoteaddr_list, entry,
+                                             link, remaddr_t);
                        DPRINTF(4, ("Deleted addr %s from list of addresses\n",
                                    stoa(addr)));
-                       free(laddr);
+                       free(entry);
                        break;
                }
-               laddr = next;
-       }
 }
 
+
 static void
 delete_interface_from_list(
        struct interface *iface
        )
 {
        remaddr_t *next;
-       remaddr_t *laddr = ISC_LIST_HEAD(remoteaddr_list);
+       remaddr_t *entry;
+       
+       entry = ISC_LIST_HEAD(remoteaddr_list);
 
-       while(laddr != NULL) {
-               next = ISC_LIST_NEXT(laddr, link);
-               if (laddr->interface == iface) {
-                       ISC_LIST_DEQUEUE_TYPE(remoteaddr_list, laddr, link, remaddr_t);
+       while (entry != NULL) {
+               next = ISC_LIST_NEXT(entry, link);
+               if (entry->interface == iface) {
+                       ISC_LIST_DEQUEUE_TYPE(remoteaddr_list, entry,
+                                             link, remaddr_t);
                        DPRINTF(4, ("Deleted addr %s for interface #%d %s from list of addresses\n",
-                                   stoa(&laddr->addr), iface->ifnum, iface->name));
-                       free(laddr);
+                                   stoa(&entry->addr), iface->ifnum,
+                                   iface->name));
+                       free(entry);
                }
-               laddr = next;
+               entry = next;
        }
 }
 
+
 static struct interface *
 find_addr_in_list(
-       struct sockaddr_storage *addr
+       sockaddr_u *addr
        ) 
 {
-       remaddr_t *next;
-       remaddr_t *laddr = ISC_LIST_HEAD(remoteaddr_list);
+       remaddr_t *entry;
+       
        DPRINTF(4, ("Searching for addr %s in list of addresses - ",
                    stoa(addr)));
 
-       while(laddr != NULL) {
-               next = ISC_LIST_NEXT(laddr, link);
-
-               if(SOCKCMP(&laddr->addr, addr)) {
+       for (entry = ISC_LIST_HEAD(remoteaddr_list);
+            entry != NULL;
+            entry = ISC_LIST_NEXT(entry, link))
+               if(SOCK_EQ(&entry->addr, addr)) {
                        DPRINTF(4, ("FOUND\n"));
-                       return laddr->interface;
+                       return entry->interface;
                }
-               
-               laddr = next;
-       }
 
        DPRINTF(4, ("NOT FOUND\n"));
        return NULL;
@@ -4108,32 +3918,28 @@ same_network_v6(
 }
 #endif /* INCLUDE_IPV6_SUPPORT */
 
+
 static isc_boolean_t
 same_network(
-       struct sockaddr_storage *addr1,
-       struct sockaddr_storage *mask,
-       struct sockaddr_storage *addr2
+       sockaddr_u *a1,
+       sockaddr_u *mask,
+       sockaddr_u *a2
        )
 {
-       if (addr1->ss_family != addr2->ss_family)
-               return ISC_FALSE;
+       isc_boolean_t sn;
 
-       if (AF_INET == addr1->ss_family) {
-               return same_network_v4(
-                               (struct sockaddr_in *)addr1,
-                               (struct sockaddr_in *)mask,
-                               (struct sockaddr_in *)addr2);
-       }
+       if (AF(a1) != AF(a2))
+               sn = ISC_FALSE;
+       else if (IS_IPV4(a1))
+               sn = same_network_v4(&a1->sa4, &mask->sa4, &a2->sa4);
 #ifdef INCLUDE_IPV6_SUPPORT
-       else if (AF_INET6 == addr1->ss_family) {
-               return same_network_v6(
-                               (struct sockaddr_in6 *)addr1,
-                               (struct sockaddr_in6 *)mask,
-                               (struct sockaddr_in6 *)addr2);
-       }
+       else if (IS_IPV6(a1))
+               sn = same_network_v6(&a1->sa6, &mask->sa6, &a2->sa6);
 #endif
        else
-               return ISC_FALSE;
+               sn = ISC_FALSE;
+
+       return sn;
 }
 
 /*
@@ -4141,66 +3947,63 @@ same_network(
  */
 static struct interface *
 find_samenet_addr_in_list(
-       struct sockaddr_storage *addr
+       sockaddr_u *addr
        ) 
 {
-       remaddr_t *next;
-       remaddr_t *laddr;
+       remaddr_t *entry;
 
-       DPRINTF(4, ("Searching for addr with same subnet as %s in "
-                   "list of addresses - ",
+       DPRINTF(4, ("Searching for addr with same subnet as %s in list of addresses - ",
                    stoa(addr)));
 
-       for (laddr = ISC_LIST_HEAD(remoteaddr_list);
-            NULL != laddr;
-            laddr = next)
-       {
-               next = ISC_LIST_NEXT(laddr, link);
+       for (entry = ISC_LIST_HEAD(remoteaddr_list);
+            entry != NULL;
+            entry = ISC_LIST_NEXT(entry, link))
 
-               if (same_network(&laddr->addr, &laddr->interface->mask,
+               if (same_network(&entry->addr, &entry->interface->mask,
                                 addr)) {
                        DPRINTF(4, ("FOUND\n"));
-                       return laddr->interface;
+                       return entry->interface;
                }
-       }
 
        DPRINTF(4, ("NOT FOUND\n"));
        return NULL;
 }
 
+
 /*
- * Find the given address with the associated flag in the list
+ * Find the given address with the all given flags set in the list
  */
 static struct interface *
-find_flagged_addr_in_list(struct sockaddr_storage *addr, int flag) {
+find_flagged_addr_in_list(
+       sockaddr_u *    addr,
+       int             flags
+       )
+{
+       remaddr_t *entry;
+       
+       DPRINTF(4, ("Finding addr %s with flags %d in list: ",
+                   stoa(addr), flags));
 
-       remaddr_t *next;
-       remaddr_t *laddr = ISC_LIST_HEAD(remoteaddr_list);
-       DPRINTF(4, ("Finding addr %s in list of addresses\n",
-                   stoa(addr)));
+       for (entry = ISC_LIST_HEAD(remoteaddr_list);
+            entry != NULL;
+            entry = ISC_LIST_NEXT(entry, link))
 
-       while(laddr != NULL) {
-               next = ISC_LIST_NEXT(laddr, link);
-               if(SOCKCMP(&laddr->addr, addr) && (laddr->interface->flags & flag)) {
-                       return laddr->interface;
-                       break;
+               if (SOCK_EQ(&entry->addr, addr)
+                   && (entry->interface->flags & flags) == flags) {
+
+                       DPRINTF(4, ("FOUND\n"));
+                       return entry->interface;
                }
-               else
-                       laddr = next;
-       }
-       return NULL; /* Not found */
+
+       DPRINTF(4, ("NOT FOUND\n"));
+       return NULL;
 }
 
-#ifdef HAS_ROUTING_SOCKET
-#include <net/route.h>
 
-#ifdef HAVE_RTNETLINK
-#include <linux/rtnetlink.h>
-#endif
-
-#ifndef UPDATE_GRACE
-#define UPDATE_GRACE   2       /* wait UPDATE_GRACE seconds before scanning */
-#endif
+#ifdef HAS_ROUTING_SOCKET
+# ifndef UPDATE_GRACE
+#  define UPDATE_GRACE 2       /* wait UPDATE_GRACE seconds before scanning */
+# endif
 
 static void
 process_routing_msgs(struct asyncio_reader *reader)
@@ -4216,7 +4019,7 @@ process_routing_msgs(struct asyncio_reader *reader)
        
        if (disable_dynamic_updates) {
                /*
-                * discard ourselves if we are not need any more
+                * discard ourselves if we are not needed any more
                 * usually happens when running unprivileged
                 */
                remove_asyncio_reader(reader);
@@ -4227,7 +4030,8 @@ process_routing_msgs(struct asyncio_reader *reader)
        cnt = read(reader->fd, buffer, sizeof(buffer));
        
        if (cnt < 0) {
-               msyslog(LOG_ERR, "i/o error on routing socket %m - disabling");
+               msyslog(LOG_ERR,
+                       "i/o error on routing socket %m - disabling");
                remove_asyncio_reader(reader);
                delete_asyncio_reader(reader);
                return;
@@ -4237,13 +4041,19 @@ process_routing_msgs(struct asyncio_reader *reader)
         * process routing message
         */
 #ifdef HAVE_RTNETLINK
-       for (nh = (struct nlmsghdr *)buffer; NLMSG_OK(nh, cnt); nh = NLMSG_NEXT(nh, cnt)) {
+       for (nh = (struct nlmsghdr *)buffer;
+            NLMSG_OK(nh, cnt);
+            nh = NLMSG_NEXT(nh, cnt)) {
                msg_type = nh->nlmsg_type;
 #else
-       for (p = buffer; (p + sizeof(struct rt_msghdr)) <= (buffer + cnt); p += rtm->rtm_msglen) {
+       for (p = buffer;
+            (p + sizeof(struct rt_msghdr)) <= (buffer + cnt);
+            p += rtm->rtm_msglen) {
                rtm = (struct rt_msghdr *)p;
                if (rtm->rtm_version != RTM_VERSION) {
-                        msyslog(LOG_ERR, "version mismatch (got %d - expected %d) on routing socket - disabling", rtm->rtm_version, RTM_VERSION);
+                       msyslog(LOG_ERR,
+                               "version mismatch (got %d - expected %d) on routing socket - disabling",
+                               rtm->rtm_version, RTM_VERSION);
 
                        remove_asyncio_reader(reader);
                        delete_asyncio_reader(reader);
@@ -4292,9 +4102,12 @@ process_routing_msgs(struct asyncio_reader *reader)
                case RTM_DELROUTE:
 #endif
                        /*
-                        * we are keen on new and deleted addresses and if an interface goes up and down or routing changes
+                        * we are keen on new and deleted addresses and
+                        * if an interface goes up and down or routing
+                        * changes
                         */
-                       DPRINTF(3, ("routing message op = %d: scheduling interface update\n", msg_type));
+                       DPRINTF(3, ("routing message op = %d: scheduling interface update\n",
+                                   msg_type));
                        timer_interfacetimeout(current_time + UPDATE_GRACE);
                        break;
 #ifdef HAVE_RTNETLINK
@@ -4306,7 +4119,8 @@ process_routing_msgs(struct asyncio_reader *reader)
                        /*
                         * the rest doesn't bother us.
                         */
-                       DPRINTF(4, ("routing message op = %d: ignored\n", msg_type));
+                       DPRINTF(4, ("routing message op = %d: ignored\n",
+                                   msg_type));
                        break;
                }
        }
@@ -4325,38 +4139,45 @@ init_async_notifications()
 #else
        int fd = socket(PF_ROUTE, SOCK_RAW, 0);
 #endif
-       
-       if (fd >= 0) {
-               fd = move_fd(fd);
+       if (fd < 0) {
+               msyslog(LOG_ERR,
+                       "unable to open routing socket (%m) - using polled interface update");
+               return;
+       }
+
+       fd = move_fd(fd);
 #ifdef HAVE_RTNETLINK
-               memset(&sa, 0, sizeof(sa));
-               sa.nl_family = PF_NETLINK;
-               sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
-                       RTMGRP_IPV4_ROUTE | RTMGRP_IPV4_MROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_IPV6_MROUTE;
-               if (bind(fd, (struct sockaddr*)&sa, sizeof(sa)) < 0) {
-                       msyslog(LOG_ERR, "bind failed on routing socket (%m) - using polled interface update");
-                       return;
-               }
+       memset(&sa, 0, sizeof(sa));
+       sa.nl_family = PF_NETLINK;
+       sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR
+                      | RTMGRP_IPV6_IFADDR | RTMGRP_IPV4_ROUTE
+                      | RTMGRP_IPV4_MROUTE | RTMGRP_IPV6_ROUTE
+                      | RTMGRP_IPV6_MROUTE;
+       if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
+               msyslog(LOG_ERR,
+                       "bind failed on routing socket (%m) - using polled interface update");
+               return;
+       }
 #endif
-               init_nonblocking_io(fd);
+       init_nonblocking_io(fd);
 #if defined(HAVE_SIGNALED_IO)
-               init_socket_sig(fd);
+       init_socket_sig(fd);
 #endif /* HAVE_SIGNALED_IO */
-               
-               reader = new_asyncio_reader();
+       
+       reader = new_asyncio_reader();
 
-               reader->fd = fd;
-               reader->receiver = process_routing_msgs;
-               
-               add_asyncio_reader(reader, FD_TYPE_SOCKET);
-               msyslog(LOG_INFO, "Listening on routing socket on fd #%d for interface updates", fd);
-       } else {
-               msyslog(LOG_ERR, "unable to open routing socket (%m) - using polled interface update");
-       }
+       reader->fd = fd;
+       reader->receiver = process_routing_msgs;
+       
+       add_asyncio_reader(reader, FD_TYPE_SOCKET);
+       msyslog(LOG_INFO,
+               "Listening on routing socket on fd #%d for interface updates",
+               fd);
 }
 #else
+/* HAS_ROUTING_SOCKET not defined */
 static void
-init_async_notifications()
+init_async_notifications(void)
 {
 }
 #endif
index 1e2f98adac571d11809b5fa3963225fdd7e5804a..41d1748e1e187e10fc482a9011c663fade64f2e2 100644 (file)
@@ -212,7 +212,7 @@ ntp_monitor(
 {
        register struct pkt *pkt;
        register struct mon_data *md;
-        struct sockaddr_storage addr;
+        sockaddr_u addr;
        register int hash;
        register int mode;
        int     interval;
@@ -234,7 +234,7 @@ ntp_monitor(
                /*
                 * Match address only to conserve MRU size.
                 */
-               if (SOCKCMP(&md->rmtadr, &addr)) {
+               if (SOCK_EQ(&md->rmtadr, &addr)) {
                        interval = current_time - md->lasttime;
                        md->lasttime = current_time;
                        md->count++;
index 039bf4dbf4d1f9ea73a92264eca6756bda149510..31b195e4ccf87e826219adcb4eb8ee56faca06d2 100644 (file)
@@ -109,7 +109,7 @@ int peer_preempt;                   /* preemptable associations */
 static struct peer init_peer_alloc[INIT_PEER_ALLOC]; /* init alloc */
 
 static void        getmorepeermem       (void);
-static struct interface *select_peerinterface (struct peer *, struct sockaddr_storage *, struct interface *, u_char);
+static struct interface *select_peerinterface (struct peer *, sockaddr_u *, struct interface *, u_char);
 
 static int score(struct peer *);
 
@@ -185,7 +185,7 @@ getmorepeermem(void)
  */
 struct peer *
 findexistingpeer(
-       struct sockaddr_storage *addr,
+       sockaddr_u *addr,
        struct peer *start_peer,
        int mode
        )
@@ -201,8 +201,8 @@ findexistingpeer(
        else
                peer = start_peer->next;
        
-       while (NULL != peer) {
-               if (SOCKCMP(addr, &peer->srcadr)
+       while (peer != NULL) {
+               if (SOCK_EQ(addr, &peer->srcadr)
                    && NSRCPORT(addr) == NSRCPORT(&peer->srcadr)
                    && (-1 == mode || peer->hmode == mode))
                        break;
@@ -217,7 +217,7 @@ findexistingpeer(
  */
 struct peer *
 findpeer(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *dstadr,
        int     pkt_mode,
        int     *action
@@ -229,7 +229,7 @@ findpeer(
        findpeer_calls++;
        hash = NTP_HASH_ADDR(srcadr);
        for (peer = peer_hash[hash]; peer != NULL; peer = peer->next) {
-               if (SOCKCMP(srcadr, &peer->srcadr) &&
+               if (SOCK_EQ(srcadr, &peer->srcadr) &&
                    NSRCPORT(srcadr) == NSRCPORT(&peer->srcadr)) {
 
                        /*
@@ -471,7 +471,7 @@ unpeer(
  */
 struct peer *
 peer_config(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *dstadr,
        int hmode,
        int version,
@@ -492,33 +492,18 @@ peer_config(
         */
        switch (hmode) {
        case MODE_BROADCAST:
-               if(srcadr->ss_family == AF_INET) {
-                       if (IN_CLASSD(ntohl(((struct sockaddr_in*)srcadr)->sin_addr.s_addr)))
-                               cast_flags = MDF_MCAST;
-                       else
-                               cast_flags = MDF_BCAST;
-                       break;
-               } else {
-                        if (IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)srcadr)->sin6_addr))
-                               cast_flags = MDF_MCAST;
-                       else
-                               cast_flags = MDF_BCAST;
-                       break;
-                }
+               if (IS_MCAST(srcadr))
+                       cast_flags = MDF_MCAST;
+               else
+                       cast_flags = MDF_BCAST;
+               break;
+
        case MODE_CLIENT:
-               if(srcadr->ss_family == AF_INET) {
-                       if (IN_CLASSD(ntohl(((struct sockaddr_in*)srcadr)->sin_addr.s_addr)))
-                               cast_flags = MDF_ACAST;
-                       else
-                               cast_flags = MDF_UCAST;
-                       break;
-               } else {
-                       if (IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)srcadr)->sin6_addr))
-                               cast_flags = MDF_ACAST;
-                       else
-                               cast_flags = MDF_UCAST;
-                       break;
-               }
+               if (IS_MCAST(srcadr))
+                       cast_flags = MDF_ACAST;
+               else
+                       cast_flags = MDF_UCAST;
+               break;
 
        default:
                cast_flags = MDF_UCAST;
@@ -557,12 +542,14 @@ set_peerdstadr(struct peer *peer, struct interface *interface)
                        peer->dstadr->peercnt--;
                        ISC_LIST_UNLINK_TYPE(peer->dstadr->peers, peer,
                            ilink, struct peer);
+                       msyslog(LOG_INFO,
+                               "%s interface %s -> %s",
+                               stoa(&peer->srcadr),
+                               stoa(&peer->dstadr->sin),
+                               (interface != NULL)
+                                   ? stoa(&interface->sin)
+                                   : "(null)");
                }
-               msyslog(LOG_INFO,
-                   "set_peerdstadr(%s): change interface from %s to %s",
-                   stoa(&peer->srcadr), (peer->dstadr != NULL) ?
-                   stoa(&peer->dstadr->sin) : "<null>", (interface !=
-                   NULL) ? stoa(&interface->sin) : "<null>");
                peer->dstadr = interface;
                if (peer->dstadr != NULL) {
                        ISC_LIST_APPEND(peer->dstadr->peers, peer,
@@ -576,7 +563,9 @@ set_peerdstadr(struct peer *peer, struct interface *interface)
  * attempt to re-rebind interface if necessary
  */
 static void
-peer_refresh_interface(struct peer *peer)
+peer_refresh_interface(
+       struct peer *peer
+       )
 {
        struct interface *niface, *piface;
 
@@ -613,10 +602,10 @@ peer_refresh_interface(struct peer *peer)
        piface = peer->dstadr;
        set_peerdstadr(peer, niface);
        if (peer->dstadr) {
-                /*
-                 * clear crypto if we change the local address
-                 */
-                if (peer->dstadr != piface && !(peer->cast_flags &
+               /*
+                * clear crypto if we change the local address
+                */
+               if (peer->dstadr != piface && !(peer->cast_flags &
                    MDF_BCLNT))
                        peer_clear(peer, "XFAC");
 
@@ -665,7 +654,12 @@ refresh_all_peerinterfaces(void)
  * find an interface suitable for the src address
  */
 static struct interface *
-select_peerinterface(struct peer *peer, struct sockaddr_storage *srcadr, struct interface *dstadr, u_char cast_flags)
+select_peerinterface(
+       struct peer *           peer,
+       sockaddr_u *            srcadr,
+       struct interface *      dstadr,
+       u_char                  cast_flags
+       )
 {
        struct interface *interface;
   
@@ -726,14 +720,14 @@ select_peerinterface(struct peer *peer, struct sockaddr_storage *srcadr, struct
  */
 struct peer *
 newpeer(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *dstadr,
        int     hmode,
        int     version,
        int     minpoll,
        int     maxpoll,
        u_int   flags,
-       u_char cast_flags,
+       u_char  cast_flags,
        int     ttl,
        keyid_t key
        )
@@ -831,18 +825,19 @@ newpeer(
        }
 #endif
        
+
        /*
         * Broadcast needs the socket enabled for broadcast
         */
-       if (cast_flags & MDF_BCAST && peer->dstadr) {
+       if ((cast_flags & MDF_BCAST) && peer->dstadr)
                enable_broadcast(peer->dstadr, srcadr);
-       }
+
        /*
         * Multicast needs the socket interface enabled for multicast
         */
-       if (cast_flags & MDF_MCAST && peer->dstadr) {
+       if ((cast_flags & MDF_MCAST) && peer->dstadr)
                enable_multicast_if(peer->dstadr, srcadr);
-       }
+
 #ifdef OPENSSL
        if (key > NTP_MAXKEY)
                peer->flags |= FLAG_SKEY;
index 9930d2b3166c6d3dd665a5bd733c1b296f8ce2ca..6df0a00cc1011ee40c8641c96a25d694b2a4b406 100644 (file)
@@ -312,7 +312,7 @@ receive(
        int     flags = 0;              /* flags with details about the authentication */
        keyid_t skeyid = 0;             /* key IDs */
        u_int32 opcode = 0;             /* extension field opcode */
-       struct sockaddr_storage *dstadr_sin; /* active runway */
+       sockaddr_u *dstadr_sin;         /* active runway */
        struct peer *peer2;             /* aux peer structure pointer */
        l_fp    p_org;                  /* origin timestamp */
        l_fp    p_rec;                  /* receive timestamp */
@@ -633,7 +633,7 @@ receive(
                                        return;      /* no wildcard */
                                }
                                pkeyid = 0;
-                               if (!SOCKNUL(&rbufp->dstadr->bcast))
+                               if (!SOCK_UNSPEC(&rbufp->dstadr->bcast))
                                        dstadr_sin =
                                            &rbufp->dstadr->bcast;
                        } else if (peer == NULL) {
@@ -3196,7 +3196,7 @@ fast_xmit(
        int     xmode,          /* receive mode */
        keyid_t xkeyid,         /* transmit key ID */
        char    *mask,          /* kiss code */
-       int     flags           /* Flags to indicate signing behaviour */
+       int     flags           /* Flags to indicate signing behaviour */
        )
 {
        struct pkt xpkt;        /* transmit packet structure */
@@ -3546,17 +3546,15 @@ proto_config(
        int     item,
        u_long  value,
        double  dvalue,
-       struct sockaddr_storage* svalue
+       sockaddr_u *svalue
        )
 {
        /*
         * Figure out what he wants to change, then do it
         */
-#ifdef DEBUG
-       if (debug > 1)
-               printf("proto_config: code %d value %lu dvalue %lf\n",
-                   item, value, dvalue);
-#endif
+       DPRINTF(2, ("proto_config: code %d value %lu dvalue %lf\n",
+                   item, value, dvalue));
+
        switch (item) {
 
        /*
@@ -3665,14 +3663,14 @@ proto_config(
         * Miscellaneous commands
         */
        case PROTO_MULTICAST_ADD: /* add group address */
-               if (svalue)
-                   io_multicast_add(*svalue);
+               if (svalue != NULL)
+                       io_multicast_add(svalue);
                sys_bclient = 1;
                break;
 
        case PROTO_MULTICAST_DEL: /* delete group address */
-               if (svalue)
-                   io_multicast_del(*svalue);
+               if (svalue != NULL)
+                       io_multicast_del(svalue);
                break;
 
        default:
index 9ab311c0e282a7ad3e229610032f2f3c40776628..9ee78e1ae26e8144a7bcb71da08e1a1dfa3b61d7 100644 (file)
@@ -180,12 +180,6 @@ refclock_newpeer(
         * Check for valid clock address. If already running, shut it
         * down first.
         */
-       if (peer->srcadr.ss_family != AF_INET) {
-               msyslog(LOG_ERR,
-                       "refclock_newpeer: clock address %s invalid, address family not implemented for refclock",
-                       stoa(&peer->srcadr));
-               return (0);
-       }
        if (!ISREFCLOCKADR(&peer->srcadr)) {
                msyslog(LOG_ERR,
                        "refclock_newpeer: clock address %s invalid",
@@ -1020,7 +1014,7 @@ refclock_ioctl(
  */
 void
 refclock_control(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct refclockstat *in,
        struct refclockstat *out
        )
@@ -1033,9 +1027,6 @@ refclock_control(
        /*
         * Check for valid address and running peer
         */
-       if (srcadr->ss_family != AF_INET)
-               return;
-
        if (!ISREFCLOCKADR(srcadr))
                return;
 
@@ -1122,7 +1113,7 @@ refclock_control(
  */
 void
 refclock_buginfo(
-       struct sockaddr_storage *srcadr, /* clock address */
+       sockaddr_u *srcadr,     /* clock address */
        struct refclockbug *bug /* output structure */
        )
 {
@@ -1135,9 +1126,6 @@ refclock_buginfo(
        /*
         * Check for valid address and peer structure
         */
-       if (srcadr->ss_family != AF_INET)
-               return;
-
        if (!ISREFCLOCKADR(srcadr))
                return;
 
index a287363d5c76e90f950d55c82f0908230303bb76..7ab476adc873b19201bae919d1d133ec8337bba4 100644 (file)
@@ -48,7 +48,7 @@ struct req_proc {
        short needs_auth;       /* true when authentication needed */
        short sizeofitem;       /* size of request data item (older size)*/
        short v6_sizeofitem;    /* size of request data item (new size)*/
-       void (*handler) (struct sockaddr_storage *, struct interface *,
+       void (*handler) (sockaddr_u *, struct interface *,
                           struct req_pkt *);   /* routine to handle request */
 };
 
@@ -59,58 +59,58 @@ static      struct req_proc univ_codes[] = {
        { NO_REQUEST,           NOAUTH,  0,     0 }
 };
 
-static void    req_ack (struct sockaddr_storage *, struct interface *, struct req_pkt *, int);
-static char *  prepare_pkt     (struct sockaddr_storage *, struct interface *, struct req_pkt *, u_int);
+static void    req_ack (sockaddr_u *, struct interface *, struct req_pkt *, int);
+static char *  prepare_pkt     (sockaddr_u *, struct interface *, struct req_pkt *, u_int);
 static char *  more_pkt        (void);
 static void    flush_pkt       (void);
-static void    peer_list       (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    peer_list_sum   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    peer_info       (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    peer_stats      (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    sys_info        (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    sys_stats       (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    mem_stats       (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    io_stats        (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    timer_stats     (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    loop_info       (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_conf         (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_unconf       (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    set_sys_flag    (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    clr_sys_flag    (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    setclr_flags    (struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long);
-static void    list_restrict   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_resaddflags  (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_ressubflags  (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_unrestrict   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_restrict     (struct sockaddr_storage *, struct interface *, struct req_pkt *, int);
-static void    mon_getlist_0   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    mon_getlist_1   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    reset_stats     (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    reset_peer      (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_key_reread   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    trust_key       (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    untrust_key     (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_trustkey     (struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long);
-static void    get_auth_info   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void    peer_list       (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    peer_list_sum   (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    peer_info       (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    peer_stats      (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    sys_info        (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    sys_stats       (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    mem_stats       (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    io_stats        (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    timer_stats     (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    loop_info       (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_conf         (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_unconf       (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    set_sys_flag    (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    clr_sys_flag    (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    setclr_flags    (sockaddr_u *, struct interface *, struct req_pkt *, u_long);
+static void    list_restrict   (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_resaddflags  (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_ressubflags  (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_unrestrict   (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_restrict     (sockaddr_u *, struct interface *, struct req_pkt *, int);
+static void    mon_getlist_0   (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    mon_getlist_1   (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    reset_stats     (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    reset_peer      (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_key_reread   (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    trust_key       (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    untrust_key     (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_trustkey     (sockaddr_u *, struct interface *, struct req_pkt *, u_long);
+static void    get_auth_info   (sockaddr_u *, struct interface *, struct req_pkt *);
 static void    reset_auth_stats (void);
-static void    req_get_traps   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    req_set_trap    (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    req_clr_trap    (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_setclr_trap  (struct sockaddr_storage *, struct interface *, struct req_pkt *, int);
-static void    set_request_keyid (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    set_control_keyid (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    get_ctl_stats   (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    get_if_stats    (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    do_if_reload    (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void    req_get_traps   (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    req_set_trap    (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    req_clr_trap    (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_setclr_trap  (sockaddr_u *, struct interface *, struct req_pkt *, int);
+static void    set_request_keyid (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    set_control_keyid (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    get_ctl_stats   (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    get_if_stats    (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    do_if_reload    (sockaddr_u *, struct interface *, struct req_pkt *);
 #ifdef KERNEL_PLL
-static void    get_kernel_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void    get_kernel_info (sockaddr_u *, struct interface *, struct req_pkt *);
 #endif /* KERNEL_PLL */
 #ifdef REFCLOCK
-static void    get_clock_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
-static void    set_clock_fudge (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void    get_clock_info (sockaddr_u *, struct interface *, struct req_pkt *);
+static void    set_clock_fudge (sockaddr_u *, struct interface *, struct req_pkt *);
 #endif /* REFCLOCK */
 #ifdef REFCLOCK
-static void    get_clkbug_info (struct sockaddr_storage *, struct interface *, struct req_pkt *);
+static void    get_clkbug_info (sockaddr_u *, struct interface *, struct req_pkt *);
 #endif /* REFCLOCK */
 
 /*
@@ -217,7 +217,7 @@ static int itemsize;
 static int databytes;
 static char exbuf[RESP_DATA_SIZE];
 static int usingexbuf;
-static struct sockaddr_storage *toaddr;
+static sockaddr_u *toaddr;
 static struct interface *frominter;
 
 /*
@@ -243,7 +243,7 @@ init_request (void)
  */
 static void
 req_ack(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt,
        int errcode
@@ -273,7 +273,7 @@ req_ack(
  */
 static char *
 prepare_pkt(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *pkt,
        u_int structsize
@@ -421,7 +421,7 @@ process_private(
 {
        struct req_pkt *inpkt;
        struct req_pkt_tail *tailinpkt;
-       struct sockaddr_storage *srcadr;
+       sockaddr_u *srcadr;
        struct interface *inter;
        struct req_proc *proc;
        int ec;
@@ -657,7 +657,7 @@ process_private(
  */
 static void
 peer_list(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -672,9 +672,9 @@ peer_list(
        for (i = 0; i < NTP_HASH_SIZE && ip != 0; i++) {
                pp = peer_hash[i];
                while (pp != 0 && ip != 0) {
-                       if (pp->srcadr.ss_family == AF_INET6) {
+                       if (IS_IPV6(&pp->srcadr)) {
                                if (client_v6_capable) {
-                                       ip->addr6 = GET_INADDR6(pp->srcadr);
+                                       ip->addr6 = SOCK_ADDR6(&pp->srcadr);
                                        ip->v6_flag = 1;
                                        skip = 0;
                                } else {
@@ -682,7 +682,7 @@ peer_list(
                                        break;
                                }
                        } else {
-                               ip->addr = GET_INADDR(pp->srcadr);
+                               ip->addr = NSRCADR(&pp->srcadr);
                                if (client_v6_capable)
                                        ip->v6_flag = 0;
                                skip = 0;
@@ -714,7 +714,7 @@ peer_list(
  */
 static void
 peer_list_sum(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -742,12 +742,12 @@ peer_list_sum(
                         * Be careful here not to return v6 peers when we
                         * want only v4.
                         */
-                       if (pp->srcadr.ss_family == AF_INET6) {
+                       if (IS_IPV6(&pp->srcadr)) {
                                if (client_v6_capable) {
-                                       ips->srcadr6 = GET_INADDR6(pp->srcadr);
+                                       ips->srcadr6 = SOCK_ADDR6(&pp->srcadr);
                                        ips->v6_flag = 1;
                                        if (pp->dstadr)
-                                               ips->dstadr6 = GET_INADDR6(pp->dstadr->sin);
+                                               ips->dstadr6 = SOCK_ADDR6(&pp->dstadr->sin);
                                        else
                                                memset(&ips->dstadr6, 0, sizeof(ips->dstadr6));
                                        skip = 0;
@@ -756,22 +756,24 @@ peer_list_sum(
                                        break;
                                }
                        } else {
-                               ips->srcadr = GET_INADDR(pp->srcadr);
+                               ips->srcadr = NSRCADR(&pp->srcadr);
                                if (client_v6_capable)
                                        ips->v6_flag = 0;
-/* XXX PDM This code is buggy. Need to replace with a straightforward assignment */
                                
-                               if (pp->dstadr)
-                                       ips->dstadr = (pp->processed) ?
-                                               pp->cast_flags == MDF_BCAST ?
-                                               GET_INADDR(pp->dstadr->bcast):
-                                               pp->cast_flags ?
-                                               GET_INADDR(pp->dstadr->sin) ?
-                                               GET_INADDR(pp->dstadr->sin):
-                                               GET_INADDR(pp->dstadr->bcast):
-                                               1 : GET_INADDR(pp->dstadr->sin);
-                               else
-                                               memset(&ips->dstadr, 0, sizeof(ips->dstadr));
+                               if (pp->dstadr) {
+                                       if (!pp->processed)
+                                               ips->dstadr = NSRCADR(&pp->dstadr->sin);
+                                       else {
+                                               if (MDF_BCAST == pp->cast_flags)
+                                                       ips->dstadr = NSRCADR(&pp->dstadr->bcast);
+                                               else if (pp->cast_flags) {
+                                                       ips->dstadr = NSRCADR(&pp->dstadr->sin);
+                                                       if (!ips->dstadr)
+                                                               ips->dstadr = NSRCADR(&pp->dstadr->bcast);
+                                               }
+                                       }
+                               } else
+                                       ips->dstadr = 0;
 
                                skip = 0;
                        }
@@ -816,7 +818,7 @@ peer_list_sum(
  */
 static void
 peer_info (
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -826,57 +828,59 @@ peer_info (
        register struct info_peer *ip;
        register int items;
        register int i, j;
-       struct sockaddr_storage addr;
+       sockaddr_u addr;
        extern struct peer *sys_peer;
        l_fp ltmp;
 
-       memset((char *)&addr, 0, sizeof addr);
        items = INFO_NITEMS(inpkt->err_nitems);
        ipl = (struct info_peer_list *) inpkt->data;
 
        ip = (struct info_peer *)prepare_pkt(srcadr, inter, inpkt,
            v6sizeof(struct info_peer));
        while (items-- > 0 && ip != 0) {
-               memset((char *)&addr, 0, sizeof(addr));
+               ZERO_SOCK(&addr);
                NSRCPORT(&addr) = ipl->port;
-               if (client_v6_capable && ipl->v6_flag != 0) {
-                       addr.ss_family = AF_INET6;
-                       GET_INADDR6(addr) = ipl->addr6;
+               if (client_v6_capable && ipl->v6_flag) {
+                       AF(&addr) = AF_INET6;
+                       SOCK_ADDR6(&addr) = ipl->addr6;
                } else {
-                       addr.ss_family = AF_INET;
-                       GET_INADDR(addr) = ipl->addr;
+                       AF(&addr) = AF_INET;
+                       NSRCADR(&addr) = ipl->addr;
                }
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               addr.ss_len = SOCKLEN(&addr);
+               addr.sas.ss_len = SOCKLEN(&addr);
 #endif
                ipl++;
                if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == 0)
-                   continue;
-               if (pp->srcadr.ss_family == AF_INET6) {
+                       continue;
+               if (IS_IPV6(srcadr)) {
                        if (pp->dstadr)
-                               ip->dstadr6 = pp->cast_flags == MDF_BCAST ?
-                                       GET_INADDR6(pp->dstadr->bcast) :
-                                       GET_INADDR6(pp->dstadr->sin);
+                               ip->dstadr6 =
+                                   (MDF_BCAST == pp->cast_flags)
+                                       ? SOCK_ADDR6(&pp->dstadr->bcast)
+                                       : SOCK_ADDR6(&pp->dstadr->sin);
                        else
                                memset(&ip->dstadr6, 0, sizeof(ip->dstadr6));
 
-                       ip->srcadr6 = GET_INADDR6(pp->srcadr);
+                       ip->srcadr6 = SOCK_ADDR6(&pp->srcadr);
                        ip->v6_flag = 1;
                } else {
-/* XXX PDM This code is buggy. Need to replace with a straightforward assignment */
-                       if (pp->dstadr)
-                               ip->dstadr = (pp->processed) ?
-                                       pp->cast_flags == MDF_BCAST ?
-                                       GET_INADDR(pp->dstadr->bcast):
-                                       pp->cast_flags ?
-                                       GET_INADDR(pp->dstadr->sin) ?
-                                       GET_INADDR(pp->dstadr->sin):
-                                       GET_INADDR(pp->dstadr->bcast):
-                                       2 : GET_INADDR(pp->dstadr->sin);
-                       else
-                               memset(&ip->dstadr, 0, sizeof(ip->dstadr));
+                       if (pp->dstadr) {
+                               if (!pp->processed)
+                                       ip->dstadr = NSRCADR(&pp->dstadr->sin);
+                               else {
+                                       if (MDF_BCAST == pp->cast_flags)
+                                               ip->dstadr = NSRCADR(&pp->dstadr->bcast);
+                                       else if (pp->cast_flags) {
+                                               ip->dstadr = NSRCADR(&pp->dstadr->sin);
+                                               if (!ip->dstadr)
+                                                       ip->dstadr = NSRCADR(&pp->dstadr->bcast);
+                                       }
+                               }
+                       } else
+                               ip->dstadr = 0;
 
-                       ip->srcadr = GET_INADDR(pp->srcadr);
+                       ip->srcadr = NSRCADR(&pp->srcadr);
                        if (client_v6_capable)
                                ip->v6_flag = 0;
                }
@@ -946,7 +950,7 @@ peer_info (
  */
 static void
 peer_stats (
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -955,7 +959,7 @@ peer_stats (
        register struct peer *pp;
        register struct info_peer_stats *ip;
        register int items;
-       struct sockaddr_storage addr;
+       sockaddr_u addr;
        extern struct peer *sys_peer;
 
 #ifdef DEBUG
@@ -970,54 +974,55 @@ peer_stats (
                memset((char *)&addr, 0, sizeof(addr));
                NSRCPORT(&addr) = ipl->port;
                if (client_v6_capable && ipl->v6_flag) {
-                       addr.ss_family = AF_INET6;
-                       GET_INADDR6(addr) = ipl->addr6;
+                       AF(&addr) = AF_INET6;
+                       SOCK_ADDR6(&addr) = ipl->addr6;
                } else {
-                       addr.ss_family = AF_INET;
-                       GET_INADDR(addr) = ipl->addr;
+                       AF(&addr) = AF_INET;
+                       NSRCADR(&addr) = ipl->addr;
                }       
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               addr.ss_len = SOCKLEN(&addr);
-#endif
-#ifdef DEBUG
-               if (debug)
-                   printf("peer_stats: looking for %s, %d, %d\n", stoa(&addr),
-                   ipl->port, ((struct sockaddr_in6 *)&addr)->sin6_port);
+               addr.sas.ss_len = SOCKLEN(&addr);
 #endif
+               DPRINTF(1, ("peer_stats: looking for %s, %d, %d\n",
+                           stoa(&addr), ipl->port, NSRCPORT(&addr)));
+
                ipl = (struct info_peer_list *)((char *)ipl +
                    INFO_ITEMSIZE(inpkt->mbz_itemsize));
 
-               if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == 0)
-                   continue;
-#ifdef DEBUG
-               if (debug)
-                    printf("peer_stats: found %s\n", stoa(&addr));
-#endif
-               if (pp->srcadr.ss_family == AF_INET) {
-                       if (pp->dstadr)
-                               ip->dstadr = (pp->processed) ?
-                                       pp->cast_flags == MDF_BCAST ?
-                                       GET_INADDR(pp->dstadr->bcast):
-                                       pp->cast_flags ?
-                                       GET_INADDR(pp->dstadr->sin) ?
-                                       GET_INADDR(pp->dstadr->sin):
-                                       GET_INADDR(pp->dstadr->bcast):
-                                       3 : 7;
-                       else
-                               memset(&ip->dstadr, 0, sizeof(ip->dstadr));
+               if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == NULL)
+                       continue;
+
+               DPRINTF(1, ("peer_stats: found %s\n", stoa(&addr)));
+
+               if (IS_IPV4(&pp->srcadr)) {
+                       if (pp->dstadr) {
+                               if (!pp->processed)
+                                       ip->dstadr = NSRCADR(&pp->dstadr->sin);
+                               else {
+                                       if (MDF_BCAST == pp->cast_flags)
+                                               ip->dstadr = NSRCADR(&pp->dstadr->bcast);
+                                       else if (pp->cast_flags) {
+                                               ip->dstadr = NSRCADR(&pp->dstadr->sin);
+                                               if (!ip->dstadr)
+                                                       ip->dstadr = NSRCADR(&pp->dstadr->bcast);
+                                       }
+                               }
+                       } else
+                               ip->dstadr = 0;
                        
-                       ip->srcadr = GET_INADDR(pp->srcadr);
+                       ip->srcadr = NSRCADR(&pp->srcadr);
                        if (client_v6_capable)
                                ip->v6_flag = 0;
                } else {
                        if (pp->dstadr)
-                               ip->dstadr6 = pp->cast_flags == MDF_BCAST ?
-                                       GET_INADDR6(pp->dstadr->bcast):
-                                       GET_INADDR6(pp->dstadr->sin);
+                               ip->dstadr6 =
+                                   (MDF_BCAST == pp->cast_flags)
+                                       ? SOCK_ADDR6(&pp->dstadr->bcast)
+                                       : SOCK_ADDR6(&pp->dstadr->sin);
                        else
                                memset(&ip->dstadr6, 0, sizeof(ip->dstadr6));
-                       
-                       ip->srcadr6 = GET_INADDR6(pp->srcadr);
+
+                       ip->srcadr6 = SOCK_ADDR6(&pp->srcadr);
                        ip->v6_flag = 1;
                }       
                ip->srcport = NSRCPORT(&pp->srcadr);
@@ -1061,7 +1066,7 @@ peer_stats (
  */
 static void
 sys_info(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1071,13 +1076,13 @@ sys_info(
        is = (struct info_sys *)prepare_pkt(srcadr, inter, inpkt,
            v6sizeof(struct info_sys));
 
-       if (sys_peer != 0) {
-               if (sys_peer->srcadr.ss_family == AF_INET) {
-                       is->peer = GET_INADDR(sys_peer->srcadr);
+       if (sys_peer) {
+               if (IS_IPV4(&sys_peer->srcadr)) {
+                       is->peer = NSRCADR(&sys_peer->srcadr);
                        if (client_v6_capable)
                                is->v6_flag = 0;
                } else if (client_v6_capable) {
-                       is->peer6 = GET_INADDR6(sys_peer->srcadr);
+                       is->peer6 = SOCK_ADDR6(&sys_peer->srcadr);
                        is->v6_flag = 1;
                }
                is->peer_mode = sys_peer->hmode;
@@ -1132,7 +1137,7 @@ sys_info(
  */
 static void
 sys_stats(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1165,7 +1170,7 @@ sys_stats(
  */
 static void
 mem_stats(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1211,7 +1216,7 @@ mem_stats(
  */
 static void
 io_stats(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1249,7 +1254,7 @@ io_stats(
  */
 static void
 timer_stats(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1281,7 +1286,7 @@ timer_stats(
  */
 static void
 loop_info(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1317,7 +1322,7 @@ loop_info(
  */
 static void
 do_conf(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1327,8 +1332,7 @@ do_conf(
        u_int fl;
        struct conf_peer *cp; 
        struct conf_peer temp_cp;
-       struct sockaddr_storage peeraddr;
-       struct sockaddr_in tmp_clock;
+       sockaddr_u peeraddr;
 
        /*
         * Do a check of everything to see that it looks
@@ -1372,7 +1376,7 @@ do_conf(
        while (items-- > 0) {
                memset(&temp_cp, 0, sizeof(struct conf_peer));
                memcpy(&temp_cp, (char *)cp, INFO_ITEMSIZE(inpkt->mbz_itemsize));
-               memset((char *)&peeraddr, 0, sizeof(struct sockaddr_storage));
+               ZERO_SOCK(&peeraddr);
 
                fl = 0;
                if (temp_cp.flags & CONF_FLAG_PREFER)
@@ -1386,20 +1390,16 @@ do_conf(
                        fl |= FLAG_SKEY;
 #endif /* OPENSSL */           
                if (client_v6_capable && temp_cp.v6_flag != 0) {
-                       peeraddr.ss_family = AF_INET6;
-                       GET_INADDR6(peeraddr) = temp_cp.peeraddr6; 
+                       AF(&peeraddr) = AF_INET6;
+                       SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6; 
                } else {
-                       peeraddr.ss_family = AF_INET;
-                       GET_INADDR(peeraddr) = temp_cp.peeraddr;
+                       AF(&peeraddr) = AF_INET;
+                       NSRCADR(&peeraddr) = temp_cp.peeraddr;
                        /*
                         * Make sure the address is valid
                         */
-                       tmp_clock = *CAST_V4(peeraddr);
-                       if (
-#ifdef REFCLOCK
-                               !ISREFCLOCKADR(&tmp_clock) &&
-#endif
-                               ISBADADR(&tmp_clock)) {
+                       if (!ISREFCLOCKADR(&peeraddr) && 
+                           ISBADADR(&peeraddr)) {
                                req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
                                return;
                        }
@@ -1407,7 +1407,7 @@ do_conf(
                }
                NSRCPORT(&peeraddr) = htons(NTP_PORT);
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               peeraddr.ss_len = SOCKLEN(&peeraddr);
+               peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
 #endif
 
                /* XXX W2DO? minpoll/maxpoll arguments ??? */
@@ -1449,7 +1449,7 @@ do_conf(
  */
 static void
 dns_a(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1478,16 +1478,8 @@ dns_a(
        /*
         * Make sure the address is valid
         */
-       if (
-#ifdef REFCLOCK
-               !ISREFCLOCKADR(&peeraddr) &&
-#endif
-               ISBADADR(&peeraddr)) {
-#ifdef REFCLOCK
-               msyslog(LOG_ERR, "dns_a: !ISREFCLOCK && ISBADADR");
-#else
-               msyslog(LOG_ERR, "dns_a: ISBADADR");
-#endif
+       if (!ISREFCLOCKADR(&peeraddr) && ISBADADR(&peeraddr)) {
+               msyslog(LOG_ERR, "dns_a: !ISREFCLOCKADR && ISBADADR");
                req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
                return;
        }
@@ -1517,7 +1509,7 @@ dns_a(
 
                msyslog(LOG_INFO, "dns_a: <%s> for %s, AssocID %d, bogon %d",
                        dp->hostname,
-                       stoa((struct sockaddr_storage *)&peeraddr), associd,
+                       stoa((sockaddr_u *)&peeraddr), associd,
                        bogon);
 
                if (bogon) {
@@ -1544,7 +1536,7 @@ dns_a(
  */
 static void
 do_unconf(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1553,7 +1545,7 @@ do_unconf(
        struct conf_unpeer temp_cp;
        register int items;
        register struct peer *peer;
-       struct sockaddr_storage peeraddr;
+       sockaddr_u peeraddr;
        int bad, found;
 
        /*
@@ -1568,18 +1560,18 @@ do_unconf(
        bad = 0;
        while (items-- > 0 && !bad) {
                memset(&temp_cp, 0, sizeof(temp_cp));
-               memset(&peeraddr, 0, sizeof(peeraddr));
+               ZERO_SOCK(&peeraddr);
                memcpy(&temp_cp, cp, INFO_ITEMSIZE(inpkt->mbz_itemsize));
-               if (client_v6_capable && temp_cp.v6_flag != 0) {
-                       peeraddr.ss_family = AF_INET6;
-                       GET_INADDR6(peeraddr) = temp_cp.peeraddr6;
+               if (client_v6_capable && temp_cp.v6_flag) {
+                       AF(&peeraddr) = AF_INET6;
+                       SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6;
                } else {
-                       peeraddr.ss_family = AF_INET;
-                       GET_INADDR(peeraddr) = temp_cp.peeraddr;
+                       AF(&peeraddr) = AF_INET;
+                       NSRCADR(&peeraddr) = temp_cp.peeraddr;
                }
-               NSRCPORT(&peeraddr) = htons(NTP_PORT);
+               SET_PORT(&peeraddr, NTP_PORT);
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               peeraddr.ss_len = SOCKLEN(&peeraddr);
+               peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
 #endif
                found = 0;
                peer = NULL;
@@ -1615,16 +1607,16 @@ do_unconf(
                memset(&temp_cp, 0, sizeof(temp_cp));
                memset(&peeraddr, 0, sizeof(peeraddr));
                memcpy(&temp_cp, cp, INFO_ITEMSIZE(inpkt->mbz_itemsize));
-               if (client_v6_capable && temp_cp.v6_flag != 0) {
-                       peeraddr.ss_family = AF_INET6;
-                       GET_INADDR6(peeraddr) = temp_cp.peeraddr6;
+               if (client_v6_capable && temp_cp.v6_flag) {
+                       AF(&peeraddr) = AF_INET6;
+                       SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6;
                } else {
-                       peeraddr.ss_family = AF_INET;
-                       GET_INADDR(peeraddr) = temp_cp.peeraddr;
+                       AF(&peeraddr) = AF_INET;
+                       NSRCADR(&peeraddr) = temp_cp.peeraddr;
                }
-               NSRCPORT(&peeraddr) = htons(NTP_PORT);
+               SET_PORT(&peeraddr, NTP_PORT);
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               peeraddr.ss_len = SOCKLEN(&peeraddr);
+               peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
 #endif
                found = 0;
                peer = NULL;
@@ -1655,7 +1647,7 @@ do_unconf(
  */
 static void
 set_sys_flag(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1669,7 +1661,7 @@ set_sys_flag(
  */
 static void
 clr_sys_flag(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1683,7 +1675,7 @@ clr_sys_flag(
  */
 static void
 setclr_flags(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt,
        u_long set
@@ -1745,7 +1737,7 @@ setclr_flags(
  */
 static void
 list_restrict(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1792,7 +1784,7 @@ list_restrict(
  */
 static void
 do_resaddflags(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1807,7 +1799,7 @@ do_resaddflags(
  */
 static void
 do_ressubflags(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1821,7 +1813,7 @@ do_ressubflags(
  */
 static void
 do_unrestrict(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1830,15 +1822,12 @@ do_unrestrict(
 }
 
 
-
-
-
 /*
  * do_restrict - do the dirty stuff of dealing with restrictions
  */
 static void
 do_restrict(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt,
        int op
@@ -1846,8 +1835,8 @@ do_restrict(
 {
        register struct conf_restrict *cr;
        register int items;
-       struct sockaddr_storage matchaddr;
-       struct sockaddr_storage matchmask;
+       sockaddr_u matchaddr;
+       sockaddr_u matchmask;
        int bad;
 
        /*
@@ -1889,20 +1878,20 @@ do_restrict(
         */
        items = INFO_NITEMS(inpkt->err_nitems);
        cr = (struct conf_restrict *)inpkt->data;
-       memset((char *)&matchaddr, 0, sizeof(struct sockaddr_storage));
-       memset((char *)&matchmask, 0, sizeof(struct sockaddr_storage));
+       ZERO_SOCK(&matchaddr);
+       ZERO_SOCK(&matchmask);
 
        while (items-- > 0) {
-               if (client_v6_capable && cr->v6_flag != 0) {
-                       GET_INADDR6(matchaddr) = cr->addr6;
-                       GET_INADDR6(matchmask) = cr->mask6;
-                       matchaddr.ss_family = AF_INET6;
-                       matchmask.ss_family = AF_INET6;
+               if (client_v6_capable && cr->v6_flag) {
+                       AF(&matchaddr) = AF_INET6;
+                       AF(&matchmask) = AF_INET6;
+                       SOCK_ADDR6(&matchaddr) = cr->addr6;
+                       SOCK_ADDR6(&matchmask) = cr->mask6;
                } else {
-                       GET_INADDR(matchaddr) = cr->addr;
-                       GET_INADDR(matchmask) = cr->mask;
-                       matchaddr.ss_family = AF_INET;
-                       matchmask.ss_family = AF_INET;
+                       AF(&matchaddr) = AF_INET;
+                       AF(&matchmask) = AF_INET;
+                       NSRCADR(&matchaddr) = cr->addr;
+                       NSRCADR(&matchmask) = cr->mask;
                }
                hack_restrict(op, &matchaddr, &matchmask, cr->mflags,
                         cr->flags);
@@ -1918,7 +1907,7 @@ do_restrict(
  */
 static void
 mon_getlist_0(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1943,15 +1932,15 @@ mon_getlist_0(
                im->lasttime = htonl((u_int32)((current_time -
                    md->firsttime) / md->count));
                im->firsttime = htonl((u_int32)(current_time - md->lasttime));
-               im->lastdrop = htonl((u_int32)md->flags);
+               im->restr = htonl((u_int32)md->flags);
                im->count = htonl((u_int32)(md->count));
-               if (md->rmtadr.ss_family == AF_INET6) {
+               if (IS_IPV6(&md->rmtadr)) {
                        if (!client_v6_capable)
                                continue;
-                       im->addr6 = GET_INADDR6(md->rmtadr);
+                       im->addr6 = SOCK_ADDR6(&md->rmtadr);
                        im->v6_flag = 1;
                } else {
-                       im->addr = GET_INADDR(md->rmtadr);
+                       im->addr = NSRCADR(&md->rmtadr);
                        if (client_v6_capable)
                                im->v6_flag = 0;
                }
@@ -1968,7 +1957,7 @@ mon_getlist_0(
  */
 static void
 mon_getlist_1(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -1989,25 +1978,26 @@ mon_getlist_1(
                im->lasttime = htonl((u_int32)((current_time -
                    md->firsttime) / md->count));
                im->firsttime = htonl((u_int32)(current_time - md->lasttime));
-               im->lastdrop = htonl((u_int32)md->flags);
+               im->restr = htonl((u_int32)md->flags);
                im->count = htonl((u_int32)md->count);
-               if (md->rmtadr.ss_family == AF_INET6) {
+               if (IS_IPV6(&md->rmtadr)) {
                        if (!client_v6_capable)
                                continue;
-                       im->addr6 = GET_INADDR6(md->rmtadr);
+                       im->addr6 = SOCK_ADDR6(&md->rmtadr);
                        im->v6_flag = 1;
-                       im->daddr6 = GET_INADDR6(md->interface->sin);
+                       im->daddr6 = SOCK_ADDR6(&md->interface->sin);
                } else {
-                       im->addr = GET_INADDR(md->rmtadr);
+                       im->addr = NSRCADR(&md->rmtadr);
                        if (client_v6_capable)
                                im->v6_flag = 0;
-                       im->daddr = (md->cast_flags == MDF_BCAST)  
-                               ? GET_INADDR(md->interface->bcast) 
-                               : (md->cast_flags 
-                               ? (GET_INADDR(md->interface->sin)
-                               ? GET_INADDR(md->interface->sin)
-                               : GET_INADDR(md->interface->bcast))
-                               : 4);
+                       if (MDF_BCAST == md->cast_flags)
+                               im->daddr = NSRCADR(&md->interface->bcast);
+                       else if (md->cast_flags) {
+                               im->daddr = NSRCADR(&md->interface->sin);
+                               if (!im->daddr)
+                                       im->daddr = NSRCADR(&md->interface->bcast);
+                       } else
+                               im->daddr = 4;
                }
                im->flags = htonl(md->cast_flags);
                im->port = md->rmtport;
@@ -2042,7 +2032,7 @@ struct reset_entry reset_entries[] = {
  */
 static void
 reset_stats(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2079,15 +2069,15 @@ reset_stats(
  */
 static void
 reset_peer(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
 {
-       register struct conf_unpeer *cp;
-       register int items;
-       register struct peer *peer;
-       struct sockaddr_storage peeraddr;
+       struct conf_unpeer *cp;
+       int items;
+       struct peer *peer;
+       sockaddr_u peeraddr;
        int bad;
 
        /*
@@ -2100,21 +2090,21 @@ reset_peer(
 
        bad = 0;
        while (items-- > 0 && !bad) {
-               memset((char *)&peeraddr, 0, sizeof(peeraddr));
-               if (client_v6_capable && cp->v6_flag != 0) {
-                       GET_INADDR6(peeraddr) = cp->peeraddr6;
-                       peeraddr.ss_family = AF_INET6;
+               ZERO_SOCK(&peeraddr);
+               if (client_v6_capable && cp->v6_flag) {
+                       AF(&peeraddr) = AF_INET6;
+                       SOCK_ADDR6(&peeraddr) = cp->peeraddr6;
                } else {
-                       GET_INADDR(peeraddr) = cp->peeraddr;
-                       peeraddr.ss_family = AF_INET;
+                       AF(&peeraddr) = AF_INET;
+                       NSRCADR(&peeraddr) = cp->peeraddr;
                }
-               NSRCPORT(&peeraddr) = htons(NTP_PORT);
+
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               peeraddr.ss_len = SOCKLEN(&peeraddr);
+               peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
 #endif
-               peer = findexistingpeer(&peeraddr, (struct peer *)0, -1);
-               if (peer == (struct peer *)0)
-                   bad++;
+               peer = findexistingpeer(&peeraddr, NULL, -1);
+               if (NULL == peer)
+                       bad++;
                cp = (struct conf_unpeer *)((char *)cp +
                    INFO_ITEMSIZE(inpkt->mbz_itemsize));
        }
@@ -2131,21 +2121,22 @@ reset_peer(
        items = INFO_NITEMS(inpkt->err_nitems);
        cp = (struct conf_unpeer *)inpkt->data;
        while (items-- > 0) {
-               memset((char *)&peeraddr, 0, sizeof(peeraddr));
-               if (client_v6_capable && cp->v6_flag != 0) {
-                       GET_INADDR6(peeraddr) = cp->peeraddr6;
-                       peeraddr.ss_family = AF_INET6;
+               ZERO_SOCK(&peeraddr);
+               if (client_v6_capable && cp->v6_flag) {
+                       AF(&peeraddr) = AF_INET6;
+                       SOCK_ADDR6(&peeraddr) = cp->peeraddr6;
                } else {
-                       GET_INADDR(peeraddr) = cp->peeraddr;
-                       peeraddr.ss_family = AF_INET;
+                       AF(&peeraddr) = AF_INET;
+                       NSRCADR(&peeraddr) = cp->peeraddr;
                }
+               SET_PORT(&peeraddr, 123);
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               peeraddr.ss_len = SOCKLEN(&peeraddr);
+               peeraddr.sas.ss_len = SOCKLEN(&peeraddr);
 #endif
-               peer = findexistingpeer(&peeraddr, (struct peer *)0, -1);
-               while (peer != 0) {
+               peer = findexistingpeer(&peeraddr, NULL, -1);
+               while (peer != NULL) {
                        peer_reset(peer);
-                       peer = findexistingpeer(&peeraddr, (struct peer *)peer, -1);
+                       peer = findexistingpeer(&peeraddr, peer, -1);
                }
                cp = (struct conf_unpeer *)((char *)cp +
                    INFO_ITEMSIZE(inpkt->mbz_itemsize));
@@ -2160,7 +2151,7 @@ reset_peer(
  */
 static void
 do_key_reread(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2175,7 +2166,7 @@ do_key_reread(
  */
 static void
 trust_key(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2189,7 +2180,7 @@ trust_key(
  */
 static void
 untrust_key(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2203,7 +2194,7 @@ untrust_key(
  */
 static void
 do_trustkey(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt,
        u_long trust
@@ -2228,7 +2219,7 @@ do_trustkey(
  */
 static void
 get_auth_info(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2296,7 +2287,7 @@ reset_auth_stats(void)
  */
 static void
 req_get_traps(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2321,21 +2312,21 @@ req_get_traps(
 
        for (i = 0, tr = ctl_trap; i < CTL_MAXTRAPS; i++, tr++) {
                if (tr->tr_flags & TRAP_INUSE) {
-                       if (tr->tr_addr.ss_family == AF_INET) {
+                       if (IS_IPV4(&tr->tr_addr)) {
                                if (tr->tr_localaddr == any_interface)
                                        it->local_address = 0;
                                else
                                        it->local_address
-                                           = GET_INADDR(tr->tr_localaddr->sin);
-                               it->trap_address = GET_INADDR(tr->tr_addr);
+                                           = NSRCADR(&tr->tr_localaddr->sin);
+                               it->trap_address = NSRCADR(&tr->tr_addr);
                                if (client_v6_capable)
                                        it->v6_flag = 0;
                        } else {
                                if (!client_v6_capable)
                                        continue;
                                it->local_address6 
-                                   = GET_INADDR6(tr->tr_localaddr->sin);
-                               it->trap_address6 = GET_INADDR6(tr->tr_addr);
+                                   = SOCK_ADDR6(&tr->tr_localaddr->sin);
+                               it->trap_address6 = SOCK_ADDR6(&tr->tr_addr);
                                it->v6_flag = 1;
                        }
                        it->trap_port = NSRCPORT(&tr->tr_addr);
@@ -2356,7 +2347,7 @@ req_get_traps(
  */
 static void
 req_set_trap(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2371,7 +2362,7 @@ req_set_trap(
  */
 static void
 req_clr_trap(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2386,7 +2377,7 @@ req_clr_trap(
  */
 static void
 do_setclr_trap(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt,
        int set
@@ -2395,14 +2386,14 @@ do_setclr_trap(
        register struct conf_trap *ct;
        register struct interface *linter;
        int res;
-       struct sockaddr_storage laddr;
+       sockaddr_u laddr;
 
        /*
-        * Prepare sockaddr_storage structure
+        * Prepare sockaddr
         */
-       memset((char *)&laddr, 0, sizeof laddr);
-       laddr.ss_family = srcadr->ss_family;
-       NSRCPORT(&laddr) = ntohs(NTP_PORT);
+       ZERO_SOCK(&laddr);
+       AF(&laddr) = AF(srcadr);
+       SET_PORT(&laddr, NTP_PORT);
 
        /*
         * Restrict ourselves to one item only.  This eliminates
@@ -2421,25 +2412,25 @@ do_setclr_trap(
        if (ct->local_address == 0) {
                linter = any_interface;
        } else {
-               if (laddr.ss_family == AF_INET)
-                       GET_INADDR(laddr) = ct->local_address;
+               if (IS_IPV4(&laddr))
+                       NSRCADR(&laddr) = ct->local_address;
                else
-                       GET_INADDR6(laddr) = ct->local_address6;
+                       SOCK_ADDR6(&laddr) = ct->local_address6;
                linter = findinterface(&laddr);
-               if (linter == NULL) {
+               if (NULL == linter) {
                        req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
                        return;
                }
        }
 
-       if (laddr.ss_family == AF_INET)
-               GET_INADDR(laddr) = ct->trap_address;
+       if (IS_IPV4(&laddr))
+               NSRCADR(&laddr) = ct->trap_address;
        else
-               GET_INADDR6(laddr) = ct->trap_address6;
-       if (ct->trap_port != 0)
-           NSRCPORT(&laddr) = ct->trap_port;
+               SOCK_ADDR6(&laddr) = ct->trap_address6;
+       if (ct->trap_port)
+               NSRCPORT(&laddr) = ct->trap_port;
        else
-           NSRCPORT(&laddr) = htons(TRAPPORT);
+               SET_PORT(&laddr, TRAPPORT);
 
        if (set) {
                res = ctlsettrap(&laddr, linter, 0,
@@ -2463,7 +2454,7 @@ do_setclr_trap(
  */
 static void
 set_request_keyid(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2491,7 +2482,7 @@ set_request_keyid(
  */
 static void
 set_control_keyid(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2520,7 +2511,7 @@ set_control_keyid(
  */
 static void
 get_ctl_stats(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2576,7 +2567,7 @@ get_ctl_stats(
  */
 static void
 get_kernel_info(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2631,7 +2622,7 @@ get_kernel_info(
  */
 static void
 get_clock_info(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2640,16 +2631,15 @@ get_clock_info(
        register u_int32 *clkaddr;
        register int items;
        struct refclockstat clock_stat;
-       struct sockaddr_storage addr;
-       struct sockaddr_in tmp_clock;
+       sockaddr_u addr;
        l_fp ltmp;
 
-       memset((char *)&addr, 0, sizeof addr);
-       addr.ss_family = AF_INET;
+       ZERO_SOCK(&addr);
+       AF(&addr) = AF_INET;
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-       addr.ss_len = SOCKLEN(&addr);
+       addr.sas.ss_len = SOCKLEN(&addr);
 #endif
-       NSRCPORT(&addr) = htons(NTP_PORT);
+       SET_PORT(&addr, NTP_PORT);
        items = INFO_NITEMS(inpkt->err_nitems);
        clkaddr = (u_int32 *) inpkt->data;
 
@@ -2657,19 +2647,18 @@ get_clock_info(
                                              sizeof(struct info_clock));
 
        while (items-- > 0) {
-               tmp_clock.sin_addr.s_addr = *clkaddr++;
-               CAST_V4(addr)->sin_addr = tmp_clock.sin_addr;
-               if (!ISREFCLOCKADR(&tmp_clock) ||
-                   findexistingpeer(&addr, (struct peer *)0, -1) == 0) {
+               NSRCADR(&addr) = *clkaddr++;
+               if (!ISREFCLOCKADR(&addr) ||
+                   findexistingpeer(&addr, NULL, -1) == NULL) {
                        req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
                        return;
                }
 
                clock_stat.kv_list = (struct ctl_var *)0;
 
-               refclock_control(&addr, (struct refclockstat *)0, &clock_stat);
+               refclock_control(&addr, NULL, &clock_stat);
 
-               ic->clockadr = tmp_clock.sin_addr.s_addr;
+               ic->clockadr = NSRCADR(&addr);
                ic->type = clock_stat.type;
                ic->flags = clock_stat.flags;
                ic->lastevent = clock_stat.lastevent;
@@ -2700,7 +2689,7 @@ get_clock_info(
  */
 static void
 set_clock_fudge(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2708,26 +2697,23 @@ set_clock_fudge(
        register struct conf_fudge *cf;
        register int items;
        struct refclockstat clock_stat;
-       struct sockaddr_storage addr;
-       struct sockaddr_in tmp_clock;
+       sockaddr_u addr;
        l_fp ltmp;
 
-       memset((char *)&addr, 0, sizeof addr);
+       ZERO_SOCK(&addr);
        memset((char *)&clock_stat, 0, sizeof clock_stat);
-       memset((char *)&tmp_clock, 0, sizeof tmp_clock);
        items = INFO_NITEMS(inpkt->err_nitems);
        cf = (struct conf_fudge *) inpkt->data;
 
        while (items-- > 0) {
-               tmp_clock.sin_addr.s_addr = cf->clockadr;
-               *CAST_V4(addr) = tmp_clock;
-               addr.ss_family = AF_INET;
+               AF(&addr) = AF_INET;
+               NSRCADR(&addr) = cf->clockadr;
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               addr.ss_len = SOCKLEN(&addr);
+               addr.sas.ss_len = SOCKLEN(&addr);
 #endif
-               NSRCPORT(&addr) = htons(NTP_PORT);
-               if (!ISREFCLOCKADR(&tmp_clock) ||
-                   findexistingpeer(&addr, (struct peer *)0, -1) == 0) {
+               SET_PORT(&addr, NTP_PORT);
+               if (!ISREFCLOCKADR(&addr) ||
+                   findexistingpeer(&addr, NULL, -1) == 0) {
                        req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
                        return;
                }
@@ -2775,7 +2761,7 @@ set_clock_fudge(
  */
 static void
 get_clkbug_info(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2785,15 +2771,14 @@ get_clkbug_info(
        register u_int32 *clkaddr;
        register int items;
        struct refclockbug bug;
-       struct sockaddr_storage addr;
-       struct sockaddr_in tmp_clock;
+       sockaddr_u addr;
 
-       memset((char *)&addr, 0, sizeof addr);
-       addr.ss_family = AF_INET;
+       ZERO_SOCK(&addr);
+       AF(&addr) = AF_INET;
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-       addr.ss_len = SOCKLEN(&addr);
+       addr.sas.ss_len = SOCKLEN(&addr);
 #endif
-       NSRCPORT(&addr) = htons(NTP_PORT);
+       SET_PORT(&addr, NTP_PORT);
        items = INFO_NITEMS(inpkt->err_nitems);
        clkaddr = (u_int32 *) inpkt->data;
 
@@ -2801,10 +2786,9 @@ get_clkbug_info(
                                               sizeof(struct info_clkbug));
 
        while (items-- > 0) {
-               tmp_clock.sin_addr.s_addr = *clkaddr++;
-               GET_INADDR(addr) = tmp_clock.sin_addr.s_addr;
-               if (!ISREFCLOCKADR(&tmp_clock) ||
-                   findexistingpeer(&addr, (struct peer *)0, -1) == 0) {
+               NSRCADR(&addr) = *clkaddr++;
+               if (!ISREFCLOCKADR(&addr) ||
+                   findexistingpeer(&addr, NULL, -1) == 0) {
                        req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
                        return;
                }
@@ -2816,7 +2800,7 @@ get_clkbug_info(
                        return;
                }
 
-               ic->clockadr = tmp_clock.sin_addr.s_addr;
+               ic->clockadr = NSRCADR(&addr);
                i = bug.nvalues;
                if (i > NUMCBUGVALUES)
                    i = NUMCBUGVALUES;
@@ -2850,24 +2834,24 @@ fill_info_if_stats(void *data, interface_info_t *interface_info)
        struct info_if_stats *ifs = *ifsp;
        struct interface *interface = interface_info->interface;
        
-       memset((char*)ifs, 0, sizeof(*ifs));
+       memset(ifs, 0, sizeof(*ifs));
        
-       if (interface->sin.ss_family == AF_INET6) {
+       if (IS_IPV6(&interface->sin)) {
                if (!client_v6_capable) {
                        return;
                }
                ifs->v6_flag = 1;
-               memcpy((char *)&ifs->unaddr.addr6, (char *)&CAST_V6(interface->sin)->sin6_addr, sizeof(struct in6_addr));
-               memcpy((char *)&ifs->unbcast.addr6, (char *)&CAST_V6(interface->bcast)->sin6_addr, sizeof(struct in6_addr));
-               memcpy((char *)&ifs->unmask.addr6, (char *)&CAST_V6(interface->mask)->sin6_addr, sizeof(struct in6_addr));
+               ifs->unaddr.addr6 = SOCK_ADDR6(&interface->sin);
+               ifs->unbcast.addr6 = SOCK_ADDR6(&interface->bcast);
+               ifs->unmask.addr6 = SOCK_ADDR6(&interface->mask);
        } else {
                ifs->v6_flag = 0;
-               memcpy((char *)&ifs->unaddr.addr, (char *)&CAST_V4(interface->sin)->sin_addr, sizeof(struct in_addr));
-               memcpy((char *)&ifs->unbcast.addr, (char *)&CAST_V4(interface->bcast)->sin_addr, sizeof(struct in_addr));
-               memcpy((char *)&ifs->unmask.addr, (char *)&CAST_V4(interface->mask)->sin_addr, sizeof(struct in_addr));
+               ifs->unaddr.addr = SOCK_ADDR4(&interface->sin);
+               ifs->unbcast.addr = SOCK_ADDR4(&interface->bcast);
+               ifs->unmask.addr = SOCK_ADDR4(&interface->mask);
        }
        ifs->v6_flag = htonl(ifs->v6_flag);
-       strcpy(ifs->name, interface->name);
+       strncpy(ifs->name, interface->name, sizeof(ifs->name));
        ifs->family = htons(interface->family);
        ifs->flags = htonl(interface->flags);
        ifs->last_ttl = htonl(interface->last_ttl);
@@ -2891,7 +2875,7 @@ fill_info_if_stats(void *data, interface_info_t *interface_info)
  */
 static void
 get_if_stats(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
@@ -2910,7 +2894,7 @@ get_if_stats(
 
 static void
 do_if_reload(
-       struct sockaddr_storage *srcadr,
+       sockaddr_u *srcadr,
        struct interface *inter,
        struct req_pkt *inpkt
        )
index 5030e8599ab2da5093091ee7cc44afb3e677045b..2ea4f35aae078db57de3fba1e6d44561a0a5c233 100644 (file)
@@ -151,7 +151,7 @@ init_restrict(void)
  */
 int
 restrictions(
-       struct sockaddr_storage *srcadr
+       sockaddr_u *srcadr
        )
 {
        struct restrictlist *rl;
@@ -166,14 +166,14 @@ restrictions(
 
        res_calls++;
        /* IPv4 source address */
-       if (srcadr->ss_family == AF_INET) {
+       if (IS_IPV4(srcadr)) {
 
                /*
                 * We need the host address in host order. Also need to
                 * know whether this is from the ntp port or not.
                 */
                hostaddr = SRCADR(srcadr);
-               isntpport = (SRCPORT(srcadr) == NTP_PORT);
+               isntpport = (NTP_PORT == SRCPORT(srcadr));
 
                /*
                 * Ignore any packets with a multicast source address
@@ -205,16 +205,14 @@ restrictions(
        }
 
        /* IPv6 source address */
-       if (srcadr->ss_family == AF_INET6) {
+       if (IS_IPV6(srcadr)) {
 
                /*
-                * We need the host address in host order. Also need to
-                * know whether this is from the ntp port or not.
+                * We need the host address in network order. Also need
+                * to know whether this is from the ntp port or not.
                 */
-               hostaddr6 = GET_INADDR6(*srcadr);
-               isntpport = (ntohs((
-                   (struct sockaddr_in6 *)srcadr)->sin6_port) ==
-                   NTP_PORT);
+               hostaddr6 = SOCK_ADDR6(srcadr);
+               isntpport = (NTP_PORT == SRCPORT(srcadr));
 
                /*
                 * Ignore any packets with a multicast source address
@@ -259,8 +257,8 @@ restrictions(
 void
 hack_restrict(
        int op,
-       struct sockaddr_storage *resaddr,
-       struct sockaddr_storage *resmask,
+       sockaddr_u *resaddr,
+       sockaddr_u *resmask,
        int mflags,
        int flags
        )
@@ -277,12 +275,10 @@ hack_restrict(
        memset(&addr6, 0, sizeof(struct in6_addr)); 
        memset(&mask6, 0, sizeof(struct in6_addr)); 
 
-       if (resaddr->ss_family == AF_INET) {
-#ifdef DEBUG
-        if (debug)
-               printf("restrict: addr %08x mask %08x mflags %08x flags %08x\n",
-                   SRCADR(resaddr), SRCADR(resmask), mflags, flags);
-#endif
+       if (IS_IPV4(resaddr)) {
+
+               DPRINTF(1, ("restrict: addr %08x mask %08x mflags %08x flags %08x\n",
+                           SRCADR(resaddr), SRCADR(resmask), mflags, flags));
 
                /*
                 * Get address and mask in host byte order
@@ -329,10 +325,10 @@ hack_restrict(
                }
        }
 
-       if (resaddr->ss_family == AF_INET6) {
-               mask6 = GET_INADDR6(*resmask);
+       if (IS_IPV6(resaddr)) {
+               mask6 = SOCK_ADDR6(resmask);
                SET_IPV6_ADDR_MASK(&addr6,
-                   &GET_INADDR6(*resaddr), &mask6);
+                   PSOCK_ADDR6(resaddr), &mask6);
                if (IN6_IS_ADDR_UNSPECIFIED(&addr6)) {
                        rlprev6 = NULL;
                        rl6 = restrictlist6;
@@ -381,7 +377,7 @@ hack_restrict(
        /*
         * Switch based on operation
         */
-       if (resaddr->ss_family == AF_INET) {
+       if (IS_IPV4(resaddr)) {
                switch (op) {
                case RESTRICT_FLAGS:
 
@@ -481,7 +477,7 @@ hack_restrict(
                default:
                        break;
                }
-       } else if (resaddr->ss_family == AF_INET6) {
+       } else if (IS_IPV6(resaddr)) {
                switch (op) {
                case RESTRICT_FLAGS:
 
index 4bfb9df6da5774c736ded6f5533a67ae7b3ff4d8..baa7ec9bb129be2a4e6e51400ff8885d1489f5fb 100644 (file)
@@ -277,7 +277,7 @@ timer(void)
                        next_peer = peer->next;
                        if (peer->action && peer->nextaction <=
                            current_time)
-                               peer->action(peer);
+                               peer->action(peer);
 
                        /*
                         * Restrain the non-burst packet rate not more
@@ -314,7 +314,7 @@ timer(void)
                                crypto_update();
 #endif /* OPENSSL */
                }
-               sys_stratum = sys_orphan;
+               sys_stratum = (u_char)sys_orphan;
                if (sys_stratum > 1)
                        sys_refid = htonl(LOOPBACKADR);
                else
index 01e837451816780be54626a0c452e7f5db5cf17a..e3b858fd69510ff9d616faf94bfe51580efce512 100644 (file)
@@ -576,7 +576,7 @@ stats_config(
 */
 void
 record_peer_stats(
-       struct sockaddr_storage *addr,
+       sockaddr_u *addr,
        int     status,
        double  offset,         /* offset */
        double  delay,          /* delay */
@@ -655,7 +655,7 @@ record_loop_stats(
  */
 void
 record_clock_stats(
-       struct sockaddr_storage *addr,
+       sockaddr_u *addr,
        const char *text        /* timecode string */
        )
 {
@@ -689,8 +689,8 @@ record_clock_stats(
  */
 void
 record_raw_stats(
-        struct sockaddr_storage *srcadr,
-        struct sockaddr_storage *dstadr,
+       sockaddr_u *srcadr,
+       sockaddr_u *dstadr,
        l_fp    *t1,            /* originate timestamp */
        l_fp    *t2,            /* receive timestamp */
        l_fp    *t3,            /* transmit timestamp */
@@ -805,7 +805,7 @@ record_proto_stats(
  */
 void
 record_crypto_stats(
-       struct sockaddr_storage *addr,
+       sockaddr_u *addr,
        const char *text        /* text message */
        )
 {
@@ -1037,11 +1037,11 @@ rereadkeys(void)
 
 
 /*
- * sock_hash - hash an sockaddr_storage structure
+ * sock_hash - hash a sockaddr_u structure
  */
 int
 sock_hash(
-       struct sockaddr_storage *addr
+       sockaddr_u *addr
        )
 {
        int hashVal;
@@ -1056,21 +1056,21 @@ sock_hash(
         * fields in sockaddr_in6 that might be filled in by recvfrom(),
         * so just use the family, port and address.
         */
-       ch = (char *)&addr->ss_family;
+       ch = (char *)&AF(addr);
        hashVal = 37 * hashVal + (int)*ch;
-       if (sizeof(addr->ss_family) > 1) {
+       if (sizeof(AF(addr)) > 1) {
                ch++;
                hashVal = 37 * hashVal + (int)*ch;
        }
-       switch(addr->ss_family) {
+       switch(AF(addr)) {
        case AF_INET:
-               ch = (char *)&((struct sockaddr_in *)addr)->sin_addr;
-               len = sizeof(struct in_addr);
+               ch = (char *)&SOCK_ADDR4(addr);
+               len = sizeof(SOCK_ADDR4(addr));
                break;
 
        case AF_INET6:
-               ch = (char *)&((struct sockaddr_in6 *)addr)->sin6_addr;
-               len = sizeof(struct in6_addr);
+               ch = (char *)&SOCK_ADDR6(addr);
+               len = sizeof(SOCK_ADDR6(addr));
                break;
        }
 
index 1139ef760e5c74fb90d37fa2d0920163ffd9cd92..88fb745ecf24c8e98d240c5ebae5fef043c026fc 100644 (file)
@@ -269,7 +269,7 @@ init_logging(
 #  endif /* DEBUG */
                setlogmask(LOG_UPTO(LOG_DEBUG)); /* @@@ was INFO */
 # endif /* LOG_DAEMON */
-#endif /* !SYS_WINNT && !VMS */
+#endif /* !VMS */
 
        if (log_version)
            NLOG(NLOG_SYSINFO) /* 'if' clause for syslog */
@@ -278,9 +278,10 @@ init_logging(
 
 
 /*
- * See if we should redirect the logfile
+ * Redirect logging to a file if requested with -l.
+ * The ntp.conf logfile directive does not use this code, see
+ * config_vars() in ntp_config.c.
  */
-
 void
 setup_logfile(
        void
@@ -487,7 +488,8 @@ ntpdmain(
                argv += optct;
        }
 
-       init_logging(progname, 1);              /* Open the log file */
+       init_lib();                     /* set ipv6_works flag early */
+       init_logging(progname, 1);      /* Open the log file */
 
 #ifdef HAVE_UMASK
        {
@@ -519,10 +521,12 @@ ntpdmain(
 
 #ifdef DEBUG
        debug = DESC(DEBUG_LEVEL).optOccCt;
-       if (debug)
-           printf("%s\n", Version);
+       DPRINTF(1, ("%s\n", Version));
 #endif
 
+       /* honor -l option to log to a file instead of syslog */
+       setup_logfile();
+
 /*
  * Enable the Multi-Media Timer for Windows?
  */
@@ -565,13 +569,11 @@ ntpdmain(
 
 #ifdef SYS_WINNT
        /*
-        * Initialize the time structures and variables
+        * Start interpolation thread, must occur before first
+        * get_systime()
         */
        init_winnt_time();
 #endif
-
-       setup_logfile();
-
        /*
         * Initialize random generator and public key pair
         */
@@ -610,8 +612,11 @@ ntpdmain(
 #if !defined(F_CLOSEM)
                        u_long s;
                        int max_fd;
-#endif /* not F_CLOSEM */
-
+#endif /* !FCLOSEM */
+                       if (syslog_file != NULL) {
+                               fclose(syslog_file);
+                               syslog_file = NULL;
+                       }
 #if defined(F_CLOSEM)
                        /*
                         * From 'Writing Reliable AIX Daemons,' SG24-4946-00,
@@ -635,6 +640,7 @@ ntpdmain(
                        (void) dup2(0, 2);
 
                        init_logging(progname, 0);
+                       /* we lost our logfile (if any) daemonizing */
                        setup_logfile();
 
 #ifdef SYS_DOMAINOS
@@ -688,8 +694,6 @@ ntpdmain(
 # endif /* NODETACH */
 #endif /* VMS */
 
-       setup_logfile();        /* We lost any redirect when we daemonized */
-
 #ifdef SCO5_CLOCK
        /*
         * SCO OpenServer's system clock offers much more precise timekeeping
@@ -827,7 +831,6 @@ ntpdmain(
        init_restrict();
        init_mon();
        init_timer();
-       init_lib();
        init_request();
        init_control();
        init_peer();
index f7479313cfd52ad36f8cbead1cd13c0b214e86a9..e8adc3196af4e1e0cad5598ae123ec7d5f28460a 100644 (file)
@@ -2,9 +2,9 @@
  *
  * The source code for the ntp discrete event simulator. 
  *
- * Written By: Sachin Kamboj
- *             University of Delaware
- *             Newark, DE 19711
+ * Written By: Sachin Kamboj
+ *             University of Delaware
+ *             Newark, DE 19711
  * Copyright (c) 2006
  * (Some code shamelessly based on the original NTP discrete event simulator)
  */
 
 /* Global Variable Definitions */
 
-sim_info simulation;         /* Simulation Control Variables */
-local_clock_info simclock;   /* Local Clock Variables */
-queue *event_queue;          /* Event Queue */
-queue *recv_queue;           /* Receive Queue */
-static double sys_residual = 0;     /* adjustment residue (s) */
+sim_info simulation;           /* Simulation Control Variables */
+local_clock_info simclock;     /* Local Clock Variables */
+queue *event_queue;            /* Event Queue */
+queue *recv_queue;             /* Receive Queue */
+static double sys_residual = 0;        /* adjustment residue (s) */
 
 void (*event_ptr[]) (Event *) = {
     sim_event_beep, sim_update_clocks, sim_event_timer, sim_event_recv_packet
-};                        /* Function pointer to the events */
+};                     /* Function pointer to the events */
 
 
 /* Define a function to compare two events to determine which one occurs first
@@ -58,20 +58,20 @@ void create_server_associations()
 {
     int i;
     for (i = 0;i < simulation.num_of_servers;++i) {
-        printf("%s\n", stoa(simulation.servers[i].addr));
-        if (peer_config(simulation.servers[i].addr,
-                        ANY_INTERFACE_CHOOSE(simulation.servers[i].addr),
-                        MODE_CLIENT,
-                        NTP_VERSION,
-                        NTP_MINDPOLL,
-                        NTP_MAXDPOLL,
-                        0, /* peerflags */
-                        0, /* ttl */
-                        0, /* peerkey */
-                        (u_char *)"*" /* peerkeystr */) == 0) {
-            fprintf(stderr, "ERROR!! Could not create association for: %s",
-                    stoa(simulation.servers[i].addr));
-        }
+       printf("%s\n", stoa(simulation.servers[i].addr));
+       if (peer_config(simulation.servers[i].addr,
+                       ANY_INTERFACE_CHOOSE(simulation.servers[i].addr),
+                       MODE_CLIENT,
+                       NTP_VERSION,
+                       NTP_MINDPOLL,
+                       NTP_MAXDPOLL,
+                       0, /* peerflags */
+                       0, /* ttl */
+                       0, /* peerkey */
+                       (u_char *)"*" /* peerkeystr */) == 0) {
+           fprintf(stderr, "ERROR!! Could not create association for: %s",
+                   stoa(simulation.servers[i].addr));
+       }
     }
 }
 
@@ -82,7 +82,7 @@ int ntpsim(int argc, char *argv[])
 {
     Event *curr_event;
     struct timeval seed;
-    
+
     /* Initialize the local Clock 
      */
     simclock.local_time = 0;
@@ -118,21 +118,21 @@ int ntpsim(int argc, char *argv[])
     getconfig(argc, argv);
     initializing = 0;
     loop_config(LOOP_DRIFTCOMP, old_drift / 1e6);
-    
+
     /*
      * Watch out here, we want the real time, not the silly stuff.
      */
     gettimeofday(&seed, NULL);
     ntp_srandom(seed.tv_usec);
-        
+
 
     /* Initialize the event queue */
     event_queue = create_priority_queue((int(*)(void *, void*)) 
-                                        determine_event_ordering);
+                                       determine_event_ordering);
 
     /* Initialize the receive queue */
     recv_queue = create_priority_queue((int(*)(void *, void*))
-                                       determine_recv_buf_ordering);
+                                      determine_recv_buf_ordering);
 
     /* Push a beep and a timer on the event queue */
     enqueue(event_queue, event(0, BEEP));
@@ -142,14 +142,14 @@ int ntpsim(int argc, char *argv[])
      */
     /* maxtime = simulation.sim_time + simulation.end_time;*/
     while (simulation.sim_time <= simulation.end_time &&
-           (!empty(event_queue))) {
-        curr_event = dequeue(event_queue);
-        /* Update all the clocks to the time on the event */
-        sim_update_clocks(curr_event);
-        
-        /* Execute the function associated with the event */
-        event_ptr[curr_event->function](curr_event);
-        free_node(curr_event);
+          (!empty(event_queue))) {
+       curr_event = dequeue(event_queue);
+       /* Update all the clocks to the time on the event */
+       sim_update_clocks(curr_event);
+
+       /* Execute the function associated with the event */
+       event_ptr[curr_event->function](curr_event);
+       free_node(curr_event);
     }
     return (0);
 }
@@ -161,9 +161,9 @@ int ntpsim(int argc, char *argv[])
 Event *event(double t, funcTkn f)
 {
     Event *e;
-    
-    if ((e = (Event *)get_node(sizeof(Event))) == NULL)
-        abortsim("get_node failed in event");
+
+    if ((e = get_node(sizeof(*e))) == NULL)
+       abortsim("get_node failed in event");
     e->time = t;
     e->function = f;
     return (e);
@@ -178,24 +178,24 @@ Event *event(double t, funcTkn f)
 void sim_event_timer(Event *e)
 {
     struct recvbuf *rbuf;
-    
+
     /* Call the NTP timer.
      * This will be responsible for actually "sending the packets."
      * Since this is a simulation, the packets sent over the network
      * will be processed by the simulate_server routine below.
      */
     timer();
-    
+
     /* Process received buffers */
     while (!empty(recv_queue)) {
-        rbuf = (struct recvbuf *)dequeue(recv_queue);
-        (rbuf->receiver)(rbuf);
-        free_node(rbuf);
+       rbuf = (struct recvbuf *)dequeue(recv_queue);
+       (rbuf->receiver)(rbuf);
+       free_node(rbuf);
     }
-    
+
     /* Arm the next timer interrupt. */
     enqueue(event_queue, 
-            event(simulation.sim_time + (1 << EVENT_TIMEOUT), TIMER));
+           event(simulation.sim_time + (1 << EVENT_TIMEOUT), TIMER));
 }
 
 
@@ -205,37 +205,37 @@ void sim_event_timer(Event *e)
  * creates a reply packet and pushes the reply packet onto the event queue
  */
 int simulate_server(
-    struct sockaddr_storage *serv_addr, /* Address of the server */
-    struct interface *inter,            /* Interface on which the reply should
-                                           be inserted */
-    struct pkt *rpkt                    /* Packet sent to the server that
-                                           needs to be processed. */
+    sockaddr_u *serv_addr,             /* Address of the server */
+    struct interface *inter,           /* Interface on which the reply should
+                                          be inserted */
+    struct pkt *rpkt                   /* Packet sent to the server that
+                                          needs to be processed. */
 )
 {
-    struct pkt xpkt;           /* Packet to be transmitted back
-                                  to the client */
+    struct pkt xpkt;          /* Packet to be transmitted back
+                                 to the client */
     struct recvbuf rbuf;       /* Buffer for the received packet */
-    Event *e;                  /* Packet receive event */
+    Event *e;                 /* Packet receive event */
     server_info *server;       /* Pointer to the server being simulated */
     script_info *curr_script;  /* Current script being processed */
     int i;
-    double d1, d2, d3;         /* Delays while the packet is enroute */
+    double d1, d2, d3;        /* Delays while the packet is enroute */
     double t1, t2, t3, t4;     /* The four timestamps in the packet */
 
     /* Search for the server with the desired address */
     server = NULL;
     for (i = 0; i < simulation.num_of_servers; ++i) {
-        fprintf(stderr,"Checking address: %s\n", stoa(simulation.servers[i].addr));
-        if (memcmp(simulation.servers[i].addr, serv_addr, 
-                   sizeof(struct sockaddr_storage)) == 0) { 
-            server = &simulation.servers[i];
-            break;
-        }
+       fprintf(stderr,"Checking address: %s\n", stoa(simulation.servers[i].addr));
+       if (memcmp(simulation.servers[i].addr, serv_addr, 
+                  sizeof(*serv_addr)) == 0) { 
+           server = &simulation.servers[i];
+           break;
+       }
     }
-    
+
     fprintf(stderr, "Received packet for: %s\n", stoa(serv_addr));
     if (server == NULL)
-        abortsim("Server with specified address not found!!!");
+       abortsim("Server with specified address not found!!!");
     
     /* Get the current script for the server */
     curr_script = server->curr_script;
@@ -251,32 +251,32 @@ int simulate_server(
     xpkt.precision = rpkt->precision;
     xpkt.rootdelay = 0;
     xpkt.rootdisp = 0;
-    
+
     /* TIMESTAMP CALCULATIONS
-            t1                           t4
-             \                          /
-          d1  \                        / d3
-               \                      /
-               t2 ----------------- t3
-                         d2
+           t1                           t4
+            \                          /
+         d1  \                        / d3
+              \                      /
+              t2 ----------------- t3
+                        d2
     */
     /* Compute the delays */
     d1 = poisson(curr_script->prop_delay, curr_script->jitter);
     d2 = poisson(curr_script->proc_delay, 0);
     d3 = poisson(curr_script->prop_delay, curr_script->jitter);
-    
+
     /* Note: In the transmitted packet: 
      * 1. t1 and t4 are times in the client according to the local clock.
      * 2. t2 and t3 are server times according to the simulated server.
      * Compute t1, t2, t3 and t4
      * Note: This function is called at time t1. 
      */
-    
+
     LFPTOD(&rpkt->xmt, t1);
     t2 = server->server_time + d1;
     t3 = server->server_time + d1 + d2;
     t4 = t1 + d1 + d2 + d3;
-    
+
     /* Save the timestamps */
     xpkt.org = rpkt->xmt;     
     DTOLFP(t2, &xpkt.rec);
@@ -292,12 +292,12 @@ int simulate_server(
     rbuf.recv_length = LEN_PKT_NOMAC;
     rbuf.recv_pkt = xpkt;
     rbuf.used = 1;
-    
-    memcpy(&rbuf.srcadr, serv_addr, sizeof(struct sockaddr_storage));
-    memcpy(&rbuf.recv_srcadr, serv_addr, sizeof(struct sockaddr_storage));
-    if ((rbuf.dstadr = malloc(sizeof(struct interface))) == NULL)
-        abortsim("malloc failed in simulate_server");
-    memcpy(rbuf.dstadr, inter, sizeof(struct interface));
+
+    memcpy(&rbuf.srcadr, serv_addr, sizeof(rbuf.srcadr));
+    memcpy(&rbuf.recv_srcadr, serv_addr, sizeof(rbuf.recv_srcadr));
+    if ((rbuf.dstadr = malloc(sizeof(*rbuf.dstadr))) == NULL)
+       abortsim("malloc failed in simulate_server");
+    memcpy(rbuf.dstadr, inter, sizeof(*rbuf.dstadr));
     /* rbuf.link = NULL; */
 
     /* Create a packet event and insert it onto the event_queue at the 
@@ -312,14 +312,14 @@ int simulate_server(
      * If not, re-enqueue the script onto the server script queue 
      */
     if (curr_script->duration > simulation.sim_time && 
-        !empty(server->script)) {
-        printf("Hello\n");
-        /* 
-         * For some reason freeing up the curr_script memory kills the
-         * simulation. Further debugging is needed to determine why.
-         * free_node(curr_script);
-         */
-        curr_script = dequeue(server->script);
+       !empty(server->script)) {
+       printf("Hello\n");
+       /* 
+        * For some reason freeing up the curr_script memory kills the
+        * simulation. Further debugging is needed to determine why.
+        * free_node(curr_script);
+        */
+       curr_script = dequeue(server->script);
     }
 
     return (0);
@@ -335,10 +335,10 @@ void sim_update_clocks (Event *e)
     double time_gap;
     double adj;
     int i;
-        
+
     /* Compute the time between the last update event and this update */
     time_gap = e->time - simulation.sim_time;
-    
+
     /* Advance the client clock */
     simclock.local_time = e->time + time_gap;
 
@@ -350,33 +350,33 @@ void sim_update_clocks (Event *e)
      * integral of samples from a Gaussian distribution.
      */
     for (i = 0;i < simulation.num_of_servers; ++i) {
-        simulation.servers[i].curr_script->freq_offset +=
-            gauss(0, time_gap * simulation.servers[i].curr_script->wander);
+       simulation.servers[i].curr_script->freq_offset +=
+           gauss(0, time_gap * simulation.servers[i].curr_script->wander);
 
-        simulation.servers[i].server_time += time_gap * 
-            (1 + simulation.servers[i].curr_script->freq_offset);
+       simulation.servers[i].server_time += time_gap * 
+           (1 + simulation.servers[i].curr_script->freq_offset);
     }
-    
-    
+
+
     /* Perform the adjtime() function. If the adjustment completed
      * in the previous interval, amortize the entire amount; if not,
      * carry the leftover to the next interval.
      */
-    
+
     adj = time_gap * simclock.slew;
     if (adj < fabs(simclock.adj)) {
-        if (simclock.adj < 0) {
-            simclock.adj += adj;
-            simclock.local_time -= adj;
-        
-        else {
-            simclock.adj -= adj;
-            simclock.local_time += adj;
-        }    
+       if (simclock.adj < 0) {
+           simclock.adj += adj;
+           simclock.local_time -= adj;
+       } 
+       else {
+           simclock.adj -= adj;
+           simclock.local_time += adj;
+       }    
     } 
     else {
-        simclock.local_time += simclock.adj;
-        simclock.adj = 0;
+       simclock.local_time += simclock.adj;
+       simclock.adj = 0;
     }
 }
 
@@ -388,15 +388,15 @@ void sim_update_clocks (Event *e)
 void sim_event_recv_packet(Event *e)
 {
     struct recvbuf *rbuf;
-    
+
     /* Allocate a receive buffer and copy the packet to it */
-    if ((rbuf = (struct recvbuf *) get_node(sizeof(struct recvbuf))) == NULL)
-        abortsim("get_node failed in sim_event_recv_packet");
-    memcpy(rbuf, &e->rcv_buf, sizeof(struct recvbuf));
-    
+    if ((rbuf = get_node(sizeof(*rbuf))) == NULL)
+       abortsim("get_node failed in sim_event_recv_packet");
+    memcpy(rbuf, &e->rcv_buf, sizeof(*rbuf));
+
     /* Store the local time in the received packet */
     DTOLFP(simclock.local_time, &rbuf->recv_time);
-    
+
     /* Insert the packet received onto the receive queue */
     enqueue(recv_queue, rbuf);
 }
@@ -418,20 +418,19 @@ void sim_event_beep(Event *e)
     enqueue(event_queue, event(e->time + simulation.beep_delay, BEEP));
 #if 0
     if(simulation.beep_delay > 0) {
-        if (first_time) {
-            printf("\t%4c    T    %4c\t%4c  T+ERR  %3c\t%5cT+ERR+NTP\n", 
-                   ' ', ' ', ' ', ' ',' ');
-            printf("\t%s\t%s\t%s\n", dash, dash, dash);
-            first_time = 0;
-            
-            printf("\t%16.6f\t%16.6f\t%16.6f\n",
-                   n->time, n->clk_time, n->ntp_time);
-            return;
-        }
-        printf("\t%16.6f\t%16.6f\t%16.6f\n",
-               simclock.local_time, 
-               
-               n->time, n->clk_time, n->ntp_time);
+       if (first_time) {
+           printf("\t%4c    T    %4c\t%4c  T+ERR  %3c\t%5cT+ERR+NTP\n", 
+                  ' ', ' ', ' ', ' ',' ');
+           printf("\t%s\t%s\t%s\n", dash, dash, dash);
+           first_time = 0;
+
+           printf("\t%16.6f\t%16.6f\t%16.6f\n",
+                  n->time, n->clk_time, n->ntp_time);
+           return;
+       }
+       printf("\t%16.6f\t%16.6f\t%16.6f\n",
+              simclock.local_time, 
+              n->time, n->clk_time, n->ntp_time);
 #endif
 
 }
@@ -510,8 +509,8 @@ adj_systime(
      */
     dtemp = now + sys_residual;
     if (dtemp < 0) {
-        isneg = 1;
-        dtemp = -dtemp;
+       isneg = 1;
+       dtemp = -dtemp;
     }
     adjtv.tv_sec = (long)dtemp;
     dtemp -= adjtv.tv_sec;
@@ -526,9 +525,9 @@ adj_systime(
      * leftover.
      */
     if (isneg) {
-        adjtv.tv_sec = -adjtv.tv_sec;
-        adjtv.tv_usec = -adjtv.tv_usec;
-        sys_residual = -sys_residual;
+       adjtv.tv_sec = -adjtv.tv_sec;
+       adjtv.tv_usec = -adjtv.tv_usec;
+       sys_residual = -sys_residual;
     }
     simclock.adj = now;
 /*     ntp_node.adj = now; */
@@ -546,8 +545,8 @@ step_systime(
 {
 #ifdef DEBUG
     if (debug)
-        printf("step_systime: time %.6f adj %.6f\n",
-               simclock.local_time, now);
+       printf("step_systime: time %.6f adj %.6f\n",
+              simclock.local_time, now);
 #endif
     simclock.local_time += now;
     return (1);
index eb84be7fc7c91899e5ba47c95f0a570c613ac511..e3d11436321a39b695ad393472641eac8517d2a5 100644 (file)
@@ -246,7 +246,7 @@ nmea_start(
 
                if ((fd = socket(PF_INET,SOCK_STREAM,p->p_proto)) == -1)
                        return(0);
-               if (connect(fd,(struct sockaddr *)&so_addr,SOCKLEN(&so_addr)) == -1) {
+               if (connect(fd,(struct sockaddr *)&so_addr, sizeof(so_addr)) == -1) {
                        close(fd);
                        return (0);
                }
@@ -506,7 +506,7 @@ nmea_receive(
        /*
         * Initialize pointers and read the timecode and timestamp
         */
-       peer = (struct peer *)rbufp->recv_srcclock;
+       peer = rbufp->recv_peer;
        pp = peer->procptr;
        up = (struct nmeaunit *)pp->unitptr;
 
index 8307b13b8f01ca51fb8b1890ec8bf9f1ee0bc810..2b38e038f19cdd59101c0355fbff6b3711ee1a15 100644 (file)
@@ -220,14 +220,14 @@ static    void    clock_filter    (struct server *);
 static struct server *clock_select (void);
 static int clock_adjust        (void);
 static void    addserver       (char *);
-static struct server *findserver (struct sockaddr_storage *);
+static struct server *findserver (sockaddr_u *);
                void    timer           (void);
 static void    init_alarm      (void);
 #ifndef SYS_WINNT
 static RETSIGTYPE alarming (int);
 #endif /* SYS_WINNT */
 static void    init_io         (void);
-static void    sendpkt         (struct sockaddr_storage *, struct pkt *, int);
+static void    sendpkt         (sockaddr_u *, struct pkt *, int);
 void   input_handler   (void);
 
 static int l_adj_systime       (l_fp *);
@@ -674,7 +674,7 @@ transmit(
        struct pkt xpkt;
 
        if (debug)
-               printf("transmit(%s)\n", stoa(&(server->srcadr)));
+               printf("transmit(%s)\n", stoa(&server->srcadr));
 
        if (server->filter_nextpt < server->xmtcnt) {
                l_fp ts;
@@ -725,18 +725,18 @@ transmit(
                L_ADDUF(&server->xmt, sys_authdelay);
                HTONL_FP(&server->xmt, &xpkt.xmt);
                len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC);
-               sendpkt(&(server->srcadr), &xpkt, (int)(LEN_PKT_NOMAC + len));
+               sendpkt(&server->srcadr, &xpkt, (int)(LEN_PKT_NOMAC + len));
 
                if (debug > 1)
                        printf("transmit auth to %s\n",
-                          stoa(&(server->srcadr)));
+                          stoa(&server->srcadr));
        } else {
                get_systime(&(server->xmt));
                HTONL_FP(&server->xmt, &xpkt.xmt);
-               sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC);
+               sendpkt(&server->srcadr, &xpkt, LEN_PKT_NOMAC);
 
                if (debug > 1)
-                       printf("transmit to %s\n", stoa(&(server->srcadr)));
+                       printf("transmit to %s\n", stoa(&server->srcadr));
        }
 
        /*
@@ -1305,16 +1305,16 @@ clock_adjust(void)
  *                 (non-blocking).
  */
 static int
-is_reachable (struct sockaddr_storage *dst)
+is_reachable (sockaddr_u *dst)
 {
        SOCKET sockfd;
 
-       sockfd = socket(dst->ss_family, SOCK_DGRAM, 0);
+       sockfd = socket(AF(dst), SOCK_DGRAM, 0);
        if (sockfd == -1) {
                return 0;
        }
 
-       if(connect(sockfd, (struct sockaddr *)dst, SOCKLEN(dst))) {
+       if (connect(sockfd, &dst->sa, SOCKLEN(dst))) {
                closesocket(sockfd);
                return 0;
        }
@@ -1372,18 +1372,17 @@ addserver(
        }
 #ifdef DEBUG
        else if (debug) {
-               fprintf(stderr, "host found : %s\n", stohost((struct sockaddr_storage*)addrResult->ai_addr));
+               fprintf(stderr, "host found : %s\n", stohost((sockaddr_u *)addrResult->ai_addr));
        }
 #endif
 
        /* We must get all returned server in case the first one fails */
        for (ptr = addrResult; ptr != NULL; ptr = ptr->ai_next) {
-               if (is_reachable ((struct sockaddr_storage *)ptr->ai_addr)) {
-                       server = (struct server *)emalloc(sizeof(struct server));
-                       memset((char *)server, 0, sizeof(struct server));
+               if (is_reachable ((sockaddr_u *)ptr->ai_addr)) {
+                       server = emalloc(sizeof(*server));
+                       memset(server, 0, sizeof(*server));
 
-                       memset(&(server->srcadr), 0, sizeof(struct sockaddr_storage));
-                       memcpy(&(server->srcadr), ptr->ai_addr, ptr->ai_addrlen);
+                       memcpy(&server->srcadr, ptr->ai_addr, ptr->ai_addrlen);
                        server->event_time = ++sys_numservers;
                        if (sys_servers == NULL)
                                sys_servers = server;
@@ -1407,40 +1406,23 @@ addserver(
  */
 static struct server *
 findserver(
-       struct sockaddr_storage *addr
+       sockaddr_u *addr
        )
 {
        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)
+       if (SRCPORT(addr) != NTP_PORT)
                return 0;
 
        for (server = sys_servers; server != NULL; 
             server = server->next_server) {
-               
-               if(server->srcadr.ss_family == AF_INET) {
-                       isc_sockaddr_fromin(&saddr, &((struct sockaddr_in*)&server->srcadr)->sin_addr, 0);
-               }
-               else {
-                       isc_sockaddr_fromin6(&saddr, &((struct sockaddr_in6*)&server->srcadr)->sin6_addr, 0);
-               }
-               if (isc_sockaddr_eqaddr(&laddr, &saddr) == ISC_TRUE)
+               if (SOCK_EQ(addr, &server->srcadr))
                        return server;
 
-               if(addr->ss_family == server->srcadr.ss_family) {
-                       if (isc_sockaddr_ismulticast(&saddr) == ISC_TRUE)
+               if (AF(addr) == AF(&server->srcadr)) {
+                       if (IS_MCAST(&server->srcadr))
                                mc_server = server;
                }
        }
@@ -1454,10 +1436,10 @@ findserver(
                        complete_servers++;
                }
 
-               server = (struct server *)emalloc(sizeof(struct server));
-               memset((char *)server, 0, sizeof(struct server));
+               server = emalloc(sizeof(*server));
+               memset(server, 0, sizeof(*server));
 
-               memcpy(&server->srcadr, addr, sizeof(struct sockaddr_storage));
+               server->srcadr = *addr;
 
                server->event_time = ++sys_numservers;
 
@@ -1776,7 +1758,8 @@ init_io(void)
                 * bind the socket to the NTP port
                 */
                if (check_ntp_port_in_use) {
-                       if (bind(fd[nbsock], res->ai_addr, SOCKLEN(res->ai_addr)) < 0) {
+                       if (bind(fd[nbsock], res->ai_addr, 
+                                SOCKLEN((sockaddr_u *)res->ai_addr)) < 0) {
 #ifndef SYS_WINNT
                                if (errno == EADDRINUSE)
 #else
@@ -1847,7 +1830,7 @@ init_io(void)
  */
 static void
 sendpkt(
-       struct sockaddr_storage *dest,
+       sockaddr_u *dest,
        struct pkt *pkt,
        int len
        )
@@ -1862,7 +1845,7 @@ sendpkt(
 
        /* Find a local family compatible socket to send ntp packet to ntp server */
        for(i = 0; (i < MAX_AF); i++) {
-               if(dest->ss_family == fd_family[i]) {
+               if(AF(dest) == fd_family[i]) {
                        sock = fd[i];
                break;
                }
@@ -1989,7 +1972,7 @@ input_handler(void)
 
                rb = get_free_recv_buffer();
 
-               fromlen = sizeof(struct sockaddr_storage);
+               fromlen = sizeof(rb->recv_srcadr);
                rb->recv_length = recvfrom(fdc, (char *)&rb->recv_pkt,
                   sizeof(rb->recv_pkt), 0,
                   (struct sockaddr *)&rb->recv_srcadr, &fromlen);
index 430931f8f9bb99dbe83666268169b3109734b62b..00bc3ff061d43eda082fb55d988a6cb6f717f061 100644 (file)
@@ -15,7 +15,7 @@ extern void   loadservers     (char *cfgpath);
  */
 struct server {
        struct server *next_server;     /* next server in build list */
-       struct sockaddr_storage srcadr; /* address of remote host */
+       sockaddr_u srcadr;              /* address of remote host */
        u_char version;                 /* version to use */
        u_char leap;                    /* leap indicator */
        u_char stratum;                 /* stratum of remote server */
index daff63678460ef0d5c97100ec21f3145bdee8d3f..ad5ed3f51920ac4603aa6e1290666863b92f27ea 100644 (file)
@@ -271,7 +271,7 @@ offsetof(mask6) = 32
 sizeof(struct info_monitor_1) = 72
 offsetof(lasttime) = 0
 offsetof(firsttime) = 4
-offsetof(lastdrop) = 8
+offsetof(restr) = 8
 offsetof(count) = 12
 offsetof(addr) = 16
 offsetof(daddr) = 20
@@ -287,7 +287,7 @@ offsetof(daddr6) = 56
 sizeof(struct info_monitor) = 48
 offsetof(lasttime) = 0
 offsetof(firsttime) = 4
-offsetof(lastdrop) = 8
+offsetof(restr) = 8
 offsetof(count) = 12
 offsetof(addr) = 16
 offsetof(port) = 20
index 6e9950f57bbf67f66836580b7e07f3862984c5a5..1364ed8247eb9b893af543762aa115726fb4dbfe 100644 (file)
@@ -84,7 +84,7 @@ static        void    docmd           (const char *);
 static void    tokenize        (const char *, char **, int *);
 static int     findcmd         (char *, struct xcmd *, struct xcmd *, struct xcmd **);
 static int     getarg          (char *, int, arg_v *);
-static int     getnetnum       (const char *, struct sockaddr_storage *, char *, int);
+static int     getnetnum       (const char *, sockaddr_u *, char *, int);
 static void    help            (struct parse *, FILE *);
 #ifdef QSORT_USES_VOID_P
 static int     helpsort        (const void *, const void *);
@@ -536,7 +536,7 @@ openhost(
        }
 
        if (ai->ai_canonname == NULL) {
-               strncpy(temphost, stoa((struct sockaddr_storage *)ai->ai_addr),
+               strncpy(temphost, stoa((sockaddr_u *)ai->ai_addr),
                    LENHOSTNAME);
                temphost[LENHOSTNAME-1] = '\0';
        } else {
@@ -1461,7 +1461,7 @@ getarg(
 static int
 getnetnum(
        const char *hname,
-       struct sockaddr_storage *num,
+       sockaddr_u *num,
        char *fullhost,
        int af
        )
@@ -1469,9 +1469,7 @@ getnetnum(
        int sockaddr_len;
        struct addrinfo hints, *ai = NULL;
 
-       sockaddr_len = (af == AF_INET)
-                          ? sizeof(struct sockaddr_in)
-                          : sizeof(struct sockaddr_in6);
+       sockaddr_len = SIZEOF_SOCKADDR(af);
        memset((char *)&hints, 0, sizeof(struct addrinfo));
        hints.ai_flags = AI_CANONNAME;
 #ifdef AI_ADDRCONFIG
@@ -1481,7 +1479,7 @@ getnetnum(
        /* decodenetnum only works with addresses */
        if (decodenetnum(hname, num)) {
                if (fullhost != 0) {
-                       getnameinfo((struct sockaddr *)num, sockaddr_len, 
+                       getnameinfo(&num->sa, sockaddr_len, 
                                    fullhost, sizeof(fullhost), NULL, 0, 
                                    NI_NUMERICHOST); 
                }
@@ -1504,13 +1502,13 @@ getnetnum(
  */
 char *
 nntohost(
-       struct sockaddr_storage *netnum
+       sockaddr_u *netnum
        )
 {
        if (!showhostnames)
-           return stoa(netnum);
+               return stoa(netnum);
 
-       if ((netnum->ss_family == AF_INET) && ISREFCLOCKADR(netnum))
+       if (ISREFCLOCKADR(netnum))
                return refnumtoa(netnum);
        return socktohost(netnum);
 }
index 4bcee3e5f5a9a2777b8d87bd43dc87336d1d28d6..9d41a70ccd5926c5df2fbacab781fa3fbdac1bbd 100644 (file)
@@ -34,7 +34,7 @@ typedef struct {
        char *string;
        long ival;
        u_long uval;
-       struct sockaddr_storage netnum;
+       sockaddr_u netnum;
 } arg_v;
 
 /*
@@ -64,4 +64,4 @@ extern        int showhostnames;
 extern int s_port;
 
 extern int     doquery (int, int, int, int, int, char *, int *, int *, char **, int, int);
-extern char *  nntohost        (struct sockaddr_storage *);
+extern char *  nntohost        (sockaddr_u *);
index 723749abce00fc2f78c029c5dad8c7eaa1da891d..8a557fdcd0484ad630e2387545e2ca3ac158587b 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * ntpdc_ops.c - subroutines which are called to perform operations by xntpdc
+ * ntpdc_ops.c - subroutines which are called to perform operations by
+ *              ntpdc
  */
 
 #ifdef HAVE_CONFIG_H
@@ -10,6 +11,7 @@
 #include <stddef.h>
 
 #include "ntpdc.h"
+#include "ntp_net.h"
 #include "ntp_control.h"
 #include "ntp_refclock.h"
 #include "ntp_stdlib.h"
 #include <arpa/inet.h>
 
 /*
- * Declarations for command handlers in here
+ * utility functions
  */
 static int     checkitems      (int, FILE *);
 static int     checkitemsize   (int, int);
 static int     check1item      (int, FILE *);
+
+/*
+ * Declarations for command handlers in here
+ */
 static void    peerlist        (struct parse *, FILE *);
 static void    peers           (struct parse *, FILE *);
 static void    doconfig        (struct parse *pcmd, FILE *fp, int mode, int refc);
@@ -221,6 +227,84 @@ struct xcmd opcmds[] = {
  */
 #define        STREQ(a, b)     (*(a) == *(b) && strcmp((a), (b)) == 0)
 
+/*
+ * SET_SS_LEN_IF_PRESENT - used by SET_ADDR, SET_ADDRS macros
+ */
+
+#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
+#define SET_SS_LEN_IF_PRESENT(psau)                            \
+       do {                                                    \
+               (psau)->sas.ss_len = SOCKLEN(psau);             \
+       } while (0)
+#else
+#define SET_SS_LEN_IF_PRESENT(psau)    do { } while (0)
+#endif
+
+/*
+ * SET_ADDR - setup address for v4/v6 as needed
+ */
+#define SET_ADDR(address, v6flag, v4addr, v6addr)              \
+do {                                                           \
+       memset(&(address), 0, sizeof(address));                 \
+       if (v6flag) {                                           \
+               AF(&(address)) = AF_INET6;                      \
+               SOCK_ADDR6(&(address)) = (v6addr);              \
+       } else {                                                \
+               AF(&(address)) = AF_INET;                       \
+               NSRCADR(&(address)) = (v4addr);                 \
+       }                                                       \
+       SET_SS_LEN_IF_PRESENT(&(address));                      \
+} while (0)
+
+
+/*
+ * SET_ADDRS - setup source and destination addresses for 
+ * v4/v6 as needed
+ */
+#define SET_ADDRS(a1, a2, info, a1prefix, a2prefix)            \
+do {                                                           \
+       memset(&(a1), 0, sizeof(a1));                           \
+       memset(&(a2), 0, sizeof(a2));                           \
+       if ((info)->v6_flag) {                                  \
+               AF(&(a1)) = AF_INET6;                           \
+               AF(&(a2)) = AF_INET6;                           \
+               SOCK_ADDR6(&(a1)) = (info)->a1prefix##6;        \
+               SOCK_ADDR6(&(a2)) = (info)->a2prefix##6;        \
+       } else {                                                \
+               AF(&(a1)) = AF_INET;                            \
+               AF(&(a2)) = AF_INET;                            \
+               NSRCADR(&(a1)) = (info)->a1prefix;              \
+               NSRCADR(&(a2)) = (info)->a2prefix;              \
+       }                                                       \
+       SET_SS_LEN_IF_PRESENT(&(a1));                           \
+       SET_SS_LEN_IF_PRESENT(&(a2));                           \
+} while (0)
+
+
+/*
+ * SET_ADDRS - setup source and destination addresses for 
+ * v4/v6 as needed
+ */
+#if 0
+#define SET_ADDR_MASK(address, addrmask, info)                 \
+do {                                                           \
+       memset(&(address), 0, sizeof(address));                 \
+       memset(&(mask), 0, sizeof(mask));                       \
+       if ((info)->v6_flag) {                                  \
+               AF(&(address)) = AF_INET6;                      \
+               AF(&(addrmask)) = AF_INET6;                     \
+               SOCK_ADDR6(&(address)) = (info)->addr6;         \
+               SOCK_ADDR6(&(addrmask)) = (info)->mask6;        \
+       } else {                                                \
+               AF(&(address)) = AF_INET;                       \
+               AF(&(addrmask)) = AF_INET;                      \
+               NSRCADR(&(address)) = (info)->addr;             \
+               NSRCADR(&(addrmask)) = (info)->mask;            \
+       }                                                       \
+       SET_SS_LEN_IF_PRESENT(&(address));                      \
+       SET_SS_LEN_IF_PRESENT(&(addrmask));                     \
+} while (0)
+#endif
 
 /*
  * checkitems - utility to print a message if no items were returned
@@ -280,7 +364,6 @@ check1item(
 }
 
 
-
 /*
  * peerlist - get a short list of peers
  */
@@ -292,7 +375,7 @@ peerlist(
        )
 {
        struct info_peer_list *plist;
-       struct sockaddr_storage paddr;
+       sockaddr_u paddr;
        int items;
        int itemsize;
        int res;
@@ -318,17 +401,7 @@ again:
            return;
 
        while (items > 0) {
-               memset((char *)&paddr, 0, sizeof(paddr));
-               if (plist->v6_flag != 0) {
-                       GET_INADDR6(paddr) = plist->addr6;
-                       paddr.ss_family = AF_INET6;
-               } else {
-                       GET_INADDR(paddr) = plist->addr;
-                       paddr.ss_family = AF_INET;
-               }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               paddr.ss_len = SOCKLEN(&paddr);
-#endif
+               SET_ADDR(paddr, plist->v6_flag, plist->addr, plist->addr6);
                if ((pcmd->nargs == 0) ||
                    ((pcmd->argval->ival == 6) && (plist->v6_flag != 0)) ||
                    ((pcmd->argval->ival == 4) && (plist->v6_flag == 0)))
@@ -378,8 +451,8 @@ dopeers(
        )
 {
        struct info_peer_summary *plist;
-       struct sockaddr_storage dstadr;
-       struct sockaddr_storage srcadr;
+       sockaddr_u dstadr;
+       sockaddr_u srcadr;
        int items;
        int itemsize;
        int ntp_poll;
@@ -440,23 +513,7 @@ again:
                NTOHL_FP(&(plist->offset), &tempts);
                ntp_poll = 1<<max(min3(plist->ppoll, plist->hpoll, NTP_MAXPOLL),
                                  NTP_MINPOLL);
-               memset((char *)&dstadr, 0, sizeof(dstadr));
-               memset((char *)&srcadr, 0, sizeof(srcadr));
-               if (plist->v6_flag != 0) {
-                       GET_INADDR6(dstadr) = plist->dstadr6;
-                       GET_INADDR6(srcadr) = plist->srcadr6;
-                       srcadr.ss_family = AF_INET6;
-                       dstadr.ss_family = AF_INET6;
-               } else {
-                       GET_INADDR(dstadr) = plist->dstadr;
-                       GET_INADDR(srcadr) = plist->srcadr;
-                       srcadr.ss_family = AF_INET;
-                       dstadr.ss_family = AF_INET;
-               }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               srcadr.ss_len = SOCKLEN(&srcadr);
-               dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
+               SET_ADDRS(dstadr, srcadr, plist, dstadr, srcadr);
                if ((pcmd->nargs == 0) ||
                    ((pcmd->argval->ival == 6) && (plist->v6_flag != 0)) ||
                    ((pcmd->argval->ival == 4) && (plist->v6_flag == 0)))
@@ -546,25 +603,10 @@ printpeer(
 {
        register int i;
        l_fp tempts;
-       struct sockaddr_storage srcadr, dstadr;
+       sockaddr_u srcadr, dstadr;
+       
+       SET_ADDRS(dstadr, srcadr, pp, dstadr, srcadr);
        
-       memset((char *)&srcadr, 0, sizeof(srcadr));
-       memset((char *)&dstadr, 0, sizeof(dstadr));
-       if (pp->v6_flag != 0) {
-               srcadr.ss_family = AF_INET6;
-               dstadr.ss_family = AF_INET6;
-               GET_INADDR6(srcadr) = pp->srcadr6;
-               GET_INADDR6(dstadr) = pp->dstadr6;
-       } else {
-               srcadr.ss_family = AF_INET;
-               dstadr.ss_family = AF_INET;
-               GET_INADDR(srcadr) = pp->srcadr;
-               GET_INADDR(dstadr) = pp->dstadr;
-       }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-       srcadr.ss_len = SOCKLEN(&srcadr);
-       dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
        (void) fprintf(fp, "remote %s, local %s\n",
                       stoa(&srcadr), stoa(&dstadr));
        (void) fprintf(fp, "hmode %s, pmode %s, stratum %d, precision %d\n",
@@ -666,8 +708,8 @@ again:
                sendsize = v4sizeof(struct info_peer_list);
 
        for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 4); qitems++) {
-               if (pcmd->argval[qitems].netnum.ss_family == AF_INET) {
-                       pl->addr = GET_INADDR(pcmd->argval[qitems].netnum);
+               if (IS_IPV4(&pcmd->argval[qitems].netnum)) {
+                       pl->addr = NSRCADR(&pcmd->argval[qitems].netnum);
                        if (impl_ver == IMPL_XNTPD)
                                pl->v6_flag = 0;
                } else {
@@ -676,7 +718,7 @@ again:
                                    "***Server doesn't understand IPv6 addresses\n");
                                return;
                        }
-                       pl->addr6 = GET_INADDR6(pcmd->argval[qitems].netnum);
+                       pl->addr6 = SOCK_ADDR6(&pcmd->argval[qitems].netnum);
                        pl->v6_flag = 1;
                }
                pl->port = (u_short)s_port;
@@ -724,7 +766,7 @@ peerstats(
        struct info_peer_stats *pp;
        /* 4 is the maximum number of peers which will fit in a packet */
        struct info_peer_list *pl, plist[min(MAXARGS, 4)];
-       struct sockaddr_storage src, dst;
+       sockaddr_u src, dst;
        int qitems;
        int items;
        int itemsize;
@@ -739,8 +781,8 @@ again:
 
        memset((char *)plist, 0, sizeof(struct info_peer_list) * min(MAXARGS, 4));
        for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 4); qitems++) {
-               if (pcmd->argval[qitems].netnum.ss_family == AF_INET) {
-                       pl->addr = GET_INADDR(pcmd->argval[qitems].netnum);
+               if (IS_IPV4(&pcmd->argval[qitems].netnum)) {
+                       pl->addr = NSRCADR(&pcmd->argval[qitems].netnum);
                        if (impl_ver == IMPL_XNTPD)
                                pl->v6_flag = 0;
                } else {
@@ -749,7 +791,7 @@ again:
                                    "***Server doesn't understand IPv6 addresses\n");
                                return;
                        }
-                       pl->addr6 = GET_INADDR6(pcmd->argval[qitems].netnum);
+                       pl->addr6 = SOCK_ADDR6(&pcmd->argval[qitems].netnum);
                        pl->v6_flag = 1;
                }
                pl->port = (u_short)s_port;
@@ -778,22 +820,22 @@ again:
            return;
 
        while (items-- > 0) {
-               memset((char *)&src, 0, sizeof(src));
-               memset((char *)&dst, 0, sizeof(dst));
+               ZERO_SOCK(&dst);
+               ZERO_SOCK(&src);
                if (pp->v6_flag != 0) {
-                       GET_INADDR6(src) = pp->srcadr6;
-                       GET_INADDR6(dst) = pp->dstadr6;
-                       src.ss_family = AF_INET6;
-                       dst.ss_family = AF_INET6;
+                       AF(&dst) = AF_INET6;
+                       AF(&src) = AF_INET6;
+                       SOCK_ADDR6(&dst) = pp->dstadr6;
+                       SOCK_ADDR6(&src) = pp->srcadr6;
                } else {
-                       GET_INADDR(src) = pp->srcadr;
-                       GET_INADDR(dst) = pp->dstadr;
-                       src.ss_family = AF_INET;
-                       dst.ss_family = AF_INET;
+                       AF(&dst) = AF_INET;
+                       AF(&src) = AF_INET;
+                       NSRCADR(&dst) = pp->dstadr;
+                       NSRCADR(&src) = pp->srcadr;
                }
 #ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               src.ss_len = SOCKLEN(&src);
-               dst.ss_len = SOCKLEN(&dst);
+               src.sas.ss_len = SOCKLEN(&src);
+               dst.sas.ss_len = SOCKLEN(&dst);
 #endif
                (void) fprintf(fp, "remote host:          %s\n",
                               nntohost(&src));
@@ -914,7 +956,7 @@ sysinfo(
        )
 {
        struct info_sys *is;
-       struct sockaddr_storage peeraddr;
+       sockaddr_u peeraddr;
        int items;
        int itemsize;
        int res;
@@ -940,17 +982,8 @@ again:
            !checkitemsize(itemsize, v4sizeof(struct info_sys)))
            return;
 
-       memset((char *)&peeraddr, 0, sizeof(peeraddr));
-       if (is->v6_flag != 0) {
-               GET_INADDR6(peeraddr) = is->peer6;
-               peeraddr.ss_family = AF_INET6;
-       } else {
-               GET_INADDR(peeraddr) = is->peer;
-               peeraddr.ss_family = AF_INET;
-       }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-       peeraddr.ss_len = SOCKLEN(&peeraddr);
-#endif
+       SET_ADDR(peeraddr, is->v6_flag, is->peer, is->peer6);
+
        (void) fprintf(fp, "system peer:          %s\n", nntohost(&peeraddr));
        (void) fprintf(fp, "system peer mode:     %s\n", modetoa(is->peer_mode));
        (void) fprintf(fp, "leap indicator:       %c%c\n",
@@ -1406,10 +1439,10 @@ again:
        if (res)
            return;
 
-       memset((void *)&cpeer, 0, sizeof(cpeer));
+       memset(&cpeer, 0, sizeof(cpeer));
 
-       if (pcmd->argval[0].netnum.ss_family == AF_INET) {
-               cpeer.peeraddr = GET_INADDR(pcmd->argval[0].netnum);
+       if (IS_IPV4(&pcmd->argval[0].netnum)) {
+               cpeer.peeraddr = NSRCADR(&pcmd->argval[0].netnum);
                if (impl_ver == IMPL_XNTPD)
                        cpeer.v6_flag = 0;
        } else {
@@ -1418,7 +1451,7 @@ again:
                            "***Server doesn't understand IPv6 addresses\n");
                        return;
                }
-               cpeer.peeraddr6 = GET_INADDR6(pcmd->argval[0].netnum);
+               cpeer.peeraddr6 = SOCK_ADDR6(&pcmd->argval[0].netnum);
                cpeer.v6_flag = 1;
        }
        cpeer.hmode = (u_char) mode;
@@ -1477,8 +1510,8 @@ again:
                sendsize = v4sizeof(struct conf_unpeer);
 
        for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 8); qitems++) {
-               if (pcmd->argval[0].netnum.ss_family == AF_INET) {
-                       pl->peeraddr = GET_INADDR(pcmd->argval[qitems].netnum);
+               if (IS_IPV4(&pcmd->argval[0].netnum)) {
+                       pl->peeraddr = NSRCADR(&pcmd->argval[qitems].netnum);
                        if (impl_ver == IMPL_XNTPD)
                                pl->v6_flag = 0;
                } else {
@@ -1488,7 +1521,7 @@ again:
                                return;
                        }
                        pl->peeraddr6 =
-                           GET_INADDR6(pcmd->argval[qitems].netnum);
+                           SOCK_ADDR6(&pcmd->argval[qitems].netnum);
                        pl->v6_flag = 1;
                }
                pl = (struct conf_unpeer *)((char *)pl + sendsize);
@@ -1654,8 +1687,8 @@ reslist(
        )
 {
        struct info_restrict *rl;
-       struct sockaddr_storage resaddr;
-       struct sockaddr_storage maskaddr;
+       sockaddr_u resaddr;
+       sockaddr_u maskaddr;
        int items;
        int itemsize;
        int res;
@@ -1695,27 +1728,12 @@ again:
                       "=====================================================================\n");
 
        while (items > 0) {
-               memset((char *)&resaddr, 0, sizeof(resaddr));
-               memset((char *)&maskaddr, 0, sizeof(maskaddr));
+               SET_ADDRS(resaddr, maskaddr, rl, addr, mask);
                if (rl->v6_flag != 0) {
-                       GET_INADDR6(resaddr) = rl->addr6;
-                       GET_INADDR6(maskaddr) = rl->mask6;
-                       resaddr.ss_family = AF_INET6;
-                       maskaddr.ss_family = AF_INET6;
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-                       resaddr.ss_len = SOCKLEN(&resaddr);
-#endif
                        addr = nntohost(&resaddr);
                } else {
-                       GET_INADDR(resaddr) = rl->addr;
-                       GET_INADDR(maskaddr) = rl->mask;
-                       resaddr.ss_family = AF_INET;
-                       maskaddr.ss_family = AF_INET;
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-                       resaddr.ss_len = SOCKLEN(&resaddr);
-#endif
                        if ((rl->mask == (u_int32)0xffffffff))
-                               addr = nntohost(&resaddr);
+                               addr = nntohost(&resaddr);
                        else
                                addr = stoa(&resaddr);
                }
@@ -1842,9 +1860,9 @@ again:
        else
                sendsize = v4sizeof(struct conf_restrict);
 
-       if (pcmd->argval[0].netnum.ss_family == AF_INET) {
-               cres.addr = GET_INADDR(pcmd->argval[0].netnum);
-               cres.mask = GET_INADDR(pcmd->argval[1].netnum);
+       if (IS_IPV4(&pcmd->argval[0].netnum)) {
+               cres.addr = NSRCADR(&pcmd->argval[0].netnum);
+               cres.mask = NSRCADR(&pcmd->argval[1].netnum);
                if (impl_ver == IMPL_XNTPD)
                        cres.v6_flag = 0;
        } else {
@@ -1853,7 +1871,7 @@ again:
                            "***Server doesn't understand IPv6 addresses\n");
                        return;
                }
-               cres.addr6 = GET_INADDR6(pcmd->argval[0].netnum);
+               cres.addr6 = SOCK_ADDR6(&pcmd->argval[0].netnum);
                cres.v6_flag = 1;
        }
        cres.flags = 0;
@@ -1890,7 +1908,7 @@ again:
         * Make sure mask for default address is zero.  Otherwise,
         * make sure mask bits are contiguous.
         */
-       if (pcmd->argval[0].netnum.ss_family == AF_INET) {
+       if (IS_IPV4(&pcmd->argval[0].netnum)) {
                if (cres.addr == 0) {
                        cres.mask = 0;
                } else {
@@ -1940,8 +1958,8 @@ monlist(
        )
 {
        char *struct_star;
-       struct sockaddr_storage addr;
-       struct sockaddr_storage dstadr;
+       sockaddr_u addr;
+       sockaddr_u dstadr;
        int items;
        int itemsize;
        int res;
@@ -1980,27 +1998,11 @@ again:
                struct info_monitor_1 *ml = (struct info_monitor_1 *) struct_star;
 
                (void) fprintf(fp,
-                              "remote address          port local address      count m ver code avgint  lstint\n");
+                              "remote address          port local address      count m ver rstr avgint  lstint\n");
                (void) fprintf(fp,
                               "===============================================================================\n");
                while (items > 0) {
-                       memset((char *)&addr, 0, sizeof(addr));
-                       memset((char *)&dstadr, 0, sizeof(dstadr));
-                       if (ml->v6_flag != 0) {
-                               GET_INADDR6(addr) = ml->addr6;
-                               addr.ss_family = AF_INET6;
-                               GET_INADDR6(dstadr) = ml->daddr6;
-                               dstadr.ss_family = AF_INET6;
-                       } else {
-                               GET_INADDR(addr) = ml->addr;
-                               addr.ss_family = AF_INET;
-                               GET_INADDR(dstadr) = ml->daddr;
-                               dstadr.ss_family = AF_INET;
-                       }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-                       addr.ss_len = SOCKLEN(&addr);
-                       dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
+                       SET_ADDRS(dstadr, addr, ml, daddr, addr);
                        if ((pcmd->nargs == 0) ||
                            ((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) ||
                            ((pcmd->argval->ival == 4) && (ml->v6_flag == 0)))
@@ -2012,7 +2014,7 @@ again:
                                    (u_long)ntohl(ml->count),
                                    ml->mode,
                                    ml->version,
-                                   (u_long)ntohl(ml->lastdrop),
+                                   (u_long)ntohl(ml->restr),
                                    (u_long)ntohl(ml->lasttime),
                                    (u_long)ntohl(ml->firsttime));
                        ml++;
@@ -2023,21 +2025,11 @@ again:
                struct info_monitor *ml = (struct info_monitor *) struct_star;
 
                (void) fprintf(fp,
-                              "     address               port     count mode ver code avgint  lstint\n");
+                              "     address               port     count mode ver rstr avgint  lstint\n");
                (void) fprintf(fp,
                               "===============================================================================\n");
                while (items > 0) {
-                       memset((char *)&dstadr, 0, sizeof(dstadr));
-                       if (ml->v6_flag != 0) {
-                               GET_INADDR6(dstadr) = ml->addr6;
-                               dstadr.ss_family = AF_INET6;
-                       } else {
-                               GET_INADDR(dstadr) = ml->addr;
-                               dstadr.ss_family = AF_INET;
-                       }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-                       dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
+                       SET_ADDR(dstadr, ml->v6_flag, ml->addr, ml->addr6);
                        if ((pcmd->nargs == 0) ||
                            ((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) ||
                            ((pcmd->argval->ival == 4) && (ml->v6_flag == 0)))
@@ -2048,7 +2040,7 @@ again:
                                    (u_long)ntohl(ml->count),
                                    ml->mode,
                                    ml->version,
-                                   (u_long)ntohl(ml->lastdrop),
+                                   (u_long)ntohl(ml->restr),
                                    (u_long)ntohl(ml->lasttime),
                                    (u_long)ntohl(ml->firsttime));
                        ml++;
@@ -2061,17 +2053,7 @@ again:
                (void) fprintf(fp,
                               "======================================================================\n");
                while (items > 0) {
-                       memset((char *)&dstadr, 0, sizeof(dstadr));
-                       if (oml->v6_flag != 0) {
-                               GET_INADDR6(dstadr) = oml->addr6;
-                               dstadr.ss_family = AF_INET6;
-                       } else {
-                               GET_INADDR(dstadr) = oml->addr;
-                               dstadr.ss_family = AF_INET;
-                       }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-                       dstadr.ss_len = SOCKLEN(&dstadr);
-#endif
+                       SET_ADDR(dstadr, oml->v6_flag, oml->addr, oml->addr6);
                        (void) fprintf(fp, "%-20.20s %5d %9ld %4d   %3d %9lu %9lu\n",
                                       nntohost(&dstadr),
                                       ntohs(oml->port),
@@ -2187,8 +2169,8 @@ again:
                sendsize = v4sizeof(struct conf_unpeer);
 
        for (qitems = 0, pl = plist; qitems < min(pcmd->nargs, 8); qitems++) {
-               if (pcmd->argval[qitems].netnum.ss_family == AF_INET) {
-                       pl->peeraddr = GET_INADDR(pcmd->argval[qitems].netnum);
+               if (IS_IPV4(&pcmd->argval[qitems].netnum)) {
+                       pl->peeraddr = NSRCADR(&pcmd->argval[qitems].netnum);
                        if (impl_ver == IMPL_XNTPD)
                                pl->v6_flag = 0;
                } else {
@@ -2198,7 +2180,7 @@ again:
                                return;
                        }
                        pl->peeraddr6 =
-                           GET_INADDR6(pcmd->argval[qitems].netnum);
+                           SOCK_ADDR6(&pcmd->argval[qitems].netnum);
                        pl->v6_flag = 1;
                }
                pl = (struct conf_unpeer *)((char *)pl + sendsize);
@@ -2382,7 +2364,7 @@ traps(
 {
        int i;
        struct info_trap *it;
-       struct sockaddr_storage trap_addr, local_addr;
+       sockaddr_u trap_addr, local_addr;
        int items;
        int itemsize;
        int res;
@@ -2410,23 +2392,7 @@ again:
        for (i = 0; i < items; i++ ) {
                if (i != 0)
                    (void) fprintf(fp, "\n");
-               memset((char *)&trap_addr, 0, sizeof(trap_addr));
-               memset((char *)&local_addr, 0, sizeof(local_addr));
-               if (it->v6_flag != 0) {
-                       GET_INADDR6(trap_addr) = it->trap_address6;
-                       GET_INADDR6(local_addr) = it->local_address6;
-                       trap_addr.ss_family = AF_INET6;
-                       local_addr.ss_family = AF_INET6;
-               } else {
-                       GET_INADDR(trap_addr) = it->trap_address;
-                       GET_INADDR(local_addr) = it->local_address;
-                       trap_addr.ss_family = AF_INET;
-                       local_addr.ss_family = AF_INET;
-               }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               trap_addr.ss_len = SOCKLEN(&trap_addr);
-               local_addr.ss_len = SOCKLEN(&local_addr);
-#endif
+               SET_ADDRS(trap_addr, local_addr, it, trap_address, local_address);
                (void) fprintf(fp, "address %s, port %d\n",
                                stoa(&trap_addr), 
                                ntohs(it->trap_port));
@@ -2500,8 +2466,8 @@ again:
        else
                sendsize = v4sizeof(struct conf_trap);
 
-       if (pcmd->argval[0].netnum.ss_family == AF_INET) {
-               ctrap.trap_address = GET_INADDR(pcmd->argval[0].netnum);
+       if (IS_IPV4(&pcmd->argval[0].netnum)) {
+               ctrap.trap_address = NSRCADR(&pcmd->argval[0].netnum);
                if (impl_ver == IMPL_XNTPD)
                        ctrap.v6_flag = 0;
        } else {
@@ -2510,7 +2476,7 @@ again:
                            "***Server doesn't understand IPv6 addresses\n");
                        return;
                }
-               ctrap.trap_address6 = GET_INADDR6(pcmd->argval[0].netnum);
+               ctrap.trap_address6 = SOCK_ADDR6(&pcmd->argval[0].netnum);
                ctrap.v6_flag = 1;
        }
        ctrap.local_address = 0;
@@ -2518,19 +2484,18 @@ again:
        ctrap.unused = 0;
 
        if (pcmd->nargs > 1) {
-               ctrap.trap_port
-                       = htons((u_short)(pcmd->argval[1].uval & 0xffff));
+               ctrap.trap_port = htons((u_short)pcmd->argval[1].uval);
                if (pcmd->nargs > 2) {
-                       if (pcmd->argval[2].netnum.ss_family !=
-                           pcmd->argval[0].netnum.ss_family) {
+                       if (AF(&pcmd->argval[2].netnum) !=
+                           AF(&pcmd->argval[0].netnum)) {
                                fprintf(stderr,
                                    "***Cannot mix IPv4 and IPv6 addresses\n");
                                return;
                        }
-                       if (pcmd->argval[2].netnum.ss_family == AF_INET)
-                               ctrap.local_address = GET_INADDR(pcmd->argval[2].netnum);
+                       if (IS_IPV4(&pcmd->argval[2].netnum))
+                               ctrap.local_address = NSRCADR(&pcmd->argval[2].netnum);
                        else
-                               ctrap.local_address6 = GET_INADDR6(pcmd->argval[2].netnum);
+                               ctrap.local_address6 = SOCK_ADDR6(&pcmd->argval[2].netnum);
                }
        }
 
@@ -2700,7 +2665,7 @@ clockstat(
        struct clktype *clk;
 
        for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++)
-           clist[qitems] = GET_INADDR(pcmd->argval[qitems].netnum);
+               clist[qitems] = NSRCADR(&pcmd->argval[qitems].netnum);
 
 again:
        res = doquery(impl_ver, REQ_GET_CLOCKINFO, 0, qitems,
@@ -2789,7 +2754,7 @@ fudge(
 
        err = 0;
        memset((char *)&fudgedata, 0, sizeof fudgedata);
-       fudgedata.clockadr = GET_INADDR(pcmd->argval[0].netnum);
+       fudgedata.clockadr = NSRCADR(&pcmd->argval[0].netnum);
 
        if (STREQ(pcmd->argval[1].string, "time1")) {
                fudgedata.which = htonl(FUDGE_TIME1);
@@ -2872,7 +2837,7 @@ clkbug(
        l_fp ts;
 
        for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++)
-           clist[qitems] = GET_INADDR(pcmd->argval[qitems].netnum);
+               clist[qitems] = NSRCADR(&pcmd->argval[qitems].netnum);
 
 again:
        res = doquery(impl_ver, REQ_GET_CLKBUGINFO, 0, qitems,
@@ -3096,7 +3061,7 @@ iflist(
        )
 {
        static char *actions = "?.+-";
-       struct sockaddr_storage saddr;
+       sockaddr_u saddr;
 
        if (res != 0)
            return;
@@ -3111,16 +3076,8 @@ iflist(
        fprintf(fp, IF_LIST_LINE);
        
        while (items > 0) {
-               if (ntohl(ifs->v6_flag)) {
-                       memcpy((char *)&GET_INADDR6(saddr), (char *)&ifs->unaddr.addr6, sizeof(ifs->unaddr.addr6));
-                       saddr.ss_family = AF_INET6;
-               } else {
-                       memcpy((char *)&GET_INADDR(saddr), (char *)&ifs->unaddr.addr, sizeof(ifs->unaddr.addr));
-                       saddr.ss_family = AF_INET;
-               }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               saddr.ss_len = SOCKLEN(&saddr);
-#endif
+               SET_ADDR(saddr, ntohl(ifs->v6_flag), 
+                        ifs->unaddr.addr.s_addr, ifs->unaddr.addr6);
                fprintf(fp, IF_LIST_FMT,
                        ntohl(ifs->ifnum),
                        actions[(ifs->action >= 1 && ifs->action < 4) ? ifs->action : 0],
@@ -3138,24 +3095,13 @@ iflist(
                        ntohl(ifs->peercnt),
                        ntohl(ifs->uptime));
 
-               if (ntohl(ifs->v6_flag)) {
-                       memcpy((char *)&GET_INADDR6(saddr), (char *)&ifs->unmask.addr6, sizeof(ifs->unmask.addr6));
-                       saddr.ss_family = AF_INET6;
-               } else {
-                       memcpy((char *)&GET_INADDR(saddr), (char *)&ifs->unmask.addr, sizeof(ifs->unmask.addr));
-                       saddr.ss_family = AF_INET;
-               }
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-               saddr.ss_len = SOCKLEN(&saddr);
-#endif
+               SET_ADDR(saddr, ntohl(ifs->v6_flag), 
+                        ifs->unmask.addr.s_addr, ifs->unmask.addr6);
                fprintf(fp, IF_LIST_AFMT_STR, stoa(&saddr), 'M');
 
                if (!ntohl(ifs->v6_flag) && ntohl(ifs->flags) & (INT_BCASTOPEN)) {
-                       memcpy((char *)&GET_INADDR(saddr), (char *)&ifs->unbcast.addr, sizeof(ifs->unbcast.addr));
-                       saddr.ss_family = AF_INET;
-#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
-                       saddr.ss_len = SOCKLEN(&saddr);
-#endif
+                       SET_ADDR(saddr, ntohl(ifs->v6_flag), 
+                                ifs->unbcast.addr.s_addr, ifs->unbcast.addr6);
                        fprintf(fp, IF_LIST_AFMT_STR, stoa(&saddr), 'B');
 
                }
index 6abdf32d90ecc52990a156faf212a6af90272bd9..8b5ec8dcb565c469554b84f67c363a487f2adf5b 100644 (file)
@@ -708,10 +708,10 @@ int ntpq_read_assoc_clockvars( int associd, char *resultbuf, int maxsize )
  * 
  ****************************************************************************/
  int ntpq_get_assoc_clocktype ( int assoc_number )
-{           
+{
     int type = 0;
     int i, rc = 0;
-    struct sockaddr_storage dum_store;
+    sockaddr_u dum_store;
     char value[LENHOSTNAME];
     char resultbuf[1024];
 
@@ -720,7 +720,7 @@ int ntpq_read_assoc_clockvars( int associd, char *resultbuf, int maxsize )
         return -1;
     } else {
         if ( peervar_assoc != assoc_cache[assoc_number].assid ) {
-            
+
             i=ntpq_read_assoc_peervars(assoc_cache[assoc_number].assid, resultbuf, sizeof(resultbuf));
             if ( i <= 0 ) {
                 return -1;
@@ -737,7 +737,7 @@ int ntpq_read_assoc_clockvars( int associd, char *resultbuf, int maxsize )
 
         if ( rc ) {
             if (decodenetnum(value, &dum_store)) {
-                type = ntpq_decodeaddrtype(&dum_store);
+               type = ntpq_decodeaddrtype(&dum_store);
                 return type;
             }
         }
index c760efefda8bffe25f066ad0afccfb3fa5d4eef0..96f5c4747f853900aa1cbdf67f824b319251fdbe 100644 (file)
@@ -102,7 +102,7 @@ extern int ntpq_read_assoc_clockvars( int associd, char *resultbuf, int maxsize
 /* in libntpq_subs.c */
 #ifndef _LIBNTPQSUBSC
 extern int ntpq_dogetassoc(void);
-extern char ntpq_decodeaddrtype(struct sockaddr_storage *sock);
+extern char ntpq_decodeaddrtype(sockaddr_u *sock);
 extern int ntpq_doquerylist(struct ntpq_varlist *, int , int , int , u_short *, int *, char **datap );
 #endif
 
index be94fd5614f1e0d0dec2898658d17d0d25d4ce58..ce182f41a38bc41826ddcc18022b5ffdcaf85478 100644 (file)
@@ -19,7 +19,7 @@
 
 /* Function Prototypes */
 int ntpq_dogetassoc(void);
-char ntpq_decodeaddrtype(struct sockaddr_storage *sock);
+char ntpq_decodeaddrtype(sockaddr_u *sock);
 int ntpq_doquerylist(struct varlist *, int , int , int , u_short *, int *, char **datap );
 
 
@@ -38,7 +38,7 @@ int ntpq_dogetassoc(void)
        }
 }
 
-char ntpq_decodeaddrtype(struct sockaddr_storage *sock)
+char ntpq_decodeaddrtype(sockaddr_u *sock)
 {
        return decodeaddrtype(sock);
 }
index bd747f6f21be02c4ec5fd98af4c9a0a147ab9a37..ac8766bbf7032e1380020c3fb0a587380a8a79ae 100644 (file)
@@ -155,9 +155,9 @@ struct xcmd opcmds[] = {
        { ":config", config,   { NTP_STR, NO, NO, NO },
          { "<configuration command line>", "", "", "" },
          "send a remote configuration command to ntpd" },
-        { "config-from-file", config_from_file, { NTP_STR, NO, NO, NO },
-          { "<configuration filename>", "", "", "" },
-          "configure ntpd using the configuration filename" },
+       { "config-from-file", config_from_file, { NTP_STR, NO, NO, NO },
+         { "<configuration filename>", "", "", "" },
+         "configure ntpd using the configuration filename" },
        { 0,            0,              { NO, NO, NO, NO },
          { "-4|-6", "", "", "" }, "" }
 };
@@ -1299,17 +1299,15 @@ prettyinterval(
 
 static char
 decodeaddrtype(
-       struct sockaddr_storage *sock
+       sockaddr_u *sock
        )
 {
        char ch = '-';
        u_int32 dummy;
-       struct sockaddr_in6 *sin6;
 
-       switch(sock->ss_family) {
+       switch(AF(sock)) {
        case AF_INET:
-               dummy = ((struct sockaddr_in *)sock)->sin_addr.s_addr;
-               dummy = ntohl(dummy);
+               dummy = SRCADR(sock);
                ch = (char)(((dummy&0xf0000000)==0xe0000000) ? 'm' :
                        ((dummy&0x000000ff)==0x000000ff) ? 'b' :
                        ((dummy&0xffffffff)==0x7f000001) ? 'l' :
@@ -1317,8 +1315,7 @@ decodeaddrtype(
                        'u');
                break;
        case AF_INET6:
-               sin6 = (struct sockaddr_in6 *)sock;
-               if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
+               if (IN6_IS_ADDR_MULTICAST(PSOCK_ADDR6(sock)))
                        ch = 'm';
                else
                        ch = 'u';
@@ -1402,8 +1399,8 @@ doprintpeers(
        int i;
        int c;
 
-       struct sockaddr_storage srcadr;
-       struct sockaddr_storage dstadr;
+       sockaddr_u srcadr;
+       sockaddr_u dstadr;
        u_long srcport = 0;
        char *dstadr_refid = "0.0.0.0";
        u_long stratum = 0;
@@ -1427,8 +1424,8 @@ doprintpeers(
        memset((char *)havevar, 0, sizeof(havevar));
        get_systime(&ts);
        
-       memset((char *)&srcadr, 0, sizeof(struct sockaddr_storage));
-       memset((char *)&dstadr, 0, sizeof(struct sockaddr_storage));
+       ZERO_SOCK(&srcadr);
+       ZERO_SOCK(&dstadr);
 
        /* Initialize by zeroing out estimate variables */
        memset((char *)&estoffset, 0, sizeof(l_fp));
@@ -1437,22 +1434,23 @@ doprintpeers(
        memset((char *)&estdisp, 0, sizeof(l_fp));
 
        while (nextvar(&datalen, &data, &name, &value)) {
-               struct sockaddr_storage dum_store;
+               sockaddr_u dum_store;
 
                i = findvar(name, peer_var, 1);
                if (i == 0)
                        continue;       /* don't know this one */
                switch (i) {
                        case CP_SRCADR:
-                       if (decodenetnum(value, &srcadr))
+                       if (decodenetnum(value, &srcadr)) {
                                havevar[HAVE_SRCADR] = 1;
+                       }
                        break;
                        case CP_DSTADR:
-                       if (decodenetnum(value, &dum_store))
+                       if (decodenetnum(value, &dum_store)) {
                                type = decodeaddrtype(&dum_store);
-                       if (pvl == opeervarlist) {
-                               if (decodenetnum(value, &dstadr)) {
+                               if (pvl == opeervarlist) {
                                        havevar[HAVE_DSTADR] = 1;
+                                       dstadr = dum_store;
                                        dstadr_refid = stoa(&dstadr);
                                }
                        }
@@ -1470,11 +1468,10 @@ doprintpeers(
                                        refid_string[i+1] = '\0';
                                        dstadr_refid = refid_string;
                                } else if (decodenetnum(value, &dstadr)) {
-                                       if (SOCKNUL(&dstadr))
+                                       if (SOCK_UNSPEC(&dstadr))
                                                dstadr_refid = "0.0.0.0";
-                                       else if ((dstadr.ss_family == AF_INET)
-                                           && ISREFCLOCKADR(&dstadr))
-                                               dstadr_refid =
+                                       else if (ISREFCLOCKADR(&dstadr))
+                                               dstadr_refid =
                                                    refnumtoa(&dstadr);
                                        else
                                                dstadr_refid =
@@ -1558,7 +1555,7 @@ doprintpeers(
                c = flash2[CTL_PEER_STATVAL(rstatus) & 0x3];
        if (numhosts > 1)
                (void) fprintf(fp, "%-*s ", maxhostlen, currenthost);
-       if (af == 0 || srcadr.ss_family == af){
+       if (af == 0 || AF(&srcadr) == af) {
                strcpy(clock_name, nntohost(&srcadr));
                
                (void) fprintf(fp,
@@ -1648,7 +1645,7 @@ dopeers(
 {
        register int i;
        char fullname[LENHOSTNAME];
-       struct sockaddr_storage netnum;
+       sockaddr_u netnum;
 
        if (!dogetassoc(fp))
                return;
@@ -1737,7 +1734,7 @@ doopeers(
 {
        register int i;
        char fullname[LENHOSTNAME];
-       struct sockaddr_storage netnum;
+       sockaddr_u netnum;
 
        if (!dogetassoc(fp))
                return;
index 428f4dc11ab21e77bf965b7d170711ced314b43d..0388316f9c11c41f17395665b973c97f9378fc14 100644 (file)
@@ -721,7 +721,7 @@ openhost(
 
        if (ai->ai_canonname == NULL) {
                strncpy(temphost, 
-                       stoa((struct sockaddr_storage *)ai->ai_addr),
+                       stoa((sockaddr_u *)ai->ai_addr),
                        LENHOSTNAME);
 
        } else {
@@ -1809,7 +1809,7 @@ findcmd(
 int
 getnetnum(
        const char *hname,
-       struct sockaddr_storage *num,
+       sockaddr_u *num,
        char *fullhost,
        int af
        )
@@ -1817,10 +1817,8 @@ getnetnum(
        int sockaddr_len;
        struct addrinfo hints, *ai = NULL;
 
-       sockaddr_len = (af == AF_INET)
-                          ? sizeof(struct sockaddr_in)
-                          : sizeof(struct sockaddr_in6);
-       memset((char *)&hints, 0, sizeof(struct addrinfo));
+       sockaddr_len = SIZEOF_SOCKADDR(af);
+       memset(&hints, 0, sizeof(hints));
        hints.ai_flags = AI_CANONNAME;
 #ifdef AI_ADDRCONFIG
        hints.ai_flags |= AI_ADDRCONFIG;
@@ -1852,12 +1850,12 @@ getnetnum(
  */
 char *
 nntohost(
-       struct sockaddr_storage *netnum
+       sockaddr_u *netnum
        )
 {
        if (!showhostnames)
                return stoa(netnum);
-       else if ((netnum->ss_family == AF_INET) && ISREFCLOCKADR(netnum))
+       else if (ISREFCLOCKADR(netnum))
                return refnumtoa(netnum);
        else
                return socktohost(netnum);
@@ -3154,7 +3152,7 @@ cookedprint(
        struct ctl_var *varlist;
        l_fp lfp;
        long ival;
-       struct sockaddr_storage hval;
+       sockaddr_u hval;
        u_long uval;
        l_fp lfparr[8];
        int narr;
@@ -3246,8 +3244,7 @@ cookedprint(
                        
                            case RF:
                                if (decodenetnum(value, &hval)) {
-                                       if ((hval.ss_family == AF_INET) &&
-                                           ISREFCLOCKADR(&hval))
+                                       if (ISREFCLOCKADR(&hval))
                                                output(fp, name,
                                                    refnumtoa(&hval));
                                        else
index 7681cf432c3660b515ae44f77e233d31497be9c0..cd7362b56dd1aca37415cc2aeb6091278012f50b 100644 (file)
@@ -34,7 +34,7 @@ typedef union {
        char *string;
        long ival;
        u_long uval;
-       struct sockaddr_storage netnum;
+       sockaddr_u netnum;
 } arg_v;
 
 /*
@@ -80,10 +80,10 @@ struct ctl_var {
 };
 
 extern void    asciize         (int, char *, FILE *);
-extern int     getnetnum       (const char *, struct sockaddr_storage *, char *, int);
+extern int     getnetnum       (const char *, sockaddr_u *, char *, int);
 extern void    sortassoc       (void);
 extern int     doquery         (int, int, int, int, char *, u_short *, int *, char **);
-extern char *  nntohost        (struct sockaddr_storage *);
+extern char *  nntohost        (sockaddr_u *);
 extern int     decodets        (char *, l_fp *);
 extern int     decodeuint      (char *, u_long *);
 extern int     nextvar         (int *, char **, char **, char **);
index ce72b5a3ef305fb1766aa3320bebf53a5c0f04db..3fe29b9de8ed7fc8d76ca8dc924edbea607b6feb 100644 (file)
@@ -1,7 +1,7 @@
 /* config.h for Windows NT */
 
-#ifndef __CONFIG_H
-#define __CONFIG_H
+#ifndef CONFIG_H
+#define CONFIG_H
 
 /*
  * For newer compilers we may we want newer prototypes from Windows
@@ -115,19 +115,23 @@ struct timeval {
 };
 
 /*
- * IPv6 requirements
+ * ntp_rfc2553.h has cruft under #ifdef SYS_WINNT which is
+ * appropriate for older Microsoft IPv6 definitions, such
+ * as in_addr6 being the struct type.  We can differentiate
+ * the RFC2553-compliant newer headers because they have
+ *   #define in_addr6 in6_addr
+ * for backward compatibility.  With the newer headers,
+ * we define ISC_PLATFORM_HAVEIPV6 and disable the cruft.
  */
-/*
- * For VS.NET most of the IPv6 types and structures are defined.
- * This should depend on the contrents of the available headers, 
- * not on the compiler version.
- */
-#if defined _MSC_VER && _MSC_VER > 1200
-#define HAVE_STRUCT_SOCKADDR_STORAGE
+#ifdef in_addr6                
 #define ISC_PLATFORM_HAVEIPV6
+#define INCLUDE_IPV6_SUPPORT
+#define INCLUDE_IPV6_MULTICAST_SUPPORT
+#define ISC_PLATFORM_HAVESCOPEID
+#define HAVE_STRUCT_SOCKADDR_STORAGE
 #define ISC_PLATFORM_HAVEIN6PKTINFO
 #define NO_OPTION_NAME_WARNINGS
-#endif
+#endif /* in_addr6 / RFC2553-compliant IPv6 headers */
 
 #ifndef _W64
 /* VC6 doesn't know about socklen_t, except if the SDK is installed */
@@ -150,6 +154,19 @@ typedef int socklen_t;
 #define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR))
 #endif
 
+/*
+ * Define this macro to control the behavior of connection
+ * resets on UDP sockets.  See Microsoft KnowledgeBase Article Q263823
+ * for details.
+ * Based on that article, it is surprising that a much newer winsock2.h
+ * does not define SIO_UDP_CONNRESET (the one that comes with VS 2008).
+ * NOTE: This requires that Windows 2000 systems install Service Pack 2
+ * or later.
+ */
+#ifndef SIO_UDP_CONNRESET 
+#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12) 
+#endif
+
 #if defined _MSC_VER && _MSC_VER < 1400
 /*
  * Use 32-bit time definitions for versions prior to VS 2005
@@ -394,4 +411,4 @@ typedef unsigned long uintptr_t;
  */
 #include <isc/stat.h>
 
-#endif /* __CONFIG_H */
+#endif /* CONFIG_H */
index 6e7b92b2c75585e9d8eb76c1bfaebebb91a6f046..62df09dae00ff8fe5fff21d96e03edabe92b9d5b 100644 (file)
@@ -7,21 +7,20 @@
 
 # if defined(HAVE_IO_COMPLETION_PORT)
 
-extern void    init_io_completion_port (void);
-extern void    uninit_io_completion_port (void);
+extern void    init_io_completion_port(void);
+extern void    uninit_io_completion_port(void);
 
-extern int     io_completion_port_add_socket (SOCKET fd, struct interface *);
+extern int     io_completion_port_add_socket(SOCKET fd, struct interface *);
 
 struct refclockio; /* in ntp_refclock.h but inclusion here triggers problems */
-extern int     io_completion_port_add_clock_io (struct refclockio *rio);
+extern int     io_completion_port_add_clock_io(struct refclockio *rio);
 
-extern int     io_completion_port_sendto (struct interface *, struct pkt *, int, struct sockaddr_storage*);
+extern int     io_completion_port_sendto(struct interface *, struct pkt *, int, sockaddr_u *);
 
-extern HANDLE  get_io_event (void);
+extern HANDLE  get_io_event(void);
+extern HANDLE  get_exit_event(void);
 
-extern HANDLE  get_exit_event (void);          /* Handle of the exit event */
-
-extern int     GetReceivedBuffers (void);
+extern int     GetReceivedBuffers(void);
 
 # endif
 
index 84afd72a45cb68ac59e101659f9bf435b8ed09ef..aef37fa32a9c66a30a6377aef069c82667fbb4e2 100644 (file)
@@ -1,10 +1,7 @@
-#if !defined __transmitbuff_h
-#define __transmitbuff_h
+#ifndef TRANSMITBUFF_H
+#define TRANSMITBUFF_H
 
 #include "ntp.h"
-#if defined HAVE_IO_COMPLETION_PORT
-# include "ntp_iocompletionport.h"
-#endif
 #include <isc/list.h>
 
 /*
@@ -17,7 +14,6 @@ typedef struct transmitbuf transmitbuf_t;
 typedef struct transmitbuf {
        ISC_LINK(transmitbuf_t) link;
 
-       WSABUF  wsabuf;
        time_t  ts;             /* Time stamp for the request */
 
        /*
@@ -46,5 +42,5 @@ extern        void    free_transmit_buffer    (transmitbuf_t *);
  */
 extern transmitbuf_t *get_free_transmit_buffer (void);
 
-#endif /* defined __transmitbuff_h */
+#endif /* TRANSMITBUFF_H */
 
index b1249dd4ebdaac6b96411018fb643dd74b74c782..8c241436f29de50e82cc13a104a3427ac0f098a6 100644 (file)
@@ -7,7 +7,7 @@
 
 #include <fcntl.h>
 
-#define NCCS   4
+#define NCCS   18      /* refclock_arc.c uses VTIME (17) */
 #define VEOL   3
 typedef unsigned char  cc_t;
 typedef unsigned int   speed_t;
@@ -176,6 +176,8 @@ struct termios
 #define        TCSANOW         0
 #define        TCSADRAIN       1
 #define        TCSAFLUSH       2
+#define        VMIN            16
+#define VTIME          17
 
 /* modem lines */
 #define TIOCM_LE       0x001
index 97bfbe52a6dfa7fce136cfe9a561ed2c7be08977..219983e794c86da9160ed6341d41fea8e32bc71b 100644 (file)
                                RelativePath="..\..\..\include\ntp_malloc.h"
                                >
                        </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_net.h"
+                               >
+                       </File>
                        <File
                                RelativePath="..\..\..\include\ntp_proto.h"
                                >
index 5d2679cc9305d80800f93ab288f31e3a0da0f997..8fcd302cb04f0a6adf21ca7804b40bff4188ceaf 100644 (file)
@@ -1,3 +1,10 @@
+/*
+ * DEAD CODE ALERT  --  for whatever reason all this wonderful stuff is
+ *                     unused.  The initialization was the only code
+ *                     exercised as of May 2009 when that was nipped.
+ */
+
+
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
@@ -35,13 +42,10 @@ static CRITICAL_SECTION TransmitLock;
 # define LOCK(lock)    EnterCriticalSection(lock)
 # define UNLOCK(lock)  LeaveCriticalSection(lock)
 
-static void 
+static inline void 
 initialise_buffer(transmitbuf *buff)
 {
-       memset((char *) buff, 0, sizeof(transmitbuf));
-
-       buff->wsabuf.len = 0;
-       buff->wsabuf.buf = (char *) &buff->pkt;
+       memset(buff, 0, sizeof(*buff));
 }
 
 static void
@@ -57,7 +61,7 @@ create_buffers(int nbufs)
        transmitbuf_t *buf;
        int i;
 
-       buf = (transmitbuf_t *) emalloc(nbufs*sizeof(transmitbuf_t));
+       buf = emalloc(nbufs * sizeof(*buf));
        for (i = 0; i < nbufs; i++)
        {
                initialise_buffer(buf);
index 920acc2020ce56c074da77f452268d88b8998e92..8ed037c8458d8e77185cbd1642ce50abb87b883b 100644 (file)
@@ -503,9 +503,22 @@ init_winnt_time(void)
        }
 
        /* Initialize random file before OpenSSL checks */
-       if(!init_randfile())
+       if (!init_randfile())
                msyslog(LOG_ERR, "Unable to initialize .rnd file\n");
 
+#pragma warning(push)
+#pragma warning(disable: 4127) /* conditional expression is constant */
+
+       if (SIZEOF_TIME_T != sizeof(time_t)
+           || SIZEOF_INT != sizeof(int)
+           || SIZEOF_SIGNED_CHAR != sizeof(char)) {
+       
+               DPRINTF(1, ("config.h SIZEOF_* macros wrong\n"));
+               exit(1);
+       }
+
+#pragma warning(pop)
+
        /*
         * Get privileges needed for fiddling with the clock
         */
index 3822e344b06853050362ab16ea35a43db3b6929f..3201d8ce51f33207613519067f10bedbe91a1af8 100644 (file)
@@ -7,8 +7,9 @@
 #include <stddef.h>
 #include <stdio.h>
 #include <process.h>
+#include <syslog.h>
+
 #include "ntp_stdlib.h"
-#include "syslog.h"
 #include "ntp_machine.h"
 #include "ntp_fp.h"
 #include "ntp.h"
@@ -17,6 +18,7 @@
 #include "ntp_iocompletionport.h"
 #include "transmitbuff.h"
 #include "ntp_request.h"
+#include "ntp_assert.h"
 #include "clockstuff.h"
 #include "ntp_io.h"
 #include "clockstuff.h"
@@ -118,9 +120,7 @@ FreeHeap(IoCompletionInfo *lpo, char *fromfunc)
 transmitbuf_t *
 get_trans_buf()
 {
-       transmitbuf_t *tb  = (transmitbuf_t *) emalloc(sizeof(transmitbuf_t));
-       tb->wsabuf.len = 0;
-       tb->wsabuf.buf = (char *) &tb->pkt;
+       transmitbuf_t *tb  = emalloc(sizeof(*tb));
        return (tb);
 }
 
@@ -436,10 +436,10 @@ OnSerialWaitComplete(ULONG_PTR i, IoCompletionInfo *lpo, DWORD Bytes, int errsta
 
                rc = ReadFile(
                        (HANDLE)buff->fd,
-                       buff->wsabuff.buf,
-                       buff->wsabuff.len,
-                       &buff->wsabuff.len,
-                       (LPOVERLAPPED) lpo);
+                       buff->recv_buffer,
+                       sizeof(buff->recv_buffer),
+                       NULL,
+                       (LPOVERLAPPED)lpo);
 
                if (!rc && ERROR_IO_PENDING != GetLastError()) {
                        msyslog(LOG_ERR, "Can't read from Refclock: %m");
@@ -502,14 +502,17 @@ io_completion_port_add_clock_io(
        IoCompletionInfo *lpo;
        recvbuf_t *buff;
 
-       if (NULL == CreateIoCompletionPort((HANDLE)_get_osfhandle(rio->fd), hIoCompletionPort, (ULONG_PTR) rio, 0)) {
+       if (NULL == CreateIoCompletionPort(
+                       (HANDLE)_get_osfhandle(rio->fd), 
+                       hIoCompletionPort, 
+                       (ULONG_PTR)rio,
+                       0)) {
                msyslog(LOG_ERR, "Can't add COM port to i/o completion port: %m");
                return 1;
        }
 
-       lpo = (IoCompletionInfo *) GetHeapAlloc("io_completion_port_add_clock_io");
-       if (lpo == NULL)
-       {
+       lpo = GetHeapAlloc("io_completion_port_add_clock_io");
+       if (NULL == lpo) {
                msyslog(LOG_ERR, "Can't allocate heap for completion port: %m");
                return 1;
        }
@@ -523,41 +526,49 @@ io_completion_port_add_clock_io(
  * Queue a receiver on a socket. Returns 0 if no buffer can be queued 
  *
  *  Note: As per the winsock documentation, we use WSARecvFrom. Using
- *        ReadFile() is less efficient.
+ *       ReadFile() is less efficient.
  */
-static unsigned long QueueSocketRecv(SOCKET s, recvbuf_t *buff, IoCompletionInfo *lpo) {
-       
-       int AddrLen;
+static unsigned long 
+QueueSocketRecv(
+       SOCKET s,
+       recvbuf_t *buff,
+       IoCompletionInfo *lpo
+       )
+{
+       WSABUF wsabuf;
+       DWORD Flags;
+       DWORD Result;
 
        lpo->request_type = SOCK_RECV;
        lpo->recv_buf = buff;
 
        if (buff != NULL) {
-               DWORD BytesReceived = 0;
-               DWORD Flags = 0;
+               Flags = 0;
                buff->fd = s;
-               AddrLen = sizeof(struct sockaddr_in);
-               buff->src_addr_len = sizeof(struct sockaddr);
-
-               if (SOCKET_ERROR == WSARecvFrom(buff->fd, &buff->wsabuff, 1, 
-                                               &BytesReceived, &Flags, 
-                                               (struct sockaddr *) &buff->recv_srcadr, (LPINT) &buff->src_addr_len, 
-                                               (LPOVERLAPPED) lpo, NULL)) {
-                       DWORD Result = WSAGetLastError();
+               buff->recv_srcadr_len = sizeof(buff->recv_srcadr);
+               wsabuf.buf = (char *)buff->recv_buffer;
+               wsabuf.len = sizeof(buff->recv_buffer);
+
+               if (SOCKET_ERROR == WSARecvFrom(buff->fd, &wsabuf, 1, 
+                                               NULL, &Flags, 
+                                               &buff->recv_srcadr.sa, 
+                                               &buff->recv_srcadr_len, 
+                                               (LPOVERLAPPED)lpo, NULL)) {
+                       Result = GetLastError();
                        switch (Result) {
                                case NO_ERROR :
                                case WSA_IO_PENDING :
                                        break ;
 
                                case WSAENOTSOCK :
-                                       netsyslog(LOG_ERR, "Can't read from socket, because it isn't a socket: %m");
+                                       msyslog(LOG_ERR, "Can't read from non-socket fd %d: %m", (int)buff->fd);
                                        /* return the buffer */
                                        freerecvbuf(buff);
                                        return 0;
                                        break;
 
                                case WSAEFAULT :
-                                       netsyslog(LOG_ERR, "The buffers parameter is incorrect: %m");
+                                       msyslog(LOG_ERR, "The buffers parameter is incorrect: %m");
                                        /* return the buffer */
                                        freerecvbuf(buff);
                                        return 0;
@@ -586,22 +597,13 @@ OnSocketRecv(ULONG_PTR i, IoCompletionInfo *lpo, DWORD Bytes, int errstatus)
        
        get_systime(&arrival_time);
 
-       /*  Convert the overlapped pointer back to a recvbuf pointer.
-       */
-       
-       /*
-        * Check returned structures
-        */
-       if (lpo == NULL)
-               return (1); /* Nothing to do */
+       NTP_REQUIRE(NULL != lpo);
+       NTP_REQUIRE(NULL != lpo->recv_buf);
 
-       buff = lpo->recv_buf;
        /*
-        * Make sure we have a buffer
+        * Convert the overlapped pointer back to a recvbuf pointer.
         */
-       if (buff == NULL) {
-               return (1);
-       }
+       buff = lpo->recv_buf;
 
        /*
         * If the socket is closed we get an Operation Aborted error
@@ -614,34 +616,31 @@ OnSocketRecv(ULONG_PTR i, IoCompletionInfo *lpo, DWORD Bytes, int errstatus)
                return (1);
        }
 
-
        /*
         * Get a new recv buffer for the replacement socket receive
         */
        newbuff = get_free_recv_buffer_alloc();
        QueueSocketRecv(inter->fd, newbuff, lpo);
 
-#ifdef DEBUG
-       if(debug > 3 && get_packet_mode(buff) == MODE_BROADCAST)
-               printf("****Accepting Broadcast packet on fd %d from %s\n", buff->fd, stoa(&buff->recv_srcadr));
-#endif
-       ignore_this = inter->ignore_packets;
-#ifdef DEBUG
-       if (debug > 3)
-               printf(" Packet mode is %d\n", get_packet_mode(buff));
-#endif
+       DPRINTF(4, ("%sfd %d %s recv packet mode is %d\n", 
+                   (MODE_BROADCAST == get_packet_mode(buff))
+                       ? " **** Broadcast "
+                       : "",
+                   (int)buff->fd, stoa(&buff->recv_srcadr),
+                   get_packet_mode(buff)));
+
        /*
         * If we keep it add some info to the structure
         */
-       if (Bytes > 0 && ignore_this == ISC_FALSE) {
+       if (Bytes && !inter->ignore_packets) {
                memcpy(&buff->recv_time, &arrival_time, sizeof buff->recv_time);        
                buff->recv_length = (int) Bytes;
                buff->receiver = receive; 
                buff->dstadr = inter;
-#ifdef DEBUG
-               if (debug > 1)
-                       printf("Received %d bytes of fd %d in buffer %x from %s\n", Bytes, buff->fd, buff, stoa(&buff->recv_srcadr));
-#endif
+
+               DPRINTF(2, ("Received %d bytes fd %d in buffer %p from %s\n", 
+                           Bytes, (int)buff->fd, buff, stoa(&buff->recv_srcadr)));
+
                packets_received++;
                inter->received++;
                add_full_recv_buffer(buff);
@@ -667,8 +666,8 @@ io_completion_port_add_socket(SOCKET fd, struct interface *inter)
        int n;
 
        if (fd != INVALID_SOCKET) {
-               if (NULL == CreateIoCompletionPort((HANDLE) fd, hIoCompletionPort,
-                                                  (DWORD) inter, 0)) {
+               if (NULL == CreateIoCompletionPort((HANDLE)fd, 
+                   hIoCompletionPort, (ULONG_PTR)inter, 0)) {
                        msyslog(LOG_ERR, "Can't add socket to i/o completion port: %m");
                        return 1;
                }
@@ -745,15 +744,15 @@ io_completion_port_sendto(
        struct interface *inter,        
        struct pkt *pkt,        
        int len, 
-       struct sockaddr_storage* dest)
+       sockaddr_u* dest)
 {
-       transmitbuf_t *buff = NULL;
+       WSABUF wsabuf;
+       transmitbuf_t *buff;
        DWORD Result = ERROR_SUCCESS;
        int errval;
        int AddrLen;
        IoCompletionInfo *lpo;
-       DWORD BytesSent = 0;
-       DWORD Flags = 0;
+       DWORD Flags;
 
        lpo = (IoCompletionInfo *) GetHeapAlloc("io_completion_port_sendto");
 
@@ -770,16 +769,18 @@ io_completion_port_sendto(
                }
 
 
-
                memcpy(&buff->pkt, pkt, len);
-               buff->wsabuf.buf = buff->pkt;
-               buff->wsabuf.len = len;
+               wsabuf.buf = buff->pkt;
+               wsabuf.len = len;
 
-               AddrLen = sizeof(struct sockaddr_in);
+               AddrLen = SOCKLEN(dest);
                lpo->request_type = SOCK_SEND;
                lpo->trans_buf = buff;
+               Flags = 0;
 
-               Result = WSASendTo(inter->fd, &buff->wsabuf, 1, &BytesSent, Flags, (struct sockaddr *) dest, AddrLen, (LPOVERLAPPED) lpo, NULL);
+               Result = WSASendTo(inter->fd, &wsabuf, 1, NULL, Flags,
+                                  &dest->sa, AddrLen, 
+                                  (LPOVERLAPPED)lpo, NULL);
 
                if(Result == SOCKET_ERROR)
                {
index 671c00c1975c55745403b2fd221c55d890d35567..5644da73eae436adf0121929537337100b179c45 100644 (file)
                                RelativePath="..\..\..\ntpd\ntp_scanner.c"
                                >
                        </File>
+                       <File
+                               RelativePath="..\..\..\ntpd\ntp_signd.c"
+                               >
+                       </File>
                        <File
                                RelativePath="..\..\..\ntpd\ntp_timer.c"
                                >
                                RelativePath="..\..\..\include\ntp_malloc.h"
                                >
                        </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_net.h"
+                               >
+                       </File>
                        <File
                                RelativePath="..\..\..\ntpd\ntp_parser.h"
                                >
                                </FileConfiguration>
                                <FileConfiguration
                                        Name="Debug|Win32"
-                                       ExcludedFromBuild="true"
                                        >
                                        <Tool
                                                Name="VCCLCompilerTool"
index 3edd8e901a504c1a1804a7f464b8374ff3212024..9a0da28e86b7c1754aa781b12f42df58fc8a1300 100644 (file)
                        Name="Header Files"
                        Filter="h;hpp;hxx;hm;inl"
                        >
+                       <File
+                               RelativePath="..\include\config.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\include\isc\net.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_fp.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_io.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_machine.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_net.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_select.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_stdlib.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_string.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_syslog.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\..\..\include\ntp_unixtime.h"
+                               >
+                       </File>
                        <File
                                RelativePath="..\..\..\ntpdate\ntpdate.h"
                                >
                        </File>
+                       <File
+                               RelativePath="..\include\syslog.h"
+                               >
+                       </File>
                </Filter>
                <Filter
                        Name="Resource Files"