| // +build windows |
| |
| package speakeasy |
| |
| import ( |
| "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) { |
| var oldMode uint32 |
| |
| err = syscall.GetConsoleMode(syscall.Stdin, &oldMode) |
| if err != nil { |
| return |
| } |
| |
| var newMode uint32 = (oldMode &^ ENABLE_ECHO_INPUT) |
| |
| err = setConsoleMode(syscall.Stdin, newMode) |
| defer setConsoleMode(syscall.Stdin, 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 |
| } |