Loading...
stdio/FreeBSD/fread.c Libc-763.13 Libc-391.1.21
--- Libc/Libc-763.13/stdio/FreeBSD/fread.c
+++ Libc/Libc-391.1.21/stdio/FreeBSD/fread.c
@@ -13,6 +13,10 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -34,7 +38,7 @@
 static char sccsid[] = "@(#)fread.c	8.2 (Berkeley) 12/11/93";
 #endif /* LIBC_SCCS and not lint */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/stdio/fread.c,v 1.16 2009/07/12 13:09:43 ed Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/stdio/fread.c,v 1.12 2002/10/12 16:13:37 mike Exp $");
 
 #include "namespace.h"
 #include <stdio.h>
@@ -43,23 +47,11 @@
 #include "local.h"
 #include "libc_private.h"
 
-/*
- * MT-safe version
- */
-
 size_t
-fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)
-{
-	size_t ret;
-
-	FLOCKFILE(fp);
-	ret = __fread(buf, size, count, fp);
-	FUNLOCKFILE(fp);
-	return (ret);
-}
-
-size_t
-__fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)
+fread(buf, size, count, fp)
+	void * __restrict buf;
+	size_t size, count;
+	FILE * __restrict fp;
 {
 	size_t resid;
 	char *p;
@@ -67,10 +59,13 @@
 	size_t total;
 
 	/*
-	 * ANSI and SUSv2 require a return value of 0 if size or count are 0.
+	 * The ANSI standard requires a return value of 0 for a count
+	 * or a size of 0.  Peculiarily, it imposes no such requirements
+	 * on fwrite; it only requires fread to be broken.
 	 */
 	if ((resid = count * size) == 0)
 		return (0);
+	FLOCKFILE(fp);
 	ORIENT(fp, -1);
 	if (fp->_r < 0)
 		fp->_r = 0;
@@ -84,11 +79,13 @@
 		resid -= r;
 		if (__srefill(fp)) {
 			/* no more input: return partial result */
+			FUNLOCKFILE(fp);
 			return ((total - resid) / size);
 		}
 	}
 	(void)memcpy((void *)p, (void *)fp->_p, resid);
 	fp->_r -= resid;
 	fp->_p += resid;
+	FUNLOCKFILE(fp);
 	return (count);
 }