]> Cypherpunks repositories - gostls13.git/commitdiff
net: handle hangup in read on Plan 9
authorDavid du Colombier <0intro@gmail.com>
Mon, 18 Apr 2016 20:37:33 +0000 (22:37 +0200)
committerDavid du Colombier <0intro@gmail.com>
Mon, 18 Apr 2016 21:58:54 +0000 (21:58 +0000)
On Plan 9, when closing a TCP connection, we
write the "hangup" string to the TCP ctl file.

The next read on the TCP data file will return
an error like "/net/tcp/18/data: Hangup", while
in Go, we expect to return io.EOF.

This change makes Read to return io.EOF when
an error string containing "Hangup" is returned.

Change-Id: I3f71ed543704190b441cac4787488a77f46d88a1
Reviewed-on: https://go-review.googlesource.com/22149
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: David du Colombier <0intro@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/fd_plan9.go

index 35d162431782381f17767c08368c6acd517ec6db..329d6152b2d9894a2e392c16b14c27bc6d4bb80e 100644 (file)
@@ -77,6 +77,9 @@ func (fd *netFD) Read(b []byte) (n int, err error) {
        }
        defer fd.readUnlock()
        n, err = fd.data.Read(b)
+       if isHangup(err) {
+               err = io.EOF
+       }
        if fd.net == "udp" && err == io.EOF {
                n = 0
                err = nil
@@ -179,3 +182,7 @@ func setReadBuffer(fd *netFD, bytes int) error {
 func setWriteBuffer(fd *netFD, bytes int) error {
        return syscall.EPLAN9
 }
+
+func isHangup(err error) bool {
+       return err != nil && stringsHasSuffix(err.Error(), "Hangup")
+}