X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fser-unix.c;h=d2221f80e087ffde853cc42471f2e12fded35a00;hb=6c00b04ff87a1298c41a5e33d1a4fe412c0751ec;hp=c39663f76803b7bafea3aca6440b22a3ee763598;hpb=0ac0a9f6f14269d2a69c804a8194cc2f7009ab3b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index c39663f768..d2221f80e0 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -1,5 +1,5 @@ /* Serial interface for local (hardwired) serial ports on Un*x like systems - Copyright 1992, 1993 Free Software Foundation, Inc. + Copyright 1992, 1993, 1994 Free Software Foundation, Inc. This file is part of GDB. @@ -33,7 +33,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ struct hardwire_ttystate { struct termios termios; - pid_t process_group; }; #endif /* termios */ @@ -65,13 +64,6 @@ struct hardwire_ttystate struct ltchars ltc; /* Line discipline flags. */ int lmode; - -#ifdef SHORT_PGRP - /* This is only used for the ultra. Does it have pid_t? */ - short process_group; -#else - int process_group; -#endif }; #endif /* sgtty */ @@ -110,23 +102,10 @@ get_tty_state(scb, state) { #ifdef HAVE_TERMIOS extern int errno; - pid_t new_process_group; if (tcgetattr(scb->fd, &state->termios) < 0) return -1; - if (!job_control) - return 0; - - /* Apparently, if a tty has no process group, then tcgetpgrp returns -1 with - errno == 0. In this case, set the process group to -1 so that we know to - omit resetting it later. */ - new_process_group = tcgetpgrp (scb->fd); - if ((new_process_group == (pid_t)-1) - && (errno != ENOTTY)) - return -1; - errno = 0; - state->process_group = new_process_group; return 0; #endif @@ -146,10 +125,7 @@ get_tty_state(scb, state) if (ioctl (scb->fd, TIOCLGET, &state->lmode) < 0) return -1; - if (!job_control) - return 0; - - return ioctl (scb->fd, TIOCGPGRP, &state->process_group); + return 0; #endif } @@ -162,14 +138,7 @@ set_tty_state(scb, state) if (tcsetattr(scb->fd, TCSANOW, &state->termios) < 0) return -1; - if (!job_control) - return 0; - - /* If the tty had no process group before, then do not reset it. */ - if (state->process_group == -1) - return 0; - else - return tcsetpgrp (scb->fd, state->process_group); + return 0; #endif #ifdef HAVE_TERMIO @@ -181,11 +150,14 @@ set_tty_state(scb, state) #ifdef HAVE_SGTTY if (ioctl (scb->fd, TIOCSETN, &state->sgttyb) < 0) return -1; + if (ioctl (scb->fd, TIOCSETC, &state->tc) < 0) + return -1; + if (ioctl (scb->fd, TIOCSLTC, &state->ltc) < 0) + return -1; + if (ioctl (scb->fd, TIOCLSET, &state->lmode) < 0) + return -1; - if (!job_control) - return 0; - - return ioctl (scb->fd, TIOCSPGRP, &state->process_group); + return 0; #endif } @@ -226,23 +198,9 @@ hardwire_noflush_set_tty_state (scb, new_ttystate, old_ttystate) new_state = *(struct hardwire_ttystate *)new_ttystate; -#ifdef HAVE_TERMIOS - /* I'm not sure whether this is necessary; the manpage makes no mention - of discarding input when switching to/from ICANON. */ - if (state->termios.c_lflag & ICANON) - new_state.termios.c_lflag |= ICANON; - else - new_state.termios.c_lflag &= ~ICANON; -#endif - -#ifdef HAVE_TERMIO - /* I'm not sure whether this is necessary; the manpage makes no mention - of discarding input when switching to/from ICANON. */ - if (state->termio.c_lflag & ICANON) - new_state.termio.c_lflag |= ICANON; - else - new_state.termio.c_lflag &= ~ICANON; -#endif + /* Don't change in or out of raw mode; we don't want to flush input. + termio and termios have no such restriction; for them flushing input + is separate from setting the attributes. */ #ifdef HAVE_SGTTY if (state->sgttyb.sg_flags & RAW) @@ -270,8 +228,6 @@ hardwire_print_tty_state (scb, ttystate) int i; #ifdef HAVE_TERMIOS - printf_filtered ("Process group = %d\n", state->process_group); - printf_filtered ("c_iflag = 0x%x, c_oflag = 0x%x,\n", state->termios.c_iflag, state->termios.c_oflag); printf_filtered ("c_cflag = 0x%x, c_lflag = 0x%x\n", @@ -300,8 +256,6 @@ hardwire_print_tty_state (scb, ttystate) #endif #ifdef HAVE_SGTTY - printf_filtered ("Process group = %d\n", state->process_group); - printf_filtered ("sgttyb.sg_flags = 0x%x.\n", state->sgttyb.sg_flags); printf_filtered ("tchars: "); @@ -392,7 +346,7 @@ hardwire_raw(scb) struct hardwire_ttystate state; if (get_tty_state(scb, &state)) - fprintf(stderr, "get_tty_state failed: %s\n", safe_strerror(errno)); + fprintf_unfiltered(gdb_stderr, "get_tty_state failed: %s\n", safe_strerror(errno)); #ifdef HAVE_TERMIOS state.termios.c_iflag = 0; @@ -422,7 +376,7 @@ hardwire_raw(scb) scb->current_timeout = 0; if (set_tty_state (scb, &state)) - fprintf(stderr, "set_tty_state failed: %s\n", safe_strerror(errno)); + fprintf_unfiltered(gdb_stderr, "set_tty_state failed: %s\n", safe_strerror(errno)); } /* Wait for input on scb, with timeout seconds. Returns 0 on success, @@ -437,61 +391,105 @@ wait_for(scb, timeout) serial_t scb; int timeout; { -#ifdef HAVE_SGTTY - struct timeval tv; - fd_set readfds; + scb->timeout_remaining = 0; - FD_ZERO (&readfds); +#ifdef HAVE_SGTTY + { + struct timeval tv; + fd_set readfds; - tv.tv_sec = timeout; - tv.tv_usec = 0; + FD_ZERO (&readfds); - FD_SET(scb->fd, &readfds); + tv.tv_sec = timeout; + tv.tv_usec = 0; - while (1) - { - int numfds; - - 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 */ + FD_SET(scb->fd, &readfds); - return 0; - } + while (1) + { + int numfds; + 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 */ #if defined HAVE_TERMIO || defined HAVE_TERMIOS if (timeout == scb->current_timeout) return 0; + scb->current_timeout = timeout; + { struct hardwire_ttystate state; if (get_tty_state(scb, &state)) - fprintf(stderr, "get_tty_state failed: %s\n", safe_strerror(errno)); + fprintf_unfiltered(gdb_stderr, "get_tty_state failed: %s\n", safe_strerror(errno)); #ifdef HAVE_TERMIOS - state.termios.c_cc[VTIME] = timeout * 10; + if (timeout < 0) + { + /* No timeout. */ + state.termios.c_cc[VTIME] = 0; + state.termios.c_cc[VMIN] = 1; + } + else + { + state.termios.c_cc[VMIN] = 0; + state.termios.c_cc[VTIME] = timeout * 10; + if (state.termios.c_cc[VTIME] != timeout * 10) + { + + /* If c_cc is an 8-bit signed character, we can't go + bigger than this. If it is always unsigned, we could use + 25. */ + + scb->current_timeout = 12; + state.termios.c_cc[VTIME] = scb->current_timeout * 10; + scb->timeout_remaining = timeout - scb->current_timeout; + } + } #endif #ifdef HAVE_TERMIO - state.termio.c_cc[VTIME] = timeout * 10; + if (timeout < 0) + { + /* No timeout. */ + state.termio.c_cc[VTIME] = 0; + state.termio.c_cc[VMIN] = 1; + } + else + { + state.termio.c_cc[VMIN] = 0; + state.termio.c_cc[VTIME] = timeout * 10; + if (state.termio.c_cc[VTIME] != timeout * 10) + { + /* If c_cc is an 8-bit signed character, we can't go + bigger than this. If it is always unsigned, we could use + 25. */ + + scb->current_timeout = 12; + state.termio.c_cc[VTIME] = scb->current_timeout * 10; + scb->timeout_remaining = timeout - scb->current_timeout; + } + } #endif - scb->current_timeout = timeout; - if (set_tty_state (scb, &state)) - fprintf(stderr, "set_tty_state failed: %s\n", safe_strerror(errno)); + fprintf_unfiltered(gdb_stderr, "set_tty_state failed: %s\n", safe_strerror(errno)); return 0; } @@ -513,24 +511,37 @@ hardwire_readchar(scb, timeout) if (scb->bufcnt-- > 0) return *scb->bufp++; - status = wait_for(scb, timeout); - - if (status < 0) - return status; - - scb->bufcnt = read(scb->fd, scb->buf, BUFSIZ); - - if (scb->bufcnt <= 0) - if (scb->bufcnt == 0) - return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to - distinguish between EOF & timeouts - someday] */ - else - return SERIAL_ERROR; /* Got an error from read */ - - scb->bufcnt--; - scb->bufp = scb->buf; - return *scb->bufp++; + while (1) + { + status = wait_for (scb, timeout); + + if (status < 0) + return status; + + scb->bufcnt = read (scb->fd, scb->buf, BUFSIZ); + + if (scb->bufcnt <= 0) + { + if (scb->bufcnt == 0) + { + /* Zero characters means timeout (it could also be EOF, but + we don't (yet at least) distinguish). */ + if (scb->timeout_remaining > 0) + { + timeout = scb->timeout_remaining; + continue; + } + else + return SERIAL_TIMEOUT; + } + else + return SERIAL_ERROR; /* Got an error from read */ + } + + scb->bufcnt--; + scb->bufp = scb->buf; + return *scb->bufp++; + } } #ifndef B19200 @@ -614,18 +625,6 @@ hardwire_setbaudrate(scb, rate) return set_tty_state (scb, &state); } -static int -hardwire_set_process_group (scb, ttystate, group) - serial_t scb; - serial_ttystate ttystate; - int group; -{ -#if defined (HAVE_SGTTY) || defined (HAVE_TERMIOS) - ((struct hardwire_ttystate *)ttystate)->process_group = group; -#endif - return 0; -} - static int hardwire_write(scb, str, len) serial_t scb; @@ -674,77 +673,10 @@ static struct serial_ops hardwire_ops = hardwire_print_tty_state, hardwire_noflush_set_tty_state, hardwire_setbaudrate, - hardwire_set_process_group }; -int job_control; -#if defined (HAVE_TERMIOS) -#include -#endif - -/* This is here because this is where we figure out whether we (probably) - have job control. Just using job_control only does part of it because - setpgid or setpgrp might not exist on a system without job control. - It might be considered misplaced (on the other hand, process groups and - job control are closely related to ttys). - - For a more clean implementation, in libiberty, put a setpgid which merely - calls setpgrp and a setpgrp which does nothing (any system with job control - will have one or the other). */ -int -gdb_setpgid () -{ - int retval = 0; - if (job_control) - { -#if defined (NEED_POSIX_SETPGID) || defined (HAVE_TERMIOS) - /* Do all systems with termios have setpgid? I hope so. */ - /* setpgid (0, 0) is supposed to work and mean the same thing as - this, but on Ultrix 4.2A it fails with EPERM (and - setpgid (getpid (), getpid ()) succeeds). */ - retval = setpgid (getpid (), getpid ()); -#else -#if defined (TIOCGPGRP) -#if defined(USG) && !defined(SETPGRP_ARGS) - retval = setpgrp (); -#else - retval = setpgrp (getpid (), getpid ()); -#endif /* USG */ -#endif /* TIOCGPGRP. */ -#endif /* NEED_POSIX_SETPGID */ - } - return retval; -} - void _initialize_ser_hardwire () { serial_add_interface (&hardwire_ops); - - /* OK, figure out whether we have job control. */ - -#if defined (HAVE_TERMIOS) - /* Do all systems with termios have the POSIX way of identifying job - control? I hope so. */ -#ifdef _POSIX_JOB_CONTROL - job_control = 1; -#else - job_control = sysconf (_SC_JOB_CONTROL); -#endif -#endif /* termios */ - -#ifdef HAVE_TERMIO - /* See comment at top of file about trying to support process groups - with termio. */ - job_control = 0; -#endif /* termio */ - -#ifdef HAVE_SGTTY -#ifdef TIOCGPGRP - job_control = 1; -#else - job_control = 0; -#endif /* TIOCGPGRP */ -#endif /* sgtty */ - }