aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote-nrom.c
diff options
context:
space:
mode:
authorStu Grossman <grossman@cygnus>1995-06-08 22:42:36 +0000
committerStu Grossman <grossman@cygnus>1995-06-08 22:42:36 +0000
commit4887063b3ce78e39fac8a79d01fa01234ab95174 (patch)
tree0c715153cace5669953c7feca4a67d1a3d010651 /gdb/remote-nrom.c
parent311f7c4b6a19b0e4376e8985491a832cfd28a315 (diff)
downloadgdb-4887063b3ce78e39fac8a79d01fa01234ab95174.zip
gdb-4887063b3ce78e39fac8a79d01fa01234ab95174.tar.gz
gdb-4887063b3ce78e39fac8a79d01fa01234ab95174.tar.bz2
* defs.h maint.c monitor.c remote-mips.c remote.c: Add support
for `watchdog' variable. This allows the user to put an upper limit on the amount of time that GDB will wait for the target to return from a step or continue operation. This will primarily be used for the testsuite, where it is difficult to come up with a reasonable timeout for things like function calls, which can take as long as three minutes under some circumstances. If the watchdog timer expires, GDB will generate an error that looks like `Watchdog has expired.', and will detach from the target. * remote-mips.c (mips_open): Setup initial frame from target. Print it out so that user is told where the program is stopped when they attach. * remote-nrom.c: Loads of cleanups. Use serial code to open network connections. Use expect() to wait for response to download command. * ser-tcp.c (tcp_open): Retry connection if we get ECONNREFUSED. * serial.c serial.h (serial_open serial_fdopen serial_close): Allow users to open the same device multiple times. They all get to share the same serial_t. This is about the only way to have multiple active targets use the same device (for download and debug). * sparcl-tdep.c: Keep #include <unistd.h> away from GO32. * target.c: Add `targetdebug' variable. If this is non-zero, then a special target is put at the top of the target stack which will cause all calls through the target vector to have their args and results printed out.
Diffstat (limited to 'gdb/remote-nrom.c')
-rw-r--r--gdb/remote-nrom.c181
1 files changed, 84 insertions, 97 deletions
diff --git a/gdb/remote-nrom.c b/gdb/remote-nrom.c
index 1699d4c..0a0a959 100644
--- a/gdb/remote-nrom.c
+++ b/gdb/remote-nrom.c
@@ -28,6 +28,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "defs.h"
#include "gdbcmd.h"
+#include "serial.h"
+
#include <string.h>
#include "inferior.h"
#include "wait.h"
@@ -229,6 +231,10 @@ static int nrom_load_sock = -1;
static int nrom_targ_sock = -1;
static int nrom_ctrl_sock = -1;
+static serial_t load_desc = NULL;
+static serial_t targ_desc = NULL;
+static serial_t ctrl_desc = NULL;
+
/* For binding to the socket we ned a sockaddr_in structure. */
static struct sockaddr_in nrom_sin;
@@ -256,6 +262,8 @@ static int bufindex = 0;
static char workbuf[NROM_BUF_SIZE];
static char sendbuf[NROM_BUF_SIZE];
+static char nrom_hostname[100];
+
/* Forward data declaration. */
extern struct target_ops nrom_ops;
@@ -404,68 +412,75 @@ mem2hex (mem, buf, count)
return buf;
}
+/* Scan input from the remote system, until STRING is found. If BUF is non-
+ zero, then collect input until we have collected either STRING or BUFLEN-1
+ chars. In either case we terminate BUF with a 0. If input overflows BUF
+ because STRING can't be found, return -1, else return number of chars in BUF
+ (minus the terminating NUL). Note that in the non-overflow case, STRING
+ will be at the end of BUF. */
+
static int
-nrom_control_send (s, nbytes)
- char *s;
- int nbytes;
+expect (string)
+ char *string;
{
- long len;
- char buf[10];
-
- /* clear leading characters */
- /* FIXME: The ioctl uses here seem bogus to me. -sts */
- len = 1;
- while (len > 0)
- {
- if (ioctl (nrom_ctrl_sock, FIONREAD, &len) < 0)
- {
- perror ("nrom_control_send ioctl");
- return (-1);
- }
- if (len > 0)
- {
- if (read (nrom_ctrl_sock, buf, 1) < 0)
- {
- perror ("nrom_control_send read");
- return (-1);
- }
- }
- }
+ char *p = string;
+ int c;
- if (remote_debug)
- printf_filtered ("nrom_control_send: sending '%s' (%d bytes) to NetROM\n",
- s, nbytes);
+ immediate_quit = 1;
- if (writen (nrom_ctrl_sock, s, nbytes) < 0)
+ while (1)
{
- perror ("nrom_control_send");
- return (-1);
- }
+ c = SERIAL_READCHAR (ctrl_desc, 5);
- /* clear trailing characters */
- len = 1;
- while (len > 0)
- {
- if (ioctl (nrom_ctrl_sock, FIONREAD, &len) < 0)
+ if (c == *p++)
{
- perror ("nrom_control_send ioctl");
- return (-1);
- }
- if (len > 0)
- {
- if (read (nrom_ctrl_sock, buf, 1) < 0)
+ if (*p == '\0')
{
- perror ("nrom_control_send read");
- return (-1);
+ immediate_quit = 0;
+
+ return 0;
}
}
+ else
+ {
+ fputc_unfiltered (c, gdb_stdout);
+ p = string;
+ if (c == *p)
+ p++;
+ }
}
+}
+
+static int
+nrom_control_send (s, nbytes)
+ char *s;
+ int nbytes;
+{
+ SERIAL_WRITE (ctrl_desc, s, nbytes);
+
return 0;
}
static void
nrom_kill ()
{
+ nrom_close (0);
+}
+
+static serial_t
+open_socket (name, port)
+ char *name;
+ int port;
+{
+ char sockname[100];
+ serial_t desc;
+
+ sprintf (sockname, "%s:%d", name, port);
+ desc = SERIAL_OPEN (sockname);
+ if (!desc)
+ perror_with_name (sockname);
+
+ return desc;
}
/* Download a file specified in ARGS to the netROM. */
@@ -485,20 +500,9 @@ nrom_load (args, fromtty)
if (nrom_control_send (downloadstring, strlen (downloadstring)) < 0)
error ("nrom_load: control_send() of `%s' failed", downloadstring);
- /* Wait for the download daemon to start up. */
- sleep (1);
-
- nrom_load_sock = socket (AF_INET, SOCK_STREAM, 0);
- if (nrom_load_sock == -1)
- error ("Could not create download socket, error %d", errno);
-
- memset (&sin, 0, sizeof(struct sockaddr_in));
- sin.sin_family = AF_INET;
- sin.sin_port = htons (load_port);
- sin.sin_addr.s_addr = htonl (nrom_ipaddr);
+ expect ("Waiting for a connection...\n");
- if (connect (nrom_load_sock, &sin, sizeof(sin)) == -1)
- error ("Connect failed, error %d", errno);
+ load_desc = open_socket (nrom_hostname, load_port);
pbfd = bfd_openr (args, 0);
@@ -540,7 +544,7 @@ nrom_load (args, fromtty)
bfd_get_section_contents (pbfd, section, buffer, fptr,
count);
- writen (nrom_load_sock, buffer, count);
+ SERIAL_WRITE (load_desc, buffer, count);
section_address += count;
fptr += count;
section_size -= count;
@@ -557,7 +561,8 @@ nrom_load (args, fromtty)
else
error ("\"%s\": Could not open", args);
- close (nrom_load_sock);
+ SERIAL_CLOSE (load_desc);
+ load_desc = NULL;
}
/* This is called not only when we first attach, but also when the
@@ -580,52 +585,24 @@ nrom_open (name, from_tty)
{
int errn;
- if (name)
- nrom_set_ipaddr (name, from_tty);
- else if (nrom_ipaddr == 0)
+ if (!name || strchr (name, '/') || strchr (name, ':'))
error (
"To open a NetROM connection, you must specify the hostname\n\
or IP address of the NetROM device you wish to use.");
- push_target (&nrom_ops);
-
- /* Create the socket used for talking with the target. */
- nrom_targ_sock = socket (AF_INET, SOCK_STREAM, 0);
-
- /* Bind the socket. */
- nrom_sin.sin_family = AF_INET;
- nrom_sin.sin_port = htons (target_port);
- nrom_sin.sin_addr.S_un.S_addr = htonl (nrom_ipaddr);
+ strcpy (nrom_hostname, name);
- /* Connect to the remote host. */
- if (connect (nrom_targ_sock, &nrom_sin, sizeof(nrom_sin)) == -1)
- error ("Connect failed, error %d", errno);
+ target_preopen (from_tty);
- /* Create the socket used for talking with the debugger services. */
- nrom_ctrl_sock = socket (AF_INET, SOCK_STREAM, 0);
+ unpush_target (&nrom_ops);
- /* Bind the socket. */
- nrom_sin.sin_family = AF_INET;
- nrom_sin.sin_port = htons (control_port);
- nrom_sin.sin_addr.S_un.S_addr = htonl (nrom_ipaddr);
+ targ_desc = open_socket (nrom_hostname, target_port);
+ ctrl_desc = open_socket (nrom_hostname, control_port);
- /* Connect to the remote host. */
- if (connect (nrom_ctrl_sock, &nrom_sin, sizeof(nrom_sin)) == -1)
- {
- errn = errno;
- close (nrom_targ_sock);
- error ("Connect control_socket failed, error %d", errn);
- }
+ push_target (&nrom_ops);
if (from_tty)
- {
- unsigned char *i;
-
- printf_filtered ("Connected to NetROM device \"%s\"", name);
- i = (unsigned char *) &nrom_ipaddr;
- printf_filtered (" (%d.%d.%d.%d)\n",
- UC(i[0]), UC(i[1]), UC(i[2]), UC(i[3]));
- }
+ printf_filtered ("Connected to NetROM device \"%s\"\n", nrom_hostname);
}
static int
@@ -640,6 +617,16 @@ static void
nrom_close (quitting)
int quitting;
{
+ if (load_desc)
+ SERIAL_CLOSE (load_desc);
+ if (targ_desc)
+ SERIAL_CLOSE (targ_desc);
+ if (ctrl_desc)
+ SERIAL_CLOSE (ctrl_desc);
+
+ load_desc = NULL;
+ targ_desc = NULL;
+ ctrl_desc = NULL;
}
/* Attach to the target that is already loaded and possibly running */
@@ -1312,7 +1299,7 @@ struct target_ops nrom_ops = {
nrom_can_run,
0, /* to_notice_signals */
0,
- process_stratum, /* to_stratum */
+ download_stratum, /* to_stratum */
NULL, /* to_next */
1,
1,