From 168667c972a1e9ede5b64ad6cee0666e9b96d4d8 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 14 Nov 2014 14:42:59 -0800 Subject: [PATCH] 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 --- libc/include/stdio.h | 13 +++++++++---- libc/stdio/fileext.h | 4 ---- libc/stdio/findfp.c | 5 ++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/libc/include/stdio.h b/libc/include/stdio.h index a7ec615ff..c0dac1a8f 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. */ diff --git a/libc/stdio/fileext.h b/libc/stdio/fileext.h index 7efff8f1b..dc89fff71 100644 --- a/libc/stdio/fileext.h +++ b/libc/stdio/fileext.h @@ -43,10 +43,6 @@ struct __sfileext { pthread_mutex_t _lock; /* file lock */ }; -__LIBC_HIDDEN__ extern struct __sfileext __sFext[3]; - -#define _FILEEXT_INITIALIZER {{NULL,0},{0},PTHREAD_RECURSIVE_MUTEX_INITIALIZER} - #define _EXT(fp) ((struct __sfileext *)((fp)->_ext._base)) #define _UB(fp) _EXT(fp)->_ub #define _FLOCK(fp) _EXT(fp)->_lock diff --git a/libc/stdio/findfp.c b/libc/stdio/findfp.c index ef8e9e64f..5e51198a7 100644 --- a/libc/stdio/findfp.c +++ b/libc/stdio/findfp.c @@ -59,12 +59,15 @@ static struct glue uglue = { 0, FOPEN_MAX - 3, usual }; static struct glue *lastglue = &uglue; _THREAD_PRIVATE_MUTEX(__sfp_mutex); -struct __sfileext __sFext[3]; +static struct __sfileext __sFext[3]; FILE __sF[3] = { std(__SRD, STDIN_FILENO), /* stdin */ std(__SWR, STDOUT_FILENO), /* stdout */ std(__SWR|__SNBF, STDERR_FILENO) /* stderr */ }; +FILE* stdin = &__sF[0]; +FILE* stdout = &__sF[1]; +FILE* stderr = &__sF[2]; struct glue __sglue = { &uglue, 3, __sF }; static struct glue *