     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

    //! Helper module which provides a function to test
    //! if stdout is a tty.

    cfg_if::cfg_if! {
        if #[cfg(unix)] {
            pub fn stdout_isatty() -> bool {
                unsafe { libc::isatty(libc::STDOUT_FILENO) != 0 }
            }
        } else if #[cfg(windows)] {
            pub fn stdout_isatty() -> bool {
                type DWORD = u32;
                type BOOL = i32;
                type HANDLE = *mut u8;
                type LPDWORD = *mut u32;
                const STD_OUTPUT_HANDLE: DWORD = -11i32 as DWORD;
                extern "system" {
                    fn GetStdHandle(which: DWORD) -> HANDLE;
                    fn GetConsoleMode(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL;
                }
                unsafe {
                    let handle = GetStdHandle(STD_OUTPUT_HANDLE);
                    let mut out = 0;
                    GetConsoleMode(handle, &mut out) != 0
                }
            }
        } else {
            // FIXME: Implement isatty on SGX
            pub fn stdout_isatty() -> bool {
                false
            }
        }
    }