use std::ffi::c_void;
use std::mem::size_of;
use std::os::windows::io::{AsRawHandle as _, BorrowedHandle};
use std::os::windows::raw::HANDLE;
use windows_sys::Win32::Foundation::MAX_PATH;
use windows_sys::Win32::Storage::FileSystem::{
FileNameInfo, GetFileInformationByHandleEx, GetFileType, FILE_TYPE_PIPE,
};
pub(super) fn msys_tty_on(handle: BorrowedHandle<'_>) -> bool {
unsafe { msys_tty_on_unsafe(handle.as_raw_handle()) }
}
pub(super) unsafe fn msys_tty_on_unsafe(handle: HANDLE) -> bool {
if GetFileType(handle) != FILE_TYPE_PIPE {
return false;
}
#[repr(C)]
#[allow(non_snake_case)]
struct FILE_NAME_INFO {
FileNameLength: u32,
FileName: [u16; MAX_PATH as usize],
}
let mut name_info = FILE_NAME_INFO {
FileNameLength: 0,
FileName: [0; MAX_PATH as usize],
};
let res = GetFileInformationByHandleEx(
handle,
FileNameInfo,
&mut name_info as *mut _ as *mut c_void,
size_of::<FILE_NAME_INFO>() as u32,
);
if res == 0 {
return false;
}
let s = match name_info
.FileName
.get(..name_info.FileNameLength as usize / 2)
{
None => return false,
Some(s) => s,
};
let name = String::from_utf16_lossy(s);
let name = name.rsplit('\\').next().unwrap_or(&name);
let is_msys = name.starts_with("msys-") || name.starts_with("cygwin-");
let is_pty = name.contains("-pty");
is_msys && is_pty
}