Merge pull request #52 from fess932/master
fix read after tty close
diff --git a/tty_unix.go b/tty_unix.go
index 06f26ba..9446ec4 100644
--- a/tty_unix.go
+++ b/tty_unix.go
@@ -7,6 +7,7 @@
"bufio"
"os"
"os/signal"
+ "syscall"
"golang.org/x/sys/unix"
)
@@ -64,18 +65,25 @@
}
func (tty *TTY) close() error {
- if tty.out == nil {
+ if tty.out == nil || tty.in == nil {
return nil
}
+
signal.Stop(tty.ss)
close(tty.ss)
err1 := unix.IoctlSetTermios(int(tty.in.Fd()), ioctlWriteTermios, &tty.termios)
err2 := tty.out.Close()
+ err3 := tty.in.Close()
+
tty.out = nil
+ tty.in = nil
if err1 != nil {
return err1
}
- return err2
+ if err2 != nil {
+ return err2
+ }
+ return err3
}
func (tty *TTY) size() (int, int, error) {
@@ -113,7 +121,10 @@
termios.Cflag |= unix.CS8
termios.Cc[unix.VMIN] = 1
termios.Cc[unix.VTIME] = 0
- if err := unix.IoctlSetTermios(int(tty.in.Fd()), ioctlWriteTermios, termios); err != nil {
+ if err = unix.IoctlSetTermios(int(tty.in.Fd()), ioctlWriteTermios, termios); err != nil {
+ return nil, err
+ }
+ if err = syscall.SetNonblock(int(tty.in.Fd()), true); err != nil {
return nil, err
}