summaryrefslogtreecommitdiff
path: root/src/pkg/net/ipsock_posix.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/net/ipsock_posix.go')
-rw-r--r--src/pkg/net/ipsock_posix.go26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/pkg/net/ipsock_posix.go b/src/pkg/net/ipsock_posix.go
index 3a059f516..4841057d6 100644
--- a/src/pkg/net/ipsock_posix.go
+++ b/src/pkg/net/ipsock_posix.go
@@ -53,13 +53,13 @@ func probeIPv6Stack() (supportsIPv6, supportsIPv4map bool) {
}
// favoriteAddrFamily returns the appropriate address family to
-// the given net, raddr, laddr and mode. At first it figures
+// the given net, laddr, raddr and mode. At first it figures
// address family out from the net. If mode indicates "listen"
// and laddr.(type).IP is nil, it assumes that the user wants to
// make a passive connection with wildcard address family, both
// INET and INET6, and wildcard address. Otherwise guess: if the
// addresses are IPv4 then returns INET, or else returns INET6.
-func favoriteAddrFamily(net string, raddr, laddr sockaddr, mode string) int {
+func favoriteAddrFamily(net string, laddr, raddr sockaddr, mode string) int {
switch net[len(net)-1] {
case '4':
return syscall.AF_INET
@@ -68,17 +68,20 @@ func favoriteAddrFamily(net string, raddr, laddr sockaddr, mode string) int {
}
if mode == "listen" {
+ // Note that OpenBSD allows neither "net.inet6.ip6.v6only"
+ // change nor IPPROTO_IPV6 level IPV6_V6ONLY socket option
+ // setting.
switch a := laddr.(type) {
case *TCPAddr:
- if a.IP == nil && supportsIPv6 {
+ if a.IP == nil && supportsIPv6 && supportsIPv4map {
return syscall.AF_INET6
}
case *UDPAddr:
- if a.IP == nil && supportsIPv6 {
+ if a.IP == nil && supportsIPv6 && supportsIPv4map {
return syscall.AF_INET6
}
case *IPAddr:
- if a.IP == nil && supportsIPv6 {
+ if a.IP == nil && supportsIPv6 && supportsIPv4map {
return syscall.AF_INET6
}
}
@@ -102,21 +105,20 @@ type sockaddr interface {
}
func internetSocket(net string, laddr, raddr sockaddr, sotype, proto int, mode string, toAddr func(syscall.Sockaddr) Addr) (fd *netFD, err error) {
- var oserr error
var la, ra syscall.Sockaddr
- family := favoriteAddrFamily(net, raddr, laddr, mode)
+ family := favoriteAddrFamily(net, laddr, raddr, mode)
if laddr != nil {
- if la, oserr = laddr.sockaddr(family); oserr != nil {
+ if la, err = laddr.sockaddr(family); err != nil {
goto Error
}
}
if raddr != nil {
- if ra, oserr = raddr.sockaddr(family); oserr != nil {
+ if ra, err = raddr.sockaddr(family); err != nil {
goto Error
}
}
- fd, oserr = socket(net, family, sotype, proto, la, ra, toAddr)
- if oserr != nil {
+ fd, err = socket(net, family, sotype, proto, la, ra, toAddr)
+ if err != nil {
goto Error
}
return fd, nil
@@ -126,7 +128,7 @@ Error:
if mode == "listen" {
addr = laddr
}
- return nil, &OpError{mode, net, addr, oserr}
+ return nil, &OpError{mode, net, addr, err}
}
func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, error) {