From 566a3e3f3d2e6afab5fa4f90c5ef0591df85f583 Mon Sep 17 00:00:00 2001 From: Xiami Date: Fri, 18 Jun 2021 01:16:56 +0800 Subject: [PATCH] Fix wrong termios save code This bug is introduced by 20e0658bedf03de0604a1a4bf9c212b7a1e26970. Saving a *unix.Termios and then modifying it in SetRaw() makes the saved state useless. By restoring saveTermios type from *unix.Termios to unix.Termios, SetRaw() no longer influences the saved termios. This should fix #228 and #233 . Signed-off-by: Xiami --- internal/term/raw.go | 2 +- internal/term/term.go | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/internal/term/raw.go b/internal/term/raw.go index 7aa3ed8d..e2a4a7b8 100644 --- a/internal/term/raw.go +++ b/internal/term/raw.go @@ -25,5 +25,5 @@ func SetRaw(fd int) error { n.Cc[syscall.VMIN] = 1 n.Cc[syscall.VTIME] = 0 - return termios.Tcsetattr(uintptr(fd), termios.TCSANOW, (*unix.Termios)(n)) + return termios.Tcsetattr(uintptr(fd), termios.TCSANOW, (*unix.Termios)(&n)) } diff --git a/internal/term/term.go b/internal/term/term.go index 3f3a53c0..8b9b966d 100644 --- a/internal/term/term.go +++ b/internal/term/term.go @@ -10,16 +10,18 @@ import ( ) var ( - saveTermios *unix.Termios + saveTermios unix.Termios saveTermiosFD int saveTermiosOnce sync.Once ) -func getOriginalTermios(fd int) (*unix.Termios, error) { +func getOriginalTermios(fd int) (unix.Termios, error) { var err error saveTermiosOnce.Do(func() { saveTermiosFD = fd - saveTermios, err = termios.Tcgetattr(uintptr(fd)) + var saveTermiosPtr *unix.Termios + saveTermiosPtr, err = termios.Tcgetattr(uintptr(fd)) + saveTermios = *saveTermiosPtr }) return saveTermios, err } @@ -30,5 +32,5 @@ func Restore() error { if err != nil { return err } - return termios.Tcsetattr(uintptr(saveTermiosFD), termios.TCSANOW, o) + return termios.Tcsetattr(uintptr(saveTermiosFD), termios.TCSANOW, &o) }