--- /dev/null
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
+
+package net
+
+import (
+ "io"
+ "syscall"
+)
+
+// eofError returns io.EOF when fd is available for reading end of
+// file.
+func (fd *netFD) eofError(n int, err error) error {
+ if n == 0 && err == nil && fd.sotype != syscall.SOCK_DGRAM && fd.sotype != syscall.SOCK_RAW {
+ return io.EOF
+ }
+ return err
+}
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
package net
"testing"
)
-var chkReadErrTests = []struct {
+var eofErrorTests = []struct {
n int
err error
fd *netFD
expected error
}{
-
{100, nil, &netFD{sotype: syscall.SOCK_STREAM}, nil},
{100, io.EOF, &netFD{sotype: syscall.SOCK_STREAM}, io.EOF},
{100, errClosing, &netFD{sotype: syscall.SOCK_STREAM}, errClosing},
{0, errClosing, &netFD{sotype: syscall.SOCK_RAW}, errClosing},
}
-func TestChkReadErr(t *testing.T) {
- for _, tt := range chkReadErrTests {
- actual := chkReadErr(tt.n, tt.err, tt.fd)
+func TestEOFError(t *testing.T) {
+ for _, tt := range eofErrorTests {
+ actual := tt.fd.eofError(tt.n, tt.err)
if actual != tt.expected {
- t.Errorf("chkReadError(%v, %v, %v): expected %v, actual %v", tt.n, tt.err, tt.fd.sotype, tt.expected, actual)
+ t.Errorf("eofError(%v, %v, %v): expected %v, actual %v", tt.n, tt.err, tt.fd.sotype, tt.expected, actual)
}
}
}
}
}
}
- err = chkReadErr(n, err, fd)
+ err = fd.eofError(n, err)
break
}
if err != nil && err != io.EOF {
}
}
}
- err = chkReadErr(n, err, fd)
+ err = fd.eofError(n, err)
break
}
if err != nil && err != io.EOF {
}
}
}
- err = chkReadErr(n, err, fd)
+ err = fd.eofError(n, err)
break
}
if err != nil && err != io.EOF {
return
}
-func chkReadErr(n int, err error, fd *netFD) error {
- if n == 0 && err == nil && fd.sotype != syscall.SOCK_DGRAM && fd.sotype != syscall.SOCK_RAW {
- return io.EOF
- }
- return err
-}
-
func (fd *netFD) Write(p []byte) (nn int, err error) {
if err := fd.writeLock(); err != nil {
return 0, err
import (
"errors"
- "io"
"os"
"runtime"
"sync"
n, err := rsrv.ExecIO(o, "WSARecv", func(o *operation) error {
return syscall.WSARecv(o.fd.sysfd, &o.buf, 1, &o.qty, &o.flags, &o.o, nil)
})
- if err == nil && n == 0 {
- err = io.EOF
- }
if raceenabled {
raceAcquire(unsafe.Pointer(&ioSync))
}
+ err = fd.eofError(n, err)
return n, err
}
o.rsan = int32(unsafe.Sizeof(*o.rsa))
return syscall.WSARecvFrom(o.fd.sysfd, &o.buf, 1, &o.qty, &o.flags, o.rsa, &o.rsan, &o.o, nil)
})
+ err = fd.eofError(n, err)
if err != nil {
return 0, nil, err
}