diff options
author | ache <ache@FreeBSD.org> | 2015-11-19 02:04:16 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2015-11-19 02:04:16 +0000 |
commit | 1f6525c547353b50e1ffd11e65d8d449602ecc4e (patch) | |
tree | 6f99ad00e1edb4db20edcccdc96ffb72836659cd /lib/libc/stdio | |
parent | 55105c5c246d765a4cbb8ce13fc620bfc0cbdfba (diff) | |
download | FreeBSD-src-1f6525c547353b50e1ffd11e65d8d449602ecc4e.zip FreeBSD-src-1f6525c547353b50e1ffd11e65d8d449602ecc4e.tar.gz |
MFC: r290549,r290729
r290549:
Reorganize code to elimitate one _sseek() call for append modes.
r290729:
1) Remove my overcomplicated error fallback and just return error
immediatelly as old code does, now for append modes too.
Real use case for such fallback is impossible (unless specially crafted).
2) Remove now unneded include I forgot to remove in prev. commits.
Diffstat (limited to 'lib/libc/stdio')
-rw-r--r-- | lib/libc/stdio/ftell.c | 29 |
1 files changed, 7 insertions, 22 deletions
diff --git a/lib/libc/stdio/ftell.c b/lib/libc/stdio/ftell.c index 152617f..fc792af 100644 --- a/lib/libc/stdio/ftell.c +++ b/lib/libc/stdio/ftell.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" #include <sys/types.h> #include <errno.h> -#include <fcntl.h> #include <limits.h> #include <stdio.h> #include "un-namespace.h" @@ -98,7 +97,13 @@ _ftello(FILE *fp, fpos_t *offset) * Find offset of underlying I/O object, then * adjust for buffered bytes. */ - if (fp->_flags & __SOFF) + if (!(fp->_flags & __SRD) && (fp->_flags & __SWR) && + fp->_p != NULL && fp->_p - fp->_bf._base > 0 && + ((fp->_flags & __SAPP) || (fp->_flags2 & __S2OAP))) { + pos = _sseek(fp, (fpos_t)0, SEEK_END); + if (pos == -1) + return (1); + } else if (fp->_flags & __SOFF) pos = fp->_offset; else { pos = _sseek(fp, (fpos_t)0, SEEK_CUR); @@ -125,26 +130,6 @@ _ftello(FILE *fp, fpos_t *offset) * position to be greater than that in the * underlying object. */ - if ((fp->_flags & __SAPP) || (fp->_flags2 & __S2OAP)) { - int serrno = errno; - - errno = 0; - if ((pos = _sseek(fp, (fpos_t)0, SEEK_END)) == -1) { - if (errno == ESPIPE || - (fp->_flags & __SOPT) || __sflush(fp) || - (pos = - _sseek(fp, (fpos_t)0, SEEK_CUR)) == -1) - return (1); - else { - errno = serrno; - *offset = pos; - return (0); - } - } - errno = serrno; - /* fp->_p can be changed in _sseek(), recalculate. */ - n = fp->_p - fp->_bf._base; - } if (pos > OFF_MAX - n) { errno = EOVERFLOW; return (1); |