On Sun, 21 Aug 2016 14:23:33 -0600, "Todd C. Miller" wrote: > We could get rid of struct sockinet entirely but I wasn't sure it > was worth it.
Here's a diff that replaces sockunion with the more common sockaddr_union. - 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 22 Aug 2016 01:17:13 -0000 @@ -83,20 +83,13 @@ #include "ftp_var.h" -union sockunion { - struct sockinet { - u_char si_len; - u_char si_family; - u_short si_port; - } su_si; - struct sockaddr_in su_sin; - struct sockaddr_in6 su_sin6; +union sockaddr_union { + struct sockaddr sa; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; }; -#define su_len su_si.si_len -#define su_family su_si.si_family -#define su_port su_si.si_port -union sockunion myctladdr, hisctladdr, data_addr; +union sockaddr_union myctladdr, hisctladdr, data_addr; int data = -1; int abrtflag = 0; @@ -259,12 +252,12 @@ hookup(char *host, char *port) ares = NULL; } #endif /* !SMALL */ - if (getsockname(s, (struct sockaddr *)&myctladdr, &namelen) < 0) { + if (getsockname(s, &myctladdr.sa, &namelen) < 0) { warn("getsockname"); code = -1; goto bad; } - if (hisctladdr.su_family == AF_INET) { + if (hisctladdr.sa.sa_family == AF_INET) { tos = IPTOS_LOWDELAY; if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0) warn("setsockopt TOS (ignored)"); @@ -1280,9 +1273,9 @@ initconn(void) struct addrinfo *ares; #endif - if (myctladdr.su_family == AF_INET6 - && (IN6_IS_ADDR_LINKLOCAL(&myctladdr.su_sin6.sin6_addr) - || IN6_IS_ADDR_SITELOCAL(&myctladdr.su_sin6.sin6_addr))) { + if (myctladdr.sa.sa_family == AF_INET6 + && (IN6_IS_ADDR_LINKLOCAL(&myctladdr.sin6.sin6_addr) + || IN6_IS_ADDR_SITELOCAL(&myctladdr.sin6.sin6_addr))) { warnx("use of scoped address can be troublesome"); } #ifndef SMALL @@ -1306,7 +1299,7 @@ initconn(void) reinit: if (passivemode) { data_addr = myctladdr; - data = socket(data_addr.su_family, SOCK_STREAM, 0); + data = socket(data_addr.sa.sa_family, SOCK_STREAM, 0); if (data < 0) { warn("socket"); return (1); @@ -1324,7 +1317,7 @@ reinit: sizeof(on)) < 0) warn("setsockopt (ignored)"); #endif /* !SMALL */ - switch (data_addr.su_family) { + switch (data_addr.sa.sa_family) { case AF_INET: if (epsv4 && !epsv4bad) { int ov; @@ -1397,7 +1390,7 @@ reinit: if (!pasvcmd) goto bad; if (strcmp(pasvcmd, "PASV") == 0) { - if (data_addr.su_family != AF_INET) { + if (data_addr.sa.sa_family != AF_INET) { fputs( "Passive mode AF mismatch. Shouldn't happen!\n", ttyout); goto bad; @@ -1416,18 +1409,18 @@ reinit: goto bad; } memset(&data_addr, 0, sizeof(data_addr)); - data_addr.su_family = AF_INET; - data_addr.su_len = sizeof(struct sockaddr_in); - data_addr.su_sin.sin_addr.s_addr = + data_addr.sin.sin_family = AF_INET; + data_addr.sin.sin_len = sizeof(struct sockaddr_in); + data_addr.sin.sin_addr.s_addr = htonl(pack4(addr, 0)); - data_addr.su_port = htons(pack2(port, 0)); + data_addr.sin.sin_port = htons(pack2(port, 0)); } else if (strcmp(pasvcmd, "LPSV") == 0) { if (code / 10 == 22 && code != 228) { fputs("wrong server: return code must be 228\n", ttyout); goto bad; } - switch (data_addr.su_family) { + switch (data_addr.sa.sa_family) { case AF_INET: error = sscanf(pasv, "%u,%u,%u,%u,%u,%u,%u,%u,%u", @@ -1447,11 +1440,11 @@ reinit: } memset(&data_addr, 0, sizeof(data_addr)); - data_addr.su_family = AF_INET; - data_addr.su_len = sizeof(struct sockaddr_in); - data_addr.su_sin.sin_addr.s_addr = + data_addr.sin.sin_family = AF_INET; + data_addr.sin.sin_len = sizeof(struct sockaddr_in); + data_addr.sin.sin_addr.s_addr = htonl(pack4(addr, 0)); - data_addr.su_port = htons(pack2(port, 0)); + data_addr.sin.sin_port = htons(pack2(port, 0)); break; case AF_INET6: error = sscanf(pasv, @@ -1475,17 +1468,17 @@ reinit: } memset(&data_addr, 0, sizeof(data_addr)); - data_addr.su_family = AF_INET6; - data_addr.su_len = sizeof(struct sockaddr_in6); + data_addr.sin6.sin6_family = AF_INET6; + data_addr.sin6.sin6_len = sizeof(struct sockaddr_in6); { u_int32_t *p32; - p32 = (u_int32_t *)&data_addr.su_sin6.sin6_addr; + p32 = (u_int32_t *)&data_addr.sin6.sin6_addr; p32[0] = htonl(pack4(addr, 0)); p32[1] = htonl(pack4(addr, 4)); p32[2] = htonl(pack4(addr, 8)); p32[3] = htonl(pack4(addr, 12)); } - data_addr.su_port = htons(pack2(port, 0)); + data_addr.sin6.sin6_port = htons(pack2(port, 0)); break; default: fputs("Bad family!\n", ttyout); @@ -1512,12 +1505,12 @@ reinit: goto bad; } data_addr = hisctladdr; - data_addr.su_port = htons(port[1]); + data_addr.sin.sin_port = htons(port[1]); } 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.sa, data_addr.sa.sa_len); + error != 0 && errno == EINTR; error = connect_wait(data)) continue; if (error != 0) { @@ -1531,7 +1524,7 @@ reinit: warn("connect"); goto bad; } - if (data_addr.su_family == AF_INET) { + if (data_addr.sa.sa_family == AF_INET) { on = IPTOS_THROUGHPUT; if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on, sizeof(int)) < 0) @@ -1543,10 +1536,10 @@ reinit: noport: data_addr = myctladdr; if (sendport) - data_addr.su_port = 0; /* let system pick one */ + data_addr.sin.sin_port = 0; /* let system pick one */ if (data != -1) (void)close(data); - data = socket(data_addr.su_family, SOCK_STREAM, 0); + data = socket(data_addr.sa.sa_family, SOCK_STREAM, 0); if (data < 0) { warn("socket"); if (tmpno) @@ -1559,7 +1552,7 @@ noport: warn("setsockopt (reuse address)"); goto bad; } - switch (data_addr.su_family) { + switch (data_addr.sa.sa_family) { case AF_INET: on = IP_PORTRANGE_HIGH; if (setsockopt(data, IPPROTO_IP, IP_PORTRANGE, @@ -1573,7 +1566,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.sa, data_addr.sa.sa_len) < 0) { warn("bind"); goto bad; } @@ -1584,7 +1577,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.sa, &namelen) < 0) { warn("getsockname"); goto bad; } @@ -1596,10 +1589,10 @@ noport: if (sendport) { char hname[NI_MAXHOST], pbuf[NI_MAXSERV]; int af_tmp; - union sockunion tmp; + union sockaddr_union tmp; tmp = data_addr; - switch (tmp.su_family) { + switch (tmp.sa.sa_family) { case AF_INET: if (!epsv4 || epsv4bad) { result = COMPLETE +1; @@ -1607,12 +1600,12 @@ noport: } /*FALLTHROUGH*/ case AF_INET6: - 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 (tmp.sa.sa_family == AF_INET6) + tmp.sin6.sin6_scope_id = 0; + af_tmp = (tmp.sa.sa_family == AF_INET) ? 1 : 2; + if (getnameinfo(&tmp.sa, tmp.sa.sa_len, hname, + sizeof(hname), pbuf, sizeof(pbuf), + NI_NUMERICHOST | NI_NUMERICSERV)) { result = ERROR; } else { result = command("EPRT |%d|%s|%s|", @@ -1636,17 +1629,17 @@ noport: if (result == COMPLETE) goto skip_port; - switch (data_addr.su_family) { + switch (data_addr.sa.sa_family) { case AF_INET: - a = (char *)&data_addr.su_sin.sin_addr; - p = (char *)&data_addr.su_port; + a = (char *)&data_addr.sin.sin_addr; + p = (char *)&data_addr.sin.sin_port; result = command("PORT %d,%d,%d,%d,%d,%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1])); break; case AF_INET6: - a = (char *)&data_addr.su_sin6.sin6_addr; - p = (char *)&data_addr.su_port; + a = (char *)&data_addr.sin6.sin6_addr; + p = (char *)&data_addr.sin6.sin6_port; result = command( "LPRT %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", 6, 16, @@ -1670,7 +1663,7 @@ noport: } if (tmpno) sendport = 1; - if (data_addr.su_family == AF_INET) { + if (data_addr.sa.sa_family == AF_INET) { on = IPTOS_THROUGHPUT; if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on, sizeof(int)) < 0) @@ -1687,14 +1680,14 @@ bad: FILE * dataconn(const char *lmode) { - union sockunion from; - socklen_t fromlen = myctladdr.su_len; + union sockaddr_union from; + socklen_t fromlen = myctladdr.sa.sa_len; int s; if (passivemode) return (fdopen(data, lmode)); - s = accept(data, (struct sockaddr *) &from, &fromlen); + s = accept(data, &from.sa, &fromlen); if (s < 0) { warn("accept"); (void)close(data), data = -1; @@ -1702,7 +1695,7 @@ dataconn(const char *lmode) } (void)close(data); data = s; - if (from.su_family == AF_INET) { + if (from.sa.sa_family == AF_INET) { int tos = IPTOS_THROUGHPUT; if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0) { @@ -1739,8 +1732,8 @@ pswitch(int flag) static struct comvars { int connect; char name[HOST_NAME_MAX+1]; - union sockunion mctl; - union sockunion hctl; + union sockaddr_union mctl; + union sockaddr_union hctl; FILE *in; FILE *out; int tpe;