summaryrefslogtreecommitdiffstats
path: root/lib/libmytinfo/tty.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libmytinfo/tty.c')
-rw-r--r--lib/libmytinfo/tty.c457
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
OpenPOWER on IntegriCloud