diff options
author | Elliott Hughes <enh@google.com> | 2014-11-14 14:42:59 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-11-14 14:42:59 -0800 |
commit | 168667c972a1e9ede5b64ad6cee0666e9b96d4d8 (patch) | |
tree | d4312b237b885460537ce9dc8fe53e26564a7d48 /libc/include | |
parent | 898aab282cff2a2949bc1726f8a4b81c1c30148e (diff) | |
download | bionic-168667c972a1e9ede5b64ad6cee0666e9b96d4d8.zip bionic-168667c972a1e9ede5b64ad6cee0666e9b96d4d8.tar.gz bionic-168667c972a1e9ede5b64ad6cee0666e9b96d4d8.tar.bz2 |
Add non-macro stdin/stdout/stderr too.
Various C and C++ standards explicitly say that stdin/stdout/stderr
should be macros, but glibc makes them global variables too. This
means it's possible to write code that uses those names as locals,
but that code (toybox being an example) won't build on bionic.
If we'd done this earlier, we could have hidden __sF for LP64, but
it's too late now.
Change-Id: I90cf8c73f52b66e1760b8fa2e135b9f9f9651230
Diffstat (limited to 'libc/include')
-rw-r--r-- | libc/include/stdio.h | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/libc/include/stdio.h b/libc/include/stdio.h index a7ec615..c0dac1a 100644 --- a/libc/include/stdio.h +++ b/libc/include/stdio.h @@ -146,7 +146,16 @@ typedef struct __sFILE { fpos_t _offset; /* current lseek offset */ } FILE; +/* Legacy BSD implementation of stdin/stdout/stderr. */ extern FILE __sF[]; +/* More obvious implementation. */ +extern FILE* stdin; +extern FILE* stdout; +extern FILE* stderr; +/* C99 and earlier plus current C++ standards say these must be macros. */ +#define stdin stdin +#define stdout stdout +#define stderr stderr #define __SLBF 0x0001 /* line buffered */ #define __SNBF 0x0002 /* unbuffered */ @@ -209,10 +218,6 @@ extern FILE __sF[]; #define SEEK_END 2 /* set file offset to EOF plus offset */ #endif -#define stdin (&__sF[0]) -#define stdout (&__sF[1]) -#define stderr (&__sF[2]) - /* * Functions defined in ANSI C standard. */ |