Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!sdd.hp.com!hplabs!hpda!hpcupt1!hpisod2!decot From: decot@hpisod2.cup.hp.com (Dave Decot) Newsgroups: comp.unix.wizards Subject: Re: sgtty -> termio Message-ID: <14020112@hpisod2.cup.hp.com> Date: 9 Apr 91 00:45:06 GMT References: <2176@estevax.UUCP> Organization: Hewlett Packard, Cupertino Lines: 87 /* Routines for managing nonechoing, one-character-at-a-time tty reads */ /* Dave Decot, hpda!decot, 851023 */ #include #include #include #ifdef BSD # include #else /* not BSD */ # include #endif quit() { signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGTERM, SIG_IGN); normal(); exit(0); } setup() { signal(SIGQUIT, quit); signal(SIGHUP, quit); signal(SIGTERM, quit); cbreak(); } 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; } }