I'm trying to Turn off echoing in the terminal, in the Golang,
Code:
func main() {
STDINFILE := os.Stdin
STDINFILENO := 0
raw, err := unix.IoctlGetTermios(STDINFILENO, unix.TCGETA)
if err != nil {
panic(err)
}
rawState := *raw
rawState.Lflag &^= unix.ECHO
err = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState)
if err != nil {
panic(err)
}
var charValue byte
reader := bufio.NewReader(STDINFILE)
for {
var err error
// read one byte
charValue, err = reader.ReadByte()
if err != nil {
if err == io.EOF {
fmt.Println("END OF FILE")
}
}
// press q to quit.
if charValue == 'q' {
os.Exit(0)
}
}
}
But it's not working as expected
I'm still able to see the echoed value,
What I'm doing wrong, Can someone please point out to me or guide me?
The issue was with the tcsetattr - parameters
err = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState)
With action TCSAFLUSH
,
DOC SUGGEST:
TCSADRAIN Make the change after waiting until all queued output has been written. You should usually use this option when changing parameters that affect output. TCSAFLUSH This is like TCSADRAIN, but also discards any queued input.
So the termios
in above case was sending back the character out to the left (the “master” pty), as ECHO
was not off in this case until the output was written to the shell
(the “slave” pty ).
Changing the action to TCSANOW - the change shall occur immediately
turned the echo off immediately.