39 lines
606 B
Go
39 lines
606 B
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
|
||
|
"golang.org/x/sys/unix"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
stdinTTY = &tty{int(os.Stdin.Fd()), nil}
|
||
|
)
|
||
|
|
||
|
type tty struct {
|
||
|
fd int
|
||
|
termios *unix.Termios
|
||
|
}
|
||
|
|
||
|
func (t *tty) EchoOff() {
|
||
|
termios, err := unix.IoctlGetTermios(t.fd, unix.TCGETS)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
t.termios = termios
|
||
|
|
||
|
newState := *termios
|
||
|
newState.Lflag &^= unix.ECHO
|
||
|
newState.Lflag |= unix.ICANON | unix.ISIG
|
||
|
newState.Iflag |= unix.ICRNL
|
||
|
unix.IoctlSetTermios(t.fd, unix.TCSETS, &newState)
|
||
|
}
|
||
|
|
||
|
func (t *tty) Restore() {
|
||
|
if t.termios != nil {
|
||
|
unix.IoctlSetTermios(t.fd, unix.TCSETS, t.termios)
|
||
|
t.termios = nil
|
||
|
}
|
||
|
}
|