From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15403 invoked by alias); 8 May 2002 23:58:00 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 15393 invoked from network); 8 May 2002 23:57:59 -0000 Received: from unknown (HELO cygnus.com) (205.180.83.203) by sources.redhat.com with SMTP; 8 May 2002 23:57:59 -0000 Received: from redhat.com (reddwarf.sfbay.redhat.com [172.16.24.50]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id QAA10350; Wed, 8 May 2002 16:57:56 -0700 (PDT) Message-ID: <3CD9B872.35CC1D23@redhat.com> Date: Wed, 08 May 2002 16:58:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Accept-Language: en MIME-Version: 1.0 To: Daniel Jacobowitz CC: gdb-patches@sources.redhat.com Subject: Re: [RFA] Remote UDP support References: <20020508232636.GA10279@nevyn.them.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2002-05/txt/msg00247.txt.bz2 Daniel Jacobowitz wrote: > > A patch for this feature was supported a year or so ago, but never went in. > I had a need for this a couple of days ago, so I did it over from scratch; > it's much easier now than it was at the time. The name of ser-tcp.c is a > bit wrong after this patch; I can either rename the file to ser-net.c or > just update some comments to match. Got a preference? Otherwise OK? > > -- > Daniel Jacobowitz Carnegie Mellon University > MontaVista Software Debian GNU/Linux Developer Wow! I love the simplicity of the change. Nice job. I'm not sure if I understand all the ramifications, though. If you call net_open, how is it going to decide whether to use udp or tcp? I imagine we would want it to use tcp by preference, if possible. > > 2002-05-08 Daniel Jacobowitz > > * ser-tcp.c: Include . Rename tcp_open > and tcp_close to net_open and net_close. > (net_open): Accept "udp:" and "tcp:" specifications. Connect > using UDP if requested. Don't try to disable Nagle on UDP > sockets. > > Index: ser-tcp.c > =================================================================== > RCS file: /cvs/src/src/gdb/ser-tcp.c,v > retrieving revision 1.10 > diff -u -p -r1.10 ser-tcp.c > --- ser-tcp.c 18 Dec 2001 18:54:18 -0000 1.10 > +++ ser-tcp.c 8 May 2002 23:21:58 -0000 > @@ -38,12 +38,13 @@ > #include > #include > #include > +#include > > #include > #include "gdb_string.h" > > -static int tcp_open (struct serial *scb, const char *name); > -static void tcp_close (struct serial *scb); > +static int net_open (struct serial *scb, const char *name); > +static void net_close (struct serial *scb); > extern int (*ui_loop_hook) (int); > void _initialize_ser_tcp (void); > > @@ -55,17 +56,27 @@ void _initialize_ser_tcp (void); > /* Open a tcp socket */ > > static int > -tcp_open (struct serial *scb, const char *name) > +net_open (struct serial *scb, const char *name) > { > char *port_str, hostname[100]; > int n, port, tmp; > + int use_udp; > struct hostent *hostent; > struct sockaddr_in sockaddr; > > + use_udp = 0; > + if (strncmp (name, "udp:", 4) == 0) > + { > + use_udp = 1; > + name = name + 4; > + } > + else if (strncmp (name, "tcp:", 4) == 0) > + name = name + 4; > + > port_str = strchr (name, ':'); > > if (!port_str) > - error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */ > + error ("net_open: No colon in host name!"); /* Shouldn't ever happen */ > > tmp = min (port_str - name, (int) sizeof hostname - 1); > strncpy (hostname, name, tmp); /* Don't want colon */ > @@ -84,7 +95,11 @@ tcp_open (struct serial *scb, const char > return -1; > } > > - scb->fd = socket (PF_INET, SOCK_STREAM, 0); > + if (use_udp) > + scb->fd = socket (PF_INET, SOCK_DGRAM, 0); > + else > + scb->fd = socket (PF_INET, SOCK_STREAM, 0); > + > if (scb->fd < 0) > return -1; > > @@ -102,7 +117,7 @@ tcp_open (struct serial *scb, const char > > if (n < 0 && errno != EINPROGRESS) > { > - tcp_close (scb); > + net_close (scb); > return -1; > } > > @@ -124,7 +139,7 @@ tcp_open (struct serial *scb, const char > if (ui_loop_hook (0)) > { > errno = EINTR; > - tcp_close (scb); > + net_close (scb); > return -1; > } > } > @@ -142,7 +157,7 @@ tcp_open (struct serial *scb, const char > { > if (polls > TIMEOUT * POLL_INTERVAL) > errno = ETIMEDOUT; > - tcp_close (scb); > + net_close (scb); > return -1; > } > } > @@ -156,20 +171,23 @@ tcp_open (struct serial *scb, const char > { > if (err) > errno = err; > - tcp_close (scb); > + net_close (scb); > return -1; > } > } > - > + > /* turn off nonblocking */ > tmp = 0; > ioctl (scb->fd, FIONBIO, &tmp); > > - /* Disable Nagle algorithm. Needed in some cases. */ > - tmp = 1; > - setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY, > - (char *)&tmp, sizeof (tmp)); > - > + if (use_udp == 0) > + { > + /* Disable Nagle algorithm. Needed in some cases. */ > + tmp = 1; > + setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY, > + (char *)&tmp, sizeof (tmp)); > + } > + > /* If we don't do this, then GDB simply exits > when the remote side dies. */ > signal (SIGPIPE, SIG_IGN); > @@ -178,7 +196,7 @@ tcp_open (struct serial *scb, const char > } > > static void > -tcp_close (struct serial *scb) > +net_close (struct serial *scb) > { > if (scb->fd < 0) > return; > @@ -194,8 +212,8 @@ _initialize_ser_tcp (void) > memset (ops, sizeof (struct serial_ops), 0); > ops->name = "tcp"; > ops->next = 0; > - ops->open = tcp_open; > - ops->close = tcp_close; > + ops->open = net_open; > + ops->close = net_close; > ops->readchar = ser_unix_readchar; > ops->write = ser_unix_write; > ops->flush_output = ser_unix_nop_flush_output;