2002-05-14 Daniel Jacobowitz <drow@mvista.com>
* ser-tcp.c: Include <netinet/udp.h>. 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. * remote.c (remote_serial_open): New function. Warn about UDP. (remote_open_1, remote_async_open_1, remote_cisco_open): Call it. 2002-05-14 Daniel Jacobowitz <drow@mvista.com> * gdb.texinfo (Debug Session): Document new `udp:' and `tcp:' options for `target remote'.
This commit is contained in:
parent
5dbc6baa50
commit
9db8d71ff0
5 changed files with 92 additions and 23 deletions
|
@ -1,3 +1,13 @@
|
|||
2002-05-14 Daniel Jacobowitz <drow@mvista.com>
|
||||
|
||||
* ser-tcp.c: Include <netinet/udp.h>. 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.
|
||||
* remote.c (remote_serial_open): New function. Warn about UDP.
|
||||
(remote_open_1, remote_async_open_1, remote_cisco_open): Call it.
|
||||
|
||||
2002-05-13 Elena Zannoni <ezannoni@redhat.com>
|
||||
|
||||
* MAINTAINERS: List sh-elf as buildable with ,-Werror.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2002-05-14 Daniel Jacobowitz <drow@mvista.com>
|
||||
|
||||
* gdb.texinfo (Debug Session): Document new `udp:' and `tcp:'
|
||||
options for `target remote'.
|
||||
|
||||
2002-05-13 Andrew Cagney <ac131313@redhat.com>
|
||||
|
||||
* gdbint.texinfo (Target Architecture Definition): Delete
|
||||
|
|
|
@ -10475,7 +10475,7 @@ of its pure text.
|
|||
Establish communication using the @code{target remote} command.
|
||||
Its argument specifies how to communicate with the target
|
||||
machine---either via a devicename attached to a direct serial line, or a
|
||||
TCP port (usually to a terminal server which in turn has a serial line
|
||||
TCP or UDP port (usually to a terminal server which in turn has a serial line
|
||||
to the target). For example, to use a serial line connected to the
|
||||
device named @file{/dev/ttyb}:
|
||||
|
||||
|
@ -10485,7 +10485,8 @@ target remote /dev/ttyb
|
|||
|
||||
@cindex TCP port, @code{target remote}
|
||||
To use a TCP connection, use an argument of the form
|
||||
@code{@var{host}:port}. For example, to connect to port 2828 on a
|
||||
@code{@var{host}:@var{port}} or @code{tcp:@var{host}:@var{port}}.
|
||||
For example, to connect to port 2828 on a
|
||||
terminal server named @code{manyfarms}:
|
||||
|
||||
@smallexample
|
||||
|
@ -10503,6 +10504,21 @@ target remote :1234
|
|||
@noindent
|
||||
|
||||
Note that the colon is still required here.
|
||||
|
||||
@cindex UDP port, @code{target remote}
|
||||
To use a UDP connection, use an argument of the form
|
||||
@code{udp:@var{host}:@var{port}}. For example, to connect to UDP port 2828
|
||||
on a terminal server named @code{manyfarms}:
|
||||
|
||||
@smallexample
|
||||
target remote udp:manyfarms:2828
|
||||
@end smallexample
|
||||
|
||||
When using a UDP connection for remote debugging, you should keep in mind
|
||||
that the `U' stands for ``Unreliable''. UDP can silently drop packets on
|
||||
busy or unreliable networks, which will cause havoc with your debugging
|
||||
session.
|
||||
|
||||
@end enumerate
|
||||
|
||||
Now you can use all the usual commands to examine and change data and to
|
||||
|
|
26
gdb/remote.c
26
gdb/remote.c
|
@ -2222,6 +2222,26 @@ remote_check_symbols (struct objfile *objfile)
|
|||
}
|
||||
}
|
||||
|
||||
static struct serial *
|
||||
remote_serial_open (char *name)
|
||||
{
|
||||
static int udp_warning = 0;
|
||||
|
||||
/* FIXME: Parsing NAME here is a hack. But we want to warn here instead
|
||||
of in ser-tcp.c, because it is the remote protocol assuming that the
|
||||
serial connection is reliable and not the serial connection promising
|
||||
to be. */
|
||||
if (!udp_warning && strncmp (name, "udp:", 4) == 0)
|
||||
{
|
||||
warning ("The remote protocol may be unreliable over UDP.");
|
||||
warning ("Some events may be lost, rendering further debugging "
|
||||
"impossible.");
|
||||
udp_warning = 1;
|
||||
}
|
||||
|
||||
return serial_open (name);
|
||||
}
|
||||
|
||||
static void
|
||||
remote_open_1 (char *name, int from_tty, struct target_ops *target,
|
||||
int extended_p)
|
||||
|
@ -2239,7 +2259,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target,
|
|||
|
||||
unpush_target (target);
|
||||
|
||||
remote_desc = serial_open (name);
|
||||
remote_desc = remote_serial_open (name);
|
||||
if (!remote_desc)
|
||||
perror_with_name (name);
|
||||
|
||||
|
@ -2337,7 +2357,7 @@ remote_async_open_1 (char *name, int from_tty, struct target_ops *target,
|
|||
|
||||
unpush_target (target);
|
||||
|
||||
remote_desc = serial_open (name);
|
||||
remote_desc = remote_serial_open (name);
|
||||
if (!remote_desc)
|
||||
perror_with_name (name);
|
||||
|
||||
|
@ -5463,7 +5483,7 @@ remote_cisco_open (char *name, int from_tty)
|
|||
|
||||
unpush_target (&remote_cisco_ops);
|
||||
|
||||
remote_desc = serial_open (name);
|
||||
remote_desc = remote_serial_open (name);
|
||||
if (!remote_desc)
|
||||
perror_with_name (name);
|
||||
|
||||
|
|
|
@ -38,12 +38,13 @@
|
|||
#include <netdb.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <netinet/udp.h>
|
||||
|
||||
#include <signal.h>
|
||||
#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 *name)
|
|||
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 *name)
|
|||
|
||||
if (n < 0 && errno != EINPROGRESS)
|
||||
{
|
||||
tcp_close (scb);
|
||||
net_close (scb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -124,7 +139,7 @@ tcp_open (struct serial *scb, const char *name)
|
|||
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 *name)
|
|||
{
|
||||
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 *name)
|
|||
{
|
||||
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 *name)
|
|||
}
|
||||
|
||||
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;
|
||||
|
|
Loading…
Reference in a new issue