summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdio/rewind.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2001-09-01 15:28:24 +0000
committerache <ache@FreeBSD.org>2001-09-01 15:28:24 +0000
commit040bf33abb9c840d4c82451216ca2948e787fea6 (patch)
treeee54a20cc4f7b4c40b42a25070f3d75c3d0f8d9e /lib/libc/stdio/rewind.c
parent77759ea63b149af08d749c57155482f866c1b82c (diff)
downloadFreeBSD-src-040bf33abb9c840d4c82451216ca2948e787fea6.zip
FreeBSD-src-040bf33abb9c840d4c82451216ca2948e787fea6.tar.gz
Save errno before function call and restore it on success (because many
internal functions there may fail and set (i.e. overwrite) errno in normal (not error) situation). In original variant errno testing after call (as POSIX suggest) is wrong when errno overwrite happens.
Diffstat (limited to 'lib/libc/stdio/rewind.c')
-rw-r--r--lib/libc/stdio/rewind.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/libc/stdio/rewind.c b/lib/libc/stdio/rewind.c
index af9232a..2db21c78 100644
--- a/lib/libc/stdio/rewind.c
+++ b/lib/libc/stdio/rewind.c
@@ -52,13 +52,16 @@ static const char rcsid[] =
void
rewind(FILE *fp)
{
+ int serrno = errno;
+
/* make sure stdio is set up */
if (!__sdidinit)
__sinit();
FLOCKFILE(fp);
- if (_fseeko(fp, (off_t)0, SEEK_SET, 1) == 0)
+ if (_fseeko(fp, (off_t)0, SEEK_SET, 1) == 0) {
clearerr_unlocked(fp);
+ errno = serrno;
+ }
FUNLOCKFILE(fp);
- /* errno required by POSIX to sense error, don't zero it here */
}
OpenPOWER on IntegriCloud