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
This commit is contained in:
Thomas Koenig 2005-10-13 16:15:30 +00:00
parent 8c210c4104
commit c1d70e1a52
2 changed files with 31 additions and 8 deletions

View File

@ -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>

View File

@ -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. */
s->physical_offset = where + n;
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;
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 */