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;
}
}