From 1b28f276a890e828b6800e774df66e51a11e852d Mon Sep 17 00:00:00 2001 From: Matthew Gabeler-Lee Date: Thu, 17 Mar 2022 07:58:03 -0400 Subject: [PATCH] fix: ensure terminal has required read settings in non-canonical mode (#409) --- 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