summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/ghci/ghc.mk2
-rw-r--r--driver/ghci/ghci.c5
-rw-r--r--driver/utils/isMinTTY.c33
-rw-r--r--driver/utils/isMinTTY.h8
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 */