nc: make connecting to IPv4 from IPv6-enabled hosts easier
(was requiring -s <local addr>)
diff --git a/networking/nc_bloaty.c b/networking/nc_bloaty.c
index 5096e32..a318c81 100644
--- a/networking/nc_bloaty.c
+++ b/networking/nc_bloaty.c
@@ -751,6 +751,13 @@
 	/* We manage our fd's so that they are never 0,1,2 */
 	/*bb_sanitize_stdio(); - not needed */
 
+	if (argv[0]) {
+		themaddr = xhost2sockaddr(argv[0],
+			argv[1]
+			? bb_lookup_port(argv[1], o_udpmode ? "udp" : "tcp", 0)
+			: 0);
+	}
+
 	/* create & bind network socket */
 	x = (o_udpmode ? SOCK_DGRAM : SOCK_STREAM);
 	if (option_mask32 & OPT_s) { /* local address */
@@ -758,7 +765,11 @@
 		ouraddr = xhost2sockaddr(str_s, o_lport);
 		x = xsocket(ouraddr->sa.sa_family, x, 0);
 	} else {
-		x = xsocket_type(&ouraddr, x);
+		/* We try IPv6, then IPv4, unless addr family is
+		 * implicitly set by way of remote addr/port spec */
+		x = xsocket_type(&ouraddr,
+				USE_FEATURE_IPV6((themaddr ? themaddr->sa.sa_family : AF_UNSPEC),)
+				x);
 		if (o_lport)
 			set_nport(ouraddr, htons(o_lport));
 	}
@@ -789,14 +800,6 @@
 		xmove_fd(xopen(str_o, O_WRONLY|O_CREAT|O_TRUNC), ofd);
 #endif
 
-	if (argv[0]) {
-		themaddr = xhost2sockaddr(argv[0],
-			argv[1]
-			? bb_lookup_port(argv[1], o_udpmode ? "udp" : "tcp", 0)
-			: 0);
-///what if sa_family won't match??
-	}
-
 	if (o_listen) {
 		dolisten();
 		/* dolisten does its own connect reporting */