20000-05-18 H.J. Lu (hjl@gnu.org)
[binutils-gdb.git] / gdb / ser-unix.c
index 919c9fd90d9a6768032f59c6e5cb3ac3ff120b59..47b6647311c602ae5829e02e0762a04f9cf0445c 100644 (file)
@@ -910,9 +910,9 @@ do_unix_readchar (serial_t scb, int timeout)
      each time through the loop.
 
      Also, timeout = 0 means to poll, so we just set the delta to 0, so we
-     will only go through the loop once. */
+     will only go through the loop once. timeout < 0 means to wait forever. */
 
-  delta = (timeout == 0 ? 0 : 1);
+  delta = (timeout <= 0 ? 0 : 1);
   while (1)
     {
 
@@ -928,51 +928,38 @@ do_unix_readchar (serial_t scb, int timeout)
            return SERIAL_TIMEOUT;
        }
 
-      status = ser_unix_wait_for (scb, delta);
+      status = ser_unix_wait_for (scb, timeout < 0 ? timeout : delta);
       timeout -= delta;
 
-      /* If we got a character or an error back from wait_for, then we can 
-         break from the loop before the timeout is completed. */
+      /* If we got an error back from wait_for, then we can return */
 
-      if (status != SERIAL_TIMEOUT)
-       {
-         break;
-       }
+      if (status == SERIAL_ERROR)
+        return status;
 
-      /* If we have exhausted the original timeout, then generate
-         a SERIAL_TIMEOUT, and pass it out of the loop. */
+      status = read (scb->fd, scb->buf, BUFSIZ);
 
-      else if (timeout == 0)
-       {
-         status = SERIAL_TIMEOUT;
-         break;
+      if (status <= 0)
+        {
+          if (status == 0)
+            {
+              if (timeout != 0)
+                continue;
+              else
+                return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to
+                                          distinguish between EOF & timeouts
+                                          someday] */
+            }
+         else if (errno == EINTR)
+            continue;
+          else
+           return SERIAL_ERROR;        /* Got an error from read */
        }
-    }
-
-  if (status < 0)
-    return status;
 
-  while (1)
-    {
-      status = read (scb->fd, scb->buf, BUFSIZ);
-      if (status != -1 || errno != EINTR)
-       break;
-    }
-
-  if (status <= 0)
-    {
-      if (status == 0)
-       return SERIAL_TIMEOUT;  /* 0 chars means timeout [may need to
-                                  distinguish between EOF & timeouts
-                                  someday] */
-      else
-       return SERIAL_ERROR;    /* Got an error from read */
+      scb->bufcnt = status;
+      scb->bufcnt--;
+      scb->bufp = scb->buf;
+      return *scb->bufp++;
     }
-
-  scb->bufcnt = status;
-  scb->bufcnt--;
-  scb->bufp = scb->buf;
-  return *scb->bufp++;
 }
 
 /* Perform operations common to both old and new readchar. */