aboutsummaryrefslogtreecommitdiff
path: root/gdb/ser-unix.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2000-12-02 14:56:20 +0000
committerAndrew Cagney <cagney@redhat.com>2000-12-02 14:56:20 +0000
commitab5ba170e9111446867b2f522686d6e0b2fe3de6 (patch)
tree55de524b1f78378ca65e061841c849ae0ac196bc /gdb/ser-unix.c
parentb045c3f9e7084ec150e57bd523c938c96528a0e7 (diff)
downloadgdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.zip
gdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.tar.gz
gdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.tar.bz2
* ser-unix.c (wait_for): Initialize the FD_SET before every select
call. (ser_unix_wait_for): Ditto.
Diffstat (limited to 'gdb/ser-unix.c')
-rw-r--r--gdb/ser-unix.c73
1 files changed, 38 insertions, 35 deletions
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c
index 791c3fa..b75e338 100644
--- a/gdb/ser-unix.c
+++ b/gdb/ser-unix.c
@@ -435,37 +435,37 @@ static int
wait_for (serial_t scb, int timeout)
{
#ifdef HAVE_SGTTY
- {
- struct timeval tv;
- fd_set readfds;
+ while (1)
+ {
+ struct timeval tv;
+ fd_set readfds;
+ int numfds;
- FD_ZERO (&readfds);
+ /* NOTE: Some OS's can scramble the READFDS when the select()
+ call fails (ex the kernel with Red Hat 5.2). Initialize all
+ arguments before each call. */
- tv.tv_sec = timeout;
- tv.tv_usec = 0;
+ tv.tv_sec = timeout;
+ tv.tv_usec = 0;
- FD_SET (scb->fd, &readfds);
+ FD_ZERO (&readfds);
+ FD_SET (scb->fd, &readfds);
- while (1)
- {
- int numfds;
+ if (timeout >= 0)
+ numfds = select (scb->fd + 1, &readfds, 0, 0, &tv);
+ else
+ numfds = select (scb->fd + 1, &readfds, 0, 0, 0);
- if (timeout >= 0)
- numfds = select (scb->fd + 1, &readfds, 0, 0, &tv);
+ if (numfds <= 0)
+ if (numfds == 0)
+ return SERIAL_TIMEOUT;
+ else if (errno == EINTR)
+ continue;
else
- numfds = select (scb->fd + 1, &readfds, 0, 0, 0);
-
- if (numfds <= 0)
- if (numfds == 0)
- return SERIAL_TIMEOUT;
- else if (errno == EINTR)
- continue;
- else
- return SERIAL_ERROR; /* Got an error from select or poll */
+ return SERIAL_ERROR; /* Got an error from select or poll */
- return 0;
- }
- }
+ return 0;
+ }
#endif /* HAVE_SGTTY */
#if defined HAVE_TERMIO || defined HAVE_TERMIOS
@@ -858,21 +858,24 @@ ser_unix_nop_raw (serial_t scb)
int
ser_unix_wait_for (serial_t scb, int timeout)
{
- int numfds;
- struct timeval tv;
- fd_set readfds, exceptfds;
+ while (1)
+ {
+ int numfds;
+ struct timeval tv;
+ fd_set readfds, exceptfds;
- FD_ZERO (&readfds);
- FD_ZERO (&exceptfds);
+ /* NOTE: Some OS's can scramble the READFDS when the select()
+ call fails (ex the kernel with Red Hat 5.2). Initialize all
+ arguments before each call. */
- tv.tv_sec = timeout;
- tv.tv_usec = 0;
+ tv.tv_sec = timeout;
+ tv.tv_usec = 0;
- FD_SET (scb->fd, &readfds);
- FD_SET (scb->fd, &exceptfds);
+ FD_ZERO (&readfds);
+ FD_ZERO (&exceptfds);
+ FD_SET (scb->fd, &readfds);
+ FD_SET (scb->fd, &exceptfds);
- while (1)
- {
if (timeout >= 0)
numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, &tv);
else