diff options
author | Russ Cox <rsc@golang.org> | 2010-04-26 22:15:25 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-04-26 22:15:25 -0700 |
commit | 0415bdc67536a8d8c51aa26f2cd9b9cdf2d3967b (patch) | |
tree | 94fb674d518e226f245ba078f44ace74057cd03b /src/pkg/net/ipsock.go | |
parent | c421356f6cd0b1ae24e49a697f4f135f11a0179a (diff) | |
download | golang-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.go | 22 |
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". |