|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T t ┃
Length: 2552 (0x9f8) Types: TextFile Names: »tty_set.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/vn/tty_set.c«
/* ** vn news reader. ** ** tty_set.c - interface to ioctl (system tty interface) ** ** see copyright disclaimer / history in vn.c source file */ #ifdef SYSV #include <termio.h> #else #include <sgtty.h> #endif #include "tty.h" extern char Erasekey,Killkey; #ifdef SYSV static struct termio C_tp, O_tp; #else static struct sgttyb C_tp; static unsigned short O_lflag; #endif static unsigned S_flag=0; static int R_ignore=0; /* up/down counter of reset calls to ignore */ #define IO_GOT 1 /* have polled for original terminal mode */ #define IO_RAW 2 /* in RAW (CBREAK actually) mode */ /* tty_set handles ioctl calls. SAVEMODE, RESTORE are used around system calls and interrupts to assure cooked mode, and restore raw if raw on SAVEMODE. The pair results in no calls to ioctl if we are cooked already when SAVEMODE is called, and may be nested, provided we desire no "restore" of cooked mode after restoring raw. When we get the original terminal mode, we also save erase and kill. sig_set makes an ioctl call to get process group leader. Otherwise ioctl calls should come through here. */ tty_set(cmd) int cmd; { int rc; unsigned mask; switch (cmd) { case BACKSTOP: #ifdef JOBCONTROL if ((rc = ioctl(1,TIOCLGET,&mask)) != 0) break; mask |= LTOSTOP; rc = ioctl(1,TIOCLSET,&mask); #else rc = 0; #endif break; case RAWMODE: if ((S_flag & IO_RAW) != 0) { rc = 0; break; } if ((S_flag & IO_GOT) == 0) { /* Save original modes, get erase / kill */ #ifdef SYSV rc = ioctl(0,TCGETA,&C_tp); O_tp = C_tp; Erasekey = C_tp.c_cc[VERASE]; Killkey = C_tp.c_cc[VKILL]; #else rc = ioctl(0,TIOCGETP,&C_tp); O_lflag = C_tp.sg_flags; Erasekey = C_tp.sg_erase; Killkey = C_tp.sg_kill; #endif } #ifdef SYSV C_tp.c_lflag &= ~(ECHO | ICANON); C_tp.c_cc[VMIN] = 1; rc = ioctl(0,TCSETAW,&C_tp); #else C_tp.sg_flags |= CBREAK; C_tp.sg_flags &= ~ECHO; rc = ioctl(0,TIOCSETP,&C_tp); #endif S_flag = IO_GOT|IO_RAW; break; case COOKED: if ((S_flag & IO_RAW) != 0) { #ifdef SYSV C_tp = O_tp; rc = ioctl(0,TCSETAW,&C_tp); #else C_tp.sg_flags = O_lflag; rc = ioctl(0,TIOCSETP,&C_tp); #endif S_flag &= ~IO_RAW; } else rc = 0; break; case SAVEMODE: if ((S_flag & IO_RAW) != 0) { tty_set(COOKED); R_ignore = 0; } else ++R_ignore; rc = 0; break; case RESTORE: if (R_ignore <= 0) { tty_set(RAWMODE); } else --R_ignore; rc = 0; break; default: rc = -1; } if (rc < 0) printex ("ioctl failure, tty_set: %d",cmd); }