summaryrefslogtreecommitdiff
path: root/usr/src/man/man4i/termio.4i
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/man/man4i/termio.4i')
-rw-r--r--usr/src/man/man4i/termio.4i2193
1 files changed, 2193 insertions, 0 deletions
diff --git a/usr/src/man/man4i/termio.4i b/usr/src/man/man4i/termio.4i
new file mode 100644
index 0000000000..c30fdd5262
--- /dev/null
+++ b/usr/src/man/man4i/termio.4i
@@ -0,0 +1,2193 @@
+.\" Copyright (c) 2005, Sun Microsystems, Inc. All Rights Reserved.
+.\" Copyright 2019, Joyent, Inc. All Rights Reserved.
+.\" Copyright 1989 AT&T
+.\" The contents of this file are subject to the terms of the
+.\" Common Development and Distribution License (the "License").
+.\" You may not use this file except in compliance with the License.
+.\"
+.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+.\" or http://www.opensolaris.org/os/licensing.
+.\" See the License for the specific language governing permissions
+.\" and limitations under the License.
+.\"
+.\" When distributing Covered Code, include this CDDL HEADER in each
+.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+.\" If applicable, add the following below this CDDL HEADER, with the
+.\" fields enclosed by brackets "[]" replaced with your own identifying
+.\" information: Portions Copyright [yyyy] [name of copyright owner]
+.Dd August 13, 2021
+.Dt TERMIO 4I
+.Os
+.Sh NAME
+.Nm termio
+.Nd general terminal interface
+.Sh SYNOPSIS
+.In termio.h
+.Fn ioctl "int fildes" "int request" "struct termio *arg"
+.Fn ioctl "int fildes" "int request" "int arg"
+.Pp
+.In termios.h
+.Fn ioctl "int fildes" "int request" "struct termios *arg"
+.Sh DESCRIPTION
+This release supports a general interface for asynchronous communications ports
+that is hardware-independent.
+The user interface to this functionality is using
+function calls (the preferred interface) described in
+.Xr termios 3C
+or
+.Fn ioctl
+commands described in this section.
+This section also discusses the
+common features of the terminal subsystem which are relevant with both user
+interfaces.
+.Pp
+When a terminal file is opened, it normally causes the process to wait until a
+connection is established.
+In practice, user programs seldom open terminal
+files; they are opened by the system and become a user's standard input,
+output, and error files.
+The first terminal file opened by the session leader
+that is not already associated with a session becomes the controlling terminal
+for that session.
+The controlling terminal plays a special role in handling
+quit and interrupt signals, as discussed below.
+The controlling terminal is
+inherited by a child process during a
+.Xr fork 2 .
+A process can break this
+association by changing its session using
+.Xr setsid 2 .
+.Pp
+A terminal associated with one of these files ordinarily operates in
+full-duplex mode.
+Characters may be typed at any time, even while output is
+occurring, and are only lost when the character input buffers of the system
+become completely full, which is rare.
+For example, the number of characters in
+the line discipline buffer may exceed
+.Brq Dv MAX_CANON
+and
+.Dv IMAXBEL
+(see below) is not set, or the user may accumulate
+.Brq Dv MAX_INPUT
+number of input characters that have not yet been read by some program.
+When the input
+limit is reached, all the characters saved in the buffer up to that point are
+thrown away without notice.
+.Ss "Session Management (Job Control)"
+A control terminal will distinguish one of the process groups in the session
+associated with it to be the foreground process group.
+All other process
+groups in the session are designated as background process groups.
+This foreground process group plays a special role in handling signal-generating
+input characters, as discussed below.
+By default, when a controlling terminal
+is allocated, the controlling process's process group is assigned as
+foreground process group.
+.Pp
+Background process groups in the controlling process's session are subject to a
+job control line discipline when they attempt to access their controlling
+terminal.
+Process groups can be sent signals that will cause them to stop,
+unless they have made other arrangements.
+An exception is made for members of
+orphaned process groups.
+.Pp
+An orphaned process group is one where the process group (see
+.Xr getpgid 2 )
+has no members with a parent in a different process group but sharing the same
+controlling terminal.
+When a member of an orphaned process group attempts to
+access its controlling terminal, EIO is returned because there would be no way
+to restart the process if it were stopped on one of these signals.
+.Pp
+If a member of a background process group attempts to read its controlling
+terminal, its process group will be sent a
+.Dv SIGTTIN
+signal, which will
+normally cause the members of that process group to stop.
+If, however, the
+process is ignoring or holding
+.Dv SIGTTIN ,
+or is a member of an orphaned
+process group, the read will fail with
+.Va errno
+set to
+.Er EIO ,
+and no signal is sent.
+.Pp
+If a member of a background process group attempts to write its controlling
+terminal and the
+.Dv TOSTOP
+bit is set in the
+.Fa c_lflag
+field, its process group is sent a
+.Dv SIGTTOU
+signal, which will normally cause the
+members of that process group to stop.
+If, however, the process is ignoring or
+holding
+.Dv SIGTTOU ,
+the write will succeed.
+If the process is not ignoring
+or holding
+.Dv SIGTTOU
+and is a member of an orphaned process group, the
+write will fail with
+.Va errno
+set to
+.Er EIO ,
+and no signal will be sent.
+.Pp
+If
+.Dv TOSTOP
+is set and a member of a background process group attempts to
+.Fn ioctl
+its controlling terminal, and that
+.Fn ioctl
+will modify terminal parameters (for example,
+.Dv TCSETA ,
+.Dv TCSETAW ,
+.Dv TCSETAF ,
+or
+.Dv TIOCSPGRP ) ,
+its process group will be sent a
+.Dv SIGTTOU
+signal, which will normally cause the members of that process group to stop.
+If, however, the process is ignoring or holding
+.Dv SIGTTOU ,
+the ioctl will succeed.
+If the process is not ignoring or holding
+.Dv SIGTTOU
+and is a member of an orphaned
+process group, the write will fail with
+.Va errno
+set to
+.Er EIO ,
+and no signal will be sent.
+.Ss "Canonical Mode Input Processing"
+Normally, terminal input is processed in units of lines.
+A line is delimited by
+a newline
+.Po
+.Sy ASCII LF
+.Pc
+character, an end-of-file
+.Po
+.Sy ASCII EOT
+.Pc
+character, or an end-of-line character.
+This means that a program attempting to
+read will block until an entire line has been typed.
+Also, no matter how many
+characters are requested in the read call, at most one line will be returned.
+It is not necessary, however, to read a whole line at once; any number of
+characters may be requested in a read, even one, without losing information.
+.Pp
+During input, erase, erase2, and kill processing is normally done.
+The
+.Sy ERASE
+and
+.Sy ERASE2
+character (by default, the character
+.Sy DEL
+for
+.Sy ERASE
+and
+.Sy Control-h
+for
+.Sy ERASE2 )
+erases the last character typed.
+The
+.Sy WERASE
+character (the character
+.Sy Control-w )
+erases the
+last "word" typed in the current input line (but not any preceding spaces or
+tabs).
+A
+.Dq word
+is defined as a sequence of non-blank characters, with tabs counted as blanks.
+None of
+.Sy ERASE
+or
+.Sy ERASE2
+or
+.Sy WERASE
+will erase beyond the beginning of the line.
+The
+.Sy KILL
+character (by default,
+the character
+.Sy NAK )
+kills (deletes) the entire input line, and optionally
+outputs a newline character.
+All these characters operate on a key stroke basis,
+independent of any backspacing or tabbing that may have been done.
+The
+.Sy REPRINT
+character (the character
+.Sy Control-r )
+prints a newline followed by all characters that have not been read.
+Reprinting also occurs automatically if
+characters that would normally be erased from the screen are fouled by program
+output.
+The characters are reprinted as if they were being echoed;
+consequencely, if
+.Dv ECHO
+is not set, they are not printed.
+.Pp
+The
+.Sy ERASE ,
+.Sy ERASE2 ,
+and
+.Sy KILL
+characters may be entered literally by preceding them with the escape character.
+In this case, the escape character is not read.
+The erase, erase2, and kill characters may be changed.
+.Ss "Non-canonical Mode Input Processing"
+In non-canonical mode input processing, input characters are not assembled into
+lines, and erase and kill processing does not occur.
+The
+.Sy MIN
+and
+.Sy TIME
+values are used to determine how to process the characters received.
+.Pp
+.Sy MIN
+represents the minimum number of characters that should be received
+when the read is satisfied (that is, when the characters are returned to the
+user).
+.Sy TIME
+is a timer of 0\&.10-second granularity that is used to timeout
+bursty and short-term data transmissions.
+The four possible values for
+.Sy MIN
+and
+.Sy TIME
+and their interactions are described below.
+.Bl -tag -width "Case A: Min > 0, Time > 0"
+.It Sy Case A: MIN > 0, TIME > 0
+In this case,
+.Sy TIME
+serves as an intercharacter timer and is activated
+after the first character is received.
+Since it is an intercharacter timer, it
+is reset after a character is received.
+The interaction between
+.Sy MIN
+and
+.Sy TIME
+is as follows: as soon as one character is received, the
+intercharacter timer is started.
+If
+.Sy MIN
+characters are received before
+the intercharacter timer expires (note that the timer is reset upon receipt of
+each character), the read is satisfied.
+If the timer expires before
+.Sy MIN
+characters are received, the characters received to that point are returned to
+the user.
+Note that if
+.Sy TIME
+expires, at least one character will be
+returned because the timer would not have been enabled unless a character was
+received.
+In this case (MIN > 0, TIME > 0), the read sleeps until the
+.Sy MIN
+and
+.Sy TIME
+mechanisms are activated by the receipt of the first character.
+If the number of characters read is less than the number of characters
+available, the timer is not reactivated and the subsequent read is satisfied
+immediately.
+.It Sy Case B: MIN > 0, TIME = 0
+In this case, since the value of
+.Sy TIME
+is zero, the timer plays no role
+and only
+.Sy MIN
+is significant.
+A pending read is not satisfied until
+.Sy MIN
+characters are received (the pending read sleeps until
+.Sy MIN
+characters are received).
+A program that uses this case to read record based
+terminal
+.Sy I/O
+may block indefinitely in the read operation.
+.It Sy Case C: MIN = 0, TIME > 0
+In this case, since
+.Sy MIN
+0,
+.Sy TIME
+no longer represents an
+intercharacter timer: it now serves as a read timer that is activated as soon
+as a
+.Xr read 2
+is done.
+A read is satisfied as soon as a single character is
+received or the read timer expires.
+Note that, in this case, if the timer
+expires, no character is returned.
+If the timer does not expire, the only way
+the read can be satisfied is if a character is received.
+In this case, the
+read will not block indefinitely waiting for a character; if no character is
+received within
+.Sy TIME
+*\&.10 seconds after the read is initiated, the read
+returns with zero characters.
+.It Sy Case D: MIN = 0, TIME = 0
+In this case, return is immediate.
+The minimum of either the number of
+characters requested or the number of characters currently available is
+returned without waiting for more characters to be input.
+.El
+.Ss "Comparing Different Cases of MIN, TIME Interaction"
+Some points to note about
+.Sy MIN
+and
+.Sy TIME :
+.Bl -bullet -offset 2n
+.It
+In the following explanations, note that the interactions of
+.Sy MIN
+and
+.Sy TIME
+are not symmetric.
+For example, when
+.Sy MIN
+> 0 and
+.Sy TIME
+= 0,
+.Sy TIME
+has no effect.
+However, in the opposite case, where
+.Sy MIN
+= 0 and
+.Sy TIME
+> 0, both
+.Sy MIN
+and
+.Sy TIME
+play a role in that
+.Sy MIN
+is satisfied with the receipt of a single character.
+.It
+Also note that in case A
+.Po
+.Sy MIN
+> 0,
+.Sy TIME
+> 0
+.Pc ,
+.Sy TIME
+represents
+an intercharacter timer, whereas in case C
+.Po
+.Sy MIN
+= 0,
+.Sy TIME
+> 0
+.Pc ,
+.Sy TIME
+represents a read timer.
+.El
+.Pp
+These two points highlight the dual purpose of the
+.Sy MIN/TIME
+feature.
+Cases A and B, where
+.Sy MIN
+> 0, exist to handle burst mode activity (for
+example, file transfer programs), where a program would like to process at
+least
+.Sy MIN
+characters at a time.
+In case A, the inteercharacter timer is
+activated by a user as a safety measure; in case B, the timer is turned off.
+.Pp
+Cases C and D exist to handle single character, timed transfers.
+These cases
+are readily adaptable to screen-based applications that need to know if a
+character is present in the input queue before refreshing the screen.
+In case
+C, the read is timed, whereas in case D, it is not.
+.Pp
+Another important note is that
+.Sy MIN
+is always just a minimum.
+It does not
+denote a record length.
+For example, if a program does a read of 20 bytes,
+.Sy MIN
+is 10, and 25 characters are present, then 20 characters will be
+returned to the user.
+.Ss "Writing Characters"
+When one or more characters are written, they are transmitted to the terminal
+as soon as previously written characters have finished typing.
+nputt characters
+are echoed as they are typed if echoing has been enabled.
+If a process produces
+characters more rapidly than they can be typed, it will be suspended when its
+output queue exceeds some limit.
+When the queue is drained down to some
+threshold, the program is resumed.
+.Ss "Special Characters"
+Certain characters have special functions on input.
+These functions and their default character values are summarized as follows:
+.Bl -tag -width REPRINT
+.It Sy INTR
+(Control-c or
+.Sy ASCII ETX )
+generates a
+.Dv SIGINT
+signal.
+.Dv SIGINT
+is sent to all foreground processes associated with the controlling terminal.
+Normally, each such process is forced to terminate, but arrangements may be
+made either to ignore the signal or to receive a trap to an agreed upon
+location.
+(See
+.Xr signal.h 3HEAD ) .
+.It Sy QUIT
+(Control-| or
+.Sy ASCII FS )
+generates a
+.Dv SIGQUIT
+signal.
+Its treatment
+is identical to the interrupt signal except that, unless a receiving process
+has made other arrangements, it will not only be terminated but a core image
+file (called
+.Pa core )
+will be created in the current working directory.
+.It Sy ERASE
+(DEL) erases the preceding character.
+It does not erase beyond
+the start of a line, as delimited by a
+.Sy NL ,
+.Sy EOF ,
+.Sy EOL ,
+or
+.Sy EOL2
+character.
+.It Sy ERASE2
+(Control-h or
+.Sy ASCII BS )
+erases the preceding character, with behaviour identical to that of ERASE.
+.It Sy WERASE
+(Control-w or
+.Sy ASCII ETX )
+erases the preceding
+.Dq word .
+It does not erase beyond the start of a line, as delimited by a
+.Sy NL ,
+.Sy EOF ,
+.Sy EOL ,
+or
+.Sy EOL2
+character.
+.It Sy KILL
+(Control-u or
+.Sy ASCII NAK )
+deletes the entire line, as delimited by a
+.Sy NL ,
+.Sy EOF ,
+.Sy EOL ,
+or
+.Sy EOL2
+character.
+.It Sy REPRINT
+(Control-r or
+.Sy ASCII DC2 )
+reprints all characters, preceded by a newline, that have not been read.
+.It Sy EOF
+(Control-d or
+.Sy ASCII EOT )
+may be used to generate an end-of-file from a terminal.
+When received, all the characters waiting to be read are immediately
+passed to the program, without waiting for a newline, and the
+.Sy EOF
+is discarded.
+Thus, if no characters are waiting (that is, the
+.Sy EOF
+occurred
+at the beginning of a line) zero characters are passed back, which is the
+standard end-of-file indication.
+Unless escaped, the
+.Sy EOF
+character is not
+echoed.
+Because
+.Sy EOT
+is the default
+.Sy EOF
+character, this prevents
+terminals that respond to
+.Sy EOT
+from hanging up.
+.It Sy NL
+.Pq Sy ASCII LF
+is the normal line delimiter.
+It cannot be changed or escaped.
+.It Sy EOL
+.Pq Sy ASCII NULL
+is an additional line delimiter, like
+.Sy NL .
+It is not normally used.
+.It Sy EOL2
+is another additional line delimiter.
+.It Sy SWTCH
+(Control-z or
+.Sy ASCII EM )
+Header file symbols related to this special
+character are present for compatibility purposes only and the kernel takes no
+special action on matching SWTCH (except to discard the character).
+.It Sy SUSP
+(Control-z or
+.Sy ASCII SUB )
+generates a
+.Dv SIGTSTP
+signal.
+.Dv SIGTSTP
+stops all processes in the foreground process group for that terminal.
+.It Sy DSUSP
+(Control-y or
+.Sy ASCII EM ) .
+It generates a
+.Dv SIGTSTP
+signal as
+.Sy SUSP
+does, but the signal is sent when a process in the foreground
+process group attempts to read the
+.Sy DSUSP
+character, rather than when it is typed.
+.It Sy STOP
+(Control-s or
+.Sy ASCII DC3 )
+can be used to suspend output temporarily.
+It is useful with
+.Sy CRT
+terminals to prevent output from disappearing before it can be read.
+While output is suspended,
+.Sy STOP
+characters are ignored and
+not read.
+.It Sy START
+(Control-q or
+.Sy ASCII DC1 )
+is used to resume output.
+Output has been suspended by a
+.Sy STOP
+character.
+While output is not suspended,
+.Sy START
+characters are ignored and not read.
+.It Sy DISCARD
+(Control-o or
+.Sy ASCII SI )
+causes subsequent output to be discarded.
+Output is discarded until another
+.Sy DISCARD
+character is typed, more input
+arrives, or the condition is cleared by a program.
+.It Sy STATUS
+(Control-t or
+.Sy ASCII DC4 )
+generates a
+.Dv SIGINFO
+signal.
+Processes with a handler will output status information when they receive
+.Dv SIGINFO ,
+for
+example,
+.Xr dd 8 .
+If a process does not have a
+.Dv SIGINFO
+handler, the
+signal will be ignored.
+.It Sy LNEXT
+(Control-v or
+.Sy ASCII SYN )
+causes the special meaning of the next character to be ignored.
+This works for all the special characters mentioned above.
+It
+allows characters to be input that would otherwise be interpreted by the system
+(for example
+.Sy KILL ,
+.Sy QUIT ) .
+The character values for
+.Sy INTR ,
+.Sy QUIT ,
+.Sy ERASE ,
+.Sy ERASE2 ,
+.Sy WERASE ,
+.Sy KILL ,
+.Sy REPRINT ,
+.Sy EOF ,
+.Sy EOL ,
+.Sy EOL2 ,
+.Sy SWTCH ,
+.Sy SUSP ,
+.Sy DSUSP ,
+.Sy STOP ,
+.Sy START ,
+.Sy DISCARD ,
+.Sy STATUS ,
+and
+.Sy LNEXT
+may be changed to suit individual tastes.
+If the value of a special control character
+is
+.Dv _POSIX_VDISABLE
+(0), the function of that special control character is disabled.
+The
+.Sy ERASE ,
+.Sy ERASE2 ,
+.Sy KILL ,
+and
+.Sy EOF
+characters may be
+escaped by a preceding backslash (\e) character, in which case no special
+function is done.
+Any of the special characters may be preceded by the
+.Sy LNEXT
+character, in
+which case no special function is done.
+.El
+.Ss "Modem Disconnect"
+When a modem disconnect is detected, a
+.Dv SIGHUP
+signal is sent to the
+terminal's controlling process.
+Unless other arrangements have been made, these
+signals cause the process to terminate.
+If
+.Dv SIGHUP
+is ignored or caught,
+any subsequent read returns with an end-of-file indication until the terminal
+is closed.
+.Pp
+If the controlling process is not in the foreground process group of the
+terminal, a
+.Dv SIGTSTP
+is sent to the terminal's foreground process group.
+Unless other arrangements have been made, these signals cause the processes to
+stop.
+.Pp
+Processes in background process groups that attempt to access the controlling
+terminal after modem disconnect while the terminal is still allocated to the
+session will receive appropriate
+.Dv SIGTTOU
+and
+.Dv SIGTTIN
+signals.
+Unless other arrangements have been made, this signal causes the processes to
+stop.
+.Pp
+The controlling terminal will remain in this state until it is reinitialized
+ithh a successful open by the controlling process, or deallocated by the
+controlling process.
+.Ss "Terminal Parameters"
+The parameters that control the behavior of devices and modules providing the
+.Vt termios
+interface are specified by the
+.Vt termios
+structure defined by
+.In termios.h .
+Several
+.Xr ioctl 2
+system calls that fetch or change
+these parameters use this structure that contains the following members:
+.Bd -literal -offset 2n
+tcflag_t c_iflag; /* input modes */
+tcflag_t c_oflag; /* output modes */
+tcflag_t c_cflag; /* control modes */
+tcflag_t c_lflag; /* local modes */
+cc_t c_cc[NCCS]; /* control chars */
+.Ed
+.Pp
+The special control characters are defined by the array
+.Fa c_cc .
+The symbolic name
+.Dv NCCS
+is the size of the Control-character array and is also
+defined by
+.In termios.h .
+The relative positions, subscript names, and
+typical default values for each function are as follows:
+.Bl -column "Relative Position" "Subscript Name" "Typical Default Value"
+.It Relative Position Ta Subscript Name Ta Typical Default Value
+.It 0 Ta Dv VINTR Ta Sy ETX
+.It 1 Ta Dv VQUIT Ta Sy FS
+.It 2 Ta Dv VERASE Ta Sy DEL
+.It 3 Ta Dv VKILL Ta Sy NAK
+.It 4 Ta Dv VEOF Ta Sy EOT
+.It 5 Ta Dv VEOL Ta Sy NUL
+.It 6 Ta Dv VEOL2 Ta Sy NUL
+.It 7 Ta Dv VWSTCH Ta Sy NUL
+.It 8 Ta Dv VSTART Ta Sy NUL
+.It 9 Ta Dv VSTOP Ta Sy DC3
+.It 10 Ta Dv VSUSP Ta Sy SUB
+.It 11 Ta Dv VDSUSP Ta Sy EM
+.It 12 Ta Dv VREPRINT Ta Sy DC2
+.It 13 Ta Dv VDISCARD Ta Sy SI
+.It 14 Ta Dv VWERASE Ta Sy ETB
+.It 15 Ta Dv VLNEXT Ta Sy SYN
+.It 16 Ta Dv VSTATUS Ta Sy DC4
+.It 17 Ta Dv VERASE2 Ta Sy BS
+.It 18-19 Ta Reserved Ta
+.El
+.Ss "Input Modes"
+The
+.Fa c_iflag
+field describes the basic terminal input control:
+.Pp
+.Bl -tag -width "IMAXBEL" -offset 2n -compact
+.It Dv IGNBRK
+Ignore break condition.
+.It Dv BRKINT
+Signal interrupt on break.
+.It Dv IGNPAR
+Ignore characters with parity errors.
+.It Dv PARMRK
+Mark parity errors.
+.It Dv INPCK
+Enable input parity check.
+.It Dv ISTRIP
+Strip character.
+.It Dv INLCR
+Map NL to CR on input.
+.It Dv IGNCR
+Ignore CR.
+.It Dv ICRNL
+Map CR to NL on input.
+.It Dv IUCLC
+Map upper-case to lower-case on input.
+.It Dv IXON
+Enable start/stop output control.
+.It Dv IXANY
+Enable any character to restart output.
+.It Dv IXOFF
+Enable start/stop input control.
+.It Dv IMAXBEL
+Echo
+.Sy BEL
+on input line too long.
+.El
+.Pp
+If
+.Dv IGNBRK
+is set, a break condition (a character framing error with data
+all zeros) detected on input is ignored, that is, not put on the input queue
+and therefore not read by any process.
+If
+.Dv IGNBRK
+is not set and
+.Dv BRKINT
+is set, the break condition shall flush the input and output
+queues and if the terminal is the controlling terminal of a foreground process
+group, the break condition generates a single
+.Dv SIGINT
+signal to that
+foreground process group.
+If neither
+.Dv IGNBRK
+nor
+.Dv BRKINT
+is set, a
+break condition is read as a single
+.Ql \e0
+.Pq Sy ASCII NULL
+character, or if
+.Dv PARMRK
+is set, as
+.Ql \e377 ,
+.Ql \e0 ,
+.Em c ,
+where
+.Ql \e377
+is a single character
+with value 377 octal (0xff hex, 255 decimal),
+.Ql \e0
+is a single character with value
+.Sy 0 ,
+and
+.Em c
+is the errored character received.
+.Pp
+If
+.Dv IGNPAR
+is set, a byte with framing or parity errors (other than
+break) is ignored.
+.Pp
+If
+.Dv PARMRK
+is set, and
+.Dv IGNPAR
+is not set, a byte with a framing or
+parity error (other than break) is given to the application as the
+three-character sequence:
+.Ql \e377 ,
+.Ql \e0 ,
+c, where
+.Ql \e377
+is a single character with value 377 octal (0xff hex, 255 decimal),
+.Ql \e0
+is a single character with value 0, and c is the errored character received.
+To avoid ambiguity in this case, if
+.Dv ISTRIP
+is not set, a valid character
+of
+.Ql \e377
+is given to the application as
+.Ql \e377 .
+If neither
+.Dv IGNPAR
+nor
+.Dv PARMRK
+is set, a framing or parity error (other than break) is given to
+the application as a single
+.Ql \e0
+.Po
+.Sy ASCII NULL
+.Pc
+character.
+.Pp
+If
+.Dv INPCK
+is set, input parity checking is enabled.
+If
+.Dv INPCK
+is not
+set, input parity checking is disabled.
+This allows output parity generation
+without input parity errors.
+Note that whether input parity checking is
+enabled or disabled is independent of whether parity detection is enabled or
+disabled.
+If parity detection is enabled but input parity checking is
+disabled, the hardware to which the terminal is connected will recognize the
+parity bit, but the terminal special file will not check whether this is set
+correctly or not.
+.Pp
+If
+.Dv ISTRIP
+is set, valid input characters are first stripped to seven
+bits, otherwise all eight bits are processed.
+.Pp
+If
+.Dv INLCR
+is set, a received
+.Sy NL
+character is translated into a
+.Sy CR
+character.
+If
+.Dv IGNCR
+is set, a received
+.Sy CR
+character is ignored (not read).
+Otherwise, if
+.Dv ICRNL
+is set, a received
+.Sy CR
+character is translated into a
+.Sy NL
+character.
+.Pp
+If
+.Dv IUCLC
+is set, a received upper case, alphabetic character is
+translated into the corresponding lower case character.
+.Pp
+If
+.Dv IXON
+is set, start/stop output control is enabled.
+A received
+.Sy STOP
+character suspends output and a received
+.Sy START
+character
+restarts output.
+The
+.Sy STOP
+and
+.Sy START
+characters will not be read,
+but will merely perform flow control functions.
+If
+.Dv IXANY
+is set, any
+input character restarts output that has been suspended.
+.Pp
+If
+.Dv IXOFF
+is set, the system transmits a
+.Sy STOP
+character when the
+input queue is nearly full, and a
+.Sy START
+character when enough input has
+been read so that the input queue is nearly empty again.
+.Pp
+If
+.Dv IMAXBEL
+is set, the
+.Sy ASCII BEL
+character is echoed if the input stream overflows.
+Further input is not stored, but any input already present in
+the input stream is not disturbed.
+If
+.Dv IMAXBEL
+is not set, no
+.Sy BEL
+character is echoed, and all input present in the input queue is discarded if
+the input stream overflows.
+.Ss "Output Modes"
+The
+.Fa c_oflag
+field specifies the system treatment of output:
+.Pp
+.Bl -tag -width ONLRET -offset 2n -compact
+.It Dv OPOST
+Post-process output.
+.It Dv OLCUC
+Map lower case to upper on output.
+.It Dv ONLCR
+Map NL to CR-NL on output.
+.It Dv OCRNL
+Map CR to NL on output.
+.It Dv ONOCR
+No
+.Sy CR
+output at column 0.
+.It Dv ONLRET
+.Sy NL
+performs
+.Sy CR
+function.
+.It Dv OFILL
+Use fill characters for delay.
+.It Dv OFDEL
+Fill is
+.Sy DEL ,
+else
+.Sy INULL .
+.It Dv NLDLY
+Select newline delays:
+.Bl -tag -width NL0 -compact -offset 2n
+.It Sy NL0
+.It Sy NL1
+.El
+.It Dv CRDLY
+Select carriage-return delays:
+.Bl -tag -width CR0 -compact -offset 2n
+.It Dv CR0
+.It Dv CR1
+.It Dv CR2
+.It Dv CR3
+.El
+.It Dv TABDLY
+Select horizontal tab delays or tab expansion:
+.Bl -tag -width XTABS -compact -offset 2n
+.It Dv TAB0
+.It Dv TAB1
+.It Dv TAB2
+.It Dv TAB3
+Expand tabs to spaces
+.It Dv XTABS
+Expand tabs to spaces
+.El
+.It Dv BSDLY
+Select backspace delays:
+.Bl -tag -width BS0 -offset 2n -compact
+.It Dv BS0
+.It Dv BS1
+.El
+.It Dv VTDLY
+Select vertical tab delays:
+.Bl -tag -width VT0 -offset 2n -compact
+.It Dv VT0
+.It Dv VT1
+.El
+.It Dv FFDLY
+Select form feed delays:
+.Bl -tag -width FF0 -offset 2n -compact
+.It Dv FF0
+.It Dv FF1
+.El
+.El
+.Pp
+If
+.Dv OPOST
+is set, output characters are post-processed as indicated by the
+remaining flags; otherwise, characters are transmitted without change.
+.Pp
+If
+.Dv OLCUC
+is set, a lower case alphabetic character is transmitted as the
+corresponding upper case character.
+This function is often used in conjunction
+with
+.Dv IUCLC .
+.Pp
+If
+.Dv ONLCR
+is set, the
+.Sy NL
+character is transmitted as the
+.Sy CR-NL
+character pair.
+If
+.Dv OCRNL
+is set, the
+.Sy CR
+character is transmitted as the
+.Sy NL
+character.
+If
+.Dv ONOCR
+is set, no
+.Sy CR
+character is transmitted when at column 0 (first position).
+If
+.Dv ONRET
+is set, the
+.Sy NL
+character is assumed to do the carriage-return function; the column
+pointer is set to 0 and the delays specified for
+.Sy CR
+are used.
+Otherwise, the
+.Sy NL
+character is assumed to do just the line-feed function; the column
+pointer remains unchanged.
+The column pointer is also set to 0 if the
+.Sy CR
+character is actually transmitted.
+.Pp
+The delay bits specify how long transmission stops to allow for mechanical or
+other movement when certain characters are sent to the terminal.
+In all cases, a value of 0 indicates no delay.
+If
+.Dv OFILL
+is set, fill characters are transmitted for delay instead of a timed delay.
+This is useful for high baud rate terminals that need only a minimal delay.
+If
+.Dv OFDEL
+is set, the
+fill character is
+.Sy DEL ;
+otherwise it is
+.Sy NULL .
+.Pp
+If a form-feed or vertical-tab delay is specified, it lasts for about 2
+seconds.
+.Pp
+Newline delay lasts about 0\&.10 seconds.
+If
+.Dv ONLRET
+is set, the carriage-return delays are used instead of the newline delays.
+If
+.Dv OFILL
+is set, two fill characters are transmitted.
+.Pp
+Carriage-return delay type 1 is dependent on the current column position, type
+2 is about 0\&.10 seconds, and type 3 is about 0\&.15 seconds.
+If
+.Dv OFILL
+is set, delay type 1 transmits two fill characters, and type 2 transmits four
+fill characters.
+.Pp
+Horizontal-tab delay type 1 is dependent on the current column position.
+Type 2 is about 0\&.10 seconds.
+Type 3 specifies that tabs are to be expanded into spaces.
+If
+.Dv OFILL
+is set, two fill characters are transmitted for any delay.
+.Pp
+Backspace delay lasts about 0\&.05 seconds.
+If
+.Dv OFILL
+is set, one fill character is transmitted.
+.Pp
+The actual delays depend on line speed and system load.
+.Ss "Control Modes"
+The
+.Fa c_cflag
+field describes the hardware control of the terminal:
+.Bl -tag -width CIBAUDEXT -offset 2n
+.It Dv CBAUD
+Baud rate:
+.Bl -tag -width B4000000 -compact
+.It Dv B0
+Hang up
+.It Dv B50
+50 baud
+.It Dv B75
+75 baud
+.It Dv B110
+110 baud
+.It Dv B134
+134 baud
+.It Dv B150
+150 baud
+.It Dv B200
+200 baud
+.It Dv B300
+300 baud
+.It Dv B600
+600 baud
+.It Dv B1200
+1200 baud
+.It Dv B1800
+1800 baud
+.It Dv B2400
+2400 baud
+.It Dv B4800
+4800 baud
+.It Dv B9600
+9600 baud
+.It Dv B19200
+19200 baud
+.It Dv B38400
+38400 baud
+.It Dv B57600
+57600 baud
+.It Dv B76800
+76800 baud
+.It Dv B115200
+115200 baud
+.It Dv B153600
+153600 baud
+.It Dv B230400
+230400 baud
+.It Dv B307200
+307200 baud
+.It Dv B460800
+460800 baud
+.It Dv B921600
+921600 baud
+.It Dv B1000000
+1000000 baud
+.It Dv B1152000
+1152000 baud
+.It Dv B1500000
+1500000 baud
+.It Dv B2000000
+2000000 baud
+.It Dv B2500000
+2500000 baud
+.It Dv B3000000
+3000000 baud
+.It Dv B3500000
+3500000 baud
+.It Dv B4000000
+4000000 baud
+.El
+.It Dv CSIZE
+Character size:
+.Bl -tag -width CIBAUDEXT -compact
+.It Dv CS5
+5 bits
+.It Dv CS6
+6 bits
+.It Dv CS7
+7 bits
+.It Dv CS8
+8 bits
+.It Dv CSTOPB
+Send two stop bits, else one
+.It Dv CREAD
+Enable receiver
+.It Dv PARENB
+Parity enable
+.It Dv PARODD
+Odd parity, else even
+.It Dv HUPCL
+Hang up on last close
+.It Dv CLOCAL
+Local line, else dial-up
+.It Dv CIBAUD
+Input baud rate, if different from output rate
+.It Dv PAREXT
+Extended parity for mark and space parity
+.It Dv CRTSXOFF
+Enable inbound hardware flow control
+.It Dv CRTSCTS
+Enable outbound hardware flow control
+.It Dv CBAUDEXT
+Bit to indicate output speed > B38400
+.It Dv CIBAUDEXT
+Bit to indicate input speed > B38400
+.El
+.El
+.Pp
+The
+.Dv CBAUD
+bits together with the
+.Dv CBAUDEXT
+bit specify the output baud rate.
+To retrieve the output speed from the
+.Vt termios
+structure pointed to by
+.Fa termios_p
+see the following code segment.
+.Bd -literal -offset 2n
+speed_t ospeed;
+if (termios_p->c_cflag & CBAUDEXT)
+ ospeed = (termios_p->c_cflag & CBAUD) + CBAUD + 1;
+else
+ ospeed = termios_p->c_cflag & CBAUD;
+.Ed
+.Pp
+To store the output speed in the termios structure pointed to by
+.Fa termios_p
+see the following code segment.
+.Bd -literal -offset 2n
+speed_t ospeed;
+if (ospeed > CBAUD) {
+ termios_p->c_cflag |= CBAUDEXT;
+ ospeed -= (CBAUD + 1);
+} else {
+ termios_p->c_cflag &= ~CBAUDEXT;
+}
+termios_p->c_cflag =
+ (termios_p->c_cflag & ~CBAUD) | (ospeed & CBAUD);
+.Ed
+.Pp
+The zero baud rate,
+.Dv B0 ,
+is used to hang up the connection.
+If
+.Dv B0
+is specified, the data-terminal-ready signal is not asserted.
+Normally, this disconnects the line.
+.Pp
+If the
+.Dv CIBAUDEXT
+or
+.Dv CIBAUD
+bits are not zero, they specify the input baud rate, with the
+.Dv CBAUDEXT
+and
+.Dv CBAUD
+bits specifying the output baud rate; otherwise, the output and input baud
+rates are both specified by the
+.Dv CBAUDEXT
+and
+.Dv CBAUD
+bits.
+The values for the
+.Dv CIBAUD
+bits are the same as the values for the
+.Dv CBAUD
+bits, shifted left
+.Dv IBSHIFT
+bits.
+For any particular hardware, impossible speed changes are
+ignored.
+To retrieve the input speed in the
+.Vt termios
+structure pointed to
+by
+.Fa termios_p
+see the following code segment.
+.Bd -literal -offset 2n
+speed_t ispeed;
+if (termios_p->c_cflag & CIBAUDEXT) {
+ ispeed = ((termios_p->c_cflag & CIBAUD) >> IBSHIFT)
+ + (CIBAUD >> IBSHIFT) + 1;
+} else {
+ ispeed = (termios_p->c_cflag & CIBAUD) >> IBSHIFT;
+}
+.Ed
+.Pp
+To store the input speed in the
+.Vt termios
+structure pointed to by
+.Fa termios_p
+see the following code segment.
+.Bd -literal -offset 2n
+speed_t ispeed;
+if (ispeed == 0) {
+ ispeed = termios_p->c_cflag & CBAUD;
+ if (termios_p->c_cflag & CBAUDEXT)
+ ispeed += (CBAUD + 1);
+}
+if ((ispeed << IBSHIFT) > CIBAUD) {
+ termios_p->c_cflag |= CIBAUDEXT;
+ ispeed -= ((CIBAUD >> IBSHIFT) + 1);
+} else {
+ termios_p->c_cflag &= ~CIBAUDEXT;
+}
+termios_p->c_cflag =
+ (termios_p->c_cflag & ~CIBAUD) | ((ispeed << IBSHIFT) & CIBAUD);
+.Ed
+.Pp
+The
+.Dv CSIZE
+bits specify the character size in bits for both transmission and reception.
+This size does not include the parity bit, if any.
+If
+.Dv CSTOPB
+is set, two stop bits are used; otherwise, one stop bit is used.
+For example, at 110 baud, two stops bits are required.
+.Pp
+If
+.Dv PARENB
+is set, parity generation and detection is enabled, and a
+parity bit is added to each character.
+If parity is enabled, the
+.Dv PARODD
+flag specifies odd parity if set; otherwise, even parity is used.
+.Pp
+If
+.Dv CREAD
+is set, the receiver is enabled.
+Otherwise, no characters are received.
+.Pp
+If
+.Dv HUPCL
+is set, the line is disconnected when the last process with the
+line open closes it or terminates.
+That is, the data-terminal-ready signal is not asserted.
+.Pp
+If
+.Dv CLOCAL
+is set, the line is assumed to be a local, direct connection
+with no modem control; otherwise, modem control is assumed.
+.Pp
+If
+.Dv CRTSXOFF
+is set, inbound hardware flow control is enabled.
+.Pp
+If
+.Dv CRTSCTS
+is set, outbound hardware flow control is enabled.
+.Pp
+The four possible combinations for the state of
+.Dv CRTSCTS
+and
+.Dv CRTSXOFF
+bits and their interactions are described below.
+.Bl -tag -width "Case C:"
+.It Sy Case A :
+.Dv CRTSCTS
+off,
+.Dv CRTSXOFF
+off.
+In this case the hardware flow control is disabled.
+.It Sy Case B :
+.Dv CRTSCTS
+on,
+.Dv CRTSXOFF
+off.
+In this case only outbound hardware flow control is enabled.
+The state of CTS signal is used to do outbound flow control.
+It is expected that output will be suspended if CTS is low and resumed
+when CTS is high.
+.It Sy Case C :
+.Dv CRTSCTS
+off,
+.Dv CRTSXOFF
+on.
+In this case only inbound hardware flow control is enabled.
+The state of RTS signal is used to do inbound flow control.
+It is expected that input will be suspended if RTS is low and resumed when RTS
+is high.
+.It Sy Case D :
+.Dv CRTSCTS
+on,
+.Dv CRTSXOFF
+on.
+In this case both inbound and outbound hardware flow control are enabled.
+Uses the state of CTS signal to do outbound
+flow control and RTS signal to do inbound flow control.
+.El
+.Ss "Local Modes"
+The
+.Fa c_lflag
+field of the argument structure is used by the line
+discipline to control terminal functions.
+The basic line discipline provides the following:
+.Pp
+.Bl -tag -offset 2n -width SIGTTOU -compact
+.It Dv ISIG
+Enable signals.
+.It Dv ICANON
+Canonical input (erase and kill processing).
+.It Dv XCASE
+Canonical upper/lower presentation.
+.It Dv ECHO
+Enable echo.
+.It Dv ECHOE
+Echo erase character as
+.Sy BS Ns - Ns Sy SP Ns - Ns Sy BS
+&.
+.It Dv ECHOK
+Echo
+.Sy NL
+after kill character.
+.It Dv ECHONL
+Echo
+.Sy NL .
+.It Dv NOFLSH
+Disable flush after interrupt or quit.
+.It Dv TOSTOP
+Send
+.It Dv SIGTTOU
+for background output.
+.It Dv ECHOCTL
+Echo control characters as
+.Em char ,
+delete as ^?.
+.It Dv ECHOPRT
+Echo erase character as character erased.
+.It Dv ECHOKE
+.Sy BS Ns - Ns Sy SP Ns - Ns Sy BS
+erase entire line on line kill.
+.It Dv FLUSHO
+Output is being flushed.
+.It Dv PENDIN
+Retype pending input at next read or input character.
+.It Dv IEXTEN
+Enable extended (implementation-defined) functions.
+.El
+.Pp
+If
+.Dv ISIG
+is set, each input character is checked against the special
+control characters
+.Sy INTR ,
+.Sy QUIT ,
+.Sy SWTCH ,
+.Sy SUSP ,
+.Sy STATUS ,
+and
+.Sy DSUSP .
+If an input character matches one of these control characters, the function
+associated with that character is performed.
+.Po
+Note: If
+.Sy SWTCH
+is set and the character matches, the character is simply discarded.
+No other action is taken.
+.Pc
+If
+.Dv ISIG
+is not set, no checking is done.
+Thus, these special
+input functions are possible only if
+.Dv ISIG
+is set.
+.Pp
+If
+.Dv ICANON
+is set, canonical processing is enabled.
+This enables the erase
+and kill edit functions, and the assembly of input characters into lines
+delimited by
+.Sy NL-c ,
+.Sy EOF ,
+.Sy EOL ,
+and
+.Sy EOL .
+If
+.Dv ICANON
+is not set, read requests are satisfied directly from the input queue.
+A read is not satisfied until at least
+.Sy MIN
+characters have been received or the timeout value
+.Sy TIME
+has expired between characters.
+This allows fast bursts of input to be read efficiently while still allowing
+single character input.
+The time value represents tenths of seconds.
+.Pp
+If
+.Dv XCASE
+is set and
+.Dv ICANON
+is set, an upper case letter is
+accepted on input if preceded by a backslash
+.Ql \e
+character, and is output preceded by a backslash
+.Ql \e
+character.
+In this mode, the
+following escape sequences are generated on output and accepted on input:
+.Bl -column "FOR:" "USE:" -offset 2n
+.It FOR: Ta USE:
+.It ` Ta \e'
+.It | Ta \e!
+.It \(ap Ta \e^
+.It { Ta \e(
+.It } Ta \e)
+.It \e Ta \e\e
+.El
+.Pp
+For example, input A as \ea, \en as \e\en, and \eN as \e\e\en.
+.Pp
+If
+.Dv ECHO
+is set, characters are echoed as received.
+.Pp
+When
+.Dv ICANON
+is set, the following echo functions are possible.
+.Bl -bullet -offset indent
+.It
+If
+.Dv ECHO
+and
+.Dv ECHOE
+are set, and
+.Dv ECHOPRT
+is not set, the
+.Sy ERASE ,
+.Sy ERASE2 ,
+and
+.Sy WERASE
+characters are echoed as one or
+more ASCII BS SP BS, which clears the last character(s) from a
+.Sy CRT
+screen.
+.It
+If
+.Dv ECHO ,
+.Dv ECHOPRT ,
+and
+.Dv IEXTEN
+are set, the first
+.Sy ERASE ,
+.Sy ERASE2 ,
+and
+.Sy WERASE
+character in a sequence echoes as a backslash
+.Ql \e ,
+followed by the characters being erased.
+Subsequent
+.Sy ERASE
+and
+.Sy WERASE
+characters echo the characters being erased, in reverse order.
+The
+next non-erase character causes a
+.Ql /
+(slash) to be typed before it is echoed.
+.Dv ECHOPRT
+should be used for hard copy terminals.
+.It
+If
+.Dv ECHOKE
+and
+.Dv IEXTEN
+are set, the kill character is echoed by
+erasing each character on the line from the screen (using the mechanism
+selected by
+.Dv ECHOE
+and
+.Dv ECHOPR ) .
+.It
+If
+.Dv ECHOK
+is set, and
+.Dv ECHOKE
+is not set, the
+.Sy NL
+character is
+echoed after the kill character to emphasize that the line is deleted.
+Note
+that a
+.Ql \e
+(escape) character or an
+.Sy LNEXT
+character preceding the erase
+or kill character removes any special function.
+.It
+If
+.Dv ECHONL
+is set, the
+.Sy NL
+character is echoed even if
+.Dv ECHO
+is not set.
+This is useful for terminals set to local echo (so called
+half-duplex).
+.El
+.Pp
+If
+.Dv ECHOCTL
+and
+.Dv IEXTEN
+are set, all control characters (characters
+with codes between 0 and 37 octal) other than
+.Sy ASCII TAB ,
+.Sy ASCII NL ,
+the
+.Sy START
+character, and the
+.Sy STOP
+character,
+.Sy ASCII CR ,
+and
+.Sy ASCII BS
+are echoed as
+.No ^ Ns Em X ,
+where
+.Em X
+is the character given by adding
+.Ql 100
+octal to the code of the control character (so
+that the character with octal code
+.Ql 1
+is echoed as
+.No ^ Ns Sy A ) ,
+and the
+.Sy ASCII DEL
+character,
+with code
+.Ql 177
+octal, is echoed as
+.No ^ Ns Sy \&? .
+.Pp
+If
+.Dv NOFLSH
+is set, the normal flush of the input and output queues
+associated with the
+.Sy INTR ,
+.Sy QUIT ,
+.Sy STATUS ,
+and
+.Sy SUSP
+characters is not done.
+This bit should be set when restarting system calls
+that read from or write to a terminal
+.Po
+see
+.Xr sigaction 2
+.Pc .
+.Pp
+If
+.Dv TOSTOP
+and
+.Dv IEXTEN
+are set, the signal
+.Dv SIGTTOU
+is sent to
+a process that tries to write to its controlling terminal if it is not in the
+foreground process group for that terminal.
+This signal normally stops the process.
+Otherwise, the output generated by that process is output to the
+current output stream.
+Processes that are blocking or ignoring
+.Dv SIGTTOU
+signals are excepted and allowed to produce output, if any.
+.Pp
+If
+.Dv FLUSHO
+and
+.Dv IEXTEN
+are set, data written to the terminal is
+discarded.
+This bit is set when the
+.Sy FLUSH
+character is typed.
+A program can cancel the effect of typing the
+.Sy FLUSH
+character by clearing
+.Dv FLUSHO .
+.Pp
+If
+.Dv PENDIN
+and
+.Dv IEXTEN
+are set, any input that has not yet been read
+is reprinted when the next character arrives as input.
+.Dv PENDIN
+is then
+automatically cleared.
+.Pp
+If
+.Dv IEXTEN
+is set, the following implementation-defined functions are
+enabled: special characters (
+.Sy WERASE ,
+.Sy REPRINT ,
+.Sy DISCARD ,
+and
+.Sy LNEXT )
+and local flags (
+.Dv TOSTOP ,
+.Dv ECHOCTL ,
+.Dv ECHOPRT ,
+.Dv ECHOKE ,
+.Dv FLUSHO ,
+and
+.Dv PENDIN ) .
+.Ss "Minimum and Timeout"
+The
+.Sy MIN
+and
+.Sy TIME
+values were described previously, in the
+subsection,
+.Sy Non-canonical Mode Input Processing .
+The initial value of
+.Sy MIN
+is 1, and the initial value of
+.Sy TIME
+is 0.
+.Ss "Terminal Size"
+The number of lines and columns on the terminal's display is specified in the
+.Vt winsize
+structure defined by
+.In sys/termios.h
+and includes the following members:
+.Bd -literal -offset 2n
+unsigned short ws_row; /* rows, in characters */
+unsigned short ws_col; /* columns, in characters */
+unsigned short ws_xpixel; /* horizontal size, in pixels */
+unsigned short ws_ypixel; /* vertical size, in pixels */
+.Ed
+.Ss "Termio Structure"
+The SunOS/SVR4
+.Vt termio
+structure is used by some
+.Fn ioctl Ns s ;
+it is defined by
+.In sys/termio.h
+and includes the following members:
+.Bd -literal -offset 2n
+unsigned short c_iflag; /* input modes */
+unsigned short c_oflag; /* output modes */
+unsigned short c_cflag; /* control modes */
+unsigned short c_lflag; /* local modes */
+char c_line; /* line discipline */
+unsigned char c_cc[NCC]; /* control chars */
+.Ed
+.Pp
+The special control characters are defined by the array
+.Fa c_cc .
+The symbolic name
+.Dv NCC
+is the size of the Control-character array and is also
+defined by
+.In termio.h .
+The relative positions, subscript names, and typical
+default values for each function are as follows:
+.Bl -column "Relative Positions" "Subscript Names" "Typical Default Values"
+.It Relative Positions Ta Subscript Names Ta Typical Default Values
+.It 0 Ta VINTR Ta EXT
+.It 1 Ta VQUIT Ta FS
+.It 2 Ta VERASE Ta DEL
+.It 3 Ta VKILL Ta NAK
+.It 4 Ta VEOF Ta EOT
+.It 5 Ta VEOL Ta NUL
+.It 6 Ta VEOL2 Ta NUL
+.It 7 Ta Reserved Ta
+.El
+.Pp
+The
+.Sy MIN
+values is stored in the
+.Dv VMIN
+element of the
+.Fa c_cc
+array; the
+.Sy TIME
+value is stored in the
+.Dv VTIME
+element of the
+.Fa c_cc
+array.
+The
+.Dv VMIN
+element is the same element as the
+.Dv VEOF
+element; the
+.Dv VTIME
+element is the same element as the
+.Dv VEOL
+element.
+.Pp
+The calls that use the
+.Va termio
+structure only affect the flags and control
+characters that can be stored in the
+.Vt termio
+structure; all other flags and control characters are unaffected.
+.Ss "Modem Lines"
+On special files representing serial ports, modem control lines can be read.
+Control lines (if the underlying hardware supports it) may also be changed.
+Status lines are read-only.
+The following modem control and status lines may be
+supported by a device; they are defined by
+.In sys/termios.h :
+.Pp
+.Bl -tag -width "TIOCM_DTR" -compact -offset 2n
+.It Dv TIOCM_LE
+line enable
+.It Dv TIOCM_DTR
+data terminal ready
+.It Dv TIOCM_RTS
+request to send
+.It Dv TIOCM_ST
+secondary transmit
+.It Dv TIOCM_SR
+secondary receive
+.It Dv TIOCM_CTS
+clear to send
+.It Dv TIOCM_CAR
+carrier detect
+.It Dv TIOCM_RNG
+ring
+.It Dv TIOCM_DSR
+data set ready
+.El
+.Pp
+.Dv TIOCM_CD
+is a synonym for
+.Dv TIOCM_CAR ,
+and
+.Dv TIOCM_RI
+is a synonym for
+.Dv TIOCM_RNG .
+Not all of these are necessarily supported by any
+particular device; check the manual page for the device in question.
+.Pp
+The software carrier mode can be enabled or disabled using the
+.Dv TIOCSSOFTCAR
+.Fn ioctl .
+If the software carrier flag for a line is off,
+the line pays attention to the hardware carrier detect (DCD) signal.
+The
+.Sy tty
+device associated with the line cannot be opened until
+.Sy DCD
+is asserted.
+If the software carrier flag is on, the line behaves as if
+.Sy DCD
+is always asserted.
+.Pp
+The software carrier flag is usually turned on for locally connected terminals
+or other devices, and is off for lines with modems.
+.Pp
+To be able to issue the
+.Dv TIOCGSOFTCAR
+and
+.Dv TIOCSSOFTCAR
+.Fn ioctl
+calls, the
+.Sy tty
+line should be opened with
+.Dv O_NDELAY
+so that the
+.Xr open 2
+will not wait for the carrier.
+.Ss "Default Values"
+The initial
+.Vt termios
+values upon driver open is configurable.
+This is accomplished by setting the "ttymodes" property in the file
+.Pa /kernel/drv/options.conf .
+Since this property is assigned during system
+initialization, any change to the "ttymodes" property will not take effect
+until the next reboot.
+The string value assigned to this property should be in
+the same format as the output of the
+.Xr stty 1
+command with the -g option.
+.Pp
+If this property is undefined, the following
+.Vt termios
+modes are in effect.
+The initial input control value is
+.Dv BRKINT ,
+.Dv ICRNL ,
+.Dv IXON ,
+.Dv IMAXBEL .
+The initial output control value is
+.Dv OPOST ,
+.Dv ONLCR ,
+.Dv TAB3 .
+The initial hardware control value is
+.Dv B9600 ,
+.Dv CS8 ,
+.Dv CREAD .
+The initial line-discipline control value is
+.Dv ISIG ,
+.Dv ICANON ,
+.Dv IEXTEN ,
+.Dv ECHO ,
+.Dv ECHOK ,
+.Dv ECHOE ,
+.Dv ECHOKE ,
+.Dv ECHOCTL .
+.Sh IOCTLS
+The
+.Fn ioctl Ns s
+supported by devices and
+.Sy STREAMS
+modules providing the
+.Xr termios 3C
+interface are listed below.
+Some calls may not be supported by all devices or modules.
+The functionality provided by these calls is also
+available through the preferred function call interface specified on
+.Nm termios .
+.Bl -tag -width TIOCSSOFTCAR
+.It Dv TCGETS
+The argument is a pointer to a
+.Vt termios
+structure.
+The current terminal parameters are fetched and stored into that structure.
+.It Dv TCSETS
+The argument is a pointer to a
+.Vt termios
+structure.
+The current terminal parameters are set from the values stored in that structure.
+The change is immediate.
+.It Dv TCSETSW
+The argument is a pointer to a
+.Vt termios
+structure.
+The current terminal parameters are set from the values stored in that structure.
+The change occurs after all characters queued for output have been transmitted.
+This form should be used when changing parameters that affect output.
+.It Dv TCSETSF
+The argument is a pointer to a
+.Vt termios
+structure.
+The current terminal parameters are set from the values stored in that structure.
+The change occurs after all characters queued for output have been transmitted;
+all characters queued for input are discarded and then the change occurs.
+.It Dv TCGETA
+The argument is a pointer to a
+.Vt termio
+structure.
+The current terminal parameters are fetched, and those parameters that can be
+stored in a
+.Vt termio
+structure are stored into that structure.
+.It Dv TCSETA
+The argument is a pointer to a
+.Vt termio
+structure.
+Those terminal parameters that can be stored in a
+.Vt termio
+structure are set from the values stored in that structure.
+The change is immediate.
+.It Dv TCSETAW
+The argument is a pointer to a
+.Vt termio
+structure.
+Those terminal parameters that can be stored in a
+.Vt termio
+structure are set from
+the values stored in that structure.
+The change occurs after all characters queued for output have been transmitted.
+This form should be used when changing parameters that affect output.
+.It Dv TCSETAF
+The argument is a pointer to a
+.Vt termio
+structure.
+Those terminal parameters that can be stored in a
+.Vt termio
+structure are set from the values stored in that structure.
+The change occurs after all characters queued
+for output have been transmitted; all characters queued for input are discarded
+and then the change occurs.
+.It Dv TCSBRK
+The argument is an
+.Vt int
+value.
+Wait for the output to drain.
+If the argument is
+.Sy 0 ,
+then send a break (zero valued bits for 0\&.25 seconds).
+.It Dv TCXONC
+Start/stop control.
+The argument is an
+.Vt int
+value.
+If the argument is
+.Sy 0 ,
+suspend output; if
+.Sy 1 ,
+restart suspended output; if
+.Sy 2 ,
+suspend input; if
+.Sy 3 ,
+restart suspended input.
+.It Dv TCFLSH
+The argument is an
+.Vt int
+value.
+If the argument is
+.Sy 0 ,
+flush the input queue; if
+.Sy 1 ,
+flush the output queue; if
+.Sy 2 ,
+flush both the input and output queues.
+.It Dv TIOCGPGRP
+The argument is a pointer to a
+.Vt pid_t .
+Set the value of that
+.Vt pid_t
+to the process group
+.Sy ID
+of the foreground process group associated with the terminal.
+See
+.Xr termios 3C
+for a description of
+.Dv TCGETPGRP .
+.It Dv TIOCSPGRP
+The argument is a pointer to a
+.Vt pid_t .
+Associate the process group whose
+process group
+.Sy ID
+is specified by the value of that
+.Vt pid_t
+with the terminal.
+The new process group value must be in the range of valid process
+group
+.Sy ID
+values.
+Otherwise, the error
+.Er EPERM
+is returned.
+.It Dv TIOCGSID
+The argument is a pointer to a
+.Vt pid_t .
+The session ID of the terminal is fetched and stored in the
+.Vt pid_t .
+.It Dv TIOCGWINSZ
+The argument is a pointer to a
+.Vt winsize
+structure.
+The terminal driver's
+notion of the terminal size is stored into that structure.
+.It Dv TIOCSWINSZ
+The argument is a pointer to a
+.Vt winsize
+structure.
+The terminal driver's
+notion of the terminal size is set from the values specified in that structure.
+If the new sizes are different from the old sizes, a
+.Dv SIGWINCH
+signal is set to the process group of the terminal.
+.It Dv TIOCMBIS
+The argument is a pointer to an
+.Vt int
+whose value is a mask containing modem control lines to be turned on.
+The control lines whose bits are set in
+the argument are turned on; no other control lines are affected.
+.It Dv TIOCMBIC
+The argument is a pointer to an
+.Vt int
+whose value is a mask containing modem control lines to be turned off.
+The control lines whose bits are set in
+the argument are turned off; no other control lines are affected.
+.It Dv TIOCMGET
+The argument is a pointer to an
+.Vt int .
+The current state of the modem
+status lines is fetched and stored in the
+.Vt int
+pointed to by the argument.
+.It Dv TIOCMSET
+The argument is a pointer to an
+.Vt int
+containing a new set of modem control lines.
+The modem control lines are turned on or off, depending on
+whether the bit for that mode is set or clear.
+.It Dv TIOCSPPS
+The argument is a pointer to an
+.Vt int
+that determines whether pulse-per-second event handling is to be enabled
+(non-zero) or disabled (zero).
+If a one-pulse-per-second reference clock is attached to the serial line's data
+carrier detect input, the local system clock will be calibrated to it.
+A clock with a high error, that is, a deviation of more than 25 microseconds
+per tick, is ignored.
+.It Dv TIOCGPPS
+The argument is a pointer to an
+.Vt int ,
+in which the state of the even handling is returned.
+The
+.Vt int
+is set to a non-zero value if pulse-per-second (PPS) handling has been enabled.
+Otherwise, it is set to zero.
+.It Dv TIOCGSOFTCAR
+The argument is a pointer to an
+.Vt int
+whose value is
+.Sy 1
+or
+.Sy 0 ,
+depending on whether the software carrier detect is turned on or off.
+.It Dv TIOCSSOFTCAR
+The argument is a pointer to an
+.Vt int
+whose value is
+.Sy 1
+or
+.Sy 0 .
+The value of the integer should be
+.Sy 0
+to turn off software carrier, or
+.Sy 1
+to turn it on.
+.It Dv TIOCGPPSEV
+The argument is a pointer to a
+.Vt "struct ppsclockev" .
+This structure contains the following members:
+.Bd -literal -offset 2n
+struct timeval tv;
+uint32_t serial;
+.Ed
+.Pp
+.Fa tv
+is the system clock timestamp when the event (pulse on the
+.Sy DCD
+pin) occurred.
+.Fa serial
+is the ordinal of the event, which each consecutive event
+being assigned the next ordinal.
+The first event registered gets a
+.Fa serial
+value of
+.Sy 1 .
+The
+.Dv TIOCGPPSEV
+returns the last event registered; multiple calls will persistently return the
+same event until a new one is registered.
+In addition to time stamping and saving the event, if it is of
+one-second period and of consistently high accuracy, the local system clock
+will automatically calibrate to it.
+.El
+.Sh FILES
+Files in or under
+.Pa /dev
+.Sh SEE ALSO
+.Xr stty 1 ,
+.Xr fork 2 ,
+.Xr getpgid 2 ,
+.Xr getsid 2 ,
+.Xr ioctl 2 ,
+.Xr setsid 2 ,
+.Xr sigaction 2 ,
+.Xr signal 3C ,
+.Xr tcsetpgrp 3C ,
+.Xr termios 3C ,
+.Xr signal.h 3HEAD ,
+.Xr streamio 4I