aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>2005-09-11 15:34:57 +0200
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2005-09-11 13:34:57 +0000
commitb65b81f93559efccba6253afefbe639526fe9d8c (patch)
tree35236cb14e10c63da0654a19ffe321f96fc4ba9c
parente182017e46105b6dc5d9a1f399a03eaf26d30016 (diff)
downloadgcc-b65b81f93559efccba6253afefbe639526fe9d8c.zip
gcc-b65b81f93559efccba6253afefbe639526fe9d8c.tar.gz
gcc-b65b81f93559efccba6253afefbe639526fe9d8c.tar.bz2
re PR libfortran/20179 (cannot mix C and Fortran I/O)
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. From-SVN: r104141
-rw-r--r--libgfortran/ChangeLog9
-rw-r--r--libgfortran/io/io.h3
-rw-r--r--libgfortran/io/transfer.c2
-rw-r--r--libgfortran/io/unix.c11
4 files changed, 24 insertions, 1 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 5dd311a..d36e500 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 6f4023b..fc8b887 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 9251cf8..cb06a79 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 1a4bedd..ca96c22 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 */