aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2005-10-13 16:15:30 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2005-10-13 16:15:30 +0000
commitc1d70e1a522d8c82ca8898a46d746f2f352bf6d5 (patch)
tree7992d61624301cfeea776530b917277c88d522ce
parent8c210c4104f0296d666aa25f5f904fc14b6da239 (diff)
downloadgcc-c1d70e1a522d8c82ca8898a46d746f2f352bf6d5.zip
gcc-c1d70e1a522d8c82ca8898a46d746f2f352bf6d5.tar.gz
gcc-c1d70e1a522d8c82ca8898a46d746f2f352bf6d5.tar.bz2
unix.c (fd_alloc_r_at): Use read() instead of do_read() only in case of special files (e.g.
2005-10-13 Thomas Koenig <Thomas.Koenig@online.de> * io/unix.c(fd_alloc_r_at): Use read() instead of do_read() only in case of special files (e.g. terminals). From-SVN: r105373
-rw-r--r--libgfortran/ChangeLog9
-rw-r--r--libgfortran/io/unix.c30
2 files changed, 31 insertions, 8 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 8afd871..16552ee 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,8 @@
+2005-10-13 Thomas Koenig <Thomas.Koenig@online.de>
+
+ * io/unix.c(fd_alloc_r_at): Use read() instead of do_read()
+ only in case of special files (e.g. terminals).
+
2005-20-13 Uros Bizjak <uros@kss-loka.si>
* config/fpu-387.h (set_fpu): Add "=m" for stmxcsr.
@@ -26,8 +31,8 @@
2005-10-12 Janne Blomqvist <jblomqvi@cc.hut.fi>
- * io/unix.c: Remove parts of patch of 2005/10/07 that cause
- input from the terminal to hang.
+ * io/unix.c(fd_alloc_r_at): Remove parts of patch of 2005/10/07 that
+ cause input from the terminal to hang.
2005-10-11 Steven G. Kargl <kargls@comcast.net>
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index de018af..ea03515 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -440,7 +440,6 @@ static char *
fd_alloc_r_at (unix_stream * s, int *len, gfc_offset where)
{
gfc_offset m;
- int n;
if (where == -1)
where = s->logical_offset;
@@ -462,13 +461,32 @@ fd_alloc_r_at (unix_stream * s, int *len, gfc_offset where)
if (s->physical_offset != m && lseek (s->fd, m, SEEK_SET) < 0)
return NULL;
- n = read (s->fd, s->buffer + s->active, s->len - s->active);
- if (n < 0)
- return NULL;
+ /* do_read() hangs on read from terminals for *BSD-systems. Only
+ use read() in that case. */
+
+ if (s->special_file)
+ {
+ ssize_t n;
+
+ n = read (s->fd, s->buffer + s->active, s->len - s->active);
+ if (n < 0)
+ return NULL;
+
+ s->physical_offset = where + n;
+ s->active += n;
+ }
+ else
+ {
+ size_t n;
- s->physical_offset = where + n;
+ n = s->len - s->active;
+ if (do_read (s, s->buffer + s->active, &n) != 0)
+ return NULL;
+
+ s->physical_offset = where + n;
+ s->active += n;
+ }
- s->active += n;
if (s->active < *len)
*len = s->active; /* Bytes actually available */