This is the mail archive of the archer@sourceware.org mailing list for the Archer project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]