ftell.c (268997) | ftell.c (289863) |
---|---|
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> | 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 268997 2014-07-22 22:49:37Z ache $"); | 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; | 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 int dflags; | |
92 93 if (fp->_seek == NULL) { 94 errno = ESPIPE; /* historic practice */ 95 return (1); 96 } 97 98 /* 99 * Find offset of underlying I/O object, then --- 15 unchanged lines hidden (view full) --- 115 if ((pos -= (HASUB(fp) ? fp->_ur : fp->_r)) < 0) { 116 fp->_flags |= __SERR; 117 errno = EIO; 118 return (1); 119 } 120 if (HASUB(fp)) 121 pos -= fp->_r; /* Can be negative at this point. */ 122 } else if ((fp->_flags & __SWR) && fp->_p != NULL) { | 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) { |
123 dflags = 0; 124 if (fp->_flags & __SAPP) 125 dflags = O_APPEND; 126 else if (fp->_file != -1 && 127 (dflags = _fcntl(fp->_file, F_GETFL)) < 0) 128 return (1); 129 if ((dflags & O_APPEND) && 130 (pos = _sseek(fp, (fpos_t)0, SEEK_END)) == -1) { 131 if ((fp->_flags & __SOPT) || __sflush(fp) || 132 (pos = _sseek(fp, (fpos_t)0, SEEK_CUR)) == -1) 133 return (1); 134 else { 135 *offset = pos; 136 return (0); | 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 } |
137 } | 138 } |
139 errno = serrno; |
|
138 } 139 /* 140 * Writing. Any buffered characters cause the 141 * position to be greater than that in the 142 * underlying object. 143 */ 144 n = fp->_p - fp->_bf._base; 145 if (pos > OFF_MAX - n) { 146 errno = EOVERFLOW; 147 return (1); 148 } 149 pos += n; 150 } 151 *offset = pos; 152 return (0); 153} | 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} |