From: Jeff Latimer jeff_lats@hotmail.com
--- programs/cmd/batch.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c index 20ae894dbfd..1cd883c0621 100644 --- a/programs/cmd/batch.c +++ b/programs/cmd/batch.c @@ -223,17 +223,32 @@ WCHAR *WCMD_fgets(WCHAR *buf, DWORD noChars, HANDLE h) DWORD charsRead; BOOL status; DWORD i; + DWORD conmode, oldconmode; + CONSOLE_READCONSOLE_CONTROL control; + + GetConsoleMode(h, &oldconmode); + conmode = oldconmode & ~ENABLE_PROCESSED_INPUT; + SetConsoleMode(h, conmode); + control.nLength = sizeof(CONSOLE_READCONSOLE_CONTROL); + control.nInitialChars = 0; + control.dwCtrlWakeupMask = 0x0008; + control.dwConsoleKeyState = 0;
/* We can't use the native f* functions because of the filename syntax differences between DOS and Unix. Also need to lose the LF (or CRLF) from the line. */
- if (VerifyConsoleIoHandle(h) && ReadConsoleW(h, buf, noChars, &charsRead, NULL) && charsRead) { + if (VerifyConsoleIoHandle(h) && ReadConsoleW(h, buf, noChars, &charsRead, &control) && charsRead) { + SetConsoleMode(h, oldconmode); if (!charsRead) return NULL;
/* Find first EOL */ for (i = 0; i < charsRead; i++) { if (buf[i] == '\n' || buf[i] == '\r') break; + if (buf[i] == 0x03) { + WCMD_output(L"^C\n"); + i = 0; + break;} } } else { @@ -242,6 +257,7 @@ WCHAR *WCMD_fgets(WCHAR *buf, DWORD noChars, HANDLE h) UINT cp; const char *p;
+ SetConsoleMode(h, oldconmode); cp = GetOEMCP(); bufA = xalloc(noChars);