This adds struct sockaddr to sockunion so we can just use &foo.su_sa
instead of (struct sockaddr *)&foo.  No functional difference but
it lets the compiler warn when appropriate.  The diff also sync the
types in struct sockinet to match the first three fields of struct
sockaddr_in.

We could get rid of struct sockinet entirely but I wasn't sure it
was worth it.

 - todd

Index: usr.bin/ftp/ftp.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/ftp.c,v
retrieving revision 1.99
diff -u -p -u -r1.99 ftp.c
--- usr.bin/ftp/ftp.c   20 Aug 2016 20:18:42 -0000      1.99
+++ usr.bin/ftp/ftp.c   21 Aug 2016 20:20:32 -0000
@@ -85,10 +85,11 @@
 
 union sockunion {
        struct sockinet {
-               u_char si_len;
-               u_char si_family;
-               u_short si_port;
+               u_int8_t si_len;
+               sa_family_t si_family;
+               in_port_t si_port;
        } su_si;
+       struct sockaddr     su_sa;
        struct sockaddr_in  su_sin;
        struct sockaddr_in6 su_sin6;
 };
@@ -259,7 +260,7 @@ hookup(char *host, char *port)
                ares = NULL;
        }
 #endif /* !SMALL */
-       if (getsockname(s, (struct sockaddr *)&myctladdr, &namelen) < 0) {
+       if (getsockname(s, &myctladdr.su_sa, &namelen) < 0) {
                warn("getsockname");
                code = -1;
                goto bad;
@@ -1516,8 +1517,8 @@ reinit:
                } else
                        goto bad;
 
-               for (error = connect(data, (struct sockaddr *)&data_addr,
-                   data_addr.su_len); error != 0 && errno == EINTR;
+               for (error = connect(data, &data_addr.su_sa, data_addr.su_len);
+                   error != 0 && errno == EINTR;
                    error = connect_wait(data))
                        continue;
                if (error != 0) {
@@ -1573,7 +1574,7 @@ noport:
                        warn("setsockopt IPV6_PORTRANGE (ignored)");
                break;
        }
-       if (bind(data, (struct sockaddr *)&data_addr, data_addr.su_len) < 0) {
+       if (bind(data, &data_addr.su_sa, data_addr.su_len) < 0) {
                warn("bind");
                goto bad;
        }
@@ -1584,7 +1585,7 @@ noport:
                warn("setsockopt (ignored)");
 #endif /* !SMALL */
        namelen = sizeof(data_addr);
-       if (getsockname(data, (struct sockaddr *)&data_addr, &namelen) < 0) {
+       if (getsockname(data, &data_addr.su_sa, &namelen) < 0) {
                warn("getsockname");
                goto bad;
        }
@@ -1610,9 +1611,9 @@ noport:
                        if (tmp.su_family == AF_INET6)
                                tmp.su_sin6.sin6_scope_id = 0;
                        af_tmp = (tmp.su_family == AF_INET) ? 1 : 2;
-                       if (getnameinfo((struct sockaddr *)&tmp,
-                           tmp.su_len, hname, sizeof(hname),
-                           pbuf, sizeof(pbuf), NI_NUMERICHOST | 
NI_NUMERICSERV)) {
+                       if (getnameinfo(&tmp.su_sa, tmp.su_len, hname,
+                           sizeof(hname), pbuf, sizeof(pbuf),
+                           NI_NUMERICHOST | NI_NUMERICSERV)) {
                                result = ERROR;
                        } else {
                                result = command("EPRT |%d|%s|%s|",
@@ -1694,7 +1695,7 @@ dataconn(const char *lmode)
        if (passivemode)
                return (fdopen(data, lmode));
 
-       s = accept(data, (struct sockaddr *) &from, &fromlen);
+       s = accept(data, &from.su_sa, &fromlen);
        if (s < 0) {
                warn("accept");
                (void)close(data), data = -1;

Reply via email to