]> Cypherpunks repositories - gostls13.git/commitdiff
os: return io.EOF from windows ReadAt as documented
authorAlex Brainman <alex.brainman@gmail.com>
Mon, 10 Jun 2013 09:14:41 +0000 (19:14 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Mon, 10 Jun 2013 09:14:41 +0000 (19:14 +1000)
Fixes #5619.

R=golang-dev, r, peter.armitage, go.peter.90
CC=golang-dev
https://golang.org/cl/9952044

src/pkg/os/file_windows.go
src/pkg/os/os_test.go
src/pkg/syscall/ztypes_windows.go

index 4cd45420759b4160e19c6534e9af46c7f2dbce9c..7a635661489913acdca4a80ac68df4acd9de3dbb 100644 (file)
@@ -312,6 +312,10 @@ func (f *File) pread(b []byte, off int64) (n int, err error) {
        var done uint32
        e = syscall.ReadFile(syscall.Handle(f.fd), b, &done, &o)
        if e != nil {
+               if e == syscall.ERROR_HANDLE_EOF {
+                       // end of file
+                       return 0, nil
+               }
                return 0, e
        }
        return int(done), nil
index 29706015d1ff537e1c90b12dbcf6cd0594d30418..1009600fef8399a143844b68c4c530bccd892685 100644 (file)
@@ -1114,3 +1114,19 @@ func TestStatDirModeExec(t *testing.T) {
                t.Errorf("Stat %q: mode %#o want %#o", path, dir.Mode()&mode, mode)
        }
 }
+
+func TestReadAtEOF(t *testing.T) {
+       f := newFile("TestReadAtEOF", t)
+       defer Remove(f.Name())
+       defer f.Close()
+
+       _, err := f.ReadAt(make([]byte, 10), 0)
+       switch err {
+       case io.EOF:
+               // all good
+       case nil:
+               t.Fatalf("ReadAt succeeded")
+       default:
+               t.Fatalf("ReadAt failed: %s", err)
+       }
+}
index a2006f803d6237ad3f549f82bcf8886093b89501..fb74b3e57ce18dcdc4e93fa401eab47e666ca625 100644 (file)
@@ -10,6 +10,7 @@ const (
        ERROR_PATH_NOT_FOUND      Errno = 3
        ERROR_ACCESS_DENIED       Errno = 5
        ERROR_NO_MORE_FILES       Errno = 18
+       ERROR_HANDLE_EOF          Errno = 38
        ERROR_FILE_EXISTS         Errno = 80
        ERROR_BROKEN_PIPE         Errno = 109
        ERROR_BUFFER_OVERFLOW     Errno = 111