Deleted Added
sdiff udiff text old ( 268997 ) new ( 289863 )
full compact
1/*-
2 * Copyright (c) 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Chris Torek.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 20 unchanged lines hidden (view full) ---

29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#if defined(LIBC_SCCS) && !defined(lint)
34static char sccsid[] = "@(#)ftell.c 8.2 (Berkeley) 5/4/95";
35#endif /* LIBC_SCCS and not lint */
36#include <sys/cdefs.h>
37__FBSDID("$FreeBSD: head/lib/libc/stdio/ftell.c 289863 2015-10-24 02:23:15Z ache $");
38
39#include "namespace.h"
40#include <sys/types.h>
41#include <errno.h>
42#include <fcntl.h>
43#include <limits.h>
44#include <stdio.h>
45#include "un-namespace.h"

--- 37 unchanged lines hidden (view full) ---

83 return (rv);
84}
85
86int
87_ftello(FILE *fp, fpos_t *offset)
88{
89 fpos_t pos;
90 size_t n;
91
92 if (fp->_seek == NULL) {
93 errno = ESPIPE; /* historic practice */
94 return (1);
95 }
96
97 /*
98 * Find offset of underlying I/O object, then

--- 15 unchanged lines hidden (view full) ---

114 if ((pos -= (HASUB(fp) ? fp->_ur : fp->_r)) < 0) {
115 fp->_flags |= __SERR;
116 errno = EIO;
117 return (1);
118 }
119 if (HASUB(fp))
120 pos -= fp->_r; /* Can be negative at this point. */
121 } else if ((fp->_flags & __SWR) && fp->_p != NULL) {
122 /* XXX: Reuse __SALC for O_APPEND. */
123 if (fp->_flags & (__SAPP|__SALC)) {
124 int serrno = errno;
125
126 errno = 0;
127 if ((pos = _sseek(fp, (fpos_t)0, SEEK_END)) == -1) {
128 if (errno == ESPIPE ||
129 (fp->_flags & __SOPT) || __sflush(fp) ||
130 (pos =
131 _sseek(fp, (fpos_t)0, SEEK_CUR)) == -1)
132 return (1);
133 else {
134 errno = serrno;
135 *offset = pos;
136 return (0);
137 }
138 }
139 errno = serrno;
140 }
141 /*
142 * Writing. Any buffered characters cause the
143 * position to be greater than that in the
144 * underlying object.
145 */
146 n = fp->_p - fp->_bf._base;
147 if (pos > OFF_MAX - n) {
148 errno = EOVERFLOW;
149 return (1);
150 }
151 pos += n;
152 }
153 *offset = pos;
154 return (0);
155}