aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2006-03-10 03:15:36 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2006-03-10 03:15:36 +0000
commit99c6db71de9460b2dac78b31e91ca279f6a50865 (patch)
tree5d99f9aecf1933262d78a6b92507191c382b4017 /libgfortran
parentd1781ab0f5ec5929a1f2eef0a3b4ae6fdb0bf2e3 (diff)
downloadgcc-99c6db71de9460b2dac78b31e91ca279f6a50865.zip
gcc-99c6db71de9460b2dac78b31e91ca279f6a50865.tar.gz
gcc-99c6db71de9460b2dac78b31e91ca279f6a50865.tar.bz2
re PR libfortran/26499 (gfortran - End of File incorrectly positioned after binary I/O.)
2006-03-09 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/26499 * io/file_pos (st_rewind): Flush always. * io/unix.c (fd_truncate): Return SUCCESS rather than FAILURE for special files like /dev/null. * io/transfer.c (st_write_done): Remove broken logic that prevented calling fd_truncate. From-SVN: r111924
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog9
-rw-r--r--libgfortran/io/file_pos.c17
-rw-r--r--libgfortran/io/transfer.c13
-rw-r--r--libgfortran/io/unix.c4
4 files changed, 25 insertions, 18 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 5bfe9c3..a0f81f4 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,12 @@
+2006-03-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR libgfortran/26499
+ * io/file_pos (st_rewind): Flush always.
+ * io/unix.c (fd_truncate): Return SUCCESS rather than FAILURE for
+ special files like /dev/null.
+ * io/transfer.c (st_write_done): Remove broken logic that prevented
+ calling fd_truncate.
+
2006-03-05 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/26554
diff --git a/libgfortran/io/file_pos.c b/libgfortran/io/file_pos.c
index 8bd364c..5d247d9 100644
--- a/libgfortran/io/file_pos.c
+++ b/libgfortran/io/file_pos.c
@@ -246,15 +246,14 @@ st_rewind (st_parameter_filepos *fpp)
"Cannot REWIND a file opened for DIRECT access");
else
{
- /* If we have been writing to the file, the last written record
- is the last record in the file, so truncate the file now.
- Reset to read mode so two consecutive rewind statements do not
- delete the file contents. Flush buffer when switching mode. */
- if (u->mode == WRITING)
- {
- flush (u->s);
- struncate (u->s);
- }
+ /* Flush the buffers. If we have been writing to the file, the last
+ written record is the last record in the file, so truncate the
+ file now. Reset to read mode so two consecutive rewind
+ statements do not delete the file contents. */
+ flush (u->s);
+ if (u->mode == WRITING)
+ struncate (u->s);
+
u->mode = READING;
u->last_record = 0;
if (sseek (u->s, 0) == FAILURE)
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index 72becd1..8c43efc 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -2189,7 +2189,8 @@ st_write_done (st_parameter_dt *dtp)
/* Deal with endfile conditions associated with sequential files. */
- if (dtp->u.p.current_unit != NULL && dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
+ if (dtp->u.p.current_unit != NULL
+ && dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
switch (dtp->u.p.current_unit->endfile)
{
case AT_ENDFILE: /* Remain at the endfile record. */
@@ -2200,12 +2201,10 @@ st_write_done (st_parameter_dt *dtp)
break;
case NO_ENDFILE:
- if (dtp->u.p.current_unit->current_record > dtp->u.p.current_unit->last_record)
- {
- /* Get rid of whatever is after this record. */
- if (struncate (dtp->u.p.current_unit->s) == FAILURE)
- generate_error (&dtp->common, ERROR_OS, NULL);
- }
+ /* Get rid of whatever is after this record. */
+ flush (dtp->u.p.current_unit->s);
+ if (struncate (dtp->u.p.current_unit->s) == FAILURE)
+ generate_error (&dtp->common, ERROR_OS, NULL);
dtp->u.p.current_unit->endfile = AT_ENDFILE;
break;
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index 1293b24..550ddab 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -586,7 +586,7 @@ fd_truncate (unix_stream * s)
/* non-seekable files, like terminals and fifo's fail the lseek.
Using ftruncate on a seekable special file (like /dev/null)
- is undefined, so we treat it as if the ftruncate failed.
+ is undefined, so we treat it as if the ftruncate succeeded.
*/
#ifdef HAVE_FTRUNCATE
if (s->special_file || ftruncate (s->fd, s->logical_offset))
@@ -597,7 +597,7 @@ fd_truncate (unix_stream * s)
#endif
{
s->physical_offset = s->file_length = 0;
- return FAILURE;
+ return SUCCESS;
}
s->physical_offset = s->file_length = s->logical_offset;