TTCOMPAT(4M) STREAMS Modules TTCOMPAT(4M)
NAME
ttcompat - V7, 4BSD and XENIX STREAMS compatibility module
SYNOPSIS
#define BSD_COMP
#include <sys/stropts.h>
#include <sys/ioctl.h>
ioctl(
fd, I_PUSH, "ttcompat");
DESCRIPTION
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(4I)). 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 |
+---------+------------+
IOCTLS
ttcompat responds to the following
ioctl calls. All others are passed
to the module below.
TIOCGETP The argument is a pointer to an
sgttyb structure. The
current terminal state is fetched; the appropriate
characters in the terminal state are stored in that
structure, as are the input and output speeds. If the
speed is over B38400, then B38400 is returned. The
values of the flags in the
sg_flags field are derived
from the flags in the terminal state and stored in the
structure.
TIOCEXCL Set ``exclusive-use'' mode; no further opens are
permitted until the file has been closed.
TIOCNXCL Turn off ``exclusive-use'' mode.
TIOCSETP The argument is a pointer to an
sgttyb structure. The
appropriate characters and input and output speeds in
the terminal state are set from the values in that
structure, and the flags in the terminal state are set
to match the values of the flags in the
sg_flags field
of that structure. The state is changed with a
TCSETSF ioctl so that the interface delays until output is
quiescent, then throws away any unread characters,
before changing the modes. If the current device speed
is over B38400 for either input or output speed, and
B38400 is specified through this interface for that
speed, the actual device speed is not changed. If the
device speed is B38400 or lower or if some speed other
than B38400 is specified, then the actual speed
specified is set.
TIOCSETN The argument is a pointer to an
sgttyb structure. The
terminal state is changed as
TIOCSETP would change it,
but a
TCSETS ioctl is used, so that the interface
neither delays nor discards input.
TIOCHPCL The argument is ignored. The
HUPCL flag is set in the
c_cflag word of the terminal state.
TIOCFLUSH The argument is a pointer to an
int variable. If its
value is zero, all characters waiting in input or
output queues are flushed. Otherwise, the value of the
int is treated as the logical
OR of the
FREAD and
FWRITE flags defined by
<sys/file.h>. If the
FREAD bit
is set, all characters waiting in input queues are
flushed, and if the
FWRITE bit is set, all characters
waiting in output queues are flushed.
TIOCSBRK The argument is ignored. The break bit is set for the
device. (This is not supported by
ttcompat. The
underlying driver must support TIOCSBRK.)
TIOCCBRK The argument is ignored. The break bit is cleared for
the device. (This is not supported by
ttcompat. The
underlying driver must support TIOCCBRK.)
TIOCSDTR The argument is ignored. The Data Terminal Ready bit is
set for the device.
TIOCCDTR The argument is ignored. The Data Terminal Ready bit is
cleared for the device.
TIOCSTOP The argument is ignored. Output is stopped as if the
STOP character had been typed.
TIOCSTART The argument is ignored. Output is restarted as if the
START character had been typed.
TIOCGETC The argument is a pointer to a
tchars structure. The
current terminal state is fetched, and the appropriate
characters in the terminal state are stored in that
structure.
TIOCSETC The argument is a pointer to a
tchars structure. The
values of the appropriate characters in the terminal
state are set from the characters in that structure.
TIOCLGET The argument is a pointer to an
int. The current
terminal state is fetched, and the values of the local
flags are derived from the flags in the terminal state
and stored in the
int pointed to by the argument.
TIOCLBIS The argument is a pointer to an
int whose value is a
mask containing flags to be set in the local flags
word. The current terminal state is fetched, and the
values of the local flags are derived from the flags in
the terminal state; the specified flags are set, and
the flags in the terminal state are set to match the
new value of the local flags word.
TIOCLBIC The argument is a pointer to an
int whose value is a
mask containing flags to be cleared in the local flags
word. The current terminal state is fetched, and the
values of the local flags are derived from the flags in
the terminal state; the specified flags are cleared,
and the flags in the terminal state are set to match
the new value of the local flags word.
TIOCLSET The argument is a pointer to an int containing a new
set of local flags. The flags in the terminal state are
set to match the new value of the local flags word.
(This
ioctl was added because
sg_flags was once a 16
bit value. The local modes controlled by TIOCLSET are
equivalent to the modes controlled by TIOCSETP and
sg_flags.)
TIOCGLTC The argument is a pointer to an
ltchars structure. The
values of the appropriate characters in the terminal
state are stored in that structure.
TIOCSLTC The argument is a pointer to an
ltchars structure. The
values of the appropriate characters in the terminal
state are set from the characters in that structure.
FIORDCHK Returns the number of immediately readable characters.
The argument is ignored. (This ioctl is handled in
the stream head, not in the
ttcompat module.)
FIONREAD Returns the number of immediately readable characters
in the int pointed to by the argument. (This ioctl is
handled in the stream head, not in the
ttcompat module.)
The following ioctls are returned as successful for the sake of
compatibility. However, nothing significant is done (that is, the
state of the terminal is not changed in any way, and no message is
passed through to the underlying
tty driver).
DIOCSETP
DIOCSETP
DIOCGETP
LDCLOSE
LDCHG
LDOPEN
LDGETT
LDSETT
TIOCGETD
TIOCSETD
The following old
ioctls are not supported by
ttcompat, but are
supported by Solaris
tty drivers. As with all ioctl not otherwise
listed in this documentation, these are passed through to the
underlying driver and are handled there.
TIOCREMOTE
TIOCGWINSZ
TIOCSWINSZ
The following
ioctls are not supported by
ttcompat, and are
generally not supported by Solaris
tty drivers. They are passed
through, and the
tty drivers return EINVAL.
LDSMAP
LDGMAP
LDNMAP
TIOCNOTTY
TIOCOUTQ
(Note: LDSMAP, LDGMAP, and LDNMAP are defined in
<
sys/termios.h>.)
SEE ALSO
ioctl(2),
termios(3C),
termio(4I),
ldterm(4M) October 2, 2001 TTCOMPAT(4M)