56 lines
1.9 KiB
Diff
56 lines
1.9 KiB
Diff
--- a/gcc/diagnostic-color.c 2018-01-03 16:03:58.000000000 +0600
|
|
+++ b/gcc/diagnostic-color.c 2018-08-02 16:33:22.679146900 +0600
|
|
@@ -22,6 +22,7 @@
|
|
|
|
#ifdef __MINGW32__
|
|
# include <windows.h>
|
|
+# include <winternl.h>
|
|
#endif
|
|
|
|
#include "color-macros.h"
|
|
@@ -208,10 +209,42 @@
|
|
to care about it either... */
|
|
HANDLE h;
|
|
DWORD m;
|
|
-
|
|
+ bool ret = false;
|
|
h = GetStdHandle (STD_ERROR_HANDLE);
|
|
- return (h != INVALID_HANDLE_VALUE) && (h != NULL)
|
|
+ ret = (h != INVALID_HANDLE_VALUE) && (h != NULL)
|
|
&& GetConsoleMode (h, &m);
|
|
+ if (!ret){
|
|
+ HMODULE ntdll = GetModuleHandle ("ntdll.dll");
|
|
+ if (ntdll != INVALID_HANDLE_VALUE){
|
|
+
|
|
+ typedef NTSTATUS NTAPI func_NtQueryObject (HANDLE, OBJECT_INFORMATION_CLASS,
|
|
+ PVOID, ULONG, PULONG);
|
|
+ func_NtQueryObject *fNtQueryObject =
|
|
+ (func_NtQueryObject*) GetProcAddress (ntdll, "NtQueryObject");
|
|
+ if (fNtQueryObject){
|
|
+
|
|
+ ULONG s = 0xffff * sizeof (WCHAR);
|
|
+ OBJECT_NAME_INFORMATION *oni = (OBJECT_NAME_INFORMATION*) xmalloc (s);
|
|
+ ULONG len;
|
|
+ /* mintty uses a named pipe like "ptyNNNN-to-master". */
|
|
+ if (!fNtQueryObject (h, ObjectNameInformation, oni, s, &len))
|
|
+ {
|
|
+ wchar_t namedPipe[] = L"\\Device\\NamedPipe\\";
|
|
+ size_t l1 = sizeof (namedPipe) / 2 - 1;
|
|
+ wchar_t toMaster[] = L"-to-master";
|
|
+ size_t l2 = sizeof (toMaster) / 2 - 1;
|
|
+ USHORT name_length = oni->Name.Length / 2;
|
|
+ if (name_length > l1 + l2 &&
|
|
+ !memcmp (oni->Name.Buffer, namedPipe, l1 * 2) &&
|
|
+ !memcmp (oni->Name.Buffer + (name_length - l2), toMaster, l2 * 2))
|
|
+ ret = true;
|
|
+ }
|
|
+
|
|
+ free (oni);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return ret;
|
|
#else
|
|
char const *t = getenv ("TERM");
|
|
return t && strcmp (t, "dumb") != 0 && isatty (STDERR_FILENO);
|