summaryrefslogtreecommitdiff
path: root/bin/ksh/tty.c
diff options
context:
space:
mode:
authorJason Downs <downsj@cvs.openbsd.org>1996-08-14 06:19:13 +0000
committerJason Downs <downsj@cvs.openbsd.org>1996-08-14 06:19:13 +0000
commit3039b959c7de1e35fe4ec27ae02f1c8fe8d4d4ac (patch)
tree09c6b5a4f13282e07afe153445fcfaa0d10651f4 /bin/ksh/tty.c
parent596c2317eee31ab9606c6b88085644407d4d2f0f (diff)
Import pdksh 5.2.7.
Diffstat (limited to 'bin/ksh/tty.c')
-rw-r--r--bin/ksh/tty.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/bin/ksh/tty.c b/bin/ksh/tty.c
new file mode 100644
index 00000000000..5ee19fbba1d
--- /dev/null
+++ b/bin/ksh/tty.c
@@ -0,0 +1,160 @@
+/* $OpenBSD: tty.c,v 1.1 1996/08/14 06:19:12 downsj Exp $ */
+
+#include "sh.h"
+#include "ksh_stat.h"
+#define EXTERN
+#include "tty.h"
+#undef EXTERN
+
+int
+get_tty(fd, ts)
+ int fd;
+ TTY_state *ts;
+{
+ int ret;
+
+# ifdef HAVE_TERMIOS_H
+ ret = tcgetattr(fd, ts);
+# else /* HAVE_TERIOS_H */
+# ifdef HAVE_TERMIO_H
+ ret = ioctl(fd, TCGETA, ts);
+# else /* HAVE_TERMIO_H */
+ ret = ioctl(fd, TIOCGETP, &ts->sgttyb);
+# ifdef TIOCGATC
+ if (ioctl(fd, TIOCGATC, &ts->lchars) < 0)
+ ret = -1;
+# else
+ if (ioctl(fd, TIOCGETC, &ts->tchars) < 0)
+ ret = -1;
+# ifdef TIOCGLTC
+ if (ioctl(fd, TIOCGLTC, &ts->ltchars) < 0)
+ ret = -1;
+# endif /* TIOCGLTC */
+# endif /* TIOCGATC */
+# endif /* HAVE_TERMIO_H */
+# endif /* HAVE_TERIOS_H */
+ return ret;
+}
+
+int
+set_tty(fd, ts, flags)
+ int fd;
+ TTY_state *ts;
+ int flags;
+{
+ int ret = 0;
+
+# ifdef HAVE_TERMIOS_H
+ ret = tcsetattr(fd, TCSADRAIN, ts);
+# else /* HAVE_TERIOS_H */
+# ifdef HAVE_TERMIO_H
+# ifndef TCSETAW /* e.g. Cray-2 */
+ /* first wait for output to drain */
+# ifdef TCSBRK
+ if (ioctl(tty_fd, TCSBRK, 1) < 0)
+ ret = -1;
+# else /* the following kludge is minimally intrusive, but sometimes fails */
+ if (flags & TF_WAIT)
+ sleep((unsigned)1); /* fake it */
+# endif
+# endif /* !TCSETAW */
+# if defined(_BSD_SYSV) || !defined(TCSETAW)
+/* _BSD_SYSV must force TIOCSETN instead of TIOCSETP (preserve type-ahead) */
+ if (ioctl(tty_fd, TCSETA, ts) < 0)
+ ret = -1;
+# else
+ if (ioctl(tty_fd, TCSETAW, ts) < 0)
+ ret = -1;
+# endif
+# else /* HAVE_TERMIO_H */
+# if defined(__mips) && (defined(_SYSTYPE_BSD43) || defined(__SYSTYPE_BSD43))
+ /* Under RISC/os 5.00, bsd43 environment, after a tty driver
+ * generated interrupt (eg, INTR, TSTP), all output to tty is
+ * lost until a SETP is done (there must be a better way of
+ * doing this...).
+ */
+ if (flags & TF_MIPSKLUDGE)
+ ret = ioctl(fd, TIOCSETP, &ts->sgttyb);
+ else
+# endif /* _SYSTYPE_BSD43 */
+ ret = ioctl(fd, TIOCSETN, &ts->sgttyb);
+# ifdef TIOCGATC
+ if (ioctl(fd, TIOCSATC, &ts->lchars) < 0)
+ ret = -1;
+# else
+ if (ioctl(fd, TIOCSETC, &ts->tchars) < 0)
+ ret = -1;
+# ifdef TIOCGLTC
+ if (ioctl(fd, TIOCSLTC, &ts->ltchars) < 0)
+ ret = -1;
+# endif /* TIOCGLTC */
+# endif /* TIOCGATC */
+# endif /* HAVE_TERMIO_H */
+# endif /* HAVE_TERIOS_H */
+ return ret;
+}
+
+
+/* Initialize tty_fd. Used for saving/reseting tty modes upon
+ * foreground job completion and for setting up tty process group.
+ */
+void
+tty_init(init_ttystate)
+ int init_ttystate;
+{
+ int do_close = 1;
+ int tfd;
+
+ if (tty_fd >= 0) {
+ close(tty_fd);
+ tty_fd = -1;
+ }
+ tty_devtty = 1;
+
+ /* SCO can't job control on /dev/tty, so don't try... */
+#if !defined(__SCO__)
+ if ((tfd = open("/dev/tty", O_RDWR, 0)) < 0) {
+/* X11R5 xterm on mips doesn't set controlling tty properly - temporary hack */
+# if !defined(__mips) || !(defined(_SYSTYPE_BSD43) || defined(__SYSTYPE_BSD43))
+ tty_devtty = 0;
+ warningf(FALSE, "No controlling tty (open /dev/tty: %s)",
+ strerror(errno));
+# endif /* __mips */
+ }
+#else /* !__SCO__ */
+ tfd = -1;
+#endif /* __SCO__ */
+
+ if (tfd < 0) {
+ do_close = 0;
+ if (isatty(0))
+ tfd = 0;
+ else if (isatty(2))
+ tfd = 2;
+ else {
+ warningf(FALSE, "Can't find tty file descriptor");
+ return;
+ }
+ }
+ if ((tty_fd = ksh_dupbase(tfd, FDBASE)) < 0) {
+ warningf(FALSE, "j_ttyinit: dup of tty fd failed: %s",
+ strerror(errno));
+ } else if (fd_clexec(tty_fd) < 0) {
+ warningf(FALSE, "j_ttyinit: can't set close-on-exec flag: %s",
+ strerror(errno));
+ close(tty_fd);
+ tty_fd = -1;
+ } else if (init_ttystate)
+ get_tty(tty_fd, &tty_state);
+ if (do_close)
+ close(tfd);
+}
+
+void
+tty_close()
+{
+ if (tty_fd >= 0) {
+ close(tty_fd);
+ tty_fd = -1;
+ }
+}