Skip to content

Commit 2173a27

Browse files
committed
net: fix inconsistent error values on setters
This change fixes inconsistent error values on Set{Deadline,ReadDeadline,WriteDeadline,ReadBuffer,WriteBuffer} for Conn, Listener and PacketConn, and Set{KeepAlive,KeepAlivePeriod,Linger,NoDelay} for TCPConn. Updates #4856. Change-Id: I34ca5e98f6de72863f85b2527478b20d8d5394dd Reviewed-on: https://go-review.googlesource.com/9109 Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent 8851113 commit 2173a27

6 files changed

+63
-21
lines changed

src/net/dial.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,8 @@ func (d *Dialer) Dial(network, address string) (Conn, error) {
180180
c, err := dial(network, addrs.first(isIPv4), dialer, d.deadline())
181181
if d.KeepAlive > 0 && err == nil {
182182
if tc, ok := c.(*TCPConn); ok {
183-
tc.SetKeepAlive(true)
184-
tc.SetKeepAlivePeriod(d.KeepAlive)
183+
setKeepAlive(tc.fd, true)
184+
setKeepAlivePeriod(tc.fd, d.KeepAlive)
185185
testHookSetKeepAlive()
186186
}
187187
}

src/net/net.go

+20-5
Original file line numberDiff line numberDiff line change
@@ -192,23 +192,32 @@ func (c *conn) SetDeadline(t time.Time) error {
192192
if !c.ok() {
193193
return syscall.EINVAL
194194
}
195-
return c.fd.setDeadline(t)
195+
if err := c.fd.setDeadline(t); err != nil {
196+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
197+
}
198+
return nil
196199
}
197200

198201
// SetReadDeadline implements the Conn SetReadDeadline method.
199202
func (c *conn) SetReadDeadline(t time.Time) error {
200203
if !c.ok() {
201204
return syscall.EINVAL
202205
}
203-
return c.fd.setReadDeadline(t)
206+
if err := c.fd.setReadDeadline(t); err != nil {
207+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
208+
}
209+
return nil
204210
}
205211

206212
// SetWriteDeadline implements the Conn SetWriteDeadline method.
207213
func (c *conn) SetWriteDeadline(t time.Time) error {
208214
if !c.ok() {
209215
return syscall.EINVAL
210216
}
211-
return c.fd.setWriteDeadline(t)
217+
if err := c.fd.setWriteDeadline(t); err != nil {
218+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
219+
}
220+
return nil
212221
}
213222

214223
// SetReadBuffer sets the size of the operating system's
@@ -217,7 +226,10 @@ func (c *conn) SetReadBuffer(bytes int) error {
217226
if !c.ok() {
218227
return syscall.EINVAL
219228
}
220-
return setReadBuffer(c.fd, bytes)
229+
if err := setReadBuffer(c.fd, bytes); err != nil {
230+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
231+
}
232+
return nil
221233
}
222234

223235
// SetWriteBuffer sets the size of the operating system's
@@ -226,7 +238,10 @@ func (c *conn) SetWriteBuffer(bytes int) error {
226238
if !c.ok() {
227239
return syscall.EINVAL
228240
}
229-
return setWriteBuffer(c.fd, bytes)
241+
if err := setWriteBuffer(c.fd, bytes); err != nil {
242+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
243+
}
244+
return nil
230245
}
231246

232247
// File sets the underlying os.File to blocking mode and returns a copy.

src/net/tcpsock_plan9.go

+14-5
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (c *TCPConn) CloseWrite() error {
6969
// some operating systems after sec seconds have elapsed any remaining
7070
// unsent data may be discarded.
7171
func (c *TCPConn) SetLinger(sec int) error {
72-
return syscall.EPLAN9
72+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: syscall.EPLAN9}
7373
}
7474

7575
// SetKeepAlive sets whether the operating system should send
@@ -78,23 +78,29 @@ func (c *TCPConn) SetKeepAlive(keepalive bool) error {
7878
if !c.ok() {
7979
return syscall.EPLAN9
8080
}
81-
return setKeepAlive(c.fd, keepalive)
81+
if err := setKeepAlive(c.fd, keepalive); err != nil {
82+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
83+
}
84+
return nil
8285
}
8386

8487
// SetKeepAlivePeriod sets period between keep alives.
8588
func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error {
8689
if !c.ok() {
8790
return syscall.EPLAN9
8891
}
89-
return setKeepAlivePeriod(c.fd, d)
92+
if err := setKeepAlivePeriod(c.fd, d); err != nil {
93+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
94+
}
95+
return nil
9096
}
9197

9298
// SetNoDelay controls whether the operating system should delay
9399
// packet transmission in hopes of sending fewer packets (Nagle's
94100
// algorithm). The default is true (no delay), meaning that data is
95101
// sent as soon as possible after a Write.
96102
func (c *TCPConn) SetNoDelay(noDelay bool) error {
97-
return syscall.EPLAN9
103+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: syscall.EPLAN9}
98104
}
99105

100106
// DialTCP connects to the remote address raddr on the network net,
@@ -183,7 +189,10 @@ func (l *TCPListener) SetDeadline(t time.Time) error {
183189
if l == nil || l.fd == nil || l.fd.ctl == nil {
184190
return syscall.EINVAL
185191
}
186-
return l.fd.setDeadline(t)
192+
if err := l.fd.setDeadline(t); err != nil {
193+
return &OpError{Op: "set", Net: l.fd.net, Addr: l.fd.laddr, Err: err}
194+
}
195+
return nil
187196
}
188197

189198
// File returns a copy of the underlying os.File, set to blocking

src/net/tcpsock_posix.go

+21-6
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ type TCPConn struct {
5353

5454
func newTCPConn(fd *netFD) *TCPConn {
5555
c := &TCPConn{conn{fd}}
56-
c.SetNoDelay(true)
56+
setNoDelay(c.fd, true)
5757
return c
5858
}
5959

@@ -114,7 +114,10 @@ func (c *TCPConn) SetLinger(sec int) error {
114114
if !c.ok() {
115115
return syscall.EINVAL
116116
}
117-
return setLinger(c.fd, sec)
117+
if err := setLinger(c.fd, sec); err != nil {
118+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
119+
}
120+
return nil
118121
}
119122

120123
// SetKeepAlive sets whether the operating system should send
@@ -123,15 +126,21 @@ func (c *TCPConn) SetKeepAlive(keepalive bool) error {
123126
if !c.ok() {
124127
return syscall.EINVAL
125128
}
126-
return setKeepAlive(c.fd, keepalive)
129+
if err := setKeepAlive(c.fd, keepalive); err != nil {
130+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
131+
}
132+
return nil
127133
}
128134

129135
// SetKeepAlivePeriod sets period between keep alives.
130136
func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error {
131137
if !c.ok() {
132138
return syscall.EINVAL
133139
}
134-
return setKeepAlivePeriod(c.fd, d)
140+
if err := setKeepAlivePeriod(c.fd, d); err != nil {
141+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
142+
}
143+
return nil
135144
}
136145

137146
// SetNoDelay controls whether the operating system should delay
@@ -142,7 +151,10 @@ func (c *TCPConn) SetNoDelay(noDelay bool) error {
142151
if !c.ok() {
143152
return syscall.EINVAL
144153
}
145-
return setNoDelay(c.fd, noDelay)
154+
if err := setNoDelay(c.fd, noDelay); err != nil {
155+
return &OpError{Op: "set", Net: c.fd.net, Addr: c.fd.laddr, Err: err}
156+
}
157+
return nil
146158
}
147159

148160
// DialTCP connects to the remote address raddr on the network net,
@@ -280,7 +292,10 @@ func (l *TCPListener) SetDeadline(t time.Time) error {
280292
if l == nil || l.fd == nil {
281293
return syscall.EINVAL
282294
}
283-
return l.fd.setDeadline(t)
295+
if err := l.fd.setDeadline(t); err != nil {
296+
return &OpError{Op: "set", Net: l.fd.net, Addr: l.fd.laddr, Err: err}
297+
}
298+
return nil
284299
}
285300

286301
// File returns a copy of the underlying os.File, set to blocking

src/net/unixsock_plan9.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func (l *UnixListener) Addr() Addr { return nil }
122122
// SetDeadline sets the deadline associated with the listener.
123123
// A zero time value disables the deadline.
124124
func (l *UnixListener) SetDeadline(t time.Time) error {
125-
return syscall.EPLAN9
125+
return &OpError{Op: "set", Net: "<nil>", Addr: nil, Err: syscall.EPLAN9}
126126
}
127127

128128
// File returns a copy of the underlying os.File, set to blocking

src/net/unixsock_posix.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -356,11 +356,14 @@ func (l *UnixListener) Addr() Addr { return l.fd.laddr }
356356

357357
// SetDeadline sets the deadline associated with the listener.
358358
// A zero time value disables the deadline.
359-
func (l *UnixListener) SetDeadline(t time.Time) (err error) {
359+
func (l *UnixListener) SetDeadline(t time.Time) error {
360360
if l == nil || l.fd == nil {
361361
return syscall.EINVAL
362362
}
363-
return l.fd.setDeadline(t)
363+
if err := l.fd.setDeadline(t); err != nil {
364+
return &OpError{Op: "set", Net: l.fd.net, Addr: l.fd.laddr, Err: err}
365+
}
366+
return nil
364367
}
365368

366369
// File returns a copy of the underlying os.File, set to blocking

0 commit comments

Comments
 (0)