@@ -9,6 +9,7 @@ package intra
99import (
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
2930func (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+
76100func (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