summaryrefslogtreecommitdiff
path: root/src/pkg/net/ipsock.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-04-26 22:15:25 -0700
committerRuss Cox <rsc@golang.org>2010-04-26 22:15:25 -0700
commit0415bdc67536a8d8c51aa26f2cd9b9cdf2d3967b (patch)
tree94fb674d518e226f245ba078f44ace74057cd03b /src/pkg/net/ipsock.go
parentc421356f6cd0b1ae24e49a697f4f135f11a0179a (diff)
downloadgolang-0415bdc67536a8d8c51aa26f2cd9b9cdf2d3967b.tar.gz
net: introduce net.Error interface
Adds two more methods, Timeout and Temporary. Implemented by os.Errno too. The intent is to make the checks for os.EAGAIN a little less clunky. It should also let us clean up a bug that Mike Solomon pointed out: if a network server gets an "out of file descriptors" error from Accept, the listener should not stop. It will be able to check this because that error would have Temporary() == true. Also clean up some underscore names. Fixes issue 442. R=r CC=golang-dev, msolo http://codereview.appspot.com/957045
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".