X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fserial.c;h=75a08781d20ba436d386953412853e9039853797;hb=37cc8bfee6166ea05f1fa2e7d9f0f4d90663b7fc;hp=de1f891edd4c9d06bc7b052038ae1c072855128f;hpb=6aba47ca06d9150c6196a374b745c2711b46e045;p=binutils-gdb.git
diff --git a/gdb/serial.c b/gdb/serial.c
index de1f891edd4..75a08781d20 100644
--- a/gdb/serial.c
+++ b/gdb/serial.c
@@ -1,13 +1,14 @@
/* Generic serial interface routines
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ 2002, 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 +17,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 . */
#include "defs.h"
#include
@@ -211,8 +210,10 @@ serial_open (const char *name)
scb->bufcnt = 0;
scb->bufp = scb->buf;
+ scb->error_fd = -1;
- if (scb->ops->open (scb, open_name))
+ /* `...->open (...)' would get expanded by an the open(2) syscall macro. */
+ if ((*scb->ops->open) (scb, open_name))
{
xfree (scb);
return NULL;
@@ -246,7 +247,6 @@ struct serial *
serial_for_fd (int fd)
{
struct serial *scb;
- struct serial_ops *ops;
for (scb = scb_base; scb; scb = scb->next)
if (scb->fd == fd)
@@ -407,6 +407,18 @@ serial_write (struct serial *scb, const char *str, int len)
in case we are getting ready to dump core or something. */
gdb_flush (serial_logfp);
}
+ if (serial_debug_p (scb))
+ {
+ int count;
+
+ for (count = 0; count < len; count++)
+ {
+ fprintf_unfiltered (gdb_stdlog, "[");
+ serial_logchar (gdb_stdlog, 'w', str[count] & 0xff, 0);
+ fprintf_unfiltered (gdb_stdlog, "]");
+ }
+ gdb_flush (gdb_stdlog);
+ }
return (scb->ops->write (scb, str, len));
}
@@ -515,12 +527,13 @@ serial_async (struct serial *scb,
serial_event_ftype *handler,
void *context)
{
- /* Only change mode if there is a need. */
- if ((scb->async_handler == NULL)
- != (handler == NULL))
- scb->ops->async (scb, handler != NULL);
+ int changed = ((scb->async_handler == NULL) != (handler == NULL));
+
scb->async_handler = handler;
scb->async_context = context;
+ /* Only change mode if there is a need. */
+ if (changed)
+ scb->ops->async (scb, handler != NULL);
}
int