Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2007-07-14 00:37:53 +0400
committerEric Blake <eblake@redhat.com>2007-07-14 00:37:53 +0400
commit08146e5adbceb673cc2c6c4adee05ba37f709095 (patch)
tree2bda91075f62fa6b54750cca0346838ebf1a9f28 /newlib/libc/stdio64
parentb71fb40215c79d607d8f24dc6af0c28d5ce9ccaf (diff)
Fix fflush issues.
* libc/stdio/fflush.c (_fflush_r): New function. (fflush): Fix reentrancy and large offset behavior. * libc/include/stdio.h (_fflush_r): Add prototype. * libc/stdio/fclose.c (_fclose_r): All fflush callers changed. * libc/stdio/freopen.c (_freopen_r): Likewise. * libc/stdio/fseek.c (_fseek_r): Likewise. * libc/stdio/ftell.c (_ftell_r): Likewise. * libc/stdio/fvwrite.c (__sfvwrite_r): Likewise. * libc/stdio/refill.c (__srefill_r): Likewise. * libc/stdio/setvbuf.c (setvbuf): Likewise. * libc/stdio/ungetc.c (_ungetc_r): Likewise. * libc/stdio/vfprintf.c (__sbprintf): Likewise. * libc/stdio/wbuf.c (__swbuf_r): Likewise. * libc/stdio64/freopen64.c (_freopen64_r): Likewise. * libc/stdio64/fseeko64.c (_fseeko64_r): Likewise. Defer to 32-bit version if not large file. * libc/stdio64/ftello64.c (_ftello64_r): Likewise. * libc/stdio64/tmpfile64.c (_tmpfile64_r): Avoid compile warning.
Diffstat (limited to 'newlib/libc/stdio64')
-rw-r--r--newlib/libc/stdio64/freopen64.c2
-rw-r--r--newlib/libc/stdio64/fseeko64.c22
-rw-r--r--newlib/libc/stdio64/ftello64.c6
-rw-r--r--newlib/libc/stdio64/tmpfile64.c1
4 files changed, 24 insertions, 7 deletions
diff --git a/newlib/libc/stdio64/freopen64.c b/newlib/libc/stdio64/freopen64.c
index 0362407e9..866d8c943 100644
--- a/newlib/libc/stdio64/freopen64.c
+++ b/newlib/libc/stdio64/freopen64.c
@@ -124,7 +124,7 @@ _DEFUN (_freopen64_r, (ptr, file, mode, fp),
else
{
if (fp->_flags & __SWR)
- fflush (fp);
+ _fflush_r (ptr, fp);
/*
* If close is NULL, closing is a no-op, hence pointless.
* If file is NULL, the file should not be closed.
diff --git a/newlib/libc/stdio64/fseeko64.c b/newlib/libc/stdio64/fseeko64.c
index fe07bfe2d..280484e62 100644
--- a/newlib/libc/stdio64/fseeko64.c
+++ b/newlib/libc/stdio64/fseeko64.c
@@ -111,11 +111,22 @@ _DEFUN (_fseeko64_r, (ptr, fp, offset, whence),
struct stat64 st;
int havepos;
+ /* Only do 64-bit seek on large file. */
+ if (!(fp->_flags & __SL64))
+ {
+ if ((_off_t) offset != offset)
+ {
+ ptr->_errno = EOVERFLOW;
+ return EOF;
+ }
+ return (_off64_t) _fseeko_r (ptr, fp, offset, whence);
+ }
+
/* Make sure stdio is set up. */
CHECK_INIT (ptr, fp);
- _flockfile(fp);
+ _flockfile (fp);
curoff = fp->_offset;
@@ -125,12 +136,12 @@ _DEFUN (_fseeko64_r, (ptr, fp, offset, whence),
if (fp->_flags & __SAPP && fp->_flags & __SWR)
{
/* So flush the buffer and seek to the end. */
- fflush (fp);
+ _fflush_r (ptr, fp);
}
/* Have to be able to seek. */
- if ((seekfn = fp->_seek64) == NULL || !(fp->_flags & __SL64))
+ if ((seekfn = fp->_seek64) == NULL)
{
ptr->_errno = ESPIPE; /* ??? */
_funlockfile(fp);
@@ -150,7 +161,7 @@ _DEFUN (_fseeko64_r, (ptr, fp, offset, whence),
* we have to first find the current stream offset a la
* ftell (see ftell for details).
*/
- fflush(fp); /* may adjust seek offset on append stream */
+ _fflush_r (ptr, fp); /* may adjust seek offset on append stream */
if (fp->_flags & __SOFF)
curoff = fp->_offset;
else
@@ -323,7 +334,8 @@ _DEFUN (_fseeko64_r, (ptr, fp, offset, whence),
*/
dumb:
- if (fflush (fp) || seekfn (ptr, fp->_cookie, offset, whence) == POS_ERR)
+ if (_fflush_r (ptr, fp)
+ || seekfn (ptr, fp->_cookie, offset, whence) == POS_ERR)
{
_funlockfile(fp);
return EOF;
diff --git a/newlib/libc/stdio64/ftello64.c b/newlib/libc/stdio64/ftello64.c
index b596d3234..2fdfb784e 100644
--- a/newlib/libc/stdio64/ftello64.c
+++ b/newlib/libc/stdio64/ftello64.c
@@ -91,6 +91,10 @@ _DEFUN (_ftello64_r, (ptr, fp),
{
_fpos64_t pos;
+ /* Only do 64-bit tell on large file. */
+ if (!(fp->_flags & __SL64))
+ return (_off64_t) _ftello_r (ptr, fp);
+
/* Ensure stdio is set up. */
CHECK_INIT (ptr, fp);
@@ -106,7 +110,7 @@ _DEFUN (_ftello64_r, (ptr, fp),
/* Find offset of underlying I/O object, then
adjust for buffered bytes. */
- fflush(fp); /* may adjust seek offset on append stream */
+ _fflush_r (ptr, fp); /* may adjust seek offset on append stream */
if (fp->_flags & __SOFF)
pos = fp->_offset;
else
diff --git a/newlib/libc/stdio64/tmpfile64.c b/newlib/libc/stdio64/tmpfile64.c
index 511606c78..98a7d7817 100644
--- a/newlib/libc/stdio64/tmpfile64.c
+++ b/newlib/libc/stdio64/tmpfile64.c
@@ -48,6 +48,7 @@ Supporting OS subroutines required: <<close>>, <<fstat>>, <<getpid>>,
*/
#include <stdio.h>
+#include <reent.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>