package main import ( "os" "golang.org/x/sys/unix" ) // hideTyping turns a terminal's echo off while a secret is typed at it, and gives back what restores it. On // anything that is not a terminal (a pipe, a file) it does nothing. func hideTyping(f *os.File) func() { fd := int(f.Fd()) before, err := unix.IoctlGetTermios(fd, unix.TCGETS) if err != nil { return func() {} } hidden := *before hidden.Lflag &^= unix.ECHO if err := unix.IoctlSetTermios(fd, unix.TCSETS, &hidden); err != nil { return func() {} } return func() { _ = unix.IoctlSetTermios(fd, unix.TCSETS, before) _, _ = os.Stderr.WriteString("\n") } }