Index: lib/Support/Windows/Process.inc =================================================================== --- lib/Support/Windows/Process.inc +++ lib/Support/Windows/Process.inc @@ -18,6 +18,7 @@ #include "llvm/Support/StringSaver.h" #include "llvm/Support/WindowsError.h" #include +#include // The Windows.h header must be after LLVM and standard headers. #include "WindowsSupport.h" @@ -228,6 +229,40 @@ return std::error_code(); } +static bool IsMintty(HANDLE Console) { + bool ret = false; + 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*) malloc (s); + ULONG len; + /* mintty uses a named pipe like "ptyNNNN-to-master". */ + if (!fNtQueryObject (Console, 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; +} + std::error_code windows::GetCommandLineArguments(SmallVectorImpl &Args, BumpPtrAllocator &Alloc) { @@ -284,7 +319,13 @@ bool Process::FileDescriptorIsDisplayed(int fd) { DWORD Mode; // Unused - return (GetConsoleMode((HANDLE)_get_osfhandle(fd), &Mode) != 0); + HANDLE Console; + Console = (HANDLE)_get_osfhandle(fd); + bool ret = (GetConsoleMode(Console, &Mode) != 0); + if (!ret){ + ret = IsMintty(Console); + } + return ret; } unsigned Process::StandardOutColumns() { @@ -318,15 +359,21 @@ static bool UseANSI = false; void Process::UseANSIEscapeCodes(bool enable) { + DWORD Mode; + HANDLE Console; #if defined(ENABLE_VIRTUAL_TERMINAL_PROCESSING) if (enable) { - HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE); - DWORD Mode; + Console = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleMode(Console, &Mode); Mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; SetConsoleMode(Console, Mode); } #endif + Console = GetStdHandle (STD_ERROR_HANDLE); + bool ret = (GetConsoleMode(Console, &Mode) != 0); + if (!ret){ + enable = enable || IsMintty(Console); + } UseANSI = enable; }