Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1a 12/4/83; site rlgvax.UUCP Path: utzoo!linus!decvax!mcnc!akgua!clyde!floyd!harpo!seismo!rlgvax!guy From: guy@rlgvax.UUCP (Guy Harris) Newsgroups: net.unix Subject: Re: Non-blocking tty read Message-ID: <1674@rlgvax.UUCP> Date: Tue, 7-Feb-84 01:00:42 EST Article-I.D.: rlgvax.1674 Posted: Tue Feb 7 01:00:42 1984 Date-Received: Thu, 9-Feb-84 23:06:41 EST References: <355@hocda.UUCP> Organization: CCI Office Systems Group, Reston, VA Lines: 57 > We have USG 4.2 UNIX, which has 'struct termio'; if you have > an oldter system with 'struct sgtty' you cannot do it. For the record, "System III" is USG 3.0.1 and "System V Release N" is USG 5.0 or later; USG 3.0 and later releases have it, although there is a bug in USG 3.0 and USG 3.0.1 (System III) that causes no-delay read not to work (it's trivial to fix). > One changes to raw mode by saving the contents of the struct for line 0, > then changes some constants. Assume you have the following code: . . . > stt.c_iflag = stt.c_oflag = stt.c_lflag = 0; > stt.c_cflag = (svt.c_cflag&CBAUD)|CS8|CREAD|CLOCAL; /* direct line */ > stt.c_cc[VMIN] = 0; /* no chars needed for read() to return */ > stt.c_cc[VTIME] = 0; /* timeout limit = 0 */ > ioctl(0,TCSETA,&stt); Two points: 1) Going into raw mode (meaning 8-bit data path with no special processing of input or output) may be overkill; one should only go into raw mode if one really wants to get 8-bit characters (i.e., the eighth bit is not a parity bit) and one wants to disable all "canonicalization" (erase, kill, eof), signals (interrupt, quit), XON/XOFF processing (think twice if you have a VT100), etc., etc.. If one is just reading single characters and responding to them directly (such as in a screen editor), merely turning the ICANON bit off in "c_lflag" will suffice. In the V7 terminal driver (and the enhanced V7 driver that comes with various Berkeley releases), turning on the CBREAK bit and possibly disabling characters like the interrupt and quit characters will suffice. 2) The trick of setting c_cc[VMIN] to 0 may not work on systems prior to USG 4.2 (I tried it on a System III system and it didn't work). I will note that the documentation of the UNIX terminal driver given in the System III and System V documentation is rather incomplete. There are several features in both drivers which are not documented, and it is not clear that all the documented features are completely or clearly documented, so be prepared for surprises if you try some things that "look" like they should work; the fact that setting c_cc[VMIN] has the effect of putting you in no-delay mode is not 100% obvious from the S3/S5 manual page. (Also, I would like to shoot the idiot at Bell who decided that the terminal driver manual pages belonged in the Administrator's Manual rather than the User's Manual. There is little correlation between administrator status and need to know the pecularities of a device interface; there is *no* correlation between administrator status and the desire or right to write a screen-oriented program, but in order to put the terminal into character-at-a-time mode you need the stuff that appears in TERMIO(7) in the *Administrator's* Manual.) Guy Harris {seismo,ihnp4,allegra}!rlgvax!guy