decot@hpisod2.HP.COM (Dave Decot) (01/23/88)
/* Routines for managing nonechoing, one-character-at-a-time tty reads */ /* Dave Decot, hpda!decot, 851023 */ /* cbreak() - sets terminal up for one-char-at-a-time reads */ /* normal() - restores terminal to initial state */ #include <stdio.h> #include <signal.h> #include <sys/types.h> #ifndef hpux /* BSD style */ # include <sgtty.h> #else hpux /* HP-UX style (and other System V systems) */ # include <termio.h> #endif hpux static int tty_mode = 0; #ifdef TCGETA static struct termio orig_tty; static struct termio new_tty; #else static struct sgttyb orig_tty; static struct sgttyb new_tty; #endif cbreak() { if (tty_mode == 0) { #ifdef TCGETA ioctl(0, TCGETA, &orig_tty); #else ioctl(0, TIOCGETP, &orig_tty); #endif tty_mode = 1; new_tty = orig_tty; } #ifdef ICANON new_tty.c_lflag &= ~(ICANON | ECHO); new_tty.c_cc[VMIN] = 1; new_tty.c_cc[VTIME] = 0; ioctl(0, TCSETA, &new_tty); #else new_tty.sg_flags |= CBREAK; new_tty.sg_flags &= ~ECHO; ioctl(0, TIOCSETN, &new_tty); #endif } normal() { if (tty_mode == 1) { #ifdef TCSETA ioctl(0, TCSETA, &orig_tty); #else ioctl(0, TIOCSETN, &orig_tty); #endif new_tty = orig_tty; } }