]> Cypherpunks repositories - gostls13.git/commitdiff
net: move bind back to sock.go
authorAlexey Borzenkov <snaury@gmail.com>
Tue, 29 Mar 2011 18:23:42 +0000 (14:23 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 29 Mar 2011 18:23:42 +0000 (14:23 -0400)
It was left in netFD.connect() by an oversight (as the name
implies, bind has no business being in connect). As a result
of this change and by only calling netFD.connect() when ra
isn't nil it becomes simpler with less code duplication.

Additionally, if netFD.connect() fails, set sysfd to -1 to
avoid finalizers (e.g. on windows) calling shutdown on a
closed and possibly reopened socket that just happened to
share the same descriptor.

R=golang-dev, rsc1, rsc
CC=golang-dev
https://golang.org/cl/4328043

src/pkg/net/fd.go
src/pkg/net/fd_windows.go
src/pkg/net/sock.go

index 3e8780083d5c2e2707ddc943a5984a8c1a8498f6..cd1a21dc361b2bf0b3e56551f16c64c77f875eec 100644 (file)
@@ -303,26 +303,18 @@ func (fd *netFD) setAddr(laddr, raddr Addr) {
        fd.sysfile = os.NewFile(fd.sysfd, fd.net+":"+ls+"->"+rs)
 }
 
-func (fd *netFD) connect(la, ra syscall.Sockaddr) (err os.Error) {
-       if la != nil {
-               e := syscall.Bind(fd.sysfd, la)
-               if e != 0 {
-                       return os.Errno(e)
+func (fd *netFD) connect(ra syscall.Sockaddr) (err os.Error) {
+       e := syscall.Connect(fd.sysfd, ra)
+       if e == syscall.EINPROGRESS {
+               var errno int
+               pollserver.WaitWrite(fd)
+               e, errno = syscall.GetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_ERROR)
+               if errno != 0 {
+                       return os.NewSyscallError("getsockopt", errno)
                }
        }
-       if ra != nil {
-               e := syscall.Connect(fd.sysfd, ra)
-               if e == syscall.EINPROGRESS {
-                       var errno int
-                       pollserver.WaitWrite(fd)
-                       e, errno = syscall.GetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_ERROR)
-                       if errno != 0 {
-                               return os.NewSyscallError("getsockopt", errno)
-                       }
-               }
-               if e != 0 {
-                       return os.Errno(e)
-               }
+       if e != 0 {
+               return os.Errno(e)
        }
        return nil
 }
index 0abf230ce1cd9c4e55e64d1dc2987de998c2b3b4..c2f736cc1267da65a0c8f06a0b05e2e59de0dbb4 100644 (file)
@@ -253,18 +253,10 @@ func (fd *netFD) setAddr(laddr, raddr Addr) {
        fd.raddr = raddr
 }
 
-func (fd *netFD) connect(la, ra syscall.Sockaddr) (err os.Error) {
-       if la != nil {
-               e := syscall.Bind(fd.sysfd, la)
-               if e != 0 {
-                       return os.Errno(e)
-               }
-       }
-       if ra != nil {
-               e := syscall.Connect(fd.sysfd, ra)
-               if e != 0 {
-                       return os.Errno(e)
-               }
+func (fd *netFD) connect(ra syscall.Sockaddr) (err os.Error) {
+       e := syscall.Connect(fd.sysfd, ra)
+       if e != 0 {
+               return os.Errno(e)
        }
        return nil
 }
index 9b99ad58f8c01221fad065ce64e510635c2a11ec..933700af160ec2248daf6207a5cffaf76b65e72d 100644 (file)
@@ -44,19 +44,30 @@ func socket(net string, f, p, t int, la, ra syscall.Sockaddr, toAddr func(syscal
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 0)
        }
 
+       if la != nil {
+               e = syscall.Bind(s, la)
+               if e != 0 {
+                       closesocket(s)
+                       return nil, os.Errno(e)
+               }
+       }
+
        if fd, err = newFD(s, f, p, net); err != nil {
                closesocket(s)
                return nil, err
        }
 
-       if err = fd.connect(la, ra); err != nil {
-               closesocket(s)
-               return nil, err
+       if ra != nil {
+               if err = fd.connect(ra); err != nil {
+                       fd.sysfd = -1
+                       closesocket(s)
+                       return nil, err
+               }
        }
 
-       sa, _ := syscall.Getsockname(fd.sysfd)
+       sa, _ := syscall.Getsockname(s)
        laddr := toAddr(sa)
-       sa, _ = syscall.Getpeername(fd.sysfd)
+       sa, _ = syscall.Getpeername(s)
        raddr := toAddr(sa)
 
        fd.setAddr(laddr, raddr)