This is the mail archive of the
archer@sourceware.org
mailing list for the Archer project.
Re: problems with v3
Roland> I don't really know the gdb code, but I'm surprised it really
Roland> has multiple different "serial" backends.
I don't know this area well, but considering that ser-unix.c is just
chock full of tty-related goo, I think it is probably important for
something. My impression is that this API is not just used for target
communication but also for manipulating gdb's own terminal.
I looked closer and aside from open/close, ser-pipe is just falling back
to some generic code.
I've appended the patch I came up with. I have not tried it at all, but
it should all be pretty obvious.
Maybe I'd do it a little differently if this were going upstream.
That doesn't seem necessary though.
Tom
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c
index 266453c..672b2a8 100644
--- a/gdb/ser-unix.c
+++ b/gdb/ser-unix.c
@@ -32,6 +32,7 @@
#include "gdb_select.h"
#include "gdb_string.h"
#include "gdbcmd.h"
+#include "gdb_stat.h"
#ifdef HAVE_TERMIOS
@@ -103,15 +104,56 @@ static int hardwire_setstopbits (struct serial *, int);
void _initialize_ser_hardwire (void);
+static struct serial_ops *
+get_pipe_like_ops (void)
+{
+ static struct serial_ops *ops;
+
+ if (ops == NULL)
+ {
+ ops = XMALLOC (struct serial_ops);
+ memset (ops, 0, sizeof (struct serial_ops));
+ ops->name = NULL;
+ ops->open = NULL;
+ ops->close = hardwire_close;
+ ops->readchar = ser_base_readchar;
+ ops->write = ser_base_write;
+ ops->flush_output = ser_base_flush_output;
+ ops->flush_input = ser_base_flush_input;
+ ops->send_break = ser_base_send_break;
+ ops->go_raw = ser_base_raw;
+ ops->get_tty_state = ser_base_get_tty_state;
+ ops->set_tty_state = ser_base_set_tty_state;
+ ops->print_tty_state = ser_base_print_tty_state;
+ ops->noflush_set_tty_state = ser_base_noflush_set_tty_state;
+ ops->setbaudrate = ser_base_setbaudrate;
+ ops->setstopbits = ser_base_setstopbits;
+ ops->drain_output = ser_base_drain_output;
+ ops->async = ser_base_async;
+ ops->read_prim = ser_unix_read_prim;
+ ops->write_prim = ser_unix_write_prim;
+ }
+
+ return ops;
+}
+
/* Open up a real live device for serial I/O */
static int
hardwire_open (struct serial *scb, const char *name)
{
+ struct stat buf;
+
scb->fd = open (name, O_RDWR);
if (scb->fd < 0)
return -1;
+ if (fstat (scb->fd, &buf) == 0 && S_ISFIFO (buf.st_mode))
+ {
+ /* Super hack! */
+ scb->ops = get_pipe_like_ops ();
+ }
+
return 0;
}