diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2008-03-05 01:50:33 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2008-03-05 01:50:33 +0000 |
commit | 25abf44844f7b9ebeb7e7e3f21b05adb903850a1 (patch) | |
tree | 80aeb189f4a89b4797ea2eb3dd5f0f5781ac9461 /libgfortran/io/unix.c | |
parent | 07c40d0bb9fffa145c083c67f282a6ec7d99cbe6 (diff) | |
download | gcc-25abf44844f7b9ebeb7e7e3f21b05adb903850a1.zip gcc-25abf44844f7b9ebeb7e7e3f21b05adb903850a1.tar.gz gcc-25abf44844f7b9ebeb7e7e3f21b05adb903850a1.tar.bz2 |
re PR libfortran/35293 (truncation errors with gfortran.dg/streamio_11.f90, 3, 4 and 15.)
PR libfortran/35293
* io/unix.c (fd_truncate): Fold s->special_file case into
success case of ftruncate/chsize call instead of the failure case.
Make failure case actually return failure. Properly update stream
pointers on failure. Call runtime_error for targets without
neither ftruncate nor chsize where such a call would be needed.
From-SVN: r132888
Diffstat (limited to 'libgfortran/io/unix.c')
-rw-r--r-- | libgfortran/io/unix.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index d33c110..b3645f0 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -706,16 +706,28 @@ fd_truncate (unix_stream * s) /* Using ftruncate on a seekable special file (like /dev/null) is undefined, so we treat it as if the ftruncate succeeded. */ + if (!s->special_file + && ( #ifdef HAVE_FTRUNCATE - if (s->special_file || ftruncate (s->fd, s->logical_offset)) + ftruncate (s->fd, s->logical_offset) != 0 +#elif defined HAVE_CHSIZE + chsize (s->fd, s->logical_offset) != 0 #else -#ifdef HAVE_CHSIZE - if (s->special_file || chsize (s->fd, s->logical_offset)) -#endif + /* If we have neither, always fail and exit, noisily. */ + runtime_error ("required ftruncate or chsize support not present"), 1 #endif + )) { - s->physical_offset = s->file_length = 0; - return SUCCESS; + /* The truncation failed and we need to handle this gracefully. + The file length remains the same, but the file-descriptor + offset needs adjustment per the successful lseek above. + (Similarly, the contents of the buffer isn't valid anymore.) + A ftruncate call does not affect the physical (file-descriptor) + offset, according to the ftruncate manual, so neither should a + failed call. */ + s->physical_offset = s->logical_offset; + s->active = 0; + return FAILURE; } s->physical_offset = s->file_length = s->logical_offset; |