Index: include/stdio.h =================================================================== --- include/stdio.h +++ include/stdio.h @@ -253,7 +253,9 @@ int fsetpos(FILE *, const fpos_t *); long ftell(FILE *); size_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict); -int getc(FILE *); +#ifndef __LIBC_C +static __inline int getc(FILE *); +#endif int getchar(void); char *gets(char *); void perror(const char *); @@ -302,7 +304,9 @@ char *ctermid(char *); FILE *fdopen(int, const char *); -int fileno(FILE *); +#ifndef __LIBC_C +static __inline int fileno(FILE *); +#endif #endif /* __POSIX_VISIBLE */ #if __POSIX_VISIBLE >= 199209 @@ -319,7 +323,9 @@ * These are normally used through macros as defined below, but POSIX * requires functions as well. */ -int getc_unlocked(FILE *); +#ifndef __LIBC_C +static __inline int getc_unlocked(FILE *); +#endif int getchar_unlocked(void); int putc_unlocked(int, FILE *); int putchar_unlocked(int); @@ -328,7 +334,9 @@ void clearerr_unlocked(FILE *); int feof_unlocked(FILE *); int ferror_unlocked(FILE *); -int fileno_unlocked(FILE *); +#ifndef __LIBC_C +static __inline int fileno_unlocked(FILE *); +#endif #endif #if __POSIX_VISIBLE >= 200112 @@ -482,23 +490,61 @@ extern int __isthreaded; +#define __sfileno(p) ((p)->_file) + +#if __POSIX_VISIBLE +#ifndef __LIBC_C +extern int __fileno_mt(FILE *fp); +extern int __getc_mt(FILE *fp); + +static __inline int +fileno(FILE *p) +{ + return (!__isthreaded ? __sfileno(p) : (__fileno_mt)(p)); +} + +static __inline int +getc(FILE *p) +{ + return (!__isthreaded ? __sgetc(p) : (__getc_mt)(p)); +} +#endif +#endif + +#if __BSD_VISIBLE +/* + * See ISO/IEC 9945-1 ANSI/IEEE Std 1003.1 Second Edition 1996-07-12 + * B.8.2.7 for the rationale behind the *_unlocked() macros. + */ +#ifndef __LIBC_C +static __inline int +fileno_unlocked(FILE *p) +{ + return __sfileno(p); +} + +#if __POSIX_VISIBLE >= 199506 +static __inline int +getc_unlocked(FILE *p) +{ + return __sgetc(p); +} +#endif + +#endif +#endif + #ifndef __cplusplus #define __sfeof(p) (((p)->_flags & __SEOF) != 0) #define __sferror(p) (((p)->_flags & __SERR) != 0) #define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) -#define __sfileno(p) ((p)->_file) #define feof(p) (!__isthreaded ? __sfeof(p) : (feof)(p)) #define ferror(p) (!__isthreaded ? __sferror(p) : (ferror)(p)) #define clearerr(p) (!__isthreaded ? __sclearerr(p) : (clearerr)(p)) -#if __POSIX_VISIBLE -#define fileno(p) (!__isthreaded ? __sfileno(p) : (fileno)(p)) -#endif - -#define getc(fp) (!__isthreaded ? __sgetc(fp) : (getc)(fp)) #define putc(x, fp) (!__isthreaded ? __sputc(x, fp) : (putc)(x, fp)) #define getchar() getc(stdin) @@ -512,10 +558,8 @@ #define feof_unlocked(p) __sfeof(p) #define ferror_unlocked(p) __sferror(p) #define clearerr_unlocked(p) __sclearerr(p) -#define fileno_unlocked(p) __sfileno(p) #endif #if __POSIX_VISIBLE >= 199506 -#define getc_unlocked(fp) __sgetc(fp) #define putc_unlocked(x, fp) __sputc(x, fp) #define getchar_unlocked() getc_unlocked(stdin) Index: lib/libc/stdio/Symbol.map =================================================================== --- lib/libc/stdio/Symbol.map +++ lib/libc/stdio/Symbol.map @@ -164,6 +164,8 @@ FBSD_1.4 { fdclose; + __fileno_mt; + __getc_mt; }; FBSDprivate_1.0 { Index: lib/libc/stdio/fileno.c =================================================================== --- lib/libc/stdio/fileno.c +++ lib/libc/stdio/fileno.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" +#define __LIBC_C #include #include "un-namespace.h" #include "libc_private.h" @@ -56,6 +57,22 @@ return (fd); } +/* + * wrapper for fileno() above, this is to be only used inside stdio.h static __inline fileno() wrapper + * to avoid symbol conflict for multithreaded programs (that causes infinite recursion). + */ +#if defined(__strong_reference) +__strong_reference(fileno, __fileno_mt); +#elif defined(__weak_reference) +__weak_reference(fileno, __fileno_mt); +#else +int +__fileno_mt(FILE *fp) +{ + return fileno(fp); +} +#endif + int fileno_unlocked(FILE *fp) { Index: lib/libc/stdio/getc.c =================================================================== --- lib/libc/stdio/getc.c +++ lib/libc/stdio/getc.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" +#define __LIBC_C #include #include "un-namespace.h" #include "libc_private.h" @@ -57,6 +58,23 @@ return (retval); } +/* + * wrapper for getc() above, this is to be only used inside stdio.h static __inline getc() wrapper + * to avoid symbol conflict for multithreaded programs (that causes infinite recursion). + */ +#if defined(__strong_reference) +__strong_reference(getc, __getc_mt); +#elif defined(__weak_reference) +__weak_reference(getc, __getc_mt); +#else +int +__getc_mt(FILE *fp) +{ + return getc(fp); +} +#endif + + int getc_unlocked(FILE *fp) {