Skip to content

Commit 376545b

Browse files
committed
rwext: impl core.ControlConn & core.RetrierConn
1 parent ffea01a commit 376545b

1 file changed

Lines changed: 26 additions & 2 deletions

File tree

intra/rwconn.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package intra
99
import (
1010
"io"
1111
"net"
12+
"syscall"
1213
"time"
1314

1415
"github.com/celzero/firestack/intra/core"
@@ -22,9 +23,9 @@ type rwext struct {
2223
minidle uint32 // min idle timeout in secs
2324
}
2425

25-
// TODO? var _ core.RetrierConn = (*rwext)(nil)
2626
// TODO? var _ core.DuplexCloser = (*rwext)(nil)
27-
var _ core.ReadRetrierConn = (*rwext)(nil)
27+
var _ core.RetrierConn = (*rwext)(nil)
28+
var _ core.ControlConn = (*rwext)(nil)
2829

2930
func (rw rwext) SetTimeout() (secs int, didSet bool) {
3031
r, w := rw.deadlines()
@@ -73,6 +74,29 @@ func (rw rwext) ReadFrom(r io.Reader) (n int64, err error) {
7374
return core.Stream(rw, r)
7475
}
7576

77+
// WriteTo implements core.RetrierConn.
78+
func (rw rwext) WriteTo(w io.Writer) (n int64, err error) {
79+
switch c := rw.Unwrap().(type) {
80+
case io.WriterTo:
81+
// disable read and write deadlines for rw.Conn as
82+
// io.WriterTo does not support io.Reader+io.Writer
83+
// semantics which rwext relies on to extend deadlines.
84+
rw.extendForever()
85+
return c.WriteTo(w)
86+
default:
87+
}
88+
// nb: stream rw (which extends deadlines) not rw.Conn
89+
return core.Stream(w, rw)
90+
}
91+
92+
// SyscallConn implements core.ControlConn.
93+
func (rw rwext) SyscallConn() (syscall.RawConn, error) {
94+
if sc, ok := rw.Unwrap().(syscall.Conn); ok {
95+
return sc.SyscallConn()
96+
}
97+
return nil, syscall.EINVAL
98+
}
99+
76100
func (rw rwext) deadlines() (r, w uint32) {
77101
dopt := settings.GetDialerOpts()
78102
// -ve ints go higher than 2^31 w/ uint: go.dev/play/p/Rrqk_V8a7W0

0 commit comments

Comments
 (0)