2007-07-03 Paul Gilliam <pgilliam@us.ibm.com>
[deliverable/binutils-gdb.git] / gdb / ser-base.c
index 8897d23bdd402210fc7b80736609e4ed69781f85..fe5a83394dbc21e2048be45270c3cb75774f4352 100644 (file)
@@ -1,7 +1,7 @@
 /* Generic serial interface functions.
 
-   Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-   2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2003,
+   2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "serial.h"
-#include "ser-unix.h"
+#include "ser-base.h"
 #include "event-loop.h"
+
+#include "gdb_select.h"
+#include "gdb_string.h"
+#include <sys/time.h>
 #ifdef USE_WIN32API
 #include <winsock2.h>
 #endif
 
-#include "gdb_string.h"
 
 static timer_handler_func push_event;
 static handler_func fd_event;
@@ -200,9 +203,9 @@ ser_base_wait_for (struct serial *scb, int timeout)
       FD_SET (scb->fd, &exceptfds);
 
       if (timeout >= 0)
-       numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, &tv);
+       numfds = gdb_select (scb->fd + 1, &readfds, 0, &exceptfds, &tv);
       else
-       numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, 0);
+       numfds = gdb_select (scb->fd + 1, &readfds, 0, &exceptfds, 0);
 
       if (numfds <= 0)
        {
@@ -340,6 +343,48 @@ generic_readchar (struct serial *scb, int timeout,
            }
        }
     }
+  /* Read any error output we might have.  */
+  if (scb->error_fd != -1)
+    {
+      ssize_t s;
+      char buf[81];
+
+      for (;;)
+        {
+         char *current;
+         char *newline;
+         int to_read = 80;
+
+         int num_bytes = -1;
+         if (scb->ops->avail)
+           num_bytes = (scb->ops->avail)(scb, scb->error_fd);
+         if (num_bytes != -1)
+           to_read = (num_bytes < to_read) ? num_bytes : to_read;
+
+         if (to_read == 0)
+           break;
+
+         s = read (scb->error_fd, &buf, to_read);
+         if (s == -1)
+           break;
+
+         /* In theory, embedded newlines are not a problem.
+            But for MI, we want each output line to have just
+            one newline for legibility.  So output things
+            in newline chunks.  */
+         buf[s] = '\0';
+         current = buf;
+         while ((newline = strstr (current, "\n")) != NULL)
+           {
+             *newline = '\0';
+             fputs_unfiltered (current, gdb_stderr);
+             fputs_unfiltered ("\n", gdb_stderr);
+             current = newline + 1;
+           }
+         fputs_unfiltered (current, gdb_stderr);
+       }
+    }
+
   reschedule (scb);
   return ch;
 }
This page took 0.024308 seconds and 4 git commands to generate.