/* Generic serial interface routines
- Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+ 2002, 2004, 2005, 2006, 2007, 2008 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,
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., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include <ctype.h>
if (strcmp (name, "pc") == 0)
ops = serial_interface_lookup ("pc");
- else if (strchr (name, ':'))
- ops = serial_interface_lookup ("tcp");
else if (strncmp (name, "lpt", 3) == 0)
ops = serial_interface_lookup ("parallel");
else if (strncmp (name, "|", 1) == 0)
{
ops = serial_interface_lookup ("pipe");
- open_name = name + 1; /* discard ``|'' */
+ /* Discard ``|'' and any space before the command itself. */
+ ++open_name;
+ while (isspace (*open_name))
+ ++open_name;
}
+ /* Check for a colon, suggesting an IP address/port pair.
+ Do this *after* checking for all the interesting prefixes. We
+ don't want to constrain the syntax of what can follow them. */
+ else if (strchr (name, ':'))
+ ops = serial_interface_lookup ("tcp");
else
ops = serial_interface_lookup ("hardwire");
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;
return scb;
}
+/* Return the open serial device for FD, if found, or NULL if FD
+ is not already opened. */
+
+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)
+ return scb;
+
+ return NULL;
+}
+
struct serial *
serial_fdopen (const int fd)
{
return scb;
}
- ops = serial_interface_lookup ("hardwire");
+ ops = serial_interface_lookup ("terminal");
+ if (!ops)
+ ops = serial_interface_lookup ("hardwire");
if (!ops)
return NULL;
- scb = XMALLOC (struct serial);
+ scb = XCALLOC (1, struct serial);
scb->ops = ops;
return scb->debug_p || global_serial_debug_p;
}
+#ifdef USE_WIN32API
+void
+serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
+{
+ if (scb->ops->wait_handle)
+ scb->ops->wait_handle (scb, read, except);
+ else
+ {
+ *read = (HANDLE) _get_osfhandle (scb->fd);
+ *except = NULL;
+ }
+}
+
+void
+serial_done_wait_handle (struct serial *scb)
+{
+ if (scb->ops->done_wait_handle)
+ scb->ops->done_wait_handle (scb);
+}
+#endif
#if 0
/* The connect command is #if 0 because I hadn't thought of an elegant