diff options
Diffstat (limited to 'driver')
-rw-r--r-- | driver/ghci/ghc.mk | 2 | ||||
-rw-r--r-- | driver/ghci/ghci.c | 5 | ||||
-rw-r--r-- | driver/utils/isMinTTY.c | 33 | ||||
-rw-r--r-- | driver/utils/isMinTTY.h | 8 |
4 files changed, 45 insertions, 3 deletions
diff --git a/driver/ghci/ghc.mk b/driver/ghci/ghc.mk index 240e16ff71..41d1f15c17 100644 --- a/driver/ghci/ghc.mk +++ b/driver/ghci/ghc.mk @@ -29,7 +29,7 @@ install_driver_ghci: else # Windows_Host... -driver/ghci_dist_C_SRCS = ghci.c ../utils/cwrapper.c ../utils/getLocation.c +driver/ghci_dist_C_SRCS = ghci.c ../utils/cwrapper.c ../utils/getLocation.c ../utils/isMinTTY.c driver/ghci_dist_CC_OPTS += -I driver/utils driver/ghci_dist_PROGNAME = ghci driver/ghci_dist_INSTALL = YES diff --git a/driver/ghci/ghci.c b/driver/ghci/ghci.c index f358d960d7..ebf13d8ba7 100644 --- a/driver/ghci/ghci.c +++ b/driver/ghci/ghci.c @@ -1,6 +1,7 @@ #include "cwrapper.h" #include "getLocation.h" +#include "isMinTTY.h" #include <stdio.h> #include <stdlib.h> #include <windows.h> @@ -15,8 +16,8 @@ int main(int argc, char** argv) { char *exePath; char *preArgv[1]; - if (getenv("_")) { - printf("WARNING: GHCi invoked via 'ghci.exe' in *nix-like shells (cygwin-bash, in particular)\n"); + if (isMinTTY()) { + printf("WARNING: GHCi invoked via 'ghci.exe' in MinTTY consoles (e.g., Cygwin or MSYS)\n"); printf(" doesn't handle Ctrl-C well; use the 'ghcii.sh' shell wrapper instead\n"); fflush(stdout); } diff --git a/driver/utils/isMinTTY.c b/driver/utils/isMinTTY.c new file mode 100644 index 0000000000..3b3ae27bf3 --- /dev/null +++ b/driver/utils/isMinTTY.c @@ -0,0 +1,33 @@ +/* + * We need Vista headers to use the GetFileInformationByHandleEx function and + * the FILE_NAME_INFO struct. + */ +#define WINVER 0x0600 +#define _WIN32_WINNT 0x0600 + +#include <stdbool.h> +#include <windows.h> +#include "isMINTTY.h" + +bool isMinTTY() { + const HANDLE h = GetStdHandle(STD_ERROR_HANDLE); + if (h == NULL || h == INVALID_HANDLE_VALUE) { + return false; + } else if (GetFileType(h) != FILE_TYPE_PIPE) { + return false; + } + + const unsigned long bufSize = sizeof(DWORD) + MAX_PATH * sizeof(WCHAR); + BYTE buf[bufSize]; + PFILE_NAME_INFO pfni = (PFILE_NAME_INFO) buf; + + if (!GetFileInformationByHandleEx(h, FileNameInfo, buf, bufSize)) { + return false; + } + + PWSTR fn = pfni->FileName; + fn[pfni->FileNameLength] = L'\0'; + + return ((wcsstr(fn, L"\\cygwin-") || wcsstr(fn, L"\\msys-")) && + wcsstr(fn, L"-pty") && wcsstr(fn, L"-master")); +} diff --git a/driver/utils/isMinTTY.h b/driver/utils/isMinTTY.h new file mode 100644 index 0000000000..22e9a473cc --- /dev/null +++ b/driver/utils/isMinTTY.h @@ -0,0 +1,8 @@ +#ifndef ISMINTTY_H +#define ISMINTTY_H + +#include <stdbool.h> + +bool isMinTTY(); + +#endif /* ISMINTTY_H */ |