@@ -17,7 +17,7 @@ import (
1717 "sync"
1818 "time"
1919
20- "github.com/creack/pty"
20+ "github.com/creack/pty/v2 "
2121 "github.com/vito/midterm"
2222)
2323
@@ -254,14 +254,14 @@ func WithTerm() (exitCode int) {
254254type terminalEmulator struct {
255255 mu sync.Mutex
256256 cmd * exec.Cmd
257- pty * os. File
257+ pty pty. Pty
258258 logf func (string , ... any )
259259
260260 term * midterm.Terminal
261261}
262262
263263func newVT100Emulator (
264- f * os. File ,
264+ f pty. Pty ,
265265 cmd * exec.Cmd ,
266266 rows , cols int ,
267267 autoResize bool ,
@@ -307,29 +307,36 @@ loop:
307307
308308func (m * terminalEmulator ) Close () error {
309309 _ , writeErr := m .pty .Write ([]byte {4 }) // EOT
310+ if writeErr != nil {
311+ writeErr = fmt .Errorf ("send EOT: %w" , writeErr )
312+ }
310313
311314 waitErrc := make (chan error , 1 )
312315 go func () {
313- waitErrc <- m .cmd .Wait ()
316+ err := m .cmd .Wait ()
317+ if err != nil {
318+ err = fmt .Errorf ("command %v: %w" , m .cmd , err )
319+ }
320+ waitErrc <- err
314321 }()
315322
316323 var waitErr error
317324 select {
318325 case waitErr = <- waitErrc :
319326 // ok
320- case <- time .After (3 * time .Second ):
327+ case <- time .After (10 * time .Second ):
321328 waitErr = fmt .Errorf ("timeout waiting for %v" , m .cmd )
322329 _ = m .cmd .Process .Kill ()
323330 }
324331
325- closeErr := m .pty .Close ()
326-
327- return errors .Join (waitErr , closeErr , writeErr )
332+ // On Windows, pty.Close may fail with invalid handle or access denied.
333+ // It's not really a problem, so we ignore the error.
334+ _ = m .pty .Close ()
335+ return errors .Join (waitErr , writeErr )
328336}
329337
330338func (m * terminalEmulator ) FeedKeys (s string ) error {
331339 _ , err := io .WriteString (m .pty , s )
332- _ = m .pty .Sync ()
333340 return err
334341}
335342
0 commit comments