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