summaryrefslogtreecommitdiff
path: root/src/pkg/net/ipsock.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/net/ipsock.go')
-rw-r--r--src/pkg/net/ipsock.go22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/pkg/net/ipsock.go b/src/pkg/net/ipsock.go
index 879bae33e..fcbd5079f 100644
--- a/src/pkg/net/ipsock.go
+++ b/src/pkg/net/ipsock.go
@@ -49,6 +49,7 @@ type sockaddr interface {
func internetSocket(net string, laddr, raddr sockaddr, proto int, mode string, toAddr func(syscall.Sockaddr) Addr) (fd *netFD, err os.Error) {
// Figure out IP version.
// If network has a suffix like "tcp4", obey it.
+ var oserr os.Error
family := syscall.AF_INET6
switch net[len(net)-1] {
case '4':
@@ -67,16 +68,16 @@ func internetSocket(net string, laddr, raddr sockaddr, proto int, mode string, t
var la, ra syscall.Sockaddr
if laddr != nil {
- if la, err = laddr.sockaddr(family); err != nil {
+ if la, oserr = laddr.sockaddr(family); err != nil {
goto Error
}
}
if raddr != nil {
- if ra, err = raddr.sockaddr(family); err != nil {
+ if ra, oserr = raddr.sockaddr(family); err != nil {
goto Error
}
}
- fd, err = socket(net, family, proto, 0, la, ra, toAddr)
+ fd, oserr = socket(net, family, proto, 0, la, ra, toAddr)
if err != nil {
goto Error
}
@@ -87,7 +88,7 @@ Error:
if mode == "listen" {
addr = laddr
}
- return nil, &OpError{mode, net, addr, err}
+ return nil, &OpError{mode, net, addr, oserr}
}
func getip(fd int, remote bool) (ip []byte, port int, ok bool) {
@@ -109,6 +110,13 @@ func getip(fd int, remote bool) (ip []byte, port int, ok bool) {
return
}
+type InvalidAddrError string
+
+func (e InvalidAddrError) String() string { return string(e) }
+func (e InvalidAddrError) Timeout() bool { return false }
+func (e InvalidAddrError) Temporary() bool { return false }
+
+
func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
switch family {
case syscall.AF_INET:
@@ -116,7 +124,7 @@ func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
ip = IPv4zero
}
if ip = ip.To4(); ip == nil {
- return nil, os.EINVAL
+ return nil, InvalidAddrError("non-IPv4 address")
}
s := new(syscall.SockaddrInet4)
for i := 0; i < IPv4len; i++ {
@@ -135,7 +143,7 @@ func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
ip = IPzero
}
if ip = ip.To16(); ip == nil {
- return nil, os.EINVAL
+ return nil, InvalidAddrError("non-IPv6 address")
}
s := new(syscall.SockaddrInet6)
for i := 0; i < IPv6len; i++ {
@@ -144,7 +152,7 @@ func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
s.Port = port
return s, nil
}
- return nil, os.EINVAL
+ return nil, InvalidAddrError("unexpected socket family")
}
// Split "host:port" into "host" and "port".