aboutsummaryrefslogtreecommitdiff
path: root/gdb/ser-unix.c
diff options
context:
space:
mode:
authorStu Grossman <grossman@cygnus>1993-05-06 22:17:10 +0000
committerStu Grossman <grossman@cygnus>1993-05-06 22:17:10 +0000
commit9e15da4ac4bf432f090f654cb3dea987325f3334 (patch)
tree239b5207105da344037617e178a6fd5434e711f6 /gdb/ser-unix.c
parentdfa592fb5ae5db2bfe3130e73128e1d08f562ece (diff)
downloadgdb-9e15da4ac4bf432f090f654cb3dea987325f3334.zip
gdb-9e15da4ac4bf432f090f654cb3dea987325f3334.tar.gz
gdb-9e15da4ac4bf432f090f654cb3dea987325f3334.tar.bz2
* ser-unix.c (wait_for): Use VTIME to do timeouts instead of
poll() for termio{s}.
Diffstat (limited to 'gdb/ser-unix.c')
-rw-r--r--gdb/ser-unix.c62
1 files changed, 46 insertions, 16 deletions
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c
index 32d22e2..5f1622d 100644
--- a/gdb/ser-unix.c
+++ b/gdb/ser-unix.c
@@ -30,11 +30,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef HAVE_TERMIOS
#include <termios.h>
#include <unistd.h>
-#include <poll.h>
#endif
#ifdef HAVE_TERMIO
#include <termio.h>
-#include <poll.h>
#endif
#ifdef HAVE_SGTTY
#include <sgtty.h>
@@ -124,9 +122,16 @@ hardwire_raw(scb)
if (ioctl (scb->fd, TIOCSETP, &sgttyb))
fprintf(stderr, "TIOCSETP failed: %s\n", safe_strerror(errno));
#endif
+
+ scb->current_timeout = 0;
}
-/* Wait for input on scb, with timeout seconds */
+/* Wait for input on scb, with timeout seconds. Returns 0 on success,
+ otherwise SERIAL_TIMEOUT or SERIAL_ERROR.
+
+ For termio{s}, we actually just setup VTIME if necessary, and let the
+ timeout occur in the read() in hardwire_read().
+ */
static int
wait_for(scb, timeout)
@@ -151,26 +156,49 @@ wait_for(scb, timeout)
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;
+
#endif /* HAVE_SGTTY */
#if defined HAVE_TERMIO || defined HAVE_TERMIOS
- struct pollfd pollfd;
+ if (timeout == scb->current_timeout)
+ return 0;
- pollfd.fd = scb->fd;
- pollfd.events = POLLIN | POLLPRI;
+ {
+#ifdef HAVE_TERMIOS
+ struct termios termios;
- if (timeout > 0)
- timeout *= 1000;
+ if (tcgetattr(scb->fd, &termios))
+ fprintf(stderr, "wait_for() tcgetattr failed: %s\n", safe_strerror(errno));
- numfds = poll(&pollfd, 1, timeout);
+ termios.c_cc[VTIME] = timeout * 10;
-#endif /* defined HAVE_TERMIO || defined HAVE_TERMIOS */
+ if (tcsetattr(scb->fd, TCSANOW, &termios))
+ fprintf(stderr, "wait_for() tcsetattr failed: %s\n", safe_strerror(errno));
+#endif /* HAVE_TERMIOS */
- if (numfds <= 0)
- if (numfds == 0)
- return SERIAL_TIMEOUT;
- else
- return SERIAL_ERROR; /* Got an error from select or poll */
+#ifdef HAVE_TERMIO
+ struct termio termio;
+
+ if (ioctl (scb->fd, TCGETA, &termio))
+ fprintf(stderr, "wait_for() TCGETA failed: %s\n", safe_strerror(errno));
+
+ termio.c_cc[VTIME] = timeout * 10;
+
+ if (ioctl (scb->fd, TCSETA, &termio))
+ fprintf(stderr, "TCSETA failed: %s\n", safe_strerror(errno));
+#endif /* HAVE_TERMIO */
+
+ scb->current_timeout = timeout;
+ return 0;
+ }
+#endif /* HAVE_TERMIO || HAVE_TERMIOS */
}
/* Read a character with user-specified timeout. TIMEOUT is number of seconds
@@ -197,7 +225,9 @@ hardwire_readchar(scb, timeout)
if (scb->bufcnt <= 0)
if (scb->bufcnt == 0)
- return SERIAL_EOF; /* 0 chars means end of file */
+ return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to
+ distinguish between EOF & timeouts
+ someday] */
else
return SERIAL_ERROR; /* Got an error from read */