home *** CD-ROM | disk | FTP | other *** search
- /*
- * 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
-
- #ifdef USE_TERMIO
-
- #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
-
- static struct termio old;
-
- int
- _lit_output() {
- struct termio tmp;
- if (ioctl(cur_term->fd, TCGETA, &old) == -1)
- return 0;
- if (!(old.c_oflag & OPOST) || !(old.c_oflag & ONLCR))
- return 0;
- memcpy((anyptr)&tmp, (anyptr)&old, sizeof(old));
- tmp.c_oflag &= ~OPOST;
- ioctl(cur_term->fd, TCSETA, &tmp);
- return 1;
- }
-
- void
- _norm_output() {
- ioctl(cur_term->fd, TCSETA, &old);
- }
-
- int
- _check_tty() {
- if ((cur_term->prog_mode.c_iflag & IXON) && cur_term->xon)
- cur_term->pad = 0;
- else
- cur_term->pad = 1;
- cur_term->baudrate = _baud_tbl[cur_term->prog_mode.c_cflag & CBAUD];
- return OK;
- }
-
- int
- def_prog_mode() {
- #ifdef USE_WINSZ
- #ifdef TIOCGWINSZ
- if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->prog_winsz) < 0)
- return ERR;
- #endif
- #endif
- if (ioctl(cur_term->fd, TCGETA, &cur_term->prog_mode) == 0
- && _check_tty() == OK)
- return OK;
- return ERR;
- }
-
- int
- def_shell_mode() {
- cur_term->termcap = 0;
- #ifdef USE_WINSZ
- #ifdef TIOCGWINSZ
- if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->shell_winsz) < 0)
- return ERR;
- #endif
- #endif
- return ioctl(cur_term->fd, TCGETA, &cur_term->shell_mode)==0 ? OK : ERR;
- }
-
- int
- reset_prog_mode() {
- return ioctl(cur_term->fd, TCSETA, &cur_term->prog_mode)==0 ? OK : ERR;
- }
-
- int
- reset_shell_mode() {
- return ioctl(cur_term->fd, TCSETA, &cur_term->shell_mode)==0 ? OK : ERR;
- }
-
- 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
-