diff options
author | Vladislav Vaintroub <wlad@montyprogram.com> | 2013-02-21 21:46:24 +0100 |
---|---|---|
committer | Vladislav Vaintroub <wlad@montyprogram.com> | 2013-02-21 21:46:24 +0100 |
commit | c6d31b279b36dd89ccc2d78c2a87e4c8d1ff0c06 (patch) | |
tree | dbfdb26d89179db6cde44e6f551e4ea60c40d8f6 /libmysql | |
parent | e03e9aab7304395575d8ae3a54835fec854dd872 (diff) | |
download | mariadb-git-c6d31b279b36dd89ccc2d78c2a87e4c8d1ff0c06.tar.gz |
MDEV-4021 : Enable Ctrl-C handler when reading password, on Windows.
Prior to this patch, _getch() was used to read password input from console. getch() has a property that it reads Ctrl-C as character with ASCII code 0x03, and disregards Ctrl-C handler for current process.
The fix is to use ReadConsole() API instead of getch() , after setting console mode to ENABLE_PROCESSED_INPUT - this mode allows current process to handle Ctrl-C events.
Diffstat (limited to 'libmysql')
-rw-r--r-- | libmysql/get_password.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/libmysql/get_password.c b/libmysql/get_password.c index 16f6b25822d..e65bd6de2f6 100644 --- a/libmysql/get_password.c +++ b/libmysql/get_password.c @@ -62,13 +62,34 @@ /* were just going to fake it here and get input from the keyboard */ void get_tty_password_buff(const char *opt_message, char *to, size_t length) { + HANDLE consoleinput;
+ DWORD oldstate; char *pos=to,*end=to+length-1; int i=0; + + consoleinput= GetStdHandle(STD_INPUT_HANDLE); + if (!consoleinput) + { + /* This is a GUI application or service without console input, bail out. */ + *to= 0; + return; + } _cputs(opt_message ? opt_message : "Enter password: "); + + /*
+ Switch to raw mode (no line input, no echo input).
+ Allow Ctrl-C handler with ENABLE_PROCESSED_INPUT.
+ */
+ GetConsoleMode(consoleinput, &oldstate);
+ SetConsoleMode(consoleinput, ENABLE_PROCESSED_INPUT); for (;;) { - int tmp; - tmp=_getch(); + char tmp; + DWORD chars_read; + if (!ReadConsole(consoleinput, &tmp, 1, &chars_read, NULL)) + break; + if (chars_read == 0) + break; if (tmp == '\b' || tmp == 127) { if (pos != to) @@ -78,13 +99,15 @@ void get_tty_password_buff(const char *opt_message, char *to, size_t length) continue; } } - if (tmp == -1 || tmp == '\n' || tmp == '\r' || tmp == 3) + if (tmp == '\n' || tmp == '\r') break; if (iscntrl(tmp) || pos == end) continue; _cputs("*"); - *(pos++) = (char)tmp; + *(pos++) = tmp; } + /* Reset console mode after password input. */ + SetConsoleMode(consoleinput, oldstate); *pos=0; _cputs("\n"); } |