re PR libfortran/26499 (gfortran - End of File incorrectly positioned after binary...
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 10 Mar 2006 03:15:36 +0000 (03:15 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 10 Mar 2006 03:15:36 +0000 (03:15 +0000)
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

libgfortran/ChangeLog
libgfortran/io/file_pos.c
libgfortran/io/transfer.c
libgfortran/io/unix.c

index 5bfe9c36e103b4e3f5f32a39f749d9ba60638f0b..a0f81f4b3ecbe66bbcfe009c13d11619b7ded87f 100644 (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
index 8bd364c43842a1113cc878ccd8f5170726a325dc..5d247d9c6b3c3f031fc5b0d2f0a33610db4f8c6a 100644 (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)
index 72becd1397261114d409235da6d2f2ccf52bcb14..8c43efc26f6a6223e3cf086e26f146af815e25a9 100644 (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;
index 1293b24c9db5f3e1fe06f4ddb44dbece3877a348..550ddabff740edc57f6396e46051ba3e100ebb69 100644 (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;