ptyio 8 user commands djbwares
ptyio feed input to a pty and print its output
`ptyio` -t -T -r subprogram args

## Description

`ptyio` copies its input to the master side of a pty. Meanwhile, it prints all output that shows up from the master.

`ptyio` runs subprogram as a child process (not a process group leader). It supplies a "job control" pipe to subprogram as descriptor 9. After the pipe closes, `ptyio` will wait for subprogram to exit; then `ptyio` will exit with the same exit code.

If `ptyio` reaches EOF or sees an error on its input, it stops reading input, but it continues printing output. If `ptyio` sees an error on its output, it sends SIGPIPE to subprogram and stops writing output.

`ptyio` must be invoked with descriptor 4 pointing to the pty master and descriptor 5 pointing to the pty slave. It passes these descriptors to subprogram. It must also be invoked with environment variable `TTY` giving the name of the pty slave. It passes this variable to subprogram.

## Options

-t

  Attached to a tty.

  `ptyio` must be attached to a tty in one of the following places: descriptor 3; `/dev/tty` (i.e. controlling TTY); descriptor 2; descriptor 0; descriptor 1. Before running subprogram, `ptyio` sets the attached tty to raw mode, and copies the original mode to the pty. Before exiting, `ptyio` restores the original mode of the attached tty.

  Whenever subprogram writes a byte to the job control pipe, `ptyio` stops itself, using the stop signal given by that byte. It restores the mode of the attached tty before stopping. After `ptyio` continues, it sets the attached tty to raw mode again, and then sends SIGCONT to subprogram

  `ptyio` passes window-size changes through to the pty.

  Many programs handle tty modes incorrectly when they are run in the background; for example, try

      (sleep 2;vi) &; vi

  `ptyio` handles this situation correctly.

-T

  (Default.) Not attached to a tty.

  Before running subprogram, `ptyio` sets the pty mode to sane mode. Whenever subprogram writes a byte to the job control pipe, `ptyio` sends SIGCONT to subprogram.

-r

  (Obsolete.) Remote mode.

  Before running subprogram, `ptyio` sets the pty mode to raw mode, and enables TIOCREMOTE on the master. After reaching end of file on standard input, `ptyio` writes 0-byte packets to the pty master, which (with correct TIOCREMOTE implementations) produces end-of-file for any program reading the pty slave.

## Raw mode

Raw mode eliminates input echoing, input line buffering, input line editing, input signals (control-C producing SIGINT, control-Z producing SIGTSTP, etc.), output conversion of LF to CR LF, and XON/XOFF flow control. It is, unfortunately, not completely clean: if too much tty input arrives at once, the kernel will discard characters.

## Sane mode

Sane mode supports input echoing, input line buffering, input signals, input conversion of CR to LF, 8-bit input, output conversion of LF to CR LF, and XON/XOFF flow control. It supports the following keys: delete for ERASE, control-backslash for QUIT, control-C for INTR, control-D for EOF, control-O for DISCARD, control-R for REPRINT, control-T for STATUS, control-U for KILL, control-V for LNEXT, control-W for WERASE, control-Y for DSUSP, and control-Z for SUSP.

## History

`ptyio` was originally part of Daniel J. Bernstein's ptyget toolset in 1996.

## Author

Original code and documentation by Daniel J. Bernstein. Documentation modernizations by Jonathan de Boyne Pollard.