diff options
Diffstat (limited to 'lib/libmytinfo/tty.c')
-rw-r--r-- | lib/libmytinfo/tty.c | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/lib/libmytinfo/tty.c b/lib/libmytinfo/tty.c new file mode 100644 index 0000000..9c22eb1 --- /dev/null +++ b/lib/libmytinfo/tty.c @@ -0,0 +1,457 @@ +/* + * tty.c + * + * By Ross Ridge + * Public Domain + * 92/02/01 07:30:49 + * + * Do some tty related things + * + */ + +#include "defs.h" +#include <term.h> + +#ifdef USE_SCCS_IDS +static const char SCCSid[] = "@(#) mytinfo tty.c 3.2 92/02/01 public domain, By Ross Ridge"; +#endif +#ifndef EXTA_IS +#define EXTA_IS 19200 +#endif + +#ifndef EXTB_IS +#define EXTB_IS 38400 +#endif + +#ifdef lint +#define ioctl _ioctl +/* shutup lint */ +/* ARGSUSED */ +/* VARARGS1 */ +static int ioctl(a, b, p) int a; long b; anyptr *p; { return 0; } +#endif + +#if defined(USE_TERMIO) || defined(USE_TERMIOS) + +#ifdef USE_TERMIOS +speed_t _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, + 2400, 4800, 9600, EXTA_IS, EXTB_IS +#ifdef B57600 + ,57600 +#endif +#ifdef B115200 + ,115200 +#endif + }; +#else +#ifdef USE_SMALLMEM +unsigned short _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, + 1800, 2400, 4800, 9600, EXTA_IS, EXTB_IS}; +#else +long _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, + 2400, 4800, 9600, EXTA_IS, EXTB_IS}; +#endif +#endif + +#ifdef USE_TERMIO +static struct termio old; +#else +static struct termios old; +#endif + +int +_lit_output() { +#ifdef USE_TERMIO + struct termio tmp; + if (ioctl(cur_term->fd, TCGETA, &old) == -1) + return 0; +#else + struct termios tmp; + if (tcgetattr(cur_term->fd, &old) == -1) + return 0; +#endif + if (!(old.c_oflag & OPOST) || !(old.c_oflag & ONLCR)) + return 0; + memcpy((anyptr)&tmp, (anyptr)&old, sizeof(old)); + tmp.c_oflag &= ~OPOST; +#ifdef USE_TERMIO + ioctl(cur_term->fd, TCSETA, &tmp); +#else + tcsetattr(cur_term->fd, TCSADRAIN, &tmp); +#endif + return 1; +} + +void +_norm_output() { +#ifdef USE_TERMIO + ioctl(cur_term->fd, TCSETA, &old); +#else + tcsetattr(cur_term->fd, TCSADRAIN, &old); +#endif +} + +int +_check_tty() { + if ((cur_term->prog_mode.c_iflag & IXON) && cur_term->xon) + cur_term->pad = 0; + else + cur_term->pad = 1; +#ifdef USE_TERMIO + cur_term->baudrate = _baud_tbl[cur_term->prog_mode.c_cflag & CBAUD]; +#else + cur_term->baudrate = cfgetospeed(&cur_term->prog_mode); +#endif + return OK; +} + +int +def_prog_mode() { + if (cur_term == NULL) + return ERR; +#ifdef USE_WINSZ +#ifdef TIOCGWINSZ + if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->prog_winsz) < 0) + return ERR; +#endif +#endif +#ifdef USE_TERMIO + if (ioctl(cur_term->fd, TCGETA, &cur_term->prog_mode) == 0 +#else + if (tcgetattr(cur_term->fd, &cur_term->prog_mode) == 0 +#endif + && _check_tty() == OK) + return OK; + return ERR; +} + +int +def_shell_mode() { + if (cur_term == NULL) + return ERR; + cur_term->termcap = 0; +#ifdef USE_WINSZ +#ifdef TIOCGWINSZ + if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->shell_winsz) < 0) + return ERR; +#endif +#endif +#ifdef USE_TERMIO + return ioctl(cur_term->fd, TCGETA, &cur_term->shell_mode)==0 ? OK : ERR; +#else + return tcgetattr(cur_term->fd, &cur_term->shell_mode)==0 ? OK : ERR; +#endif +} + + +#pragma weak reset_prog_mode +int +reset_prog_mode() { + if (cur_term == NULL) + return ERR; +#ifdef USE_TERMIO + return ioctl(cur_term->fd, TCSETA, &cur_term->prog_mode)==0 ? OK : ERR; +#else + return tcsetattr(cur_term->fd, TCSADRAIN, &cur_term->prog_mode)==0 ? OK : ERR; +#endif +} + +#pragma weak reset_shell_mode +int +reset_shell_mode() { + if (cur_term == NULL) + return ERR; +#ifdef USE_TERMIO + return ioctl(cur_term->fd, TCSETA, &cur_term->shell_mode)==0 ? OK : ERR; +#else + return tcsetattr(cur_term->fd, TCSADRAIN, &cur_term->shell_mode)==0 ? OK : ERR; +#endif +} + +int +_init_tty() { + cur_term->true_lines = lines; + cur_term->true_columns = columns; + if (pad_char == NULL) + cur_term->padch = '\000'; + else + cur_term->padch = pad_char[0]; + if (def_shell_mode() == ERR || def_prog_mode() == ERR) { + cur_term->pad = 0; + cur_term->baudrate = 1; + cur_term->xon = 0; + return OK; + } + cur_term->xon = (xoff_character == NULL || xoff_character[0] == '\021') + && (xon_character == NULL || xon_character[0] == '\023') + && xon_xoff; +#ifdef USE_WINSZ +#ifdef TIOCGWINSZ + if (cur_term->prog_winsz.ws_row != 0 + && cur_term->prog_winsz.ws_col != 0) { + lines = cur_term->prog_winsz.ws_row; + columns = cur_term->prog_winsz.ws_col; + } +#endif +#endif + return OK; +} + +#else + +#ifdef USE_SGTTY + +#ifdef USE_SMALLMEM +unsigned short _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, + 1800, 2400, 4800, 9600, EXTA_IS, EXTB_IS}; +#else +long _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, + 1800, 2400, 4800, 9600, EXTA_IS, EXTB_IS}; +#endif + + +#ifdef TIOCLGET + +static int old; + +int +_lit_output() { + struct sgttyb buf; + int tmp; + + ioctl(cur_term->fd, TIOCGETP, &buf); + if (buf.sg_flags & RAW) + return 0; + ioctl(cur_term->fd, TIOCLGET, &old); + if (old & LLITOUT) + return 0; + tmp = old | LLITOUT; + ioctl(cur_term->fd, TIOCLSET, &tmp); + return 1; +} + +void +_norm_output() { + ioctl(cur_term->fd, TIOCLSET, &old); +} + +#else + +static struct sgttyb old; + +int +_lit_output() { + struct sgttyb tmp; + ioctl(cur_term->fd, TIOCGETP, &old); + if (old.sg_flags & RAW) + return 0; + memcpy((anyptr)&tmp, (anyptr)&old, sizeof(old)); + tmp.sg_flags |= RAW; + ioctl(cur_term->fd, TIOCSETP, &tmp); + return 1; +} + +void +_norm_output() { + ioctl(cur_term->fd, TIOCSETP, &old); +} + +#endif + +int +_check_tty() { + if (!(cur_term->prog_mode.v6.sg_flags & RAW) && cur_term->xon) + cur_term->pad = 0; + else + cur_term->pad = 1; + cur_term->baudrate = _baud_tbl[cur_term->prog_mode.v6.sg_ospeed & 0xf]; + return OK; +} + +int +def_shell_mode() { + if (ioctl(cur_term->fd, TIOCGETP, &cur_term->shell_mode.v6) < 0) + return ERR; +#ifdef TIOCGETC + if (ioctl(cur_term->fd, TIOCGETC, &cur_term->shell_mode.v7) < 0) + return ERR; +#endif +#ifdef TIOCLGET + if (ioctl(cur_term->fd, TIOCLGET, &cur_term->shell_mode.bsd) < 0) + return ERR; +#endif +#ifdef TIOCGLTC + if (ioctl(cur_term->fd, TIOCGLTC, &cur_term->shell_mode.bsd_new) < 0) + return ERR; +#endif +#ifdef USE_WINSZ +#ifdef TIOCGWINSZ + if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->shell_winsz)<0) + return ERR; +#endif +#endif + cur_term->termcap = 0; + return OK; +} + +int +def_prog_mode() { + if (ioctl(cur_term->fd, TIOCGETP, &cur_term->prog_mode.v6) < 0) + return ERR; +#ifdef TIOCGETC + if (ioctl(cur_term->fd, TIOCGETC, &cur_term->prog_mode.v7) < 0) + return ERR; +#endif +#ifdef TIOCLGET + if (ioctl(cur_term->fd, TIOCLGET, &cur_term->prog_mode.bsd) < 0) + return ERR; +#endif +#ifdef TIOCGLTC + if (ioctl(cur_term->fd, TIOCGLTC, &cur_term->prog_mode.bsd_new) < 0) + return ERR; +#endif +#ifdef USE_WINSZ +#ifdef TIOCGWINSZ + if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->prog_winsz)<0) + return ERR; +#endif +#endif + return _check_tty(); +} + +int +reset_shell_mode() { + if (ioctl(cur_term->fd, TIOCSETP, &cur_term->shell_mode.v6) < 0) + return ERR; +#ifdef TIOCGETC + if (ioctl(cur_term->fd, TIOCSETC, &cur_term->shell_mode.v7) < 0) + return ERR; +#endif +#ifdef TIOCLGET + if (ioctl(cur_term->fd, TIOCLSET, &cur_term->shell_mode.bsd) < 0) + return ERR; +#endif +#ifdef TIOCGLTC + if (ioctl(cur_term->fd, TIOCSLTC, &cur_term->shell_mode.bsd_new) < 0) + return ERR; +#endif + return OK; +} + +int +reset_prog_mode() { + if (ioctl(cur_term->fd, TIOCSETP, &cur_term->prog_mode.v6) < 0) + return ERR; +#ifdef TIOCGETC + if (ioctl(cur_term->fd, TIOCSETC, &cur_term->prog_mode.v7) < 0) + return ERR; +#endif +#ifdef TIOCLGET + if (ioctl(cur_term->fd, TIOCLSET, &cur_term->prog_mode.bsd) < 0) + return ERR; +#endif +#ifdef TIOCGLTC + if (ioctl(cur_term->fd, TIOCSLTC, &cur_term->prog_mode.bsd_new) < 0) + return ERR; +#endif + return OK; +} + +int +_init_tty() { + cur_term->true_lines = lines; + cur_term->true_columns = columns; + if (pad_char == NULL) + cur_term->padch = '\000'; + else + cur_term->padch = pad_char[0]; + if (def_shell_mode() == ERR || def_prog_mode() == ERR) { + cur_term->pad = 0; + cur_term->baudrate = 1; + cur_term->xon = 0; + return OK; + } +#ifndef TIOCGETC + cur_term->xon = (xoff_character == NULL || xoff_character[0] == '\021') + && (xon_character == NULL || xon_character[0] == '\023') + && xon_xoff; +#else + if (xon_xoff) { + if (xon_character != NULL) { + cur_term->prog_mode.v7.t_startc = xon_character[0]; + if (ioctl(cur_term->fd, TIOCSETC, + &cur_term->prog_mode.v7) < 0) + return ERR; + } + if (xoff_character != NULL) { + cur_term->prog_mode.v7.t_stopc = xoff_character[0]; + if (ioctl(cur_term->fd, TIOCSETC, + &cur_term->prog_mode.v7) < 0) + return ERR; + } + } + cur_term->xon = xon_xoff; +#endif +#ifdef USE_WINSZ +#ifdef TIOCGWINSZ + if (cur_term->prog_winsz.ws_row != 0 + && cur_term->prog_winsz.ws_col != 0) { + lines = cur_term->prog_winsz.ws_row; + columns = cur_term->prog_winsz.ws_col; + } +#endif +#endif + return OK; +} + +#else + +int +_lit_output() { + return 0; +} + +void +_norm_output() { + return; +} + +int +_check_tty() { + return OK; +} + +int +def_prog_mode() { + return OK; +} + +int +reset_prog_mode() { + return OK; +} + +int +def_shell_mode() { + return OK; +} + +int +reset_shell_mode() { + return OK; +} + +int +_init_tty() { + cur_term->pad = 1; + cur_term->padch = 0; + cur_term->baudrate = 1200; + cur_term->xon = 0; + cur_term->termcap = 0; + cur_term->true_lines = lines; + cur_term->true_columns = columns; +} + +#endif + +#endif |