summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdio/freopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdio/freopen.c')
-rw-r--r--lib/libc/stdio/freopen.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/libc/stdio/freopen.c b/lib/libc/stdio/freopen.c
index 476f3ef..bbf039a 100644
--- a/lib/libc/stdio/freopen.c
+++ b/lib/libc/stdio/freopen.c
@@ -113,9 +113,17 @@ freopen(file, mode, fp)
return (NULL);
}
}
- if (oflags & O_TRUNC)
- ftruncate(fp->_file, 0);
- if (_fseeko(fp, 0, oflags & O_APPEND ? SEEK_END : SEEK_SET,
+ if (oflags & O_TRUNC) {
+ if (ftruncate(fp->_file, (off_t)0) < 0) {
+ sverrno = errno;
+ fclose(fp);
+ FUNLOCKFILE(fp);
+ errno = sverrno;
+ return (NULL);
+ }
+ }
+ fp->_flags |= __SNPT; /* real seek */
+ if (_fseeko(fp, (off_t)0, oflags & O_APPEND ? SEEK_END : SEEK_SET,
0) < 0 && errno != ESPIPE) {
sverrno = errno;
fclose(fp);
OpenPOWER on IntegriCloud