20
20
21
21
#if defined(_WIN32 ) || defined(_WIN64 )
22
22
23
- typedef struct _FILE_NAME_INFORMATION {
24
- uint16_t FileNameLength ;
25
- WCHAR FileName [1 ];
26
- } FILE_NAME_INFORMATION , * PFILE_NAME_INFORMATION ;
23
+ typedef struct _UNICODE_STRING {
24
+ USHORT Length ;
25
+ USHORT MaximumLength ;
26
+ PWSTR Buffer ;
27
+ } UNICODE_STRING , * PUNICODE_STRING ;
27
28
29
+ typedef struct _OBJECT_NAME_INFORMATION {
30
+ UNICODE_STRING Name ;
31
+ WCHAR NameBuffer [0 ];
32
+ } OBJECT_NAME_INFORMATION , * POBJECT_NAME_INFORMATION ;
28
33
29
34
typedef enum {
30
35
ObjectBasicInformation ,
@@ -46,17 +51,17 @@ JNIEXPORT jint JNICALL CLibrary_NATIVE(isatty)
46
51
47
52
ULONG result ;
48
53
BYTE buffer [1024 ];
49
- PFILE_NAME_INFORMATION nameinfo = (PFILE_NAME_INFORMATION ) buffer ;
54
+ POBJECT_NAME_INFORMATION nameinfo = (POBJECT_NAME_INFORMATION ) buffer ;
50
55
PWSTR name ;
56
+ DWORD mode ;
51
57
52
58
/* check if fd is a pipe */
53
59
HANDLE h = (HANDLE ) _get_osfhandle (arg0 );
54
60
DWORD t = GetFileType (h );
55
61
if (t == FILE_TYPE_CHAR ) {
56
- rc = 1 ;
57
- }
58
- else if (t != FILE_TYPE_PIPE ) {
59
- rc = 0 ;
62
+ // check that this is a real tty because the /dev/null
63
+ // and /dev/zero streams are also of type FILE_TYPE_CHAR
64
+ rc = GetConsoleMode (h , & mode ) != 0 ;
60
65
}
61
66
else {
62
67
if (hModuleNtDll == 0 ) {
@@ -78,17 +83,19 @@ JNIEXPORT jint JNICALL CLibrary_NATIVE(isatty)
78
83
}
79
84
else {
80
85
81
- name = nameinfo -> FileName ;
82
- name [nameinfo -> FileNameLength / sizeof (* name )] = 0 ;
86
+ name = nameinfo -> Name .Buffer ;
87
+ name [nameinfo -> Name .Length / 2 ] = 0 ;
88
+
89
+ //fprintf( stderr, "Standard stream %d: pipe name: %S\n", arg0, name);
83
90
84
91
/*
85
92
* Check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX')
86
93
* or a cygwin pty pipe ('cygwin-XXXX-ptyN-XX')
87
94
*/
88
- if ((!wcsstr (name , L"msys-" ) && !wcsstr (name , L"cygwin-" ))
89
- || !wcsstr (name , L"-pty" )) {
95
+ if ((wcsstr (name , L"msys-" ) || wcsstr (name , L"cygwin-" )) && wcsstr (name , L"-pty" )) {
90
96
rc = 1 ;
91
97
} else {
98
+ // This is definitely not a tty
92
99
rc = 0 ;
93
100
}
94
101
}
0 commit comments