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 */