+2008-03-05 Hans-Peter Nilsson <hp@axis.com>
+
+ 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.
+
2008-03-03 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/33197
/* 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;