diff options
Diffstat (limited to 'newlib/libc/stdio64/fseeko64.c')
-rw-r--r-- | newlib/libc/stdio64/fseeko64.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/newlib/libc/stdio64/fseeko64.c b/newlib/libc/stdio64/fseeko64.c index fe07bfe..280484e 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; |