summaryrefslogtreecommitdiff
path: root/src/pkg/net/sock.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/net/sock.go')
-rw-r--r--src/pkg/net/sock.go30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/pkg/net/sock.go b/src/pkg/net/sock.go
index 867e328f1..dc139f04a 100644
--- a/src/pkg/net/sock.go
+++ b/src/pkg/net/sock.go
@@ -10,7 +10,6 @@ package net
import (
"io"
- "reflect"
"syscall"
)
@@ -28,10 +27,20 @@ func socket(net string, f, t, p int, la, ra syscall.Sockaddr, toAddr func(syscal
syscall.CloseOnExec(s)
syscall.ForkLock.RUnlock()
- setDefaultSockopts(s, f, t)
+ err = setDefaultSockopts(s, f, t)
+ if err != nil {
+ closesocket(s)
+ return nil, err
+ }
+ var bla syscall.Sockaddr
if la != nil {
- err = syscall.Bind(s, la)
+ bla, err = listenerSockaddr(s, f, la, toAddr)
+ if err != nil {
+ closesocket(s)
+ return nil, err
+ }
+ err = syscall.Bind(s, bla)
if err != nil {
closesocket(s)
return nil, err
@@ -53,7 +62,12 @@ func socket(net string, f, t, p int, la, ra syscall.Sockaddr, toAddr func(syscal
}
sa, _ := syscall.Getsockname(s)
- laddr := toAddr(sa)
+ var laddr Addr
+ if la != nil && bla != la {
+ laddr = toAddr(la)
+ } else {
+ laddr = toAddr(sa)
+ }
sa, _ = syscall.Getpeername(s)
raddr := toAddr(sa)
@@ -61,14 +75,6 @@ func socket(net string, f, t, p int, la, ra syscall.Sockaddr, toAddr func(syscal
return fd, nil
}
-type UnknownSocketError struct {
- sa syscall.Sockaddr
-}
-
-func (e *UnknownSocketError) Error() string {
- return "unknown socket address type " + reflect.TypeOf(e.sa).String()
-}
-
type writerOnly struct {
io.Writer
}