diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 5dd311ad589035c8cfac3a9711f1dce0fd417501..d36e500ddca48a3c424a03a44428b7487785fa86 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -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.
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index 6f4023b9e33d79d424e673bb96f2cb1e44b4ffb6..fc8b8873d8a11071c2692ad2785d86ed82f06387 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -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);
 
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index 9251cf8f24f3f69dd3d4c9beabbcbc3d9b25d065..cb06a79fba51bf495d8f20ef54091853ff6abee0 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -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;
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index 1a4beddfc06734e81c8d2d86d0fa7dacf83731ff..ca96c229b48c8ffb683aebcb0fa1b6b41fd574bb 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -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 */