gdb/testsuite/
[binutils-gdb.git] / gdb / ser-base.c
index fe5a83394dbc21e2048be45270c3cb75774f4352..c17a38903026867d96199f34a465934ce7aec6e3 100644 (file)
@@ -1,13 +1,13 @@
 /* Generic serial interface functions.
 
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2003,
-   2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,9 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "serial.h"
@@ -65,12 +63,13 @@ enum {
    the need to make redundant calls into the event-loop - the next
    scheduled task is only changed when needed. */
 
-void
+static void
 reschedule (struct serial *scb)
 {
   if (serial_is_async_p (scb))
     {
       int next_state;
+
       switch (scb->async_state)
        {
        case FD_SCHEDULED:
@@ -172,6 +171,7 @@ static void
 push_event (void *context)
 {
   struct serial *scb = context;
+
   scb->async_state = NOTHING_SCHEDULED; /* Timers are one-off */
   scb->async_handler (scb, scb->async_context);
   /* re-schedule */
@@ -281,9 +281,7 @@ do_ser_base_readchar (struct serial *scb, int timeout)
   if (status <= 0)
     {
       if (status == 0)
-       /* 0 chars means timeout.  (We may need to distinguish between EOF
-          & timeouts someday.)  */
-       return SERIAL_TIMEOUT;  
+        return SERIAL_EOF;
       else
        /* Got an error from read.  */
        return SERIAL_ERROR;    
@@ -367,6 +365,13 @@ generic_readchar (struct serial *scb, int timeout,
          s = read (scb->error_fd, &buf, to_read);
          if (s == -1)
            break;
+         if (s == 0)
+           {
+             /* EOF */
+             close (scb->error_fd);
+             scb->error_fd = -1;
+             break;
+           }
 
          /* In theory, embedded newlines are not a problem.
             But for MI, we want each output line to have just