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,12 @@ 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
+ // Stderr returns an io.ReadWriter that writes to this channel
87
+ // with the extended data type set to stderr. Stderr may
88
+ // safely be read and written from a different goroutine than
89
+ // Read and Write respectively.
90
+ Stderr () io.ReadWriter
85
91
}
86
92
87
93
// maxSigBufSize is how many signals will be buffered
@@ -127,18 +133,16 @@ type session struct {
127
133
breakCh chan <- bool
128
134
}
129
135
130
- func (sess * session ) Write ( p [] byte ) ( n int , err error ) {
136
+ func (sess * session ) Stderr () io. ReadWriter {
131
137
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
138
+ return NewPtyReadWriter (sess .Channel .Stderr ())
139
+ }
140
+ return sess .Channel .Stderr ()
141
+ }
142
+
143
+ func (sess * session ) Write (p []byte ) (int , error ) {
144
+ if sess .pty != nil {
145
+ return NewPtyWriter (sess .Channel ).Write (p )
142
146
}
143
147
return sess .Channel .Write (p )
144
148
}
@@ -242,7 +246,7 @@ func (sess *session) handleRequests(reqs <-chan *gossh.Request) {
242
246
continue
243
247
}
244
248
245
- var payload = struct { Value string }{}
249
+ payload : = struct { Value string }{}
246
250
gossh .Unmarshal (req .Payload , & payload )
247
251
sess .rawCmd = payload .Value
248
252
@@ -267,7 +271,7 @@ func (sess *session) handleRequests(reqs <-chan *gossh.Request) {
267
271
continue
268
272
}
269
273
270
- var payload = struct { Value string }{}
274
+ payload : = struct { Value string }{}
271
275
gossh .Unmarshal (req .Payload , & payload )
272
276
sess .subsystem = payload .Value
273
277
0 commit comments