X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=cbits%2FconsUtils.c;h=b20eb7ae07c496c55b20c8943fc058b868863aab;hb=7dbb606d7b57cdad87a0ffbdb6ea4a274ebca7c0;hp=fa11000594ea4f9bc7784336635cb8476989bdf5;hpb=5f18f21db608de60eaf77bb16745937c58f798a9;p=ghc-base.git diff --git a/cbits/consUtils.c b/cbits/consUtils.c index fa11000..b20eb7a 100644 --- a/cbits/consUtils.c +++ b/cbits/consUtils.c @@ -14,6 +14,29 @@ #define _get_osfhandle get_osfhandle #endif +int is_console__(int fd) { + DWORD st; + HANDLE h; + if (!_isatty(fd)) { + /* TTY must be a character device */ + return 0; + } + h = (HANDLE)_get_osfhandle(fd); + if (h == INVALID_HANDLE_VALUE) { + /* Broken handle can't be terminal */ + return 0; + } + if (!GetConsoleMode(h, &st)) { + /* GetConsoleMode appears to fail when it's not a TTY. In + particular, it's what most of our terminal functions + assume works, so if it doesn't work for all intents + and purposes we're not dealing with a terminal. */ + return 0; + } + return 1; +} + + int set_console_buffering__(int fd, int cooked) { @@ -25,13 +48,10 @@ set_console_buffering__(int fd, int cooked) DWORD flgs = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT; if ( (h = (HANDLE)_get_osfhandle(fd)) != INVALID_HANDLE_VALUE ) { - /* Only for console-connected Handles */ - if ( GetFileType(h) == FILE_TYPE_CHAR ) { if ( GetConsoleMode(h,&st) && - SetConsoleMode(h, cooked ? (st | flgs) : st & ~flgs) ) { + SetConsoleMode(h, cooked ? (st | ENABLE_LINE_INPUT) : st & ~flgs) ) { return 0; - } - } + } } return -1; }