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
This commit is contained in:
Jerry DeLisle 2006-03-10 03:15:36 +00:00
parent d1781ab0f5
commit 99c6db71de
4 changed files with 25 additions and 18 deletions

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -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;