44 lines
890 B
Go
44 lines
890 B
Go
![]() |
// +build windows
|
||
|
|
||
|
package speakeasy
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"syscall"
|
||
|
)
|
||
|
|
||
|
// SetConsoleMode function can be used to change value of ENABLE_ECHO_INPUT:
|
||
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx
|
||
|
const ENABLE_ECHO_INPUT = 0x0004
|
||
|
|
||
|
func getPassword() (password string, err error) {
|
||
|
hStdin := syscall.Handle(os.Stdin.Fd())
|
||
|
var oldMode uint32
|
||
|
|
||
|
err = syscall.GetConsoleMode(hStdin, &oldMode)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var newMode uint32 = (oldMode &^ ENABLE_ECHO_INPUT)
|
||
|
|
||
|
err = setConsoleMode(hStdin, newMode)
|
||
|
defer setConsoleMode(hStdin, oldMode)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
return readline()
|
||
|
}
|
||
|
|
||
|
func setConsoleMode(console syscall.Handle, mode uint32) (err error) {
|
||
|
dll := syscall.MustLoadDLL("kernel32")
|
||
|
proc := dll.MustFindProc("SetConsoleMode")
|
||
|
r, _, err := proc.Call(uintptr(console), uintptr(mode))
|
||
|
|
||
|
if r == 0 {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|