ttcompat is a STREAMS
module that translates the ioctl calls supported by the
older Version 7, 4BSD, and XENIX terminal drivers into the ioctl calls supported by the termio interface
(see termio(7I)). All other messages pass
through this module unchanged; the behavior of read and write calls is unchanged, as is the behavior of ioctl
calls other than the ones supported by ttcompat.
This module can be automatically pushed onto a stream using the autopush mechanism when a terminal device is opened; it does not
have to be explicitly pushed onto a stream. This module requires that the termios interface be supported by the modules and the application
can push the driver downstream. The TCGETS, TCSETS, and TCSETSF ioctl calls must
be supported. If any information set or fetched by those ioctl
calls is not supported by the modules and driver downstream, some of the V7/4BSD/XENIX functions may not be supported.
For example, if the CBAUD bits in
the c_cflag field are not supported, the functions provided
by the sg_ispeed and sg_ospeed fields
of the sgttyb structure (see below) will not be supported.
If the TCFLSH ioctl
is not supported, the function provided by the TIOCFLUSH ioctl will not be supported. If the TCXONC ioctl is not supported,
the functions provided by the TIOCSTOP
and TIOCSTART ioctl
calls will not be supported. If the TIOCMBIS and TIOCMBIC ioctl calls are not supported, the functions provided by the TIOCSDTR and TIOCCDTR ioctl calls will not be supported.
The basic ioctl calls use the sgttyb
structure defined by <sys/ttold.h> (included
by <sys/ioctl.h>):
|
struct sgttyb {
char sg_ispeed;
char sg_ospeed;
char sg_erase;
char sg_kill;
int sg_flags;
};
|
The sg_ispeed and sg_ospeed fields
describe the input and output speeds of the device. If the speed set on
the device is over B38400, then it is reported as B38400 for compatibility
reasons. If it is set to B38400 and the current speed is over B38400, the
change is ignored. See TIOCGETP and TIOCSETP below. The sg_erase and sg_kill fields of the argument structure
specify the erase and kill characters respectively, and reflect the values
in the VERASE and VKILL members of the c_cc field of the termios structure.
The sg_flags field of the argument structure contains
several flags that determine the system's treatment of the terminal. They
are mapped into flags in fields of the terminal state, represented by the termios structure.
Delay type 0 (NL0, TAB0, CR0, FF0, BS0) is always
mapped into the equivalent delay type 0 in the c_oflag field of the termios structure. Other
delay mappings are performed as follows:
sg_flags | c_oflag |
BS1 | BS1 |
FF1 | VT1 |
CR1 | CR2 |
CR2 | CR3 |
CR3 | CR0 (not supported) |
TAB1 | TAB1 |
TAB2 | TAB2 |
XTABS | TAB3 |
NL1 | ONLRET|CR1 |
NL2 | NL1 |
NL3 | NL0 (not supported) |
If previous TIOCLSET or TIOCLBIS ioctl calls have
not selected LITOUT or PASS8 mode, and if RAW mode is not selected, the ISTRIP flag is set in the c_iflag field of the termios structure, and the EVENP and ODDP flags control
the parity of characters sent to the terminal and accepted from the terminal,
as follows:
- 0 (neither EVENP nor ODDP)
- Parity
is not to be generated on output or checked on input. The character size
is set to CS8 and the PARENB flag is cleared in the c_cflag field of
the termios structure.
- EVENP
- Even parity characters are
to be generated on output and accepted on input. The INPCK flag is set in
the c_iflag field of the termios structure,
the character size is set to CS7
and the PARENB flag is set in the c_iflag
field of the termios structure.
- ODDP
- Odd parity characters are to
be generated on output and accepted on input. The INPCK
flag is set in the c_iflag, the character size is set to CS7 and the PARENB and PARODD flags are set in the c_iflag field of
the termios structure.
- EVENP|ODDP or ANYP
- Even parity
characters are to be generated on output and characters of either parity
are to be accepted on input. The INPCK flag is cleared
in the c_iflag field, the character size is set to CS7 and the PARENB flag
is set in the c_iflag field of the termios
structure.
The RAW flag disables all output processing
(the OPOST flag in the c_oflag field,
and the XCASE and IEXTEN flags in the c_iflag field are cleared in the termios structure) and input processing
(all flags in the c_iflag field other than the IXOFF and IXANY flags are cleared in the termios structure). Eight bits of data, with no parity bit are
accepted on input and generated on output; the character size is set to CS8 and the PARENB and PARODD flags are cleared in the c_cflag field
of the termios structure. The signal-generating and line-editing
control characters are disabled by clearing the ISIG and ICANON flags in the c_iflag field of the termios
structure.
The CRMOD flag turns input carriage return characters
into linefeed characters, and output linefeed characters to be sent as a carriage
return followed by a linefeed. The ICRNL flag in the c_iflag field, and the OPOST and ONLCR flags in the c_oflag field, are set in the termios
structure.
The LCASE flag maps upper-case
letters in the ASCII character set to their
lower-case equivalents on input (the IUCLC flag is set in the c_iflag field), and maps
lower-case letters in the ASCII character
set to their upper-case equivalents on output (the OLCUC flag is set in the c_oflag field). Escape
sequences are accepted on input, and generated on output, to handle certain ASCII characters not supported by older terminals
(the XCASE flag is set in the c_lflag field).
Other flags are directly mapped to flags in the termios
structure:
sg_flags | Flags in termios structure |
CBREAK | Complement of ICANON in c_lflag field |
ECHO | ECHO in c_lflag field |
TANDEM | IXOFF in c_iflag field |
Another structure associated with each terminal specifies characters
that are special in both the old Version 7 and the newer 4BSD terminal interfaces. The following structure is defined by <sys/ttold.h>:
|
struct tchars {
char t_intrc; /* interrupt */
char t_quitc; /* quit */
char t_startc; /* start output */
char t_stopc; /* stop output */
char t_eofc; /* end-of-file */
char t_brkc; /* input delimiter (like nl) */
};
|
XENIX defines the tchar structure as tc. The characters are mapped
to members of the c_cc field of the termios
structure as follows:
|
tchars c_cc index
t_intrc VINTR
t_quitc VQUIT
t_startc VSTART
t_stopc VSTOP
t_eofc VEOF
t_brkc VEOL
|
Also associated with each terminal is a local flag word (TIOCLSET and TIOCLGET), specifying flags supported by
the new 4BSD terminal interface. Most of these flags are directly mapped to
flags in the termios structure:
Local flags | Flags in termios structure |
LCRTBS | Not supported |
LPRTERA | ECHOPRT in the c_lflag field |
LCRTERA | ECHOE in the c_lflag field |
LTILDE | Not supported |
LMDMBUF | Not supported |
LTOSTOP | TOSTOP in the c_lflag field |
LFLUSHO | FLUSHO in the c_lflag field |
LNOHANG | CLOCAL in the c_cflag field |
LCRTKIL | ECHOKE in the c_lflag field |
LPASS8 | CS8 in the c_cflag field |
LCTLECH | CTLECH in the c_lflag field |
LPENDIN | PENDIN in the c_lflag field |
LDECCTQ | Complement of IXANY in the c_iflag field |
LNOFLSH | NOFLSH in the c_lflag field |
Each flag has a corresponding equivalent sg_flags
value. The sg_flags definitions omit the leading "L";
for example, TIOCSETP with sg_flags set to TOSTOP is equivalent
to TIOCLSET with LTOSTOP.
Another structure associated with each terminal is the ltchars structure which defines control characters for the new 4BSD terminal interface. Its structure is:
|
struct ltchars {
char t_suspc; /* stop process signal */
char t_dsuspc; /* delayed stop process signal */
char t_rprntc; /* reprint line */
char t_flushc; /*flush output (toggles) */
char t_werasc; /* word erase */
char t_lnextc; /* literal next character */
};
|
The characters are mapped to members of the c_cc
field of the termios structure as follows:
ltchars | c_cc index |
t_suspc | VSUS |
t_dsuspc | VDSUSP |
t_rprntc | VREPRINT |
t_flushc | VDISCARD |
t_werasc | VWERASE |
t_lnextc | VLNEXT |
|