another attempt at avoiding IPv6 when it's not supported.

dsymonds confirms that this one works.

R=r
DELTA=50  (23 added, 17 deleted, 10 changed)
OCL=28433
CL=28444
diff --git a/src/lib/net/net.go b/src/lib/net/net.go
index b4bb48b..a95907e 100644
--- a/src/lib/net/net.go
+++ b/src/lib/net/net.go
@@ -19,6 +19,24 @@
 	UnknownSocketFamily = os.NewError("unknown socket family");
 )
 
+
+// Should we try to use the IPv4 socket interface if we're
+// only dealing with IPv4 sockets?  As long as the host system
+// understands IPv6, it's okay to pass IPv4 addresses to the IPv6
+// interface.  That simplifies our code and is most general.
+// Unfortunately, we need to run on kernels built without IPv6 support too.
+// So probe the kernel to figure it out.
+func kernelSupportsIPv6() bool {
+	fd, e := syscall.Socket(syscall.AF_INET6, syscall.SOCK_STREAM, syscall.IPPROTO_TCP);
+	if fd >= 0 {
+		syscall.Close(fd)
+	}
+	return e == 0
+}
+
+var preferIPv4 = !kernelSupportsIPv6()
+
+
 func LookupHost(name string) (cname string, addrs []string, err os.Error)
 
 // Split "host:port" into "host" and "port".
@@ -63,17 +81,21 @@
 // Convert "host:port" into IP address and port.
 // For now, host and port must be numeric literals.
 // Eventually, we'll have name resolution.
-func hostPortToIP(net, hostport, mode string) (ip []byte, iport int, err os.Error) {
+func hostPortToIP(net, hostport, mode string) (ip IP, iport int, err os.Error) {
 	var host, port string;
 	host, port, err = splitHostPort(hostport);
 	if err != nil {
 		return nil, 0, err
 	}
 
-	var addr []byte;
+	var addr IP;
 	if host == "" {
 		if mode == "listen" {
-			addr = IPzero;	// wildcard - listen to all
+			if preferIPv4 {
+				addr = IPv4zero;
+			} else {
+				addr = IPzero;	// wildcard - listen to all
+			}
 		} else {
 			return nil, 0, MissingAddress;
 		}
@@ -296,23 +318,6 @@
 
 // Internet sockets (TCP, UDP)
 
-// Should we try to use the IPv4 socket interface if we're
-// only dealing with IPv4 sockets?  As long as the host system
-// understands IPv6, it's okay to pass IPv4 addresses to the IPv6
-// interface.  That simplifies our code and is most general.
-// Unfortunately, we need to run on kernels built without IPv6 support too.
-// So probe the kernel to figure it out.
-func kernelSupportsIPv6() bool {
-	fd, e := syscall.Socket(syscall.AF_INET6, syscall.SOCK_STREAM, syscall.IPPROTO_TCP);
-	if fd >= 0 {
-		syscall.Close(fd)
-	}
-	return e == 0
-}
-
-var preferIPv4 = !kernelSupportsIPv6()
-
-
 func internetSocket(net, laddr, raddr string, proto int64, mode string)
 	(fd *netFD, err os.Error)
 {
@@ -352,7 +357,7 @@
 		}
 	}
 
-	var cvt func(addr []byte, port int) (sa *syscall.Sockaddr, err os.Error);
+	var cvt func(addr IP, port int) (sa *syscall.Sockaddr, err os.Error);
 	var family int64;
 	if vers == 4 {
 		cvt = v4ToSockaddr;