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;