summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdio
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdio')
-rw-r--r--lib/libc/stdio/fread.c23
-rw-r--r--lib/libc/stdio/local.h3
-rw-r--r--lib/libc/stdio/vfscanf.c2
3 files changed, 19 insertions, 9 deletions
diff --git a/lib/libc/stdio/fread.c b/lib/libc/stdio/fread.c
index 73c7c19..3edb84a 100644
--- a/lib/libc/stdio/fread.c
+++ b/lib/libc/stdio/fread.c
@@ -47,11 +47,23 @@ __FBSDID("$FreeBSD$");
#include "local.h"
#include "libc_private.h"
+/*
+ * MT-safe version
+ */
+
size_t
-fread(buf, size, count, fp)
- void * __restrict buf;
- size_t size, count;
- FILE * __restrict fp;
+fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)
+{
+ int 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)
{
size_t resid;
char *p;
@@ -65,7 +77,6 @@ fread(buf, size, count, fp)
*/
if ((resid = count * size) == 0)
return (0);
- FLOCKFILE(fp);
ORIENT(fp, -1);
if (fp->_r < 0)
fp->_r = 0;
@@ -79,13 +90,11 @@ fread(buf, size, count, fp)
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);
}
diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h
index 74c3238..de038fa 100644
--- a/lib/libc/stdio/local.h
+++ b/lib/libc/stdio/local.h
@@ -78,7 +78,8 @@ extern int __vfscanf(FILE *, const char *, __va_list);
extern int __vfwprintf(FILE *, const wchar_t *, __va_list);
extern int __vfwscanf(FILE * __restrict, const wchar_t * __restrict,
__va_list);
-
+extern size_t __fread(void * __restrict buf, size_t size, size_t count,
+ FILE * __restrict fp);
extern int __sdidinit;
diff --git a/lib/libc/stdio/vfscanf.c b/lib/libc/stdio/vfscanf.c
index ea3004c..27df280 100644
--- a/lib/libc/stdio/vfscanf.c
+++ b/lib/libc/stdio/vfscanf.c
@@ -412,7 +412,7 @@ literal:
}
nread += sum;
} else {
- size_t r = fread((void *)va_arg(ap, char *), 1,
+ size_t r = __fread((void *)va_arg(ap, char *), 1,
width, fp);
if (r == 0)
OpenPOWER on IntegriCloud