1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-14 10:09:48 +00:00

Reorganize code to elimitate one _sseek() call for append modes.

MFC after:      1 week
This commit is contained in:
Andrey A. Chernov 2015-11-08 18:00:44 +00:00
parent 3f5ac575ea
commit 881e47bbb2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=290549

View File

@ -98,7 +98,20 @@ _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))) {
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 {
*offset = pos;
return (0);
}
}
} else if (fp->_flags & __SOFF)
pos = fp->_offset;
else {
pos = _sseek(fp, (fpos_t)0, SEEK_CUR);
@ -125,26 +138,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);