PR libfortran/20179
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Sep 2005 13:34:57 +0000 (13:34 +0000)
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Sep 2005 13:34:57 +0000 (13:34 +0000)
* io/unix.c (is_preconnected): Add function to test if a stream
corresponds to a preconnected unit.
* io/io.h: Add prototype for is_preconnected.
* io/transfer.c (data_transfer_init): Do not truncate
preconnected units.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@104141 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 5dd311a..d36e500 100644 (file)
@@ -1,3 +1,12 @@
+2005-09-11  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR libfortran/20179
+       * io/unix.c (is_preconnected): Add function to test if a stream
+       corresponds to a preconnected unit.
+       * io/io.h: Add prototype for is_preconnected.
+       * io/transfer.c (data_transfer_init): Do not truncate
+       preconnected units.
+
 2005-09-10  Janne Blomqvist  <jblomqvi@cc.hut.fi>
 
        * io/unix.c: Remove mmap code.
index 6f4023b..fc8b887 100644 (file)
@@ -493,6 +493,9 @@ internal_proto(file_position);
 extern int is_seekable (stream *);
 internal_proto(is_seekable);
 
+extern int is_preconnected (stream *);
+internal_proto(is_preconnected);
+
 extern void empty_internal_buffer(stream *);
 internal_proto(empty_internal_buffer);
 
index 9251cf8..cb06a79 100644 (file)
@@ -1183,7 +1183,7 @@ data_transfer_init (int read_flag)
      it is always safe to truncate the file on the first write */
   if (g.mode == WRITING
       && current_unit->flags.access == ACCESS_SEQUENTIAL
-      && current_unit->last_record == 0)
+      && current_unit->last_record == 0 && !is_preconnected(current_unit->s))
        struncate(current_unit->s);
 
   current_unit->mode = g.mode;
index 1a4bedd..ca96c22 100644 (file)
@@ -218,6 +218,17 @@ fix_fd (int fd)
   return fd;
 }
 
+int
+is_preconnected (stream * s)
+{
+  int fd;
+
+  fd = ((unix_stream *) s)->fd;
+  if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO)
+    return 1;
+  else
+    return 0;
+}
 
 /* write()-- Write a buffer to a descriptor, allowing for short writes */