isatty()

Jeff Johnston jjohnstn@redhat.com
Fri Jan 4 18:32:00 GMT 2008


Jeff Johnston wrote:
> Vincent Rivière wrote:
>> Jeff Johnston a wrote :
>>> _isatty is not one of the fundamental syscalls required by newlib.  
>>> Remember that newlib's historical origin was to support embedded 
>>> platforms and it only required a small set of syscalls to support 
>>> the ANSI C plus miscellaneous functions.  There is a rough isatty() 
>>> implementation in libc/posix that uses fstat, not _isatty.
>>>
>>> Platforms that have wanted it have typically just done so directly 
>>> in their libgloss implementation or libc/sys (used before libgloss 
>>> was created) or they use the libc/posix implementation or they use 
>>> the default libgloss/isatty.c version (always returns 1) or they let 
>>> libnosys resolve it (always returns 0) just to allow tests to link/run.
>>
>> I understand.
>> But there are 2 problems :
>>
>> 1) isatty() is currently fundamental, because without it, a simple 
>> printf() cannot link !
>> isatty() is used at the bottom of libc/stdio/makebuf.c
>>
>> 2) The isatty() implementation in libgloss/libnosys/isatty.c uses the 
>> wrong errno. It should only #include <errno.h>, without #undef errno, 
>> extern int errno.
>>
> Hmm, there are huge inconsistencies here.  The isatty syscall hasn't 
> been made compulsory like the other newlib syscalls in that there is 
> neither _isatty or _isatty_r calls in the library, but it should have 
> been or at the very least, something like the libc/posix isatty 
> implementation should have been exposed to be overridden if desired.
>
> The isatty in libnosys should probably be changed to be consistent 
> with other libnosys syscalls and implement _isatty.
>
> It will take some unravelling to see if adding _isatty_r will break 
> things or not for existing platforms.  For example, Cygwin is using 
> the libc/posix isatty and also uses libc/syscalls which would override 
> libc/posix in the case of the same object name.
>
> I need to look at this a bit.
>
> -- Jeff J.
Ok, I have checked in patches to both libgloss and newlib.  I have 
tested x86-linux and mn10300.  It should work the same as before for 
Cygwin and powerpcle-*-pe because the libc/posix directory supplies 
isatty which calls _isatty which is also supplied in libc/posix.  The 
two stdio routines now call _isatty_r which is always supplied in 
libc/reent and calls either _isatty_r or _isatty.  Again, Cygwin should 
not see a change since it will end up calling the _isatty implementation 
in libc/posix.

For x86-linux, it was also using libc/posix.  I added a new isatty 
implementation in sys/linux which will override the posix definition.  
It works fine according to the test I performed.  I might in the future 
want to not use the lib/posix directory and have the isatty also name 
_isatty.

I changed various libgloss implementations to rename isatty to be 
_isatty.  Thus, they should hook up with _isatty_r as desired.  These 
platforms were using the libc/syscalls directory which now has a isatty 
implemenation.  Libnosys is also renamed its isatty to be _isatty.  
Consistent now.

If anybody finds a problem,  just post it here.

-- Jeff J.



More information about the Newlib mailing list