X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fisatty.c;h=e38bc9d9aaf6a3c37e418419e6637fd50a53fd72;hb=7ef6c64e210ac0979d7e8ac69bc5b5208c2405ab;hp=fa70001eeb71f9d3657191f2da4dd4bd46d9b4a0;hpb=39065e3b61f9c359b6c01739be9bccea9643ea7c;p=gnulib.git diff --git a/lib/isatty.c b/lib/isatty.c index fa70001ee..e38bc9d9a 100644 --- a/lib/isatty.c +++ b/lib/isatty.c @@ -1,5 +1,5 @@ /* isatty() replacement. - Copyright (C) 2012 Free Software Foundation, Inc. + Copyright (C) 2012-2014 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,10 +34,10 @@ /* Optimized test whether a HANDLE refers to a console. See . */ -#define IsConsoleHandle(h) (((long) (h) & 3) == 3) +#define IsConsoleHandle(h) (((intptr_t) (h) & 3) == 3) #if HAVE_MSVC_INVALID_PARAMETER_HANDLER -static inline int +static int _isatty_nothrow (int fd) { int result; @@ -48,8 +48,7 @@ _isatty_nothrow (int fd) } CATCH_MSVC_INVAL { - result = -1; - errno = EBADF; + result = 0; } DONE_MSVC_INVAL; @@ -59,15 +58,24 @@ _isatty_nothrow (int fd) # define _isatty_nothrow _isatty #endif +/* Determine whether FD refers to a console device. Return 1 if yes. + Return 0 and set errno if no. (ptsname_r relies on the errno value.) */ int isatty (int fd) { - /* _isatty (fd) tests whether GetFileType of the handle is FILE_TYPE_CHAR. */ + HANDLE h = (HANDLE) _get_osfhandle (fd); + if (h == INVALID_HANDLE_VALUE) + { + errno = EBADF; + return 0; + } + /* _isatty (fd) tests whether GetFileType of the handle is FILE_TYPE_CHAR. + But it does not set errno when it returns 0. */ if (_isatty_nothrow (fd)) { - HANDLE h = (HANDLE) _get_osfhandle (fd); - return IsConsoleHandle (h); + if (IsConsoleHandle (h)) + return 1; } - else - return 0; + errno = ENOTTY; + return 0; }