OSDN Git Service

2006-03-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 10 Mar 2006 03:15:36 +0000 (03:15 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 10 Mar 2006 03:15:36 +0000 (03:15 +0000)
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
libgfortran/io/file_pos.c
libgfortran/io/transfer.c
libgfortran/io/unix.c

index 5bfe9c3..a0f81f4 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 8bd364c..5d247d9 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 72becd1..8c43efc 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 1293b24..550ddab 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;