aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/ser-go32.c13
-rw-r--r--gdb/ser-tcp.c42
-rw-r--r--gdb/ser-unix.c29
-rw-r--r--gdb/serial.c13
5 files changed, 71 insertions, 40 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8eb811a..3d1f9b5 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+Fri Jun 25 17:02:45 1993 Stu Grossman (grossman at cygnus.com)
+
+ * remote.c: Add arg names to prototypes, in a modest effort at
+ clarification. Also add prototypes for some new functions.
+ * (remote_wait): Better error reporting for 'T' responses.
+ * ser-go32.c (strncasecmp): Make str1 & str2 be const.
+ * (dos_async_init): Make usage message reflect requested port #.
+ * ser-tcp.c (tcp_open): Terminate hostname properly to prevent
+ random hostname lookup failures. Add nicer message for unknown
+ host error. (wait_for): Wake up in case of exceptions. Also,
+ restart select() if we got EINTR.
+ * ser-unix.c (wait_for): Restart select() if we got EINTR.
+ * serial.c: (serial_close): Clean up code.
+
Fri Jun 25 11:22:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* Makefile.in (*.tab.c): Use ./c-exp.tab.c not just c-exp.tab.c.
diff --git a/gdb/ser-go32.c b/gdb/ser-go32.c
index 5b3ad90..8689e24 100644
--- a/gdb/ser-go32.c
+++ b/gdb/ser-go32.c
@@ -49,7 +49,7 @@ static void go32_restore PARAMS ((serial_t scb));
static void go32_close PARAMS ((serial_t scb));
static serial_ttystate go32_get_tty_state PARAMS ((serial_t scb));
static int go32_set_tty_state PARAMS ((serial_t scb, serial_ttystate state));
-static int strncasecmp PARAMS ((char *str1, char *str2, int len));
+static int strncasecmp PARAMS ((const char *str1, const char *str2, int len));
static char *aptr PARAMS ((short p));
static ASYNC_STRUCT *getivec PARAMS ((int which));
static int dos_async_init PARAMS ((int port));
@@ -78,7 +78,7 @@ static int iov;
static int
strncasecmp(str1, str2, len)
- char *str1, *str2;
+ const char *str1, *str2;
register int len;
{
unsigned char c1, c2;
@@ -143,13 +143,12 @@ dos_async_init(port)
if (!async)
{
- error("GDB can not connect to asynctsr program, check that it is installed\n\
+ error("GDB cannot connect to asynctsr program, check that it is installed\n\
and that serial I/O is not being redirected (perhaps by NFS)\n\n\
example configuration:\n\
-C> mode com2:9600,n,8,1,p\n\
-C> asynctsr 2\n\
-C> gdb \n");
-
+C> mode com%d:9600,n,8,1,p\n\
+C> asynctsr %d\n\
+C> gdb \n", port, port);
}
iov = async->iov;
diff --git a/gdb/ser-tcp.c b/gdb/ser-tcp.c
index 3b30bf1..5afe63e 100644
--- a/gdb/ser-tcp.c
+++ b/gdb/ser-tcp.c
@@ -64,14 +64,16 @@ tcp_open(scb, name)
if (!port_str)
error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */
- tmp = min(port_str - name + 1, sizeof hostname);
- strncpy (hostname, name, tmp - 1); /* Don't want colon */
+ tmp = min (port_str - name, sizeof hostname - 1);
+ strncpy (hostname, name, tmp); /* Don't want colon */
+ hostname[tmp] = '\000'; /* Tie off host name */
port = atoi (port_str + 1);
hostent = gethostbyname (hostname);
if (!hostent)
{
+ fprintf (stderr, "%s: unknown host\n", hostname);
errno = ENOENT;
return -1;
}
@@ -93,9 +95,10 @@ tcp_open(scb, name)
memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
sizeof (struct in_addr));
- if (connect(scb->fd, &sockaddr, sizeof(sockaddr)))
+ if (connect (scb->fd, &sockaddr, sizeof(sockaddr)))
{
close(scb->fd);
+ scb->fd = -1;
return -1;
}
@@ -158,27 +161,34 @@ wait_for(scb, timeout)
{
int numfds;
struct timeval tv;
- fd_set readfds;
+ fd_set readfds, exceptfds;
FD_ZERO (&readfds);
+ FD_ZERO (&exceptfds);
tv.tv_sec = timeout;
tv.tv_usec = 0;
FD_SET(scb->fd, &readfds);
+ FD_SET(scb->fd, &exceptfds);
- if (timeout >= 0)
- numfds = select(scb->fd+1, &readfds, 0, 0, &tv);
- else
- numfds = select(scb->fd+1, &readfds, 0, 0, 0);
-
- if (numfds <= 0)
- if (numfds == 0)
- return SERIAL_TIMEOUT;
- else
- return SERIAL_ERROR; /* Got an error from select or poll */
-
- return 0;
+ while (1)
+ {
+ if (timeout >= 0)
+ numfds = select(scb->fd+1, &readfds, 0, &exceptfds, &tv);
+ else
+ numfds = select(scb->fd+1, &readfds, 0, &exceptfds, 0);
+
+ if (numfds <= 0)
+ if (numfds == 0)
+ return SERIAL_TIMEOUT;
+ else if (errno == EINTR)
+ continue;
+ else
+ return SERIAL_ERROR; /* Got an error from select or poll */
+
+ return 0;
+ }
}
/* Read a character with user-specified timeout. TIMEOUT is number of seconds
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c
index 6c142e7..248496e 100644
--- a/gdb/ser-unix.c
+++ b/gdb/ser-unix.c
@@ -212,18 +212,23 @@ wait_for(scb, timeout)
FD_SET(scb->fd, &readfds);
- if (timeout >= 0)
- numfds = select(scb->fd+1, &readfds, 0, 0, &tv);
- else
- numfds = select(scb->fd+1, &readfds, 0, 0, 0);
-
- if (numfds <= 0)
- if (numfds == 0)
- return SERIAL_TIMEOUT;
- else
- return SERIAL_ERROR; /* Got an error from select or poll */
-
- return 0;
+ while (1)
+ {
+ if (timeout >= 0)
+ numfds = select(scb->fd+1, &readfds, 0, 0, &tv);
+ else
+ numfds = select(scb->fd+1, &readfds, 0, 0, 0);
+
+ if (numfds <= 0)
+ if (numfds == 0)
+ return SERIAL_TIMEOUT;
+ else if (errno == EINTR)
+ continue;
+ else
+ return SERIAL_ERROR; /* Got an error from select or poll */
+
+ return 0;
+ }
#endif /* HAVE_SGTTY */
diff --git a/gdb/serial.c b/gdb/serial.c
index 005c946..6913fd6 100644
--- a/gdb/serial.c
+++ b/gdb/serial.c
@@ -116,11 +116,14 @@ serial_close(scb)
{
last_serial_opened = NULL;
- if (scb != NULL)
- {
- scb->ops->close(scb);
- free(scb);
- }
+/* This is bogus. It's not our fault if you pass us a bad scb...! Rob, you
+ should fix your code instead. */
+
+ if (!scb)
+ return;
+
+ scb->ops->close(scb);
+ free(scb);
}
#if 0