]> Cypherpunks repositories - gostls13.git/commitdiff
auto-detect whether to use IPv6 or IPv4 kernel interface
authorRuss Cox <rsc@golang.org>
Thu, 30 Apr 2009 20:41:36 +0000 (13:41 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 30 Apr 2009 20:41:36 +0000 (13:41 -0700)
R=r
DELTA=12  (9 added, 0 deleted, 3 changed)
OCL=28096
CL=28118

src/lib/net/net.go

index 737af520b6048cf2a2d398f4ddea3f616556519d..63074470bc625289c90e7dab7154c81bdf08a0d7 100644 (file)
@@ -300,9 +300,18 @@ func (c *connBase) SetLinger(sec int) os.Error {
 // 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.
-// If we need to build on a system without IPv6 support, setting
-// preferIPv4 here should fall back to the IPv4 socket interface when possible.
-const preferIPv4 = false
+// 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)