Commit 26281446 authored by David du Colombier's avatar David du Colombier

net: handle hangup in read on Plan 9

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/22149Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: David du Colombier <0intro@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent f81ae3b2
...@@ -77,6 +77,9 @@ func (fd *netFD) Read(b []byte) (n int, err error) { ...@@ -77,6 +77,9 @@ func (fd *netFD) Read(b []byte) (n int, err error) {
} }
defer fd.readUnlock() defer fd.readUnlock()
n, err = fd.data.Read(b) n, err = fd.data.Read(b)
if isHangup(err) {
err = io.EOF
}
if fd.net == "udp" && err == io.EOF { if fd.net == "udp" && err == io.EOF {
n = 0 n = 0
err = nil err = nil
...@@ -179,3 +182,7 @@ func setReadBuffer(fd *netFD, bytes int) error { ...@@ -179,3 +182,7 @@ func setReadBuffer(fd *netFD, bytes int) error {
func setWriteBuffer(fd *netFD, bytes int) error { func setWriteBuffer(fd *netFD, bytes int) error {
return syscall.EPLAN9 return syscall.EPLAN9
} }
func isHangup(err error) bool {
return err != nil && stringsHasSuffix(err.Error(), "Hangup")
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment