From 1c201879d2b84024109dd6d5bd0ac0beb05ec0bb Mon Sep 17 00:00:00 2001 From: jvdelisle Date: Fri, 10 Mar 2006 03:15:36 +0000 Subject: [PATCH] 2006-03-09 Jerry DeLisle 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111924 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgfortran/ChangeLog | 9 +++++++++ libgfortran/io/file_pos.c | 17 ++++++++--------- libgfortran/io/transfer.c | 13 ++++++------- libgfortran/io/unix.c | 4 ++-- 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 + + 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 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; -- 2.7.4