]>
Commit | Line | Data |
---|---|---|
15c0b25d AP |
1 | // +build windows |
2 | ||
3 | package speakeasy | |
4 | ||
5 | import ( | |
6 | "syscall" | |
7 | ) | |
8 | ||
9 | // SetConsoleMode function can be used to change value of ENABLE_ECHO_INPUT: | |
10 | // http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx | |
11 | const ENABLE_ECHO_INPUT = 0x0004 | |
12 | ||
13 | func getPassword() (password string, err error) { | |
14 | var oldMode uint32 | |
15 | ||
16 | err = syscall.GetConsoleMode(syscall.Stdin, &oldMode) | |
17 | if err != nil { | |
18 | return | |
19 | } | |
20 | ||
21 | var newMode uint32 = (oldMode &^ ENABLE_ECHO_INPUT) | |
22 | ||
23 | err = setConsoleMode(syscall.Stdin, newMode) | |
24 | defer setConsoleMode(syscall.Stdin, oldMode) | |
25 | if err != nil { | |
26 | return | |
27 | } | |
28 | ||
29 | return readline() | |
30 | } | |
31 | ||
32 | func setConsoleMode(console syscall.Handle, mode uint32) (err error) { | |
33 | dll := syscall.MustLoadDLL("kernel32") | |
34 | proc := dll.MustFindProc("SetConsoleMode") | |
35 | r, _, err := proc.Call(uintptr(console), uintptr(mode)) | |
36 | ||
37 | if r == 0 { | |
38 | return err | |
39 | } | |
40 | return nil | |
41 | } |