From a11d7d4e11207be9186c6dbeda11fedfef3cbe4d Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Thu, 14 Mar 2013 10:32:42 +0400 Subject: [PATCH] net: prepare connect() for new network poller The problem is that new network poller can have spurious rediness notifications. This implementation ensures that the socket is actually connected. R=golang-dev, rsc, akumar CC=golang-dev https://golang.org/cl/7785043 --- src/pkg/net/fd_unix.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/pkg/net/fd_unix.go b/src/pkg/net/fd_unix.go index 5621927dc3..cc5a030acb 100644 --- a/src/pkg/net/fd_unix.go +++ b/src/pkg/net/fd_unix.go @@ -86,21 +86,19 @@ func (fd *netFD) connect(ra syscall.Sockaddr) error { if err := fd.pd.PrepareWrite(); err != nil { return err } - err := syscall.Connect(fd.sysfd, ra) - if err == syscall.EINPROGRESS { - if err = fd.pd.WaitWrite(); err != nil { - return err + for { + err := syscall.Connect(fd.sysfd, ra) + if err == nil || err == syscall.EISCONN { + break } - var e int - e, err = syscall.GetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_ERROR) - if err != nil { - return os.NewSyscallError("getsockopt", err) + if err != syscall.EINPROGRESS && err != syscall.EALREADY && err != syscall.EINTR { + return err } - if e != 0 { - err = syscall.Errno(e) + if err = fd.pd.WaitWrite(); err != nil { + return err } } - return err + return nil } // Add a reference to this fd. -- 2.48.1