From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10604 invoked by alias); 13 Aug 2010 04:37:36 -0000 Mailing-List: contact archer-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: List-Id: Received: (qmail 10587 invoked by uid 22791); 13 Aug 2010 04:37:33 -0000 X-SWARE-Spam-Status: No, hits=-6.1 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org From: Tom Tromey To: Roland McGrath Cc: Oleg Nesterov , archer@sourceware.org, utrace-devel@redhat.com Subject: Re: problems with v3 References: <20100811235810.GA9783@redhat.com> <20100812011113.GA13212@redhat.com> <20100812023750.GA17011@redhat.com> <20100812235228.GA15051@redhat.com> <20100813015844.B7703400E3@magilla.sf.frob.com> Date: Fri, 13 Aug 2010 04:37:00 -0000 In-Reply-To: <20100813015844.B7703400E3@magilla.sf.frob.com> (Roland McGrath's message of "Thu, 12 Aug 2010 18:58:44 -0700 (PDT)") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2010-q3/txt/msg00107.txt.bz2 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; }