Skip to content

Commit

Permalink
Merge branch 'kb/msys2-tty'
Browse files Browse the repository at this point in the history
The "are we talking with TTY, doing an interactive session?"
detection has been updated to work better for "Git for Windows".

* kb/msys2-tty:
  mingw: make isatty() recognize MSYS2's pseudo terminals (/dev/pty*)
  • Loading branch information
gitster committed May 30, 2016
2 parents 7777322 + f7f90e0 commit 07ffe87
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 5 deletions.
58 changes: 54 additions & 4 deletions compat/winansi.c
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,7 @@ static size_t sizeof_ioinfo = 0;
#define IOINFO_L2E 5
#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)

#define FPIPE 0x08
#define FDEV 0x40

static inline ioinfo* _pioinfo(int fd)
Expand Down Expand Up @@ -530,6 +531,45 @@ static HANDLE swap_osfhnd(int fd, HANDLE new_handle)
return old_handle;
}

#ifdef DETECT_MSYS_TTY

#include <winternl.h>
#include <ntstatus.h>

static void detect_msys_tty(int fd)
{
ULONG result;
BYTE buffer[1024];
POBJECT_NAME_INFORMATION nameinfo = (POBJECT_NAME_INFORMATION) buffer;
PWSTR name;

/* check if fd is a pipe */
HANDLE h = (HANDLE) _get_osfhandle(fd);
if (GetFileType(h) != FILE_TYPE_PIPE)
return;

/* get pipe name */
if (!NT_SUCCESS(NtQueryObject(h, ObjectNameInformation,
buffer, sizeof(buffer) - 2, &result)))
return;
name = nameinfo->Name.Buffer;
name[nameinfo->Name.Length] = 0;

/* check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX') */
if (!wcsstr(name, L"msys-") || !wcsstr(name, L"-pty"))
return;

/* init ioinfo size if we haven't done so */
if (init_sizeof_ioinfo())
return;

/* set FDEV flag, reset FPIPE flag */
_pioinfo(fd)->osflags &= ~FPIPE;
_pioinfo(fd)->osflags |= FDEV;
}

#endif

void winansi_init(void)
{
int con1, con2;
Expand All @@ -538,8 +578,15 @@ void winansi_init(void)
/* check if either stdout or stderr is a console output screen buffer */
con1 = is_console(1);
con2 = is_console(2);
if (!con1 && !con2)
if (!con1 && !con2) {
#ifdef DETECT_MSYS_TTY
/* check if stdin / stdout / stderr are MSYS2 pty pipes */
detect_msys_tty(0);
detect_msys_tty(1);
detect_msys_tty(2);
#endif
return;
}

/* create a named pipe to communicate with the console thread */
xsnprintf(name, sizeof(name), "\\\\.\\pipe\\winansi%lu", GetCurrentProcessId());
Expand Down Expand Up @@ -575,8 +622,11 @@ void winansi_init(void)
HANDLE winansi_get_osfhandle(int fd)
{
HANDLE hnd = (HANDLE) _get_osfhandle(fd);
if ((fd == 1 || fd == 2) && isatty(fd)
&& GetFileType(hnd) == FILE_TYPE_PIPE)
return (fd == 1) ? hconsole1 : hconsole2;
if (isatty(fd) && GetFileType(hnd) == FILE_TYPE_PIPE) {
if (fd == 1 && hconsole1)
return hconsole1;
else if (fd == 2 && hconsole2)
return hconsole2;
}
return hnd;
}
3 changes: 2 additions & 1 deletion config.mak.uname
Original file line number Diff line number Diff line change
Expand Up @@ -557,7 +557,8 @@ else
BASIC_LDFLAGS += -Wl,--large-address-aware
endif
CC = gcc
COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0
COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -DDETECT_MSYS_TTY
EXTLIBS += -lntdll
INSTALL = /bin/install
NO_R_TO_GCC_LINKER = YesPlease
INTERNAL_QSORT = YesPlease
Expand Down

0 comments on commit 07ffe87

Please sign in to comment.