diff options
author | Stu Grossman <grossman@cygnus> | 1993-04-06 05:50:54 +0000 |
---|---|---|
committer | Stu Grossman <grossman@cygnus> | 1993-04-06 05:50:54 +0000 |
commit | 4e772f4426b2e004da8aaa4cccc7ea483eadf794 (patch) | |
tree | 52ef0674eefe2186020a8ccc68265c6cd2a0d9ab /gdb/serial.c | |
parent | 9acdb2dc824dfdfbd94bbd4481473dc3b9c2c09b (diff) | |
download | gdb-4e772f4426b2e004da8aaa4cccc7ea483eadf794.zip gdb-4e772f4426b2e004da8aaa4cccc7ea483eadf794.tar.gz gdb-4e772f4426b2e004da8aaa4cccc7ea483eadf794.tar.bz2 |
* Makefile.in (SFILES OBS): Add serial.[co] & ser-hardwire.[co].
These implement a new serial line interface for talking to remote
targets.
* configure.in: Link ser-hardwire.c to ser-unix.c for all hosts,
EXCEPT go32, which gets ser-go32.c.
* remote.c: Use new serial interface. More remote-xxx's to be
converted later.
* ser-bsd.c, ser-termios.c: Removed.
* serial.c: New. Implements common operations for all serial
types.
* ser-unix.c: New. Unix specific serial operations for various
flavors of Unix (Posix, SysV, BSD).
* serial.h: Generic serial interface defs.
* config/i386/go32.mh, config/i386/i386bsd.h,
config/m68k/apollo68b.mh, config/sparc/sun4os4.mh: Remove
ser-bsd.o from XDEPFILES. All the magic is now handled in
configure.in.
Diffstat (limited to 'gdb/serial.c')
-rw-r--r-- | gdb/serial.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/gdb/serial.c b/gdb/serial.c new file mode 100644 index 0000000..5a4fcf4 --- /dev/null +++ b/gdb/serial.c @@ -0,0 +1,181 @@ +/* Generic serial interface routines + Copyright 1992, 1993 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 +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +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., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "defs.h" +#include "serial.h" + +/* Open up a device or a network socket, depending upon the syntax of NAME. */ + +static struct serial_ops *serial_ops_list = NULL; + +static struct serial_ops * +serial_interface_lookup (name) + char *name; +{ + struct serial_ops *ops; + + for (ops = serial_ops_list; ops; ops = ops->next) + if (strcmp (name, ops->name) == 0) + return ops; + + return NULL; +} + +void +serial_add_interface(optable) + struct serial_ops *optable; +{ + optable->next = serial_ops_list; + serial_ops_list = optable; +} + +serial_t +serial_open(name) + const char *name; +{ + serial_t scb; + struct serial_ops *ops; + + ops = serial_interface_lookup ("hardwire"); + + if (!ops) + return NULL; + + scb = (serial_t)xmalloc (sizeof (struct _serial_t)); + + scb->ops = ops; + + scb->bufcnt = 0; + scb->bufp = scb->buf; + + if (SERIAL_OPEN (scb, name)) + { + free (scb); + return NULL; + } + + return scb; +} + +#if 0 +/* Connect the user directly to the remote system. This command acts just like + the 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */ + +static void +cleanup_tty(ttystate) + struct ttystate ttystate; +{ + printf("\r\n[Exiting connect mode]\r\n"); + serial_restore(0, &ttystate); +} + +static void +connect_command (args, fromtty) + char *args; + int fromtty; +{ + fd_set readfds; + int numfds; + int c; + char cur_esc = 0; + static struct ttystate ttystate; + + dont_repeat(); + + if (desc < 0) + error("target not open."); + + if (args) + fprintf("This command takes no args. They have been ignored.\n"); + + printf("[Entering connect mode. Use ~. or ~^D to escape]\n"); + + serial_raw(0, &ttystate); + + make_cleanup(cleanup_tty, &ttystate); + + FD_ZERO(&readfds); + + while (1) + { + do + { + FD_SET(0, &readfds); + FD_SET(desc, &readfds); + numfds = select(sizeof(readfds)*8, &readfds, 0, 0, 0); + } + while (numfds == 0); + + if (numfds < 0) + perror_with_name("select"); + + if (FD_ISSET(0, &readfds)) + { /* tty input, send to stdebug */ + char cx; + + c = serial_readchar(-1); + if (c < 0) + perror_with_name("connect"); + + cx = c; + serial_write(&cx, 1); + switch (cur_esc) + { + case 0: + if (c == '\r') + cur_esc = c; + break; + case '\r': + if (c == '~') + cur_esc = c; + else + cur_esc = 0; + break; + case '~': + if (c == '.' || c == '\004') + return; + else + cur_esc = 0; + } + } + + if (FD_ISSET(desc, &readfds)) + { + while (1) + { + c = serial_readchar(-1); + if (c < 0) + break; + putchar(c); + } + fflush(stdout); + } + } +} +#endif + +#if 0 +void +_initialize_serial () +{ + add_com ("connect", class_obscure, connect_command, + "Connect the terminal directly up to the command monitor.\n\ +Use <CR>~. or <CR>~^D to break out."); +} +#endif |