1
1
package ssh
2
2
3
3
import (
4
- "bytes"
5
4
"errors"
6
5
"fmt"
6
+ "io"
7
7
"net"
8
8
"sync"
9
9
@@ -82,6 +82,10 @@ type Session interface {
82
82
// the request handling loop. Registering nil will unregister the channel.
83
83
// During the time that no channel is registered, breaks are ignored.
84
84
Break (c chan <- bool )
85
+
86
+ // SafeStderr returns the Stderr io.Writer that handles replacing \n with
87
+ // \r\n when there's an active Pty.
88
+ SafeStderr () io.Writer
85
89
}
86
90
87
91
// maxSigBufSize is how many signals will be buffered
@@ -127,18 +131,16 @@ type session struct {
127
131
breakCh chan <- bool
128
132
}
129
133
130
- func (sess * session ) Write ( p [] byte ) ( n int , err error ) {
134
+ func (sess * session ) SafeStderr () io. Writer {
131
135
if sess .pty != nil {
132
- m := len (p )
133
- // normalize \n to \r\n when pty is accepted.
134
- // this is a hardcoded shortcut since we don't support terminal modes.
135
- p = bytes .Replace (p , []byte {'\n' }, []byte {'\r' , '\n' }, - 1 )
136
- p = bytes .Replace (p , []byte {'\r' , '\r' , '\n' }, []byte {'\r' , '\n' }, - 1 )
137
- n , err = sess .Channel .Write (p )
138
- if n > m {
139
- n = m
140
- }
141
- return
136
+ return NewPtyWriter (sess .Stderr ())
137
+ }
138
+ return sess .Stderr ()
139
+ }
140
+
141
+ func (sess * session ) Write (p []byte ) (int , error ) {
142
+ if sess .pty != nil {
143
+ return NewPtyWriter (sess .Channel ).Write (p )
142
144
}
143
145
return sess .Channel .Write (p )
144
146
}
@@ -242,7 +244,7 @@ func (sess *session) handleRequests(reqs <-chan *gossh.Request) {
242
244
continue
243
245
}
244
246
245
- var payload = struct { Value string }{}
247
+ payload : = struct { Value string }{}
246
248
gossh .Unmarshal (req .Payload , & payload )
247
249
sess .rawCmd = payload .Value
248
250
@@ -267,7 +269,7 @@ func (sess *session) handleRequests(reqs <-chan *gossh.Request) {
267
269
continue
268
270
}
269
271
270
- var payload = struct { Value string }{}
272
+ payload : = struct { Value string }{}
271
273
gossh .Unmarshal (req .Payload , & payload )
272
274
sess .subsystem = payload .Value
273
275
0 commit comments