ldterm(7) ldterm(7)
NAME
ldterm - standard STREAMS terminal line discipline module
DESCRIPTION
ldterm is a STREAMS module that provides most of the termio(7)
terminal interface. This module does not perform the low-
level device control functions specified by flags in the
c_cflag word of the termio/termios structure or by the IGNBRK,
IGNPAR, PARMRK, or INPCK flags in the c_iflag word of the
termio/termios structure; those functions must be performed by
the driver or by modules pushed below the ldterm module. All
other termio/termios functions are performed by ldterm; some
of them, however, require the cooperation of the driver or
modules pushed below ldterm and may not be performed in some
cases. These include the IXOFF flag in the c_iflag word and
the delays specified in the c_oflag word.
ldterm also handles EUC and multi-byte characters.
When ldterm is pushed onto a stream, the open routine
initializes the settings of the termio flags. The default
settings in most implementations are:
c_iflag = BRKINT|ICRNL|IXON|ISTRIP
c_oflag = OPOST|ONLCR|TAB3
c_cflag = 0
c_lflag = ISIG|ICANON|ECHO|ECHOK
The remainder of this section describes the processing of
various STREAMS messages on the read- and write-side.
Read-side Behavior
Various types of STREAMS messages are processed as follows:
M_BREAK
When this message is received, either an interrupt
signal is generated or the message is treated as if it
were an M_DATA message containing a single ASCII NUL
character, depending on the state of the BRKINT flag.
M_DATA
This message is normally processed using the standard
termio input processing. If the ICANON flag is set, a
single input record (``line'') is accumulated in an
internal buffer and sent upstream when a line-
terminating character is received. If the ICANON flag is
not set, other input processing is performed and the
Copyright 1994 Novell, Inc. Page 1
ldterm(7) ldterm(7)
processed data are passed upstream.
If output is to be stopped or started as a result of the
arrival of characters (usually CNTRL-Q and CNTRL-S),
M_STOP and M_START messages are sent downstream. If the
IXOFF flag is set and input is to be stopped or started
as a result of flow-control considerations, M_STOPI and
M_STARTI messages are sent downstream.
M_DATA messages are sent downstream, as necessary, to
perform echoing.
If a signal is to be generated, an M_FLUSH message with a
flag byte of FLUSHR is placed on the read queue. If the
signal is also to flush output, an M_FLUSH message with
a flag byte of FLUSHW is sent downstream.
M_CTL If the size of the data buffer associated with the
message is the size of struct iocblk, ldterm will
perform functional negotiation to determine where the
termio(7) processing is to be done. If the command field
of the iocblk structure (ioc_cmd) is set to MC_NO_CANON,
the input canonical processing normally performed on
M_DATA messages is disabled and those messages are
passed upstream unmodified; this is for the use of
modules or drivers that perform their own input
processing, such as a pseudo-terminal in TIOCREMOTE mode
connected to a program that performs this processing. If
the command is MC_DO_CANON, all input processing is
enabled. If the command is MC_PART_CANON, then an
M_DATA message containing a termios structure is
expected to be attached to the original M_CTL message.
The ldterm module will examine the iflag, oflag, and
lflag fields of the termios structure and from then on
will process only those flags which have not been turned
ON. If none of the above commands are found, the
message is ignored; in any case, the message is passed
upstream.
M_FLUSH
The read queue of the module is flushed of all its data
messages and all data in the record being accumulated
are also flushed. The message is passed upstream.
Copyright 1994 Novell, Inc. Page 2
ldterm(7) ldterm(7)
M_IOCACK
The data contained within the message, which is to be
returned to the process, are augmented if necessary, and
the message is passed upstream.
All other messages are passed upstream unchanged.
Write-side Behavior
Various types of STREAMS messages are processed as follows:
M_FLUSH
The write queue of the module is flushed of all its data
messages and the message is passed downstream.
M_IOCTL
The function of this ioctl is performed and the message
is passed downstream in most cases. The TCFLSH and
TCXONC ioctls can be performed entirely in the ldterm
module, so the reply is sent upstream and the message is
not passed downstream.
M_DATA
If the OPOST flag is set, or both the XCASE and ICANON
flags are set, output processing is performed and the
processed message is passed downstream along with any
M_DELAY messages generated. Otherwise, the message is
passed downstream without change.
All other messages are passed downstream unchanged.
ioctls
The following ioctls are processed by the ldterm module. All
others are passed downstream. EUC_WSET and EUC_WGET are I_STR
ioctl calls whereas other ioctls listed here are TRANSPARENT
ioctls.
TCGETS/TCGETA
The message is passed downstream; if an acknowledgment
is seen, the data provided by the driver and modules
downstream are augmented and the acknowledgement is
passed upstream.
TCSETS/TCSETSW/TCSETSF/TCSETA/TCSETAW/TCSETAF
The parameters that control the behavior of the ldterm
module are changed. If a mode change requires options
at the stream head to be changed, an M_SETOPTS message
Copyright 1994 Novell, Inc. Page 3
ldterm(7) ldterm(7)
is sent upstream. If the ICANON flag is turned on or
off, the read mode at the stream head is changed to
message-nondiscard or byte-stream mode, respectively.
If the TOSTOP
flag is turned on or off, the tostop mode at the stream
head is turned on or off, respectively.
TCFLSH
If the argument is 0, an M_FLUSH message with a flag
byte of FLUSHR is sent downstream and placed on the read
queue. If the argument is 1, the write queue is flushed
of all its data messages and an M_FLUSH message with a
flag byte of FLUSHW is sent upstream and downstream. If
the argument is 2, the write queue is flushed of all its
data messages and an M_FLUSH message with a flag byte of
FLUSHRW is sent downstream and placed on the read queue.
TCXONC
If the argument is 0 and output is not already stopped,
an M_STOP message is sent downstream. If the argument
is 1 and output is stopped, an M_START message is sent
downstream. If the argument is 2 and input is not
already stopped, an M_STOPI message is sent downstream.
If the argument is 3 and input is stopped, an M_STARTI
message is sent downstream.
TCSBRK
The message is passed downstream, so the driver has a
chance to drain the data and then send and an M_IOCACK
message upstream.
EUC_WSET
This call takes a pointer to an eucioc structure, and
uses it to set the EUC line discipline's local
definition for the code set widths to be used for
subsequent operations. Within the stream, the line
discipline may optionally notify other modules of this
setting via M_CTL messages.
EUC_WGET
This call takes a pointer to an eucioc structure, and
returns in it the EUC code set widths currently in use
by the EUC line discipline.
Copyright 1994 Novell, Inc. Page 4
ldterm(7) ldterm(7)
REFERENCES
pseudo(1), console(7), termio(7), termios(3C)
Copyright 1994 Novell, Inc. Page 5