From c60389eee7d3a6db3501a52b33512a156546c9a4 Mon Sep 17 00:00:00 2001 From: Matthew Gabeler-Lee Date: Wed, 16 Feb 2022 10:53:17 -0500 Subject: [PATCH] fix: ensure terminal has required read settings in non-canonical mode fixes #408 --- terminal/runereader_posix.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/terminal/runereader_posix.go b/terminal/runereader_posix.go index 99cbf434..3b846049 100644 --- a/terminal/runereader_posix.go +++ b/terminal/runereader_posix.go @@ -50,6 +50,11 @@ func (rr *RuneReader) SetTermMode() error { newState := rr.state.term newState.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG + // Because we are clearing canonical mode, we need to ensure VMIN & VTIME are + // set to the values we expect. This combination puts things in standard + // "blocking read" mode (see termios(3)). + newState.Cc[syscall.VMIN] = 1 + newState.Cc[syscall.VTIME] = 0 if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(rr.stdio.In.Fd()), ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 { return err