From 0415bdc67536a8d8c51aa26f2cd9b9cdf2d3967b Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 26 Apr 2010 22:15:25 -0700 Subject: 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 --- src/pkg/net/ipsock.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src/pkg/net/ipsock.go') 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". -- cgit v1.2.3