From a037b21e7588263dba78ac0b1651abd56237ca93 Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Sat, 26 Jun 1993 00:22:30 +0000 Subject: * 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. --- gdb/ChangeLog | 14 ++++++++++++++ gdb/ser-go32.c | 13 ++++++------- gdb/ser-tcp.c | 42 ++++++++++++++++++++++++++---------------- gdb/ser-unix.c | 29 +++++++++++++++++------------ gdb/serial.c | 13 ++++++++----- 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 -- cgit v1.1