summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2015-11-19 02:04:16 +0000
committerache <ache@FreeBSD.org>2015-11-19 02:04:16 +0000
commit1f6525c547353b50e1ffd11e65d8d449602ecc4e (patch)
tree6f99ad00e1edb4db20edcccdc96ffb72836659cd /lib
parent55105c5c246d765a4cbb8ce13fc620bfc0cbdfba (diff)
downloadFreeBSD-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')
-rw-r--r--lib/libc/stdio/ftell.c29
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);
OpenPOWER on IntegriCloud