On Wed, Jan 2, 2013 at 9:48 AM, Michael Goffioul <michael.goffi...@gmail.com > wrote:
> On Sun, Dec 23, 2012 at 3:51 PM, Michael Goffioul < > michael.goffi...@gmail.com> wrote: > >> On Sun, Dec 23, 2012 at 3:25 PM, Eli Zaretskii <e...@gnu.org> wrote: >> >>> > Date: Thu, 20 Dec 2012 19:02:03 -0500 >>> > From: Michael Goffioul <michael.goffi...@gmail.com> >>> > >>> > We've got a bug report in octave [1] that seems to indicate that >>> gnulib's >>> > replacement of isatty is incorrect on Windows 8 (it's fine up to >>> Windows >>> > 7). Looking at the implementation, it first calls the Windows _isatty >>> > version, then checks the last 2 bits of the handle associated with the >>> file >>> > descriptor, based on the assumption described in [2] (a console HANDLE >>> is >>> > not a multiple of 4). It seems that this last assumption is not valid >>> > anymore on Windows 8. >>> >>> Does the following work on Windows 8? >>> >>> #define ISATTY(fd) (isatty(fd) && lseek(fd,SEEK_CUR,0) == -1) >>> >>> and then use ISATTY instead of isatty. >>> >>> (The lseek test is to reject other character devices, most prominently >>> the null device, with MS implementation of isatty doesn't reject.) >>> >> >> I'll ask the bug reported to try it out (I don't have Windows 8). Paolo, >> note that there's an error in your suggested code, one should test "!= 0" >> instead of equality: GetConsoleMode returns non zero on success. >> >> > Someone has finally tested the suggestions under Windows 8. Paolo's > suggestion works OK, Eli's one does not. I attached the test utility. The > results are: > > test-tty.exe: > > isatty (stdin): 64 > IsConsoleHandle (stdin): 0 > IsConsoleHandle2 (stdin): 1 > ISATTY (stdin): 0 > > isatty (stdout): 64 > IsConsoleHandle (stdout): 0 > IsConsoleHandle2 (stdout): 1 > ISATTY (stdout): 0 > > test-tty.exe <NUL: > > isatty (stdin): 64 > IsConsoleHandle (stdin): 0 > IsConsoleHandle2 (stdin): 0 > ISATTY (stdin): 0 > > isatty (stdout): 64 > IsConsoleHandle (stdout): 0 > IsConsoleHandle2 (stdout): 1 > ISATTY (stdout): 0 > > > Note, the lseek call, as suggested, is incorrect [1]. The 2nd and 3rd > argument should be swapped. However it didn't make any difference in the > test results. > > Michael. > > [1] http://msdn.microsoft.com/en-us/library/1yee101t(v=vs.100).aspx > Just for the record, Eli's suggestion works fine on WinXP 32 bits. Michael.