diff options
Diffstat (limited to 'lib/libc/stdio/ungetc.c')
| -rw-r--r-- | lib/libc/stdio/ungetc.c | 37 | 
1 files changed, 33 insertions, 4 deletions
| diff --git a/lib/libc/stdio/ungetc.c b/lib/libc/stdio/ungetc.c index deaed759992f..25f59d7420fb 100644 --- a/lib/libc/stdio/ungetc.c +++ b/lib/libc/stdio/ungetc.c @@ -42,6 +42,10 @@ static char sccsid[] = "@(#)ungetc.c	8.2 (Berkeley) 11/3/93";  #include <stdlib.h>  #include <string.h>  #include "local.h" +#ifdef _THREAD_SAFE +#include <pthread.h> +#include "pthread_private.h" +#endif  /*   * Expand the ungetc buffer `in place'.  That is, adjust fp->_p when @@ -49,7 +53,7 @@ static char sccsid[] = "@(#)ungetc.c	8.2 (Berkeley) 11/3/93";   * and move the bytes in the buffer around as necessary so that they   * are all at the end (stack-style).   */ -static +static int  __submore(fp)  	register FILE *fp;  { @@ -82,6 +86,7 @@ __submore(fp)  	return (0);  } +int  ungetc(c, fp)  	int c;  	register FILE *fp; @@ -90,16 +95,27 @@ ungetc(c, fp)  		return (EOF);  	if (!__sdidinit)  		__sinit(); +#ifdef _THREAD_SAFE +	_thread_flockfile(fp,__FILE__,__LINE__); +#endif  	if ((fp->_flags & __SRD) == 0) {  		/*  		 * Not already reading: no good unless reading-and-writing.  		 * Otherwise, flush any current write stuff.  		 */ -		if ((fp->_flags & __SRW) == 0) +		if ((fp->_flags & __SRW) == 0) { +#ifdef _THREAD_SAFE +			_thread_funlockfile(fp); +#endif  			return (EOF); +		}  		if (fp->_flags & __SWR) { -			if (__sflush(fp)) +			if (__sflush(fp)) { +#ifdef _THREAD_SAFE +				_thread_funlockfile(fp); +#endif  				return (EOF); +			}  			fp->_flags &= ~__SWR;  			fp->_w = 0;  			fp->_lbfsize = 0; @@ -113,10 +129,17 @@ ungetc(c, fp)  	 * This may require expanding the current ungetc buffer.  	 */  	if (HASUB(fp)) { -		if (fp->_r >= fp->_ub._size && __submore(fp)) +		if (fp->_r >= fp->_ub._size && __submore(fp)) { +#ifdef _THREAD_SAFE +			_thread_funlockfile(fp); +#endif  			return (EOF); +		}  		*--fp->_p = c;  		fp->_r++; +#ifdef _THREAD_SAFE +		_thread_funlockfile(fp); +#endif  		return (c);  	}  	fp->_flags &= ~__SEOF; @@ -130,6 +153,9 @@ ungetc(c, fp)  	    fp->_p[-1] == c) {  		fp->_p--;  		fp->_r++; +#ifdef _THREAD_SAFE +		_thread_funlockfile(fp); +#endif  		return (c);  	} @@ -144,5 +170,8 @@ ungetc(c, fp)  	fp->_ubuf[sizeof(fp->_ubuf) - 1] = c;  	fp->_p = &fp->_ubuf[sizeof(fp->_ubuf) - 1];  	fp->_r = 1; +#ifdef _THREAD_SAFE +	_thread_funlockfile(fp); +#endif  	return (c);  } | 
